PolarFire Soc IAP System Services 代码验证

PolarFire Family System Services User Guide

 

1、读取 序列号 16 个字节

      status = MSS_SYS_get_serial_number(data_buffer, MSS_SYS_MAILBOX_DATA_OFFSET);

      xprintf_hex( "device serial number (DSN)", data_buffer, 16 );

  一、打印 读取到的 序列号,结果如下:

   device serial number (DSN),len:16.

           0x90 0xE1 0x70 0x9F 0x0D 0xF1 0xFC 0xFA 0x94 0x22 0x71 0xED 0xC2 0x6E 0xDE 0x9E

  二、FlashPro read idcode 读取到的结果:

  programmer '35D9AF88' : device 'MPFS250T' : EXPORT DSN[128] = 9ede6ec2ed712294fafcf10d9f70e190

  注 :字节序是反的;

image

 

2、读取 user code

      status = MSS_SYS_get_user_code( data_buffer, MSS_SYS_MAILBOX_DATA_OFFSET );

      xprintf_hex( "user code", data_buffer, 4 );

  一、打印读取到数据

  user code,len:4.
  0x1E 0x1C 0x1C 0x00

  这四个字节 设置 在 libero 

image

 

 

3、读取 design info 共计 36 字节

status = MSS_SYS_get_design_info(data_buffer, MSS_SYS_MAILBOX_DATA_OFFSET);
xprintf_hex( "DESIGN info", data_buffer, 36 );

 

打印结果:

DESIGN info,len:36.
0xC0 0x3F 0x4D 0x50 0x46 0x53 0x5F 0x49 0x43 0x49 0x43 0x4C 0x45 0x5F 0x4B 0x49 0x54 0x5F 0x42 0x41 0x53 0x45 0x5F 0x44 0x45 0x53 0x49 0x47 0x4E 0x00 0x00 0x00 0x00 0x00 0x00 0x00
end.

前32字节 : 换成 字符串:  0xC0 0x3F 暂时不转换, 后面的是  MPFS_ICICLE_KIT_BASE_DESIGN 

最后4个字节 , 分别对应 当前版本号 和 回退版本保护版本号 0和0

 

image

 

4、校验固件函数有两个,下面是 

 uint16_t MSS_SYS_authenticate_bitstream ( uint32_t spi_flash_address, uint16_t mb_offset );

 uint16_tMSS_SYS_authenticate_iap_image ( uint32_t spi_idx );

一个 根据 固件存放地址  一个 是 根据 目录编号;

目录存在 SPI 开始的 1KB 里,每4个字节 对应一个固件的地址, 编号 0-255  ,理论 可以 256个 固件 ; 但是 1 往往填写 0 , 因此固件 255个;

 

在使用在应用编程(IAP)服务之前,可能需要先验证新的比特流,再让设备执行重新编程;这样一来,若比特流无效,便可避免调用恢复流程。

区别:

 

  • 比特流认证系统服务(bitstream authentication system service):仅能用于认证 “比特流” 这一部分,不涉及镜像描述符和可选的设计初始化数据。
  • IAP 镜像认证系统服务(IAP image authentication system service):可用于认证 “完整的编程镜像”,即同时覆盖镜像描述符、比特流,以及可选的设计初始化数据。

 

 5、执行 IAP 升级 函数

uint16_t MSS_SYS_execute_iap uint8_t iap_cmd, uint32_t spiaddr, uint16_t mb_offset );

 

#define IAP_PROGRAM_BY_SPIIDX_CMD 0x42u
#define IAP_VERIFY_BY_SPIIDX_CMD 0x44u
#define IAP_PROGRAM_BY_SPIADDR_CMD 0x43u
#define IAP_VERIFY_BY_SPIADDR_CMD 0x45u
#define IAP_AUTOUPDATE_CMD 0x46u

 

命令常量含义说明
IAP_PROGRAM_BY_SPIIDX_CMD 基于 SPI 目录索引,对指定索引的 IAP 镜像执行编程操作
IAP_VERIFY_BY_SPIIDX_CMD 基于 SPI 目录索引,对指定索引的 IAP 镜像 与当前设备内容是否一致 
IAP_PROGRAM_BY_SPIADDR_CMD 基于 SPI 闪存物理地址,对指定地址的比特流执行编程操作
IAP_VERIFY_BY_SPIADDR_CMD 基于 SPI 闪存物理地址,对指定地址的比特流与当前设备内容是否一致 
IAP_AUTOUPDATE_CMD 触发自动更新:从 SPI 目录前两个镜像中选择最新版本进行编程(无需指定地址 / 索引)

 

场景 1:通过 SPI 目录索引编程 IAP 镜像(索引 0)

result = MSS_SYS_execute_iap(IAP_PROGRAM_BY_SPIIDX_CMD, 0, 5);

场景 2:通过 SPI 地址验证比特流

result = MSS_SYS_execute_iap(IAP_VERIFY_BY_SPIADDR_CMD, 0x00020000, 8);

场景 3:触发自动更新

result = MSS_SYS_execute_iap(IAP_AUTOUPDATE_CMD, 0, 10);

注意事项

  1. 执行编程操作前,建议先用对应VERIFY命令验证目标数据(比特流 / IAP 镜像)的有效性,避免因无效数据导致设备异常。
  2. 使用SPIIDX相关命令时,严格遵守SPI_IDX=1不可用的限制,否则可能导致恢复功能失效。
  3. 邮箱偏移量mb_offset需根据系统实际内存布局设置,确保不与其他服务冲突。
  4. 若返回非 0 错误,需参考设备文档中的 “状态响应” 表排查具体原因(如地址无效、镜像损坏等)。

 我的  个人思考 :

 

  MSS_SYS_authenticate_iap_image 和 MSS_SYS_execute_iap 形参 为 IAP_VERIFY_BY_SPIIDX_CMD 区别是什么?

 

MSS_SYS_authenticate_iap_image  是升级前, 对 SPI flash  中  的固件 有效行 进行验证 

IAP_VERIFY_BY_SPIIDX_CMD  是 升级后, 指定索引的固件或者指定地址的固件 和 设备的内容是否一致,来确认升级是否成功!!

 

验证代码,需要做两件事:

Libero 2025.1 生成 IAP 使用的 BIN 文件 - 所长 - 博客园

PolarFire® SoC QSPI 代码编写 测试 - 所长 - 博客园 

将生成 的 BIN 文件 写入 到 SC-SPI 对应 FLASH 中!!!

 

 下面进行 代码验证 

    // 读取  The device serial number (DSN) is a 128-bit unique device ID
    uint16_t status = MSS_SYS_get_serial_number(data_buffer, MSS_SYS_MAILBOX_DATA_OFFSET);
    xprintf_hex( "device serial number (DSN)", data_buffer, 16 );

    // 读取 用户 code 共计 4个字节
    // silicon signature 
    status = MSS_SYS_get_user_code( data_buffer, MSS_SYS_MAILBOX_DATA_OFFSET );
    xprintf_hex( "user code", data_buffer, 4 );

    // 读取当前版本信息
    // 共计 36个字节
    // 0-31 字节  是 design name 
    // 32-33 2个字节 DESIGN VERSION
    // 34-35 2个字节 BACK LEVEL version
    status = MSS_SYS_get_design_info(data_buffer, MSS_SYS_MAILBOX_DATA_OFFSET);
    xprintf_hex( "DESIGN info", data_buffer, 36 );


    // 校验 SPI FLASH golden 版本
    status = MSS_SYS_authenticate_iap_image( 0 );
    xprintf( "authenticate iap status=0x%X.\n", status );

    // 根据校验结果 调用接口 进行 IAP 升级
    if( status == MSS_SYS_SUCCESS )
    {
        status = MSS_SYS_execute_iap( MSS_SYS_IAP_PROGRAM_BY_SPIIDX_CMD, 0, 0 );
        xprintf( "MSS_SYS_execute_iap status=0x%X.\n", status );
    }

 

IAP 升级 过程中不断电,  日志 :根据日志,编程耗时 30秒;

The flash device manufacturer ID is 0x20, memory type ID is 0xBA, capacity ID is 0x21.
[SFUD]Find a Micron flash chip. Size is 134217728 bytes.
[SFUD]QSPI_FLASH flash device is initialize success.
system version:2.
heap:10976, tick:18.
heap:10976, tick:1020.
heap:10976, tick:2021.
heap:10976, tick:3022.
heap:10976, tick:4023.

[14:45:28.795]发→◇test_sys_services.□
[14:45:28.861]收←◆cmd_process rx len=18,:test_sys_services..
device serial number (DSN),len:16.
0x90 0xE1 0x70 0x9F 0x0D 0xF1 0xFC 0xFA 0x94 0x22 0x71 0xED 0xC2 0x6E 0xDE 0x9E 
end.
user code,len:4.
0x1E 0x1C 0x1C 0x00 
end.
DESIGN info,len:36.
0xC0 0x3F 0x4D 0x50 0x46 0x53 0x5F 0x49 0x43 0x49 0x43 0x4C 0x45 0x5F 0x4B 0x49 0x54 0x5F 0x42 0x41 0x53 0x45 0x5F 0x44 0x45 0x53 0x49 0x47 0x4E 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
end.

[14:45:33.568]收←◆authenticate iap status=0x0.

[14:46:03.780]收←◆The flash device manufacturer ID is 0x20, memory type ID is 0xBA, capacity ID is 0x21.
[SFUD]Find a Micron flash chip. Size is 134217728 bytes.
[SFUD]QSPI_FLASH flash device is initialize success.
system version:1.
heap:10976, tick:18.

[14:46:04.781]收←◆heap:10976, tick:1020.

[14:46:05.782]收←◆heap:10976, tick:2021.

[14:46:06.784]收←◆heap:10976, tick:3022.

[14:46:07.784]收←◆heap:10976, tick:4023.

[14:46:22.113]发→◇test_sys_services.□
[14:46:22.150]收←◆cmd_process rx len=18,:test_sys_services..
err: cmd not support!

 重新烧录 版本为2 的  risc-V 的运行  代码, 此次 IAP 升级过程中 ,进行断电:

[14:48:47.399]收←◆The flash device manufacturer ID is 0x20, memory type ID is 0xBA, capacity ID is 0x21.
[SFUD]Find a Micron flash chip. Size is 134217728 bytes.
[SFUD]QSPI_FLASH flash device is initialize success.
system version:2.
heap:10976, tick:18.

[14:48:48.401]收←◆heap:10976, tick:1020.

[14:48:49.402]收←◆heap:10976, tick:2021.

[14:48:50.403]收←◆heap:10976, tick:3022.

[14:48:51.403]收←◆heap:10976, tick:4023.

[14:48:55.585]发→◇test_sys_services.□
[14:48:55.652]收←◆cmd_process rx len=18,:test_sys_services..
device serial number (DSN),len:16.
0x90 0xE1 0x70 0x9F 0x0D 0xF1 0xFC 0xFA 0x94 0x22 0x71 0xED 0xC2 0x6E 0xDE 0x9E 
end.
user code,len:4.
0x1E 0x1C 0x1C 0x00 
end.
DESIGN info,len:36.
0xC0 0x3F 0x4D 0x50 0x46 0x53 0x5F 0x49 0x43 0x49 0x43 0x4C 0x45 0x5F 0x4B 0x49 0x54 0x5F 0x42 0x41 0x53 0x45 0x5F 0x44 0x45 0x53 0x49 0x47 0x4E 0x00 0x00 0x00 0x02 0x00 0x00 0x00 
end.

[14:49:00.360]收←◆authenticate iap status=0x0.

[14:49:47.115]收←◆The flash device manufacturer ID is 0x20, memory type ID is 0xBA, capacity ID is 0x21.
[SFUD]Find a Micron flash chip. Size is 134217728 bytes.
[SFUD]QSPI_FLASH flash device is initialize success.
system version:1.
heap:10976, tick:18.

[14:49:48.118]收←◆heap:10976, tick:1020.

[14:49:49.118]收←◆heap:10976, tick:2021.

[14:49:50.119]收←◆heap:10976, tick:3022.

[14:49:51.120]收←◆heap:10976, tick:4023.

此过程 经过断电,依旧 恢复了 image 索引为 1 的 固件 !

posted on 2025-09-26 11:39  所长  阅读(13)  评论(0)    收藏  举报

导航