關(guān)于i.MX RT1xxx系列芯片BootROM中集成的DCD功能這個話題,早就想寫了,但是一直沒有動筆,畢竟這個話題比較生澀,單獨(dú)講會比較枯燥。最近在支持一個i.MX RT1170客戶,需要在客戶板卡上跑其應(yīng)用代碼的壓力測試,但是客戶因?yàn)楸C艿木壒蕛H提供了應(yīng)用可執(zhí)行文件,而我們又需要在客戶應(yīng)用里額外加一些配置代碼做測試,測試過程中會涉及多次斷電上電,如果掛外部調(diào)試器去做額外配置又太繁瑣,這時候DCD功能就派上用場了。
注:文中貼圖、代碼主要以i.MX RT1170為例,其余i.MX RT1xxx系列原理類似。
一、DCD是什么及其應(yīng)用場景
DCD是Device Configuration Data縮寫,這是i.MX RT1xxx系列芯片BootROM里帶的一個附加功能,主要用于App啟動前系統(tǒng)外設(shè)的用戶定制化配置。我們知道i.MX RT1xxx系列芯片上電永遠(yuǎn)都是BootROM代碼先執(zhí)行,然后由BootROM再去加載App執(zhí)行。如果希望在App執(zhí)行前系統(tǒng)就已經(jīng)被配置到指定狀態(tài)(即不需要在App里去做這方面系統(tǒng)設(shè)置),那就需要借助DCD功能,你只需要按格式將DCD數(shù)據(jù)放到Boot Device指定偏移處即可,BootROM會自動去解析執(zhí)行。
翻看芯片參考手冊Device Configuration Data(DCD)章節(jié),你會發(fā)現(xiàn)DCD數(shù)據(jù)設(shè)計特別簡單,它總共支持三類命令:Writedata(Tag是0xCC)、Checkdata(Tag是0xCF)、NOP(Tag是0xC0),這三類命令就是為了讀寫芯片外設(shè)寄存器而設(shè)計的,我們需要做的,就是組合這三類命令,完成指定外設(shè)模塊寄存器的設(shè)置序列。
任意打開一個RT1170 SDK示例工程,都會包含dcd.c/h文件(僅當(dāng)工程選項(xiàng)預(yù)編譯宏里有XIP_BOOT_HEADER_DCD_ENABLE=1才會被使能)。

隨便摘其中兩句分析下,第一句表明是Writedata命令的*address=val_msk動作合集,第二句是執(zhí)行*((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內(nèi)容繼續(xù)聊,這其實(shí)是配置芯片SEMC外設(shè),去初始化外部SDRAM的全部序列。
有了這個DCD設(shè)置,那么App里就可以不用管外部SDRAM初始化工作了,直接讀寫訪問SDRAM完成相應(yīng)應(yīng)用業(yè)務(wù)功能即可,這也是DCD的典型應(yīng)用場景。如果應(yīng)用代碼直接是全部在SDRAM執(zhí)行,在不設(shè)計用戶二級Bootloader做加載的情況下,DCD是必選的解決方案。
二、以實(shí)際客戶案例代入DCD使用
現(xiàn)在回到客戶的實(shí)際案例,客戶RT1170板卡上用了一顆來自MXIC的OctalFlash,代碼是執(zhí)行在Flash上,現(xiàn)在我們需要測試不同F(xiàn)lexSPI1->DLLACR[SLVDLYTARGET]設(shè)置下的工作情況,而我們手頭僅有客戶可執(zhí)行文件。 將客戶可執(zhí)行文件下載進(jìn)板卡,并設(shè)置啟動模式為從Flash啟動(2'b10),然后掛上JLINK調(diào)試器讀取FlexSPI1->DLLACR寄存器值(該寄存器地址是0x400cc0c0),得到0x00400079,其中SLVDLYTARGET是默認(rèn)的理想值4'b1111,這個值是BootROM自動配置的,我們無法通過FDCB啟動頭來更改設(shè)置。

為了做壓力測試,我們需要更改不同的FlexSPI1->DLLACR[SLVDLYTARGET]值,比如將其設(shè)為4'b1000,這時候可以借助DCD來實(shí)現(xiàn),我們直接使用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設(shè)置界面里啟用"UseDCDdescription"選項(xiàng),并在動作框里直接輸入下面語句(這里直接是類C語法,會被工具自動轉(zhuǎn)成DCD數(shù)據(jù)),然后連接、下載。 *(uint32_t*)0x400cc0c0=0x00400041;

將板卡設(shè)為從Flash啟動模式后重新上電,掛上JLINK再去讀取,此時FlexSPI1->DLLACR已經(jīng)是期望的0x00400041,說明DCD功能生效了。這里還有一個注意事項(xiàng),即BootROM利用FDCB啟動頭配置FlexSPI外設(shè)在前,解析執(zhí)行DCD數(shù)據(jù)在后,所以我們才能借助DCD實(shí)現(xiàn)這樣的更改測試。

三、DCD能配置全部外設(shè)嗎?
看起來DCD特別強(qiáng)大,那么它能幫助操作Arm 4GB系統(tǒng)空間里的全部地址嗎?答案是否定的,出于安全考慮,BootROM里做了地址限制,我們僅能用DCD操作如下指定的一些外設(shè)(不同i.MX RT系列有所不同): 
也就是說,寄存器地址落在這個區(qū)間的外設(shè),可以通過DCD配置,其它的則不可以。
-
寄存器
+關(guān)注
關(guān)注
31文章
5587瀏覽量
128984 -
ROM
+關(guān)注
關(guān)注
4文章
578瀏覽量
88509 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
325瀏覽量
24914 -
SDK
+關(guān)注
關(guān)注
3文章
1093瀏覽量
51146 -
DCD
+關(guān)注
關(guān)注
0文章
8瀏覽量
2655
原文標(biāo)題:利用i.MX RT1xxx系列ROM集成的DCD功能可輕松配置指定外設(shè)
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
i.MX RT1xxx 系列的時鐘系統(tǒng)以及相關(guān)功能引腳
i.MX RT10xx系列外部晶振相關(guān)引腳的作用
介紹的是i.MX RT1xxx系列MCU的Parallel NOR啟動
介紹i.MX RT1xxx系列MCU的Raw NAND啟動
恩智浦i.MX RT1170在將該系列帶上了更高的層面
i.MX RT開發(fā)筆記-08 | i.MX RT1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)
痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(4)- Flashloader初體驗(yàn)(blhost)...
RT-Thread & NXP 發(fā)布 i.MX RT 系列 BSP 新框架
痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(9)- 從Parallel NOR啟動
痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(8)- 從Raw NAND啟動
利用i.MXRT1xxx系列ROM集成的DCD功能可輕松配置指定外設(shè)
理解i.MX RT中FlexSPI外設(shè)lookupTable里配置訪問行列混合尋址Memory的參數(shù)值
XMCD – i.MX RT11xx系列簡單易用的特定外設(shè)配置功能

利用i.MX RT1xxx系列ROM集成的DCD功能可輕松配置指定外設(shè)
評論