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