應用于DM648的FLASH自動加載實現方法
COFF文件中與下載無關的冗余信息比較多,其中文件頭、可選文件頭、段信息表、段數據是本次研究的重點,現對本次設計使用到的信息詳述如下。
本文引用地址:http://www.104case.com/article/201609/305059.htm1)文件頭保存了COFF文件的基本信息,如段數目、符號表位置等。長度為22字節。文件頭的前兩個字節為魔幻數,標注COFF文件的版本,適用于TI公司DSP的魔幻數為0x00C2,第16、17字節為可選文件頭的長度,該數值為0或28。0表示文件中不包含可選文件頭部分。否則長度為28字節。
2)可選文件頭從偏移量0x16處廾始,長度可以為0。TI的DSP采用的可選文件頭長度為28字節。可選文件頭中以字節為單位標注了代碼段、已初始化數據段和未初始化數據段的大小和基地址等信息,其中最重要的是第16到第20字節,為可執行程序的入口地址。
3)段信息表位于可選文件頭之后。通常編譯之后產生的數據段有很多,所以COFF文件的段信息表分成很多部分,每一個部分長度為48字節。前八個字節用來保存段名,系統默認的段名有.text,.data,.bss等。12到15字節是段數據的運行地址,也就是將可執行文件載入內存時,這個地址就是段數據第一個字節的位置。16到19字節以字節為單位標注段數據的長度。20到23字節標注段數據在COFF文件中的偏移量。40到43字節是段的屬性標識,與下載相關的標識如表1所示,其余標識符數據不需要下載。

4)數據段保存段信息表所描述的數據,數據以原始數據的形式存放,只有需要下載的數據段才保存在該處。
3.2 AIS格式分析及格式轉換程序設計
TI對AIS的定義為Application Image Script,應用鏡像腳本,是一種鏡像文件格式。AIS腳本以魔幻字0x41504954開始,之后包括命令和數據兩部分,表2所示是AIS中命令代碼。稱之為Opcode。在系統啟動的第一個階段,RBL會對AIS格式的UBL文件中的Opcodes進行解析執行。

上述命令代碼中Section Load和Jump_Close是最重要的兩個。具體的命令及數據格式如圖3所示。

Section Load是數據段復制命令,以命令代碼0x58535901開始,之后的數據以32位為長度,分別是復制的目的地址、數據長度和要復制的數據。當所有需要下載的數據段都已復制完成后,需要以Jump_Close命令結束。Jump_Close命令的數據部分提供了一個32位的入口地址,該地址為應用程序的入口地址。程序會跳轉到該入口地址運行應用程序。
COFF到AIS文件格式轉換的過程首先就是讀取COFF文件頭數據,獲得文件中數據段的數量,然后根據段信息表來判斷該數據段是否需要下載、下載的目的地址、數據長度和數據在COFF文件中起始地址。然后將段起始地址、數據長度和數據(ROW DATA格式)填寫到Section Load指令的數據部分,每個數據段對應一條Section Load指令。這一過程中只處理需要下載的數據段,因為不需要下載的數據段即未初始化數據段是在程序運行過程中被賦值的。下載的各個數據段按照目的地址由低到高的順序填寫到AIS文件中,直到所有數據段都處理完成,最后以Jump_Close命令結束,便得到了可用于燒寫的AIS文件。軟件流程如圖4所示。

4 一個完整的自動加載實現過程
基于DM648的核心板原理框圖如圖5所示。核心板上的主要資源包括:TMS320DM648處理器,最高工作頻率為1.1 GHZ;256 MB的DDR2存儲器,工作頻率為533 MHz;32 MB的NOR FLASH,型號為S29GL256N,每個扇區大小為128 KB。

1)準備工作
在CCS環境中使用C語言編寫UBL和應用程序,編澤生成.out文件,使用3.2節提到的轉換程序將.out文件轉換為AIS文件。后綴為.ais。
2)啟動模式選擇及下載環境創建
配置DM648芯片引腳BOOTMODE[0:3]全部為低電平,FASTBOOT為高電平,選擇芯片的啟動方式為仿真器啟動。連接仿真器、DM648核心板和PC機,配置仿真器驅動保證CCS可以配合硬件環境完成程序調試。
3)燒寫UBL及應用程序AIS文件
在CCS環境下打開TI公司的DVSDK中的DM648_NORWriter.pjt,該工程實現將UBL及應用程序AIS文件燒寫到FLASH中。首先通過CFI接口讀取FLASH芯片的參數并自動選擇操作FLASH所用的命令字是AMD模式或是Intel模式。在實際開發時所選FLASH芯片可能不支持CFI接口,此時需要使用者參考自己使用的硬件系統中FLASH芯片數據手冊,指定操作FLASH所用的指令字。
由于燒寫程序需要將AIS鏡像文件完全燒寫到FLASH中而不需要對內容作解析,因此在CCS環境下以文件操作的形式,使用二進制格式將鏡像文件打開,獲得文件指針并讀取文件內容。文件操作代碼如下:
//輸入UBL.ais文件路徑
DEBUG_printString(“Enter thc binary AIS file name:
rn”);
DEBUG_readString(fileName);
fflush(stdin);
//以二進制形式打開UBL.ais文件,獲取文件指針fPtr
fPtr=fopen(fileName,“rb”);
//讀取AIS文件的長度(字節數)
fseek(fPtr,0,SEEK_END);
ublFileSize=ftell(fPtr);
程序運行后會彈出對話框要求輸入AIS文件路徑。在CCS環境中連接DM648核心板,編譯并運行DM648_NORWriter.pjt工程完成燒寫。
4)重新配置啟動模式實現系統自啟動
燒寫完成后,斷開CCS連接,DM648核心板斷電并且重新設置引腳BOOTMODE[0:3]狀態為0100,FASTBOOT為高電平,以此選擇芯片的啟動模式為EMIFA ROM快速啟動。DM648核心板重新上電后自動運行UBL程序實現應用程序的自動加載。可以使用串口線連接DM648和PC機,UBL會在執行過程中將啟動信息通過串行接口發送到PC機。
評論