關于i.MX RT1xxx系列芯片BootROM中集成的DCD功能這個話題,早就想寫了,但是一直沒有動筆,畢竟這個話題比較生澀,單獨講會比較枯燥。最近在支持一個i.MX RT1170客戶,需要在客戶板卡上跑其應用代碼的壓力測試,但是客戶因為保密的緣故僅提供了應用可執(zhí)行文件,而我們又需要在客戶應用里額外加一些配置代碼做測試,測試過程中會涉及多次斷電上電,如果掛外部調試器去做額外配置又太繁瑣,這時候DCD功能就派上用場了。
注:文中貼圖、代碼主要以i.MX RT1170為例,其余i.MX RT1xxx系列原理類似。
一、DCD是什么及其應用場景
DCD是Device Configuration Data縮寫,這是i.MX RT1xxx系列芯片BootROM里帶的一個附加功能,主要用于App啟動前系統(tǒng)外設的用戶定制化配置。我們知道i.MX RT1xxx系列芯片上電永遠都是BootROM代碼先執(zhí)行,然后由BootROM再去加載App執(zhí)行。如果希望在App執(zhí)行前系統(tǒng)就已經被配置到指定狀態(tài)(即不需要在App里去做這方面系統(tǒng)設置),那就需要借助DCD功能,你只需要按格式將DCD數(shù)據(jù)放到Boot Device指定偏移處即可,BootROM會自動去解析執(zhí)行。
翻看芯片參考手冊Device Configuration Data(DCD)章節(jié),你會發(fā)現(xiàn)DCD數(shù)據(jù)設計特別簡單,它總共支持三類命令:Writedata(Tag是0xCC)、Checkdata(Tag是0xCF)、NOP(Tag是0xC0),這三類命令就是為了讀寫芯片外設寄存器而設計的,我們需要做的,就是組合這三類命令,完成指定外設模塊寄存器的設置序列。
任意打開一個RT1170 SDK示例工程,都會包含dcd.c/h文件(僅當工程選項預編譯宏里有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內容繼續(xù)聊,這其實是配置芯片SEMC外設,去初始化外部SDRAM的全部序列。
有了這個DCD設置,那么App里就可以不用管外部SDRAM初始化工作了,直接讀寫訪問SDRAM完成相應應用業(yè)務功能即可,這也是DCD的典型應用場景。如果應用代碼直接是全部在SDRAM執(zhí)行,在不設計用戶二級Bootloader做加載的情況下,DCD是必選的解決方案。
二、以實際客戶案例代入DCD使用
現(xiàn)在回到客戶的實際案例,客戶RT1170板卡上用了一顆來自MXIC的OctalFlash,代碼是執(zhí)行在Flash上,現(xiàn)在我們需要測試不同F(xiàn)lexSPI1->DLLACR[SLVDLYTARGET]設置下的工作情況,而我們手頭僅有客戶可執(zhí)行文件。 將客戶可執(zhí)行文件下載進板卡,并設置啟動模式為從Flash啟動(2'b10),然后掛上JLINK調試器讀取FlexSPI1->DLLACR寄存器值(該寄存器地址是0x400cc0c0),得到0x00400079,其中SLVDLYTARGET是默認的理想值4'b1111,這個值是BootROM自動配置的,我們無法通過FDCB啟動頭來更改設置。
為了做壓力測試,我們需要更改不同的FlexSPI1->DLLACR[SLVDLYTARGET]值,比如將其設為4'b1000,這時候可以借助DCD來實現(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設置界面里啟用"UseDCDdescription"選項,并在動作框里直接輸入下面語句(這里直接是類C語法,會被工具自動轉成DCD數(shù)據(jù)),然后連接、下載。 *(uint32_t*)0x400cc0c0=0x00400041;
將板卡設為從Flash啟動模式后重新上電,掛上JLINK再去讀取,此時FlexSPI1->DLLACR已經是期望的0x00400041,說明DCD功能生效了。這里還有一個注意事項,即BootROM利用FDCB啟動頭配置FlexSPI外設在前,解析執(zhí)行DCD數(shù)據(jù)在后,所以我們才能借助DCD實現(xiàn)這樣的更改測試。
三、DCD能配置全部外設嗎?
看起來DCD特別強大,那么它能幫助操作Arm 4GB系統(tǒng)空間里的全部地址嗎?答案是否定的,出于安全考慮,BootROM里做了地址限制,我們僅能用DCD操作如下指定的一些外設(不同i.MX RT系列有所不同):
也就是說,寄存器地址落在這個區(qū)間的外設,可以通過DCD配置,其它的則不可以。
-
寄存器
+關注
關注
31文章
5343瀏覽量
120377 -
ROM
+關注
關注
4文章
572瀏覽量
85773 -
調試器
+關注
關注
1文章
305瀏覽量
23741 -
SDK
+關注
關注
3文章
1036瀏覽量
45951 -
DCD
+關注
關注
0文章
8瀏覽量
2407
原文標題:利用i.MX RT1xxx系列ROM集成的DCD功能可輕松配置指定外設
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論