查看: 1111|回复: 0

[分享] 为什么SFDP是影响串行Flash正常下载的重要因素?

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32017
    最后登录
    2024-4-9
    发表于 2020-9-3 10:29:58 | 显示全部楼层 |阅读模式
    为什么SFDP是影响串行Flash正常下载的重要因素?
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP。

    i.MXRT系列MCU发布已两年多了,基于i.MXRT的客户产品也越来越多,可以说是全面开花了。痞子衡作为i.MXRT产品线的系统应用工程师,早期的时候还可以尽情做参考设计,现在基本大量时间都被客户支持占据了。

    因为i.MXRT系列都没有内置Flash(RT1064, RT1024等SIP型号除外),因此为其搭配一块串行NOR Flash去启动是客户项目的第一个头等大事,而串行NOR Flash厂商非常多,客户选择余地很大,因此我们不得不与客户一起同茫茫Flash型号打交道,痞子衡也常常调侃自己已沦为Flash测试工程师。

    痞子衡在支持客户解决串行NOR Flash下载启动问题过程中主要遇到几个常见因素,这几个因素可能会影响Flash在i.MXRT下无法正常使用,今天痞子衡就重点跟大家聊聊SFDP这个因素。

    一、SFDP标准简介
    SFDP又叫JESD216,是JEDEC协会于2011年开始推出的串行Flash接口标准,类似于CFI在并行NOR Flash上的标准。SFDP发展至今已经诞生了如下版本:
    1.png
    我们知道串行Flash厂商非常多,在2011年之前,大家都是各自玩,没有明确的统一标准(虽然几个领头厂商起了示范作用,但各家在具体细节上还是会有差异),这对于Flash用户来说就比较麻烦了,需要把各家Flash手册仔细研读,不能漏掉任何一个细节。

    随着串行Flash市场需求越来越强烈,各个厂商也在铆足劲给自家Flash加特性,这时候JEDEC站出来了,拉了几个主要的Flash厂商一起订个SFDP标准,有了这个标准,Flash用户就方便多了,尤其是软件设计人员,开发Flash驱动从此有标准可依,甚至一套驱动可以用在所有支持SFDP标准的Flash上,实现各厂商Flash之间轻松切换。

    二、部分Flash型号不支持SFDP
    因为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:
    2.png
    3.png
    虽然我们可以在后续开发的过程中也能正常使用非SFDP标准的Flash以及能通过读SFDP命令查询出芯片是否支持SFDP,但最好在Flash选型前就能明确知道其SFDP情况,这个需要跟Flash厂商销售沟通好。总之,痞子衡推荐大家选用各厂商支持SFDP标准的新型号。

    三、不支持SFDP的Flash如何适用i.MXRT下载
    如果你认真看过痞子衡写的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不可缺。
    1. status_t flexspi_nor_mem_config(uint32_t *config)
    2. {
    3.     status_t status = kStatus_InvalidArgument;
    4.     bool isNorConfigOption = false;

    5.     serial_nor_config_option_t *option = (serial_nor_config_option_t *)config;
    6.     flexspi_nor_config_t *norConfig = (flexspi_nor_config_t *)config;

    7.     if (option->option0.B.tag == kSerialNorCfgOption_Tag)
    8.     {
    9.         status = flexspi_nor_get_config(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock, option);
    10.         // ...
    11.         isNorConfigOption = true;
    12.     }
    13.     else if (norConfig->memConfig.tag == FLEXSPI_CFG_BLK_TAG)
    14.     {
    15.         memcpy(&s_flexspiNorConfigBlock, norConfig, sizeof(flexspi_nor_config_t));
    16.         isNorConfigOption = true;
    17.     }
    18.     // ...

    19.     if (isNorConfigOption)
    20.     {
    21.         status = flexspi_nor_flash_init(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock);
    22.         // ...
    23.     }

    24.     return status;
    25. }
    复制代码
    上面这种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痞子衡便介绍完毕了,掌声在哪里~~~

    文章出处:痞子衡嵌入式

    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-24 15:28 , Processed in 0.105483 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表