zoukankan      html  css  js  c++  java
  • 痞子衡嵌入式:导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP


      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是导致串行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发展至今已经诞生了如下版本:

    时间 标准
    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之间轻松切换。

    二、部分Flash型号不支持SFDP

      因为SFDP标准是2011年才开始推出,新兴Flash厂商(比如兆易创新)的产品基本都是支持SFDP标准的,而部分老牌Flash厂商(比如华邦)则存在老型号和新型号共存的问题。老型号都是2011年前设计生产的,不支持SFDP;2011年之后设计的新型号基本都是支持SFDP的。

      华邦目前是串行Flash第一大厂商,痞子衡遇到好几个i.MXRT客户,选用的华邦NOR Flash,但Flash里不支持SFDP,因此客户支持稍微复杂一些。关于SFDP支持问题,痞子衡特别联系过华邦销售人员,得到了他们的答复,华邦NOR Flash家族里 W25QxxJVW25QxxJW 系列都是新型号,全部支持SFDP;而 W25QxxFVW25QxxFW 系列属于老型号,大多没有SFDP,但是也有如下部分型号支持SFDP:

      虽然我们可以在后续开发的过程中也能正常使用非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-EVKmiddlewaremcu-bootsrcmemorysrcflexspi_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支持:

    1. J-Link下载算法源工程,可以参考 /boards/msft_rt600_xproject/flash_algo_b0_silicon/Keil_JLink 这个源工程
    2. MCUBootUtility v2.3更新,参看文章 《MCUBootUtility v2.3发布,这次不再放过任何一款Flash》 第2.3节

      至此,导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP痞子衡便介绍完毕了,掌声在哪里~~~

    欢迎订阅

    文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

    微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

  • 相关阅读:
    vue 按需加载
    需要打印真实尺寸大小等需求的,css的单位可以使用mm等做单位
    d3 比例尺
    d3 根据数据绘制svg
    d3 svg简单学习
    d3 使用随机数据生成条形图
    d3 画简单的柱形图
    d3 使用数据
    d3 数据绑定
    d3 添加元素相关api
  • 原文地址:https://www.cnblogs.com/henjay724/p/13602259.html
Copyright © 2011-2022 走看看