https://www.nxp.com/docs/en/application-note/AN12419.pdf
AN12419講述了關于Secure JTAG的原理、如何修改fuse實現Secure JTAG功能,以及JLINKscript相關文件內容,給出了使用JLINK commander形式實現了內核的識別。通常情況下,內核能夠找到就說明Secure JTAG已經成功了,但在實際的使用中,客戶還是會遇到很多問題。比如:SecureJTAG找不到內核或時有時無;如何在通用的IDE,MCUXPresso,IAR, MDK中添加Secure JTAG的功能,從而實現基于Secure JTAG debug的功能等。多說一句,關于secure JTAG的測試,實際上還是需要一點成本的,因為需要修改fuse,如果粗心修改錯了fuse的位置,那么可能導致無法恢復的問題。由于每個客戶的情況不盡相同,小編也做了較多測試,借助其他部門帶有芯片夾能夠換芯片的板子測試,測過RT1050,RT1060, RT1064,但在實際使用中,仍有些客戶提到EVK上會復現,導致小編一度懷疑是否和EVK不一致所導致,所以也測過RT1060,RT1064 EVK的secure JTAG。
本文就把之前所有相關經驗寫入到這篇文章,便于后來者遇到類似問題能夠有個參考,避免一些不必要的雷區踏入,請大家借鑒。
二、本文測試平臺情況MIMXRT1064-EVKrevA: RT1060-EVK, RT1050-EVKB 情況類似
SDK_2_13_0_EVK-MIMXRT1064
MCUXpressoIDE v11.7.1_9221
MDKV5.36:高版本也是如此
IAR 9.30.1:高版本也是如此
SeggerJLINK plus
JLINK驅動V788D
NXP-MCUBootUtility-5.1.
三、RT1064 secure JTAG修改
通常情況下,不建議客戶一股腦把所有的相關fuse直接燒完然后再測,小編通常情況下會循序漸進,硬件摸排,保證能支持JTAG,然后fuse原始讀取保持,燒JTAG,測JTAG,最后上secure JTAG的其他fuse燒錄和測試。
3.1MIMXRT1064-EVK硬件修改對于RT10XX EVK,默認和芯片一樣,是支持SWD的,JTAG的引腳從硬件上連接到了其他的硬件模塊,所以會對JTAG有所影響,在確定要使用JTAG的時候,需要修改電路,正如MIMXRT105060HDUG說的那樣:
(1). Burn fuse DAP_SJC_SWD_SEL from ‘0’ to ‘1’ to choose JTAG.
(2). DNP R323,R309,R152 to isolate JTAG multiplexed signals.
(3). Keep off J47 to J50to isolate board level debugger.
當然,這里硬件目前只需要修改,去掉R323, R309, R152,然后斷開J47,J48,J49,J50。使用Segger JLINK JTAG連接到EVK J21。
3.2 原始fuse讀取 首先MIMXRT1064-EVK板子進入到serial download模式,SW7:1-OFF,2-OFF,3-OFF,4-ON。使用MCUBootUtility工具連接EVK,并且讀取初始fuse map,情況如下:
3.3 JTAG 修改與測試
修改fuse實現SWD->JTAG:0X460[19]DAP_SJC_SWD_SEL=1:
JTAG方式測試連接,找到內核:
如果找不到內核,說明硬件修改不正確,或者fuse修改的位置不對,需要自行進一步檢查,確保JLINK commander的JTAG能夠找到內核,才能繼續下一步。
3.4 secureJTAG 修改
修改fuse實現secure JTAG:
0X460[23:22]:JTAG_SMODE =1
0X460[26]: KTE_FUSE=1
0X610,0X600燒錄key: 0xedcba987654321,用戶可以燒錄自己的key,記錄下來放到自己的JLINKscript中皆可。
上面的相關的secure JTAG fuse和key fuse燒錄好之后,最后燒錄fuse 0X400[6]: SJC_RESP_LOCK=1,關閉secret response key的讀寫:
可以看到,這里的0X600,0X610key區域已經不可見。這里記錄下UUID0,UUID1,后續需要腳本讀取的時候進行正確性查看。
3.5 secureJTAG JLINK commander測試
因為在secure JTAG的連接過程中,需要拉低拉高JTAG_MOD引腳,所以需要接一根線用于拉低拉高JTAG_MOD,MIMXRT1064-EVK可以使用J25_4,該引腳是3.3V,JTAG_MOD信號使用TP11測試點。默認JTAG_MOD是拉低,需要拉高的時候,可以接到J25_4.測試過程中需要使用到JLINK script,腳本內容如下,具體查看附件NXP_RT1064_SecureJTAG.JlinkScript:
int InitTarget(void) {
int r;
int v;
int Key0;
int Key1;
JLINK_SYS_Report("***********************************************");
JLINK_SYS_Report("J-Link script: InitTarget() *");
JLINK_SYS_Report("NXP iMXRT, Enable Secure JTAG *");
JLINK_SYS_Report("***********************************************");
JLINK_SYS_MessageBox("Set pin JTAG_MOD => 1 and press any key to continue...");
// Secure response stored @ 0x600, 0x610 in eFUSE region (OTP memory)
Key0 = 0x87654321;
Key1 = 0xedcba9;
JLINK_CORESIGHT_Configure("IRPre=0;DRPre=0;IRPost=0;DRPost=0;IRLenDevice=5");
CPU = CORTEX_M7;
JLINK_SYS_Sleep(100);
JLINK_JTAG_WriteIR(0xC); // Output Challenge instruction
// Readback Challenge, Shift 64 dummy bits on TDI, TODO: receive Challenge bits on TDO
JLINK_JTAG_StartDR();
JLINK_SYS_Report("Reading Challenge ID....");
JLINK_JTAG_WriteDRCont(0xffffffff, 32); // 32-bit dummy write on TDI / read 32 bits on TDO
v = JLINK_JTAG_GetU32(0);
JLINK_SYS_Report1("Challenge UUID0:", v);
JLINK_JTAG_WriteDREnd(0xffffffff, 32);
v = JLINK_JTAG_GetU32(0);
JLINK_SYS_Report1("Challenge UUID1:", v);
JLINK_JTAG_WriteIR(0xD); // Output Response instruction
JLINK_JTAG_StartDR();
JLINK_JTAG_WriteDRCont(Key0, 32);
JLINK_JTAG_WriteDREnd(Key1, 24);
JLINK_SYS_MessageBox("Change pin JTAG_MOD => 0, press any key to continue...");
return 0;
}
SecJtag.bat文件如下:jlink.exe-JLinkScriptFile NXP_RT1064_SecureJTAG.JlinkScript -device MIMXRT1064XXX6A -ifJTAG -speed 4000 -autoconnect 1 -JTAGConf -1,-1;主要用于使用JLINK commander和JLINKscript實現secure JTAG的連接。將SecJtag.bat,JLink.exe, NXP_RT1064_SecureJTAG.JlinkScript三個文件放到一個文件夾。
測試時可以配置板子到internal boot模式:SW7:1-OFF,2-OFF,3-ON, 4-OFF.
運行SecJtag.bat測試情況如下:首先提示連接JTAG_MOD到1:
這個時候板子上,使用杜邦線連接J25_4和TP11, 也就是將JTAG_MOD=1,點擊OK,進入下一步:
這里可以看到,已經能夠識別正確的UUID,和上面MCUBootutility讀到的UUID一致,很多客戶在這個地方就不能讀到正確的UUID,說明要么硬件修改有問題,要么fuse修改有問題,要么另外一種情況,app里面JTAG引腳沒使能,后續詳細講。
這里松開TP11和J25_4的連接,默認為JTAG_MOD=0,點擊OK,繼續:這里可以看到,ARM CM7內核已經成功找到,意味著,硬件平臺已經能夠實現JTAG的通訊。下面可以進入IDE Secure JTAG debug階段了。
四、Secure JTAG在三大IDE的debug
本章針對如何使用secure JTAG在RT10XX常用三大IDE:mcuxpresso, IAR, MDK中實現secure jtag的代碼debug運行。
4.1 軟件代碼準備
本文選擇SDK的hello_world工程測試:
SDK_2_13_0_EVK-MIMXRT1064oardsevkmimxrt1064demo_appshello_world這里需要注意兩個點:(1)不要直接使用led_blinky,因為代碼使用的led控制引腳GPIO_AD_B0_09是 JTAG_TDI,會導致下載了這個代碼之后,不能實現下次的Secure JTAG連接,因為JTAG的引腳功能被修改;
(2)在app pinmux.c中添加對于JTAG的引腳配置,否則會因為缺少JTAG的引腳配置,出現一種現象,空的RT1064,也就是沒有燒過代碼的片子能夠使用Secure JTAG連接,一旦燒錄代碼之后,就無法連接的情況。Pinmux.c添加如下代碼:
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_11_JTAG_TRSTB, 0U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_06_JTAG_TMS, 0U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_07_JTAG_TCK, 0U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_JTAG_TDI, 0U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_10_JTAG_TDO, 0U);
4.2 MCUXpressoSecure JTAG debug使用MCUXpresso IDE導入hello world代碼,修改pinmux.c,添加JTAG引腳配置。
配置MCUXPresso IDE的JLinkGDBServerCL.exe版本為使用的JLINK驅動版本,Window->preferences:
Run->Debugconfigurations,配置為JTAG,選擇device為MIMXRT1064xxx6A,添加JLINKscript腳本:
連接JTAG_MOD=1, 即TP11連接J25_4,點擊OK:
可以看到,已經獲取到正確的UUID,并且要求連接JTAG_MOD=0, 這時候讓TP11懸空,點擊OK繼續:這時候已經能夠成功進入到debug模式,能夠仿真,具體可以查看附件中的MCUXpresso11_7_1_MIMXRT1064_SJTAG.mp4文件。
這里測試經驗是,發現MCUXpresso V11.7.1有點不太穩定,需要多試幾次,但是后續的V11.8.0版本,下載非常穩定。如果能夠拿到高于V11.7.1的版本,建議使用高版本IDE。
4.3 IAR SecureJTAG debug
有些客戶需要使用IAR版本debug Secure JTAG功能,可以使用SDK demo中的helloworld,修改pinmux.c添加JTAG引腳配置代碼。
不同之處在于:(1)運行JLINK驅動,JLinkDLLUpdater.exe 刷新JLINK驅動到IAR,MDK IDE:
(2)修改JLINKscript的文件名,和demo名稱一致,并放到工程文件夾的settings文件夾下面,比如這里的例程是hello_world_flexspi_nor_debug,則需要JlinkScript的文件名為:hello_world_flexspi_nor_debug.JlinkScript,這樣IAR就會自動調用對應的JlinkScript文件:(3)配置IAR debugger為JLINK JTAG:
- 點擊debug,進入debug:
- 提示配置JTAG_MOD=1, 則連接TP11到J25_4:
對于MDK的secure JTAG配置,基本要求如下:
(1)修改pinmux.c 代碼,使能JTAG 引腳功能
(2)運行JLINK驅動,JLinkDLLUpdater.exe,刷新到MDK
(3)JlinkScript文件名修改為JLinkSettings.JlinkScript,拷貝到工程所在目錄下,這樣MDK就會自動調用客戶的JLINK腳本
(4)修改debugger為JLINK,并且修改為JTAG接口
到目前為止,MDK的Secure JTAG相關配置已經完成,按道理,可以直接debug去運行了。但是小編這里經過多次測試發現有些問題,對于RAM的代碼(hello_world debug),能夠進行secure JTAG debug沒問題,但是對于flash的代碼(hello_world_flexspi_nor_debug),通過secure jtagdownload沒有問題,但是debug會程序跑飛,檢查memory數據,讀不出正確的數據:
UUID也能讀正確了,通常這種情況可能和MDK與JLINK驅動的lashloader有關,但是JLINK的Flashloader并沒有直接開放出來,所以,小編又嘗試使用RT-UFL作為Flashloader,能夠debugger成功。如果遇到類似問題的網友,需要MDK secure。
具體步驟,請參考文檔:
https://www.cnblogs.com/henjay724/p/13951686.html
https://www.cnblogs.com/henjay724/p/15465655.html
這里總結下,拷貝iMXRT_UFL文件到JLINK驅動:
C:Program FilesSEGGERJLINKDevicesNXP
拷貝JLinkDevices.xml到:
C:Program FilesSEGGERJLINK
Jlinkscript的添加和圖21一樣。
修改JlinkSettings.ini文件,device為MIMXRT1064_UFL, override =1.
刪除燒錄算法:
去掉update target before Debugging:
進入debug模式:
配置JTAG_MOD=1, 連接TP11到J25_4,點擊OK繼續:配置JTAG_MOD=0, 讓TP11 浮空,點擊OK, 進入debug模式,并且運行如下:
可以看到,換過flashloader為RT-UFL之后,MDK 工程Secure JTAG debug也能成功運行。附件給出RT-UFL相關的文件。
五、總結
對于Secure JTAG,需要修改硬件支持JTAG, 修改fuse支持secure JTAG, 修改代碼引腳使能JTAG功能,對于IDE,需要配置相關的接口為JTAG,添加正確的JlinkScriptfile,這樣就能成功的運行Secure JTAG功能,并且進行IDE的代碼debug。附件情況:
evkmimxrt1064_hello_world_SJTAG.zip:mcuxpresso工程EVK-MIMXRT1064-hello_world_iar.7z:IAR工程
EVK-MIMXRT1064-hello_world_mdk.7z:mdk工程
File NXP_RT1064_SecureJTAG.JlinkScript, JLINK 腳本
File SecJtag.bat,結合JLink.exe 和NXP_RT1064_SecureJTAG.JlinkScript實現JLINK Commander形式的內核查找連接
File RT-UFL:超級下載算法,來源https://github.com/JayHeng/RT-UFL
附件可到官方論壇下載:
https://community.nxp.com/t5/i-MX-RT-Knowledge-Base/RT106X-secure-JTAG-test-and-IDE-debug/ta-p/1685577
作者:周晶晶
END
更多恩智浦AI-IoT市場和產品信息,邀您同時關注“NXP客棧”微信公眾號
? ? ?NXP客棧
恩智浦致力于打造安全的連接和基礎設施解決方案,為智慧生活保駕護航。
長按二維碼,關注我們
恩智浦MCU加油站
這是由恩智浦官方運營的公眾號,著重為您推薦恩智浦MCU的產品信息、開發技巧、教程文檔、培訓課程等內容。
長按二維碼,關注我們
原文標題:RT106X Secure JTAG測試與IDE調試
文章出處:【微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
-
mcu
+關注
關注
146文章
17185瀏覽量
351708 -
恩智浦
+關注
關注
14文章
5869瀏覽量
107755
原文標題:RT106X Secure JTAG測試與IDE調試
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論