痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是超级下载算法开发笔记(4)之轮询Flash配置参数。
文接上篇 《超级下载算法(RT-UFL)开发笔记(3) - 统一FlexSPI驱动访问》,现在超级下载算法中已经集成了BootROM版本的统一FlexSPI驱动,原则上BootROM能支持启动的所有串行NOR Flash型号,超级下载算法都可以对其进行擦写操作。BootROM虽然可以支持很多种不同的Flash,但其需要依赖用户提供一个名为FDCB的配置结构体放置在Flash固定偏移处,BootROM先配置FlexSPI为1bit SDR低速模式去访问Flash获取到FDCB,然后从FDCB中得到当前Flash的全部属性再去重新初始化FlexSPI外设。然而超级下载算法没法从用户处获取到Flash的信息,只能自力更生,使用轮询的方法去不断尝试,直到试出合适的配置参数。
本篇是开发笔记第四篇,咱们就重点聊聊如何让超级下载算法适用不同厂商生产的不同属性串行NOR Flash。
一、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型号其实是一样的配置值。
二、快速生成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。
在i.MXRTxxx参考手册Non-Secure Boot ROM章节里你可以找到如下典型Flash型号对应的参考config option值:
三、利用config option来做轮询
直接利用512bytes的FDCB去轮询太难,但利用8bytes的config option去轮询就简单多了。我们顺着上文中提及的ufl_target_desc_t结构体,在其中新增几个成员(FlexSPI外设编号/基址/映射地址,config option),其中轮询主要跟config option有关。
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主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。
痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数的更多相关文章
- 痞子衡嵌入式:深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程. 从外部串行NOR Flash启动问题是i.MXRT系列开发最 ...
- 痞子衡嵌入式:了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点. 前段时间痞子衡写了一篇 <深入i.MXRT1050系 ...
- 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...
- 痞子衡嵌入式:ARM Cortex-M内核MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是ARM Cortex-M内核微控制器相关知识. ARM公司从2004年开始推出Cortex-M系列内核,迄今Cortex-M家族已经包 ...
- 痞子衡嵌入式:恩智浦LPC系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦LPC系列微控制器相关知识. 恩智浦半导体最早于2003年便开始推出LPC系列MCU,但早期的产品LPC2000/3000系列属 ...
- 痞子衡嵌入式:超级下载算法RT-UFL v1.0在Keil MDK下的使用
痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...
- 痞子衡嵌入式:超级下载算法RT-UFL v1.0发布,附J-Link下安装教程
痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> 历时 8 个月终于迎来了 v1.0 版发布,因为是第一个正式版,为了保证质 ...
- 痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计
大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的开源项目 RT-UFL. 痞子衡在近两年多的i.MXRT客户项目支持过程中,遇到的一个相当高频的问题就是制作i.MXRT下载算法.我们 ...
随机推荐
- Centos 7 关机和重启 命令
1,关机命令 1 shutdown -h now/0 2 halt 3 init 0 4 poweroff 5 举例: 6 shutdown -h 3 ------3分钟后关机(可用shutdown ...
- 深度学习DeepLearning技术实战(12月18日---21日)
12月线上课程报名中 深度学习DeepLearning(Python)实战培训班 时间地点: 2020 年 12 月 18 日-2020 年 12 月 21日 (第一天报到 授课三天:提前环境部署 电 ...
- Flask的配置文件加载两种方式
配置文件 1 基于全局变量 2 基于类的方式 配置文件的加载需要将配合文件的相对路径添加到app.config.from_object("文件路径"),类的方式也是一样,需要将类的 ...
- 2.kafka架构深入——生产者
一个topic有多个partition,每个partition又有多个副本,在这些副本中又有一个leader和多个follower. 1)分区的原因 (1)方便在集群中扩展,每个Partition可以 ...
- 回滚原理 Since database connections are thread-local, this is thread-safe.
mysql django 实践: django @transaction.atomic 机制分析 1.数据库清空表Tab 2.请求django-view @transaction.at ...
- 消息队列扫盲(RocketMQ 入门)
消息队列扫盲 消息队列顾名思义就是存放消息的队列,队列我就不解释了,别告诉我你连队列都不知道似啥吧? 所以问题并不是消息队列是什么,而是 消息队列为什么会出现?消息队列能用来干什么?用它来干这些事会带 ...
- ThinkPHP 5.0.24 反序列化RCE (Windows下EXP)
直接上exp吧,Windows下. <?php namespace think\process\pipes; class Windows { private $files = []; publi ...
- three.js cannon.js物理引擎之制作拥有物理特性的汽车
今天郭先生说一说使用cannon.js的车辆辅助类让我们的汽车模型拥有物理特性.效果图如下,在线案例请点击博客原文. 下面我们说一下今天要使用的两个类,并简单的看看他们的物理意义 1. Raycast ...
- 深入理解java虚拟机,GC参考手册
深入理解java虚拟机 一.<深入理解Java虚拟机> 1.第2章 Java内存区域与内存溢出异常 2.第3章 垃圾收集器与内存分配策略 3.第4章 虚拟机性能监控与故障处理工具 4.第5 ...
- hadoop的Namenode HA原理详解
为什么要Namenode HA? 1. NameNode High Availability即高可用. 2. NameNode 很重要,挂掉会导致存储停止服务,无法进行数据的读写,基于此NameNod ...