本帖最后由 小恩GG 于 2021-10-18 16:31 编辑
【经验分享】SPT保留用户RT10XX代码FCB下载方法 1. 文档说明 SPT(MCUXpressosecure provisioning tool)是NXP官方出的RT/LPC55Sxx系列烧录普通代码以及加密代码的工具,下载链接: 本文不涉及加密,是针对工具下载RT10XX 代码,如何保持客户代码中的FCB头的情况,类如,直接使用SDK代码生成带有FCB头的app.s19文件,如何保持源文件的FCB下载,通常情况下,如果不保留客户代码FCB,SPT工具会使用blhost直接使用Configure-memory命令写入FCB到外部flash0X60000000处,这个将是根据option0,option1配置ROM直接写入,而不是使用客户的APP文件中的FCB,实际下载的是从偏移0X1000开始带有IVT以及APP的代码。 但是实际项目中,往往客户需要保证烧录的代码和原来提供的代码文件是一致的,所以本文讲给出如何保留客户app FCB头的方法。 以SDK代码led_blinky为例,直接生成.s19文件,使用SPT 工具下载: 图1 可以发现,选择SDK生成的.s19文件,保留客户FCB头,下载之后,情况如下: 图2 这里发现,在flash erase 的时候,失败了。 那么为何SDK工程直接下载,保留FCB会出现这个情况呢? 其实从图1中的SPT工具提示也可以发现,这里需要客户的FCB头带有read, erase和programLUT, 但是打开SDK的xip/evkmimxrt1060_flexspi_nor_config.c,会发现,只带有read LUT, 没有其他LUT。 知道原因之后,就可以知道如何修改SDK APP FCB去满足保留客户FCB了。 2. FCB 代码修改与测试 打开SDK的xip/evkmimxrt1060_flexspi_nor_config.c,添加write, erase, program等LUT,具体代码如下:
- const flexspi_nor_config_t qspiflash_config = {
- .memConfig =
- {
- .tag = FLEXSPI_CFG_BLK_TAG,
- .version = FLEXSPI_CFG_BLK_VERSION,
- .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
- .csHoldTime = 3u,
- .csSetupTime = 3u,
- .sflashPadType = kSerialFlash_4Pads,
- .serialClkFreq = kFlexSpiSerialClk_100MHz,
- .sflashA1Size = 8u * 1024u * 1024u,
- .lookupTable =
- {
- // Read LUTs
- FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
- FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
- // Read status
- [4*1] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),
- //write Enable
- [4*3] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
- // Sector Erase byte LUTs
- [4*5] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x18),
- // Block Erase 64Kbyte LUTs
- [4*8] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8, RADDR_SDR, FLEXSPI_1PAD, 0x18),
- //Page Program - single mode
- [4*9] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 0x18),
- [4*9+1] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04, STOP, FLEXSPI_1PAD, 0x0),
- //Erase whole chip
- [4*11] =FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
- },
- },
- .pageSize = 256u,
- .sectorSize = 4u * 1024u,
- .blockSize = 64u * 1024u,
- .isUniformBlockSize = false,
- };
复制代码
然后再次测试,结果如下: 图3 可以发现,下载以及成功运行。 读出QSPI memory之后,和源文件对比,可以发现一致: 图4 图5
那么查看不保留用户FCB头的情况下,看看读出的实际FCB和源代码FCB的对比情况: 图6 图7 图8 可见,如果不保留客户APP的FCB, blhost会使用命令烧录一个完整的LUT,这个LUT已经包含了erase, read,program等。 所以,如果需要保留客户APP的FCB,并且使用SPT工具成功下载,那么客户的FCB中需要添加read, program,erase等LUT,可以使用上述代码添加到flexspi_nor_config_t qspiflash_config 中。
|