关于i.MX RT1xxx系列芯片BootROM中集成的DCD功能这个话题,早就想写了,但是一直没有动笔,毕竟这个话题比较生涩,单独讲会比较枯燥。最近在支持一个i.MX RT1170客户,需要在客户板卡上跑其应用代码的压力测试,但是客户因为保密的缘故仅提供了应用可执行文件,而我们又需要在客户应用里额外加一些配置代码做测试,测试过程中会涉及多次断电上电,如果挂外部调试器去做额外配置又太繁琐,这时候DCD功能就派上用场了。
注:文中贴图、代码主要以i.MX RT1170为例,其余i.MX RT1xxx系列原理类似。
一、DCD是什么及其应用场景
DCD是Device Configuration Data缩写,这是i.MX RT1xxx系列芯片BootROM里带的一个附加功能,主要用于App启动前系统外设的用户定制化配置。我们知道i.MX RT1xxx系列芯片上电永远都是BootROM代码先执行,然后由BootROM再去加载App执行。如果希望在App执行前系统就已经被配置到指定状态(即不需要在App里去做这方面系统设置),那就需要借助DCD功能,你只需要按格式将DCD数据放到Boot Device指定偏移处即可,BootROM会自动去解析执行。
翻看芯片参考手册Device Configuration Data(DCD)章节,你会发现DCD数据设计特别简单,它总共支持三类命令:Writedata(Tag是0xCC)、Checkdata(Tag是0xCF)、NOP(Tag是0xC0),这三类命令就是为了读写芯片外设寄存器而设计的,我们需要做的,就是组合这三类命令,完成指定外设模块寄存器的设置序列。
任意打开一个RT1170 SDK示例工程,都会包含dcd.c/h文件(仅当工程选项预编译宏里有XIP_BOOT_HEADER_DCD_ENABLE=1才会被使能)。
随便摘其中两句分析下,第一句表明是Writedata命令的*address=val_msk动作合集,第二句是执行*((uint32_t*)0x40CC0200)=0x00000703,也就是CCM->CLOCK_ROOT[kCLOCK_Root_Semc].CONTROL=0x703。
/*#1.1-129,commandheaderbytesformerged'Write-value'command*/ 0xCC,0x04,0x0C,0x04, /*#1.1,command:write_value,address:CCM_CLOCK_ROOT4_CONTROL,value:0x703,size:4*/ 0x40,0xCC,0x02,0x00,0x00,0x00,0x07,0x03,
接着这个示例dcd.c内容继续聊,这其实是配置芯片SEMC外设,去初始化外部SDRAM的全部序列。
有了这个DCD设置,那么App里就可以不用管外部SDRAM初始化工作了,直接读写访问SDRAM完成相应应用业务功能即可,这也是DCD的典型应用场景。如果应用代码直接是全部在SDRAM执行,在不设计用户二级Bootloader做加载的情况下,DCD是必选的解决方案。
二、以实际客户案例代入DCD使用
现在回到客户的实际案例,客户RT1170板卡上用了一颗来自MXIC的OctalFlash,代码是执行在Flash上,现在我们需要测试不同FlexSPI1->DLLACR[SLVDLYTARGET]设置下的工作情况,而我们手头仅有客户可执行文件。 将客户可执行文件下载进板卡,并设置启动模式为从Flash启动(2'b10),然后挂上JLINK调试器读取FlexSPI1->DLLACR寄存器值(该寄存器地址是0x400cc0c0),得到0x00400079,其中SLVDLYTARGET是默认的理想值4'b1111,这个值是BootROM自动配置的,我们无法通过FDCB启动头来更改设置。
为了做压力测试,我们需要更改不同的FlexSPI1->DLLACR[SLVDLYTARGET]值,比如将其设为4'b1000,这时候可以借助DCD来实现,我们直接使用MCUBootUtility工具(需要使用v4.1.1版本及以上)来使能DCD。 下载地址:https://github.com/JayHeng/NXP-MCUBootUtility/archive/refs/tags/v4.1.1.zip 将客户板卡启动模式改为SerialDownload(2'b01),插上UART/USB下载线,打开MCUBootUtility工具,在DCD设置界面里启用"UseDCDdescription"选项,并在动作框里直接输入下面语句(这里直接是类C语法,会被工具自动转成DCD数据),然后连接、下载。 *(uint32_t*)0x400cc0c0=0x00400041;
将板卡设为从Flash启动模式后重新上电,挂上JLINK再去读取,此时FlexSPI1->DLLACR已经是期望的0x00400041,说明DCD功能生效了。这里还有一个注意事项,即BootROM利用FDCB启动头配置FlexSPI外设在前,解析执行DCD数据在后,所以我们才能借助DCD实现这样的更改测试。
三、DCD能配置全部外设吗?
看起来DCD特别强大,那么它能帮助操作Arm 4GB系统空间里的全部地址吗?答案是否定的,出于安全考虑,BootROM里做了地址限制,我们仅能用DCD操作如下指定的一些外设(不同i.MX RT系列有所不同):
也就是说,寄存器地址落在这个区间的外设,可以通过DCD配置,其它的则不可以。
全部0条评论
快来发表一下你的评论吧 !