DM6437 dsp系列之啟動過程全析(2)—AIS文件解析


本文均屬自己閱讀源碼的點滴總結,轉賬請注明出處謝謝。

歡迎和大家交流。qq:1037701636 email: gzzaigcn2009@163.comgzzaigcn2012@gmail.com

開發工具CCS5.1,Source Insight。

這篇博客主要和大家分享,AIS文件的制作與使用。什么是AIS,TI對其的定義為Application Image Script,應用鏡像腳本,是用來對Image的一種格式定義,從數據源的本質去分析就是一個保存了大量二進制數據的類型存儲起來。而AIS中基本的數據大小為一個word 32位bit。包括命令、包括數據等。

AIS文件核心的是由Second boot和APP的兩個鏡像打包在一個文件當中去,然后自動添加一些命令行信息,數據存儲格式為little Endian。

A.如下所示是AIS中命令字。稱之為Opcode。在前面所說到的RBL中,內部固件會都下面的一系列Opcodes進行解析,然后做進一步處理。

上訴的命令字使用頻率最高,且最為重要的是Section Load,Request CRC,Enable CRC,Jump Close,Function Execute。

1.Section Load:加載段,Dsp中往往在cmd中生成各種類型的段,包括數據,代碼,未初始化數據,自定義段等。這些在AIS文件中都是在Section load命令字的后面存在。如下所示:

圖中的address指定了數據加載到存儲空間的地址,SIZE指定數據大小,接着的是有效的raw data。所有單元格都占據一個word的空間。

 

2. CRC相關的命令字

CRC Request和Enable等分別用於對加載的數據進行CRC校驗,比如1中的Load Section完成時,會對加載的數據包括SIZE,ADDRESS做CRC校驗,最終得到一個數據,而這個crc數據,將會和AIS指定的expected CRC value做比較,查看是否讀取的內容完全正確,保證數據的讀取無誤。

 

3.Jump close command.跳轉關閉指令

 跳轉關閉指令,該指令是意味着AIS文件 結束。用戶可以跳入到自己的APP程序去執行,其后的一個字代表跳入的程序空間所在的位置。

 

4. Function Execute Command 函數執行命令

在AIS的解析文件讀取到該命令字時,會繼續讀取,往往這些命令字是在AIS文件的最開頭,比Second Boot還要先執行。完成的比如dm6437的包括PLL,DDR,EMIFA三個功能。這些全部在RBL中被執行。為Secnod Boot打好硬件的配置。具體內容將會在后面介紹。

 

B .基於SPI24 boot的AIS文件

在第一篇博文中,說到boot的方式為SPI24 norflash啟動。那么如何在AIS文件中體現出來,並反饋給RBL呢?

上圖就是典型的一種SPI AIS文件的數據格式。第一個word代表SPI的位長,即操作的flash的地址位大小,這里24位的需為0x00000003。然后第二個word為固定的幻數,大小固定0x41504954。

 

C.AIS文件的制作與生存。

AIS文件作為一個鏡像文件,那他是如何生成的呢。主要包括以下內容:

1.Second_boot源碼。

該源碼開源,下載的網址為http://processors.wiki.ti.com/index.php/DM643x_24-bit_SPI_Secondary_Boot_Loader

主要包括對norflash的讀、寫操作以及核心的boot代碼。

2.Second boot代碼解析。

閱讀過代碼后,初步發現該代碼的功能其實也體現出RBL的一些功能。SPI通過32位的包,讀取每一個Command命令字,然后對命令字做解析。

void main(void) {      //RBL加載Second_UBL后,跳入這里執行用於加載APP

    /* Enable caching. */
    enable_L1_cache();

	initBoot();
	performNandBoot();//讀取並解析APP的AIS文件,讀取相關section到指定區域

    /* Disable Caching */
    disable_L1_cache();

    /* Jump to application start point */
    TARGET_BOOT_STATUS.applicationStart(); //PC跳入到APP的main入口所在的地址處,開始運行應用程序
}
 

 

TARGET_BOOT_STATUS.aisStreamPtr = (Uint32) SPI_APPLI_IMAGE_ADDRESS;//偏移10Kb,AIS Image APP的地址
TARGET_BOOT_STATUS.status = parseAisData();//解析並且加載APP AIS Image到指定位置。


SPI_APPLI_IMAGE_ADDRESS這個地址,指定了APP Image在AIS文件中的存儲位置,用戶可以根據自己的需求進行修改。這里默認的10KB之前的代碼稱之為Second boot。即RBL會讀取到DDR中執行。Second boot啟動后運行上面的main函數,開始對APP部分的鏡像做解析。主要是把幾個核心的Section加載進來。並對每個數據段都要做CRC的校驗,以免數據由誤差。

最后是如何跳入APP的程序入口的呢?我們知道一旦讀到Jump close命令,將會把APP的地址傳入到函數指針,調用該函數指針后,就會跳入APP所在的程序開始運行(一般也就是main所在的地址空間)。如下:

TARGET_BOOT_STATUS.applicationStart(); //PC跳入到APP的main入口所在的地址處,開始運行應用程序

這樣就實現了一個完整的RBL+SBT+APP的完整啟動過程。而所有的鏡像都以AIS文件存在,體現了其的重要性。

 

AIS文件的制作命令:

AIS文件的制作需要用到一直叫perl的腳本命令,一般需要在window上進行手動安裝,Linux有專門的命令安裝。

准備好Second boot和APP的2進制鏡像文件(需要通過專門的軟件將CCS編譯出來的out文件),依次按照如下步驟執行:

a.編寫perl的window 批處理文本.bat:

C:\Perl\bin\perl.exe genAIS.pl -otype bin -i led.out -o led.hex -bootmode spimaster -memwidth 8  -datawidth 8 -addrsz 24 -cfg evmdm6437.cfg
pause

先要寫入perl的命令,整個是基於perl的system()函數來執行的。后面的配置內容含義如下所示:

但是有如下幾點要注意:-otype貌似最新版本的genAIS.pl只支持bin不能寫成binary ,bootmode后面spi要寫成spimaster,不然寫成spi是無效的


上述的配置命令在批處理文件中體現出來,這里不在講述。

根據以上內容,genAIS.pl分別最終生成bin格式的Second boot和 APP兩個AIS文件。類似如下數據包:

00000000h: 03 00 00 00 54 49 50 41 0D 59 53 58 00 00 03 00 ; ....TIPA.YSX....
00000010h: 15 00 00 00 00 00 00 00 00 00 00 00 0D 59 53 58 ; .............YSX
00000020h: 01 00 05 00 FC FF FF 3F FC FF FF 3F FC FF FF 3F ; ....??????
00000030h: FC FF FF 3F 00 00 00 00 0D 59 53 58 02 00 09 00 ; ??.....YSX....
00000040h: 17 00 00 00 01 00 00 00 0B 00 00 00 00 00 00 00 ; ................
00000050h: 05 64 00 50 22 88 13 00 48 21 49 16 02 C7 0C 00 ; .d.P"?.H!I..?.
00000060h: EF 04 00 00 03 59 53 58 01 59 53 58 00 00 FF 87 ; ?...YSX.YSX..?
00000070h: A0 10 00 00 C6 11 47 03 20 41 12 30 58 23 90 01 ; ?..?G. A.0X#?

可以看到基本的數據結構和上面所述的基本相同,0x00000003表示是SPI24位的操作。只是這里添加啦一部分function函數頭,用於配置PLL,DDR2,EMIF等,這部分內容就在-cfg中的文件,這部分內容直接拷貝到生成的AIS文件,而不會對out文件進行解析生成。只是簡單的復制到AIS文件的開頭。典型的dm6437.cfg如下所示:

0x5853590D  #Function Execute Command
0x00030000  #   Selects PLL configuration function, with 3 arguments
0x00000015  #   PLLM value
0x00000000  #   PLLDIV 0
0x00000000  #   Clock source
0x5853590D  #Function Execute Command
0x00050001  #   Selects EMIFA configuration, with 5 arguments
0x3FFFFFFC  #   AB1CR control register mask
0x3FFFFFFC  #   AB2CR control register mask
0x3FFFFFFC  #   AB3CR control register mask
0x3FFFFFFC  #   AB4CR control register mask
0x00000000  #   NANDFCR control register mask
0x5853590D  #Function Execute Command
0x00090002  #   Selects DDR memory configuration, with 9 arguments
0x00000017  #   DDR PLLM
0x00000001  #   PLL SRC
0x0000000B  #   DDR CLLK DIV
0x00000000  #   VBPE CLK DIV
0x50006405  #   DDR Control register mask
0x00138822  #   SDRAM Config register mask
0x16492148  #   SDRAM Timer 0 register mask
0x000CC702  #   SDRAM Timer 1 register mask
0x000004EF  #   SDRAM Refresh control register mask 

 

b.使用combineAIS.pl 將兩個AIS文件打包成為最終 的一個合成的AIS文件

perl combineAIS.pl SPI_Secondary_boot.bin myAppAIS.bin finalAIS.bin 10

這里的10表示,APP偏移10kb在AIS文件中。

到這里整個AIS的文件制作的過程就結束。

 

總的來說dm6437基於這種AIS文件的啟動方式,簡單方便,有利於開發,對其深入理解有好處,可以自由的設置AIS文件。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM