痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数


  你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是超级下载算法开发笔记(4)之轮询Flash配置参数html

  文接上篇 《超级下载算法(RT-UFL)开发笔记(3) - 统一FlexSPI驱动访问》,如今超级下载算法中已经集成了BootROM版本的统一FlexSPI驱动,原则上BootROM能支持启动的全部串行NOR Flash型号,超级下载算法均可以对其进行擦写操做。BootROM虽然能够支持不少种不一样的Flash,但其须要依赖用户提供一个名为FDCB的配置结构体放置在Flash固定偏移处,BootROM先配置FlexSPI为1bit SDR低速模式去访问Flash获取到FDCB,而后从FDCB中获得当前Flash的所有属性再去从新初始化FlexSPI外设。然而超级下载算法无法从用户处获取到Flash的信息,只能自力更生,使用轮询的方法去不断尝试,直到试出合适的配置参数。git

  本篇是开发笔记第四篇,我们就重点聊聊如何让超级下载算法适用不一样厂商生产的不一样属性串行NOR Flash。github

1、BootROM对Flash的支持(FDCB)

  前言里讲了BootROM对Flash的支持是靠不一样的FDCB结构体配置值来实现的,这个FDCB一共512bytes,原型及各byte定义在i.MXRT1xxx参考手册System Boot章节里 Serial NOR configuration block (512 bytes) 一小节有详细介绍。这个FDCB主要是用于配置FlexSPI外设的,我们超级下载算法的 flexspi_nor_flash_init() 函数的一个主要参数 flexspi_nor_config_t 其实就是FDCB。算法

status_t flexspi_nor_flash_init(uint32_t instance, flexspi_nor_config_t *config);

  关于这个FDCB具体如何赋值,恩智浦官网有一些应用笔记,这些应用笔记介绍了一些典型的Flash型号应该匹配什么样的FDCB值,从这些应用笔记里咱们能够大概了解FDCB用法。数组

  上面的应用笔记里列举了一些BootROM支持的Flash型号,这些型号仅仅是恩智浦工程师验证过的型号,而客户在实际项目中用到的Flash型号远远不止这些。从Flash型号自己角度来看,不一样厂商的不一样型号是独特且惟一的,但从FDCB角度而言,不少同类型Flash型号实际上是同样的配置值。微信

2、快速生成FDCB的方法(config option)

  那么咱们如今是否是直接在超级下载算法中穷举不一样的FDCB值去轮询呢?要知道FDCB有512bytes,这是个不小的结构体,轮询一遍太费时且低效了。咱们须要进一步提炼FDCB,将其精简一下,只轮询那些跟Flash类型紧密相关的参数。这个工做其实也不须要咱们作了,恩智浦ROM研发小组已经作好了,那即是8bytes的config option配置结构体,这个配置结构体也是超级下载算法的 flexspi_nor_get_config() 函数的一个主要参数 serial_nor_config_option_t。函数

status_t flexspi_nor_get_config(uint32_t instance, flexspi_nor_config_t *config, serial_nor_config_option_t *option);

  其实这个神奇的8bytes的config option配置结构体不止一次地出现过痞子衡以前的文章里:《致使串行NOR Flash在i.MXRT下没法正常下载/启动的常见因素之SFDP》《致使串行NOR Flash在i.MXRT下没法正常下载/启动的常见因素之QE bit》《FlexSPI NOR启动时间(RT1170)》《MCUBootUtility v2.3发布,此次再也不放过任何一款Flash》,它很是精炼地归纳了市面上主要的串行NOR Flash特性(都要符合JESD216规范),只要你提供config option,通过 flexspi_nor_get_config() 函数执行后即可以自动生成相对应的完整FDCB。flex

  在i.MXRTxxx参考手册Non-Secure Boot ROM章节里你能够找到以下典型Flash型号对应的参考config option值:ui

3、利用config option来作轮询

  直接利用512bytes的FDCB去轮询太难,但利用8bytes的config option去轮询就简单多了。咱们顺着上文中说起的ufl_target_desc_t结构体,在其中新增几个成员(FlexSPI外设编号/基址/映射地址,config option),其中轮询主要跟config option有关。.net

typedef struct _target_desc
{
    uint32_t imxrtChipId;
    uint32_t flexspiInstance;                 // 新增
    uint32_t flexspiBaseAddr;                 // 新增
    uint32_t flashBaseAddr;                   // 新增
    serial_nor_config_option_t configOption;  // 新增
    flexspi_nor_flash_driver_t flashDriver;
    flexspi_bsp_driver_t flexspiBsp;
} ufl_target_desc_t;

  而后咱们定义一个config option型的数组 s_flashConfigOpt[],里面存放一些经典的config option值。当前痞子衡的设计是仅轮询这些经典的config option值,并无穷举config option,这也是从超级下载算法的执行效率角度考虑,这些经典的config option值足以覆盖80%以上的Flash型号了(后期若是要提升Flash覆盖率,会考虑转到穷举法的)。

static const serial_nor_config_option_t s_flashConfigOpt[] = {
    // For Normal Quad, eg. IS25LP064A, GD25LB256E
    {.option0.U = 0xc0000001, .option1.U = 0x00000000},

    // For Normal Octal, eg. MX25UM51345G
    {.option0.U = 0xc0403001, .option1.U = 0x00000000},
    {.option0.U = 0xc1503051, .option1.U = 0x20000014},

    // For Normal HyperBus, eg. S26KS512S, IS26KS512S
    {.option0.U = (0xc0233000 + kSerialNorCfgOption_MaxFreq), .option1.U = 0x00000000},

    // For Normal Octal, eg. MX25UM51245G
    {.option0.U = 0xc0403031, .option1.U = 0x00000000},

    // For Normal Octal, eg. MT35X
    {.option0.U = 0xc0603001, .option1.U = 0x00000000},
    // For Normal Octal, eg. ATXP032
    {.option0.U = 0xc0803001, .option1.U = 0x00000000},

    // For Normal 1-bit SDR
    {.option0.U = FLASH_CONFIG_OPT_1BIT_SDR, .option1.U = 0x00000000},
};

  关于具体轮询操做,源码在 RT-UFL 项目中的ufl_auto_probe_flash.c 文件里,痞子衡就再也不贴出了,只讲一下几个要点:

  • 要点 1: 对于一些SIP版本的i.MXRT型号,没有必要再轮询了,直接给预设的config option值便可。
  • 要点 2: config option参数轮询成功的判断标准是,执行初始化->擦->写操做均正常(或许还要加入回读校验)。
  • 要点 3: 当前config option参数轮询失败进到下一个option值前须要对FlexSPI外设进行复位(有条件的话还要对Flash进行复位)。
  • 要点 4: 不一样Flash型号支持的最大速度不一样,轮询时老是先从最低速开始,慢慢增速到最大支持的速度(当前是100MHz,后期会调整)。
  • 要点 5: 为了照顾没有SFDP表的Flash(或不符合JESD216规范),轮询过程里增长了一个1bit SDR属性的FDCB表做为最后一个保底轮询。

  至此,超级下载算法开发笔记(4)之轮询Flash配置参数痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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