新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 應(yīng)用于DM648的FLASH自動加載實(shí)現(xiàn)方法

應(yīng)用于DM648的FLASH自動加載實(shí)現(xiàn)方法

作者: 時間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

COFF文件中與下載無關(guān)的冗余信息比較多,其中文件頭、可選文件頭、段信息表、段數(shù)據(jù)是本次研究的重點(diǎn),現(xiàn)對本次設(shè)計使用到的信息詳述如下。

本文引用地址:http://butianyuan.cn/article/201609/305059.htm

1)文件頭保存了COFF文件的基本信息,如段數(shù)目、符號表位置等。長度為22字節(jié)。文件頭的前兩個字節(jié)為魔幻數(shù),標(biāo)注COFF文件的版本,適用于TI公司DSP的魔幻數(shù)為0x00C2,第16、17字節(jié)為可選文件頭的長度,該數(shù)值為0或28。0表示文件中不包含可選文件頭部分。否則長度為28字節(jié)。

2)可選文件頭從偏移量0x16處廾始,長度可以為0。TI的DSP采用的可選文件頭長度為28字節(jié)??蛇x文件頭中以字節(jié)為單位標(biāo)注了代碼段、已初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段的大小和基地址等信息,其中最重要的是第16到第20字節(jié),為可執(zhí)行程序的入口地址。

3)段信息表位于可選文件頭之后。通常編譯之后產(chǎn)生的數(shù)據(jù)段有很多,所以COFF文件的段信息表分成很多部分,每一個部分長度為48字節(jié)。前八個字節(jié)用來保存段名,系統(tǒng)默認(rèn)的段名有.text,.data,.bss等。12到15字節(jié)是段數(shù)據(jù)的運(yùn)行地址,也就是將可執(zhí)行文件載入內(nèi)存時,這個地址就是段數(shù)據(jù)第一個字節(jié)的位置。16到19字節(jié)以字節(jié)為單位標(biāo)注段數(shù)據(jù)的長度。20到23字節(jié)標(biāo)注段數(shù)據(jù)在COFF文件中的偏移量。40到43字節(jié)是段的屬性標(biāo)識,與下載相關(guān)的標(biāo)識如表1所示,其余標(biāo)識符數(shù)據(jù)不需要下載。

應(yīng)用于DM648的FLASH自動加載實(shí)現(xiàn)方法

4)數(shù)據(jù)段保存段信息表所描述的數(shù)據(jù),數(shù)據(jù)以原始數(shù)據(jù)的形式存放,只有需要下載的數(shù)據(jù)段才保存在該處。

3.2 AIS格式分析及格式轉(zhuǎn)換程序設(shè)計

TI對AIS的定義為Application Image Script,,是一種鏡像文件格式。AIS腳本以魔幻字0x41504954開始,之后包括命令和數(shù)據(jù)兩部分,表2所示是AIS中命令代碼。稱之為Opcode。在系統(tǒng)啟動的第一個階段,RBL會對AIS格式的UBL文件中的Opcodes進(jìn)行解析執(zhí)行。

應(yīng)用于DM648的FLASH自動加載實(shí)現(xiàn)方法

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

應(yīng)用于DM648的FLASH自動加載實(shí)現(xiàn)方法

Section Load是數(shù)據(jù)段復(fù)制命令,以命令代碼0x58535901開始,之后的數(shù)據(jù)以32位為長度,分別是復(fù)制的目的地址、數(shù)據(jù)長度和要復(fù)制的數(shù)據(jù)。當(dāng)所有需要下載的數(shù)據(jù)段都已復(fù)制完成后,需要以Jump_Close命令結(jié)束。Jump_Close命令的數(shù)據(jù)部分提供了一個32位的入口地址,該地址為應(yīng)用程序的入口地址。程序會跳轉(zhuǎn)到該入口地址運(yùn)行應(yīng)用程序。

COFF到AIS文件格式轉(zhuǎn)換的過程首先就是讀取COFF文件頭數(shù)據(jù),獲得文件中數(shù)據(jù)段的數(shù)量,然后根據(jù)段信息表來判斷該數(shù)據(jù)段是否需要下載、下載的目的地址、數(shù)據(jù)長度和數(shù)據(jù)在COFF文件中起始地址。然后將段起始地址、數(shù)據(jù)長度和數(shù)據(jù)(ROW DATA格式)填寫到Section Load指令的數(shù)據(jù)部分,每個數(shù)據(jù)段對應(yīng)一條Section Load指令。這一過程中只處理需要下載的數(shù)據(jù)段,因?yàn)椴恍枰螺d的數(shù)據(jù)段即未初始化數(shù)據(jù)段是在程序運(yùn)行過程中被賦值的。下載的各個數(shù)據(jù)段按照目的地址由低到高的順序填寫到AIS文件中,直到所有數(shù)據(jù)段都處理完成,最后以Jump_Close命令結(jié)束,便得到了可用于燒寫的AIS文件。軟件流程如圖4所示。

應(yīng)用于DM648的FLASH自動加載實(shí)現(xiàn)方法

4 一個完整的自動加載實(shí)現(xiàn)過程

基于DM648的核心板原理框圖如圖5所示。核心板上的主要資源包括:處理器,最高工作頻率為1.1 GHZ;256 MB的DDR2存儲器,工作頻率為533 MHz;32 MB的NOR FLASH,型號為S29GL256N,每個扇區(qū)大小為128 KB。

應(yīng)用于DM648的FLASH自動加載實(shí)現(xiàn)方法

1)準(zhǔn)備工作

在CCS環(huán)境中使用C語言編寫UBL和應(yīng)用程序,編澤生成.out文件,使用3.2節(jié)提到的轉(zhuǎn)換程序?qū)?out文件轉(zhuǎn)換為AIS文件。后綴為.ais。

2)啟動模式選擇及下載環(huán)境創(chuàng)建

配置DM648芯片引腳BOOTMODE[0:3]全部為低電平,F(xiàn)ASTBOOT為高電平,選擇芯片的啟動方式為仿真器啟動。連接仿真器、DM648核心板和PC機(jī),配置仿真器驅(qū)動保證CCS可以配合硬件環(huán)境完成程序調(diào)試。

3)燒寫UBL及應(yīng)用程序AIS文件

在CCS環(huán)境下打開TI公司的DVSDK中的DM648_NORWriter.pjt,該工程實(shí)現(xiàn)將UBL及應(yīng)用程序AIS文件燒寫到FLASH中。首先通過CFI接口讀取FLASH芯片的參數(shù)并自動選擇操作FLASH所用的命令字是AMD模式或是Intel模式。在實(shí)際開發(fā)時所選FLASH芯片可能不支持CFI接口,此時需要使用者參考自己使用的硬件系統(tǒng)中FLASH芯片數(shù)據(jù)手冊,指定操作FLASH所用的指令字。

由于燒寫程序需要將AIS鏡像文件完全燒寫到FLASH中而不需要對內(nèi)容作解析,因此在CCS環(huán)境下以文件操作的形式,使用二進(jìn)制格式將鏡像文件打開,獲得文件指針并讀取文件內(nèi)容。文件操作代碼如下:

//輸入UBL.ais文件路徑

DEBUG_printString(“Enter thc binary AIS file name:

rn”);

DEBUG_readString(fileName);

fflush(stdin);

//以二進(jìn)制形式打開UBL.ais文件,獲取文件指針fPtr

fPtr=fopen(fileName,“rb”);

//讀取AIS文件的長度(字節(jié)數(shù))

fseek(fPtr,0,SEEK_END);

ublFileSize=ftell(fPtr);

程序運(yùn)行后會彈出對話框要求輸入AIS文件路徑。在CCS環(huán)境中連接DM648核心板,編譯并運(yùn)行DM648_NORWriter.pjt工程完成燒寫。

4)重新配置啟動模式實(shí)現(xiàn)系統(tǒng)自啟動

燒寫完成后,斷開CCS連接,DM648核心板斷電并且重新設(shè)置引腳BOOTMODE[0:3]狀態(tài)為0100,F(xiàn)ASTBOOT為高電平,以此選擇芯片的啟動模式為EMIFA ROM快速啟動。DM648核心板重新上電后自動運(yùn)行UBL程序?qū)崿F(xiàn)應(yīng)用程序的自動加載。可以使用串口線連接DM648和PC機(jī),UBL會在執(zhí)行過程中將啟動信息通過串行接口發(fā)送到PC機(jī)。



評論


技術(shù)專區(qū)

關(guān)閉