你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是致使串行NOR Flash在i.MXRT下没法正常下载/启动的常见因素之SFDP。html
i.MXRT系列MCU发布已两年多了,基于i.MXRT的客户产品也愈来愈多,能够说是全面开花了。痞子衡做为i.MXRT产品线的系统应用工程师,早期的时候还能够尽情作参考设计,如今基本大量时间都被客户支持占据了。git
由于i.MXRT系列都没有内置Flash(RT1064, RT1024等SIP型号除外),所以为其搭配一块串行NOR Flash去启动是客户项目的头等大事,而串行NOR Flash厂商很是多,客户选择余地很大,所以咱们不得不与客户一块儿同茫茫Flash型号打交道,痞子衡也经常调侃本身已沦为Flash测试工程师。github
痞子衡在支持客户解决串行NOR Flash下载启动问题过程当中主要遇到几个常见因素,这几个因素可能会影响Flash在i.MXRT下没法正常使用,今天痞子衡就重点跟你们聊聊SFDP这个因素。算法
SFDP又叫JESD216,是JEDEC协会于2011年开始推出的串行Flash接口标准,相似于CFI在并行NOR Flash上的标准。SFDP发展至今已经诞生了以下版本:微信
时间 | 标准 |
---|---|
2011 | JESD216 |
2013.07 | JESD216A |
2014.05 | JESD216B |
2018.08 | JESD216C |
2018.11 | JESD216D |
2019.08 | JESD216D.01 |
咱们知道串行Flash厂商很是多,在2011年以前,你们都是各自玩,没有明确的统一标准(虽然几个领头厂商起了示范做用,但各家在具体细节上仍是会有差别),这对于Flash用户来讲就比较麻烦了,须要把各家Flash手册仔细研读,不能漏掉任何一个细节。函数
随着串行Flash市场需求愈来愈强烈,各个厂商也在铆足劲给自家Flash加特性,这时候JEDEC站出来了,拉了几个主要的Flash厂商一块儿订个SFDP标准,有了这个标准,Flash用户就方便多了,尤为是软件设计人员,开发Flash驱动今后有标准可依,甚至一套驱动能够用在全部支持SFDP标准的Flash上,实现各厂商Flash之间轻松切换。工具
由于SFDP标准是2011年才开始推出,新兴Flash厂商(好比兆易创新)的产品基本都是支持SFDP标准的,而部分老牌Flash厂商(好比华邦)则存在老型号和新型号共存的问题。老型号都是2011年前设计生产的,不支持SFDP;2011年以后设计的新型号基本都是支持SFDP的。测试
华邦目前是串行Flash第一大厂商,痞子衡遇到好几个i.MXRT客户,选用的华邦NOR Flash,但Flash里不支持SFDP,所以客户支持稍微复杂一些。关于SFDP支持问题,痞子衡特别联系过华邦销售人员,获得了他们的答复,华邦NOR Flash家族里 W25QxxJV 和 W25QxxJW 系列都是新型号,所有支持SFDP;而 W25QxxFV 和W25QxxFW 系列属于老型号,大多没有SFDP,可是也有以下部分型号支持SFDP:flex
虽然咱们能够在后续开发的过程当中也能正常使用非SFDP标准的Flash以及能经过读SFDP命令查询出芯片是否支持SFDP,但最好在Flash选型前就能明确知道其SFDP状况,这个须要跟Flash厂商销售沟通好。总之,痞子衡推荐你们选用各厂商支持SFDP标准的新型号。ui
若是你认真看过痞子衡写的i.MXRT启动系列文章,你应该知道i.MXRT之因此可以支持市面上几乎全部的串行NOR Flash启动是靠的512 byte的FDCB结构体,这个结构体原型即flexspi_nor_config_t,它能够描述启动所需的全部Flash参数信息。
i.MXRT在启动时首先会用1bit SDR时序模式去获取用户放在Flash开始或偏移0x400处(因i.MXRT型号而异)的FDCB,而后根据FDCB里的信息去进一步配置启动,所以Flash里有无SFDP其实不影响启动,只要在FDCB里描述清楚便可。
可是Flash里有无SFDP很是影响在i.MXRT相关配套工具下的擦写操做(俗称下载),由于全部工具(JLink、各IDE、ROM配套Flashloader、痞子衡的MCUBootUtility)默认都是基于SFDP来设计Flash下载算法的。
仅以ROM配套Flashloader为例,其上位机工具是blhost.exe,它有以下经典的命令序列。这个序列就是利用用户提供简化的串行Flash配置值0xc0000007(描述通常的四线QSPI)来初始化FlexSPI以及Flash,为后续擦写操做作准备。
blhost -u -- fill-memory 0x20202000 4 0xc0000007 blhost -u -- configure-memory 0x9 0x20202000
configure-memory命令底层究竟是什么样的逻辑呢?让咱们找到任何一个SDK包,在\SDK_2.x.x_MIMXRTxxxx-EVK\middleware\mcu-boot\src\memory\src\flexspi_nor_memory.c里能够找到以下函数flexspi_nor_mem_config(),它就是其底层逻辑,在这个函数里咱们能够看到,Flashloader会判断传来的config值究竟是简化的serial_nor_config_option_t,仍是完整的flexspi_nor_config_t。
若是config是简化的serial_nor_config_option_t,Flashloader会调用flexspi_nor_get_config()函数去自动填充生成完整的flexspi_nor_config_t,你能够继续去看flexspi_nor_get_config()函数的实现,对于普通四线QSPI,其就是根据Flash里读回的SFDP表内容来作的填充,所以这种方式下SFDP不可缺。
status_t flexspi_nor_mem_config(uint32_t *config) { status_t status = kStatus_InvalidArgument; bool isNorConfigOption = false; serial_nor_config_option_t *option = (serial_nor_config_option_t *)config; flexspi_nor_config_t *norConfig = (flexspi_nor_config_t *)config; if (option->option0.B.tag == kSerialNorCfgOption_Tag) { status = flexspi_nor_get_config(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock, option); // ... isNorConfigOption = true; } else if (norConfig->memConfig.tag == FLEXSPI_CFG_BLK_TAG) { memcpy(&s_flexspiNorConfigBlock, norConfig, sizeof(flexspi_nor_config_t)); isNorConfigOption = true; } // ... if (isNorConfigOption) { status = flexspi_nor_flash_init(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock); // ... } return status; }
上面这种0xc0000007搞定一切四线QSPI的方式仅适用于含SFDP的Flash,对于不含SFDP的Flash怎么办呢。其实上面已经给了解决方法,那就是直接提供完整的FDCB,所以i.MXRT相关配套工具下载算法都须要相应改一下,痞子衡在两个项目上都作了非SFDP Flash支持:
- J-Link下载算法源工程,能够参考 /boards/msft_rt600_xproject/flash_algo_b0_silicon/Keil_JLink 这个源工程
- MCUBootUtility v2.3更新,参看文章 《MCUBootUtility v2.3发布,此次再也不放过任何一款Flash》 第2.3节
至此,致使串行NOR Flash在i.MXRT下没法正常下载/启动的常见因素之SFDP痞子衡便介绍完毕了,掌声在哪里~~~
文章会同时发布到个人 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就能够在手机上第一时间看了哦。