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
注 :字节序是反的;

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

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

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)服务之前,可能需要先验证新的比特流,再让设备执行重新编程;这样一来,若比特流无效,便可避免调用恢复流程。
区别:
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);
注意事项
我的 个人思考 :
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 的 固件 !
浙公网安备 33010602011771号