應(yīng)用于DM648的FLASH自動(dòng)加載實(shí)現(xiàn)方法
COFF文件中與下載無(wú)關(guān)的冗余信息比較多,其中文件頭、可選文件頭、段信息表、段數(shù)據(jù)是本次研究的重點(diǎn),現(xiàn)對(duì)本次設(shè)計(jì)使用到的信息詳述如下。
本文引用地址:http://cafeforensic.com/article/201609/305059.htm1)文件頭保存了COFF文件的基本信息,如段數(shù)目、符號(hào)表位置等。長(zhǎng)度為22字節(jié)。文件頭的前兩個(gè)字節(jié)為魔幻數(shù),標(biāo)注COFF文件的版本,適用于TI公司DSP的魔幻數(shù)為0x00C2,第16、17字節(jié)為可選文件頭的長(zhǎng)度,該數(shù)值為0或28。0表示文件中不包含可選文件頭部分。否則長(zhǎng)度為28字節(jié)。
2)可選文件頭從偏移量0x16處廾始,長(zhǎng)度可以為0。TI的DSP采用的可選文件頭長(zhǎng)度為28字節(jié)。可選文件頭中以字節(jié)為單位標(biāo)注了代碼段、已初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段的大小和基地址等信息,其中最重要的是第16到第20字節(jié),為可執(zhí)行程序的入口地址。
3)段信息表位于可選文件頭之后。通常編譯之后產(chǎn)生的數(shù)據(jù)段有很多,所以COFF文件的段信息表分成很多部分,每一個(gè)部分長(zhǎng)度為48字節(jié)。前八個(gè)字節(jié)用來(lái)保存段名,系統(tǒng)默認(rèn)的段名有.text,.data,.bss等。12到15字節(jié)是段數(shù)據(jù)的運(yùn)行地址,也就是將可執(zhí)行文件載入內(nèi)存時(shí),這個(gè)地址就是段數(shù)據(jù)第一個(gè)字節(jié)的位置。16到19字節(jié)以字節(jié)為單位標(biāo)注段數(shù)據(jù)的長(zhǎng)度。20到23字節(jié)標(biāo)注段數(shù)據(jù)在COFF文件中的偏移量。40到43字節(jié)是段的屬性標(biāo)識(shí),與下載相關(guān)的標(biāo)識(shí)如表1所示,其余標(biāo)識(shí)符數(shù)據(jù)不需要下載。
4)數(shù)據(jù)段保存段信息表所描述的數(shù)據(jù),數(shù)據(jù)以原始數(shù)據(jù)的形式存放,只有需要下載的數(shù)據(jù)段才保存在該處。
3.2 AIS格式分析及格式轉(zhuǎn)換程序設(shè)計(jì)
TI對(duì)AIS的定義為Application Image Script,應(yīng)用鏡像腳本,是一種鏡像文件格式。AIS腳本以魔幻字0x41504954開(kāi)始,之后包括命令和數(shù)據(jù)兩部分,表2所示是AIS中命令代碼。稱(chēng)之為Opcode。在系統(tǒng)啟動(dòng)的第一個(gè)階段,RBL會(huì)對(duì)AIS格式的UBL文件中的Opcodes進(jìn)行解析執(zhí)行。
上述命令代碼中Section Load和Jump_Close是最重要的兩個(gè)。具體的命令及數(shù)據(jù)格式如圖3所示。
Section Load是數(shù)據(jù)段復(fù)制命令,以命令代碼0x58535901開(kāi)始,之后的數(shù)據(jù)以32位為長(zhǎng)度,分別是復(fù)制的目的地址、數(shù)據(jù)長(zhǎng)度和要復(fù)制的數(shù)據(jù)。當(dāng)所有需要下載的數(shù)據(jù)段都已復(fù)制完成后,需要以Jump_Close命令結(jié)束。Jump_Close命令的數(shù)據(jù)部分提供了一個(gè)32位的入口地址,該地址為應(yīng)用程序的入口地址。程序會(huì)跳轉(zhuǎn)到該入口地址運(yùn)行應(yīng)用程序。
COFF到AIS文件格式轉(zhuǎn)換的過(guò)程首先就是讀取COFF文件頭數(shù)據(jù),獲得文件中數(shù)據(jù)段的數(shù)量,然后根據(jù)段信息表來(lái)判斷該數(shù)據(jù)段是否需要下載、下載的目的地址、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)在COFF文件中起始地址。然后將段起始地址、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)(ROW DATA格式)填寫(xiě)到Section Load指令的數(shù)據(jù)部分,每個(gè)數(shù)據(jù)段對(duì)應(yīng)一條Section Load指令。這一過(guò)程中只處理需要下載的數(shù)據(jù)段,因?yàn)椴恍枰螺d的數(shù)據(jù)段即未初始化數(shù)據(jù)段是在程序運(yùn)行過(guò)程中被賦值的。下載的各個(gè)數(shù)據(jù)段按照目的地址由低到高的順序填寫(xiě)到AIS文件中,直到所有數(shù)據(jù)段都處理完成,最后以Jump_Close命令結(jié)束,便得到了可用于燒寫(xiě)的AIS文件。軟件流程如圖4所示。
4 一個(gè)完整的自動(dòng)加載實(shí)現(xiàn)過(guò)程
基于DM648的核心板原理框圖如圖5所示。核心板上的主要資源包括:TMS320DM648處理器,最高工作頻率為1.1 GHZ;256 MB的DDR2存儲(chǔ)器,工作頻率為533 MHz;32 MB的NOR FLASH,型號(hào)為S29GL256N,每個(gè)扇區(qū)大小為128 KB。
1)準(zhǔn)備工作
在CCS環(huán)境中使用C語(yǔ)言編寫(xiě)UBL和應(yīng)用程序,編澤生成.out文件,使用3.2節(jié)提到的轉(zhuǎn)換程序?qū)?out文件轉(zhuǎn)換為AIS文件。后綴為.ais。
2)啟動(dòng)模式選擇及下載環(huán)境創(chuàng)建
配置DM648芯片引腳BOOTMODE[0:3]全部為低電平,F(xiàn)ASTBOOT為高電平,選擇芯片的啟動(dòng)方式為仿真器啟動(dòng)。連接仿真器、DM648核心板和PC機(jī),配置仿真器驅(qū)動(dòng)保證CCS可以配合硬件環(huán)境完成程序調(diào)試。
3)燒寫(xiě)UBL及應(yīng)用程序AIS文件
在CCS環(huán)境下打開(kāi)TI公司的DVSDK中的DM648_NORWriter.pjt,該工程實(shí)現(xiàn)將UBL及應(yīng)用程序AIS文件燒寫(xiě)到FLASH中。首先通過(guò)CFI接口讀取FLASH芯片的參數(shù)并自動(dòng)選擇操作FLASH所用的命令字是AMD模式或是Intel模式。在實(shí)際開(kāi)發(fā)時(shí)所選FLASH芯片可能不支持CFI接口,此時(shí)需要使用者參考自己使用的硬件系統(tǒng)中FLASH芯片數(shù)據(jù)手冊(cè),指定操作FLASH所用的指令字。
由于燒寫(xiě)程序需要將AIS鏡像文件完全燒寫(xiě)到FLASH中而不需要對(duì)內(nèi)容作解析,因此在CCS環(huán)境下以文件操作的形式,使用二進(jìn)制格式將鏡像文件打開(kāi),獲得文件指針并讀取文件內(nèi)容。文件操作代碼如下:
//輸入U(xiǎn)BL.ais文件路徑
DEBUG_printString(“Enter thc binary AIS file name:
rn”);
DEBUG_readString(fileName);
fflush(stdin);
//以二進(jìn)制形式打開(kāi)UBL.ais文件,獲取文件指針fPtr
fPtr=fopen(fileName,“rb”);
//讀取AIS文件的長(zhǎng)度(字節(jié)數(shù))
fseek(fPtr,0,SEEK_END);
ublFileSize=ftell(fPtr);
程序運(yùn)行后會(huì)彈出對(duì)話框要求輸入AIS文件路徑。在CCS環(huán)境中連接DM648核心板,編譯并運(yùn)行DM648_NORWriter.pjt工程完成燒寫(xiě)。
4)重新配置啟動(dòng)模式實(shí)現(xiàn)系統(tǒng)自啟動(dòng)
燒寫(xiě)完成后,斷開(kāi)CCS連接,DM648核心板斷電并且重新設(shè)置引腳BOOTMODE[0:3]狀態(tài)為0100,F(xiàn)ASTBOOT為高電平,以此選擇芯片的啟動(dòng)模式為EMIFA ROM快速啟動(dòng)。DM648核心板重新上電后自動(dòng)運(yùn)行UBL程序?qū)崿F(xiàn)應(yīng)用程序的自動(dòng)加載??梢允褂么诰€連接DM648和PC機(jī),UBL會(huì)在執(zhí)行過(guò)程中將啟動(dòng)信息通過(guò)串行接口發(fā)送到PC機(jī)。
評(píng)論