DSP 芯片的片上引導裝載程序(Bootloader) 用于在系統(tǒng)上電時將用戶程序從外部非易失性慢速存儲器(如FLASH 等)或外部控制器(如ARM 等) 中裝載到片內或者片外的高速存儲器中高速運行[1]。DSP 芯片一般都提供多種引導裝載模式,如Host 引導裝載、EMIF 引導裝載、I2C 引導裝載、Serial RapidIO 引導裝載等。相比其它幾種模式而言,I2C 引導裝載具有體積小、功耗低、連接簡單等優(yōu)點。本文以TI 公司的DSP 芯片TMS320C6455[2](以下簡稱C6455)為例,詳細介紹了I2C 引導裝載模式的實現(xiàn)步驟,并構建了一個小系統(tǒng)驗證引導裝載的實現(xiàn)過程。1 C6455 的引導裝載模式介紹
C6455 的引導裝載模式由引導模式管腳BOOTMODE[3:0]決定。在DSP 復位時上述四個管腳的不同狀態(tài)對應著不同的引導裝載模式,具體如表1 所示。
對于主I2C 引導裝載模式,DSP 作為I2C 總線上的主設備,在復位后引導裝載程序會按照引導表的參數(shù)從外部I2C EEPROM 或者其它I2C 總線從設備讀取數(shù)據到相應的目的地址完成引導過程。引導表指定了數(shù)據的目的地址和長度。
從I2C 引導裝載與主I2C 引導裝載類似,只是DSP 在復位后等待外部I2C 總線主設備按照引導表的參數(shù)將數(shù)據寫入指定的地址。對于多DSP 的情況,可以用一個DSP 作為主設備,其它DSP 工作于從I2C 引導裝載模式下。
本文使用主I2C 引導裝載模式,構建的驗證系統(tǒng)連接方式如圖1 所示,使用的EEPROM 型號是Atmel 公司的AT24C1024B[3]。為了保證系統(tǒng)能夠穩(wěn)定的工作,SCL 和SDA 信號都需要接上拉電阻。
圖 1 C6455 和EEPROM 的連接方式
為了直觀地驗證引導裝載的結果,我們使用一個簡單的DSP 程序,通過C6455 的通用輸入輸出管腳GPIO2 不斷輸出高低交替的信號驅動一個發(fā)光二極管閃爍,相應的DSP 程序代碼如下:
main()
{
initial(); // 初始化DSP
for(;;) GPIO2_toggle();//GPIO2 高低變化
}
2 I2C 引導裝載的流程[4]
如果在DSP 的復位過程中選擇了主I2C 引導裝載,也就是引導模式管腳BOOTMODE[3:0]配置為0101,那么DSP 的引導裝載程序首先從外部I2C EEPROM 中讀取128 個字節(jié)的引導參數(shù)。引導參數(shù)在EEPROM 中的起始偏移地址可由DSP 的配置管腳CFGGP[2:0]設定,即偏移地址為0x80×CFGGP[2:0],本文中CFGGP[2:0]是000 ,也就是引導參數(shù)的起始位置在EEPROM 的地址0 處。
引導裝載程序根據讀到的引導參數(shù)判斷下一步該如何進行裝載。引導參數(shù)表的主要內容如表2 所示,每一個參數(shù)占用兩個字節(jié),表中僅列出了主要的幾個參數(shù)的定義。
Length 項指定了引導參數(shù)表的數(shù)據長度,固定為26 個字節(jié)。Checksum 項是所有26 個字節(jié)的校驗和,如果是全0 表示不需要校驗。Boot mode 項選擇引導模式,本例中是0101, 主I2C 引導模式。[!--empirenews.page--]
如果引導參數(shù)表中的Option 選項為00, 表示在LSW 項中指定的地址是另外一個引導參數(shù)表的起始地址。如果Option 選項是01,那么LSW 項中指定的地址是引導表(也就是實際的DSP 程序)的起始地址;如果 Option 選項為10,那么LSW 項中指定的地址是引導配置表的起始地址。
引導裝載程序在讀取了引導參數(shù)后將熱啟動DSP, 然后根據讀到的參數(shù)進行相應的操作。如果Option 選項指定下一步要裝入的是引導配置表,那么引導裝載程序會根據引導配置表中的內容配置相應的寄存器等,同時引導參數(shù)中的LSW 項和Option 項也會被更新。然后引導裝載程序熱啟動DSP,根據更新后的LSW 項和Option 項進行下一步的引導配置或者引導參數(shù)設置。
如果Option 選項指定下一步要裝入的是引導表,那么引導裝載程序會根據引導表中的設置從EEPROM 中讀取一定長度的數(shù)據到指定地址,然后DSP 跳轉到程序的入口地址處(一般就是_c_int00 )開始執(zhí)行。
LSW 項指定下一步需要裝載的引導配置表或者引導表的起始地址,Next LSW 項則是在Option 項為10 時指定引導配置完成后下一個引導參數(shù)表的起始地址。
2.1 引導配置表的設置
為了在程序引導裝載之前初始化一些必須的參數(shù),需要用到引導配置表。例如在引導裝載程序要把代碼裝載到DDR 存儲器中執(zhí)行的時候,就需要在引導裝載之前配置一些DDR 的控制寄存器。
配置每一個寄存器(或者寫一個存儲器地址)需要3 個字(32bit) 的配置過程。第一個字指定了需要配置的寄存器的地址,第二個字指定了該寄存器中需要設置為1 的位,第三個字節(jié)指定了該寄存器中需要設置為0 的位。如果第二個字和第三個字有某些數(shù)據位同時有效,那么對應的數(shù)據位數(shù)據翻轉。如果第二個字和第三個字同時為0,那么程序跳轉到第一個字指定的地址執(zhí)行。如果三個字全部為0,那么引導配置結束,表3 舉出幾個例子詳細說明上述配置的過程。
可以看出,雖然引導配置表一般只是在引導裝載之前配置一些寄存器,但是對于一些很簡短的程序,也可以使用引導配置表將程序直接裝載到內部存儲器中去運行。
在引導配置完成后就需要將引導表(也就是真正需要在DSP 中運行的用戶程序)裝載到指定地址。
2.2 引導表的生成
引導表包括DSP 程序的代碼段、數(shù)據段、以及其它一些程序信息,如程序入口地址等。引導表可以根據COFF 文件格式由用戶從CCS 工程文件(即*.out 文件)中提取,不過使用TI 提供的轉換工具hex6x 更為方便。使用hex6x 生成引導表時需要設置一些參數(shù),這些參數(shù)可以用配置文件的形式提供給hex6x 使用[5],一個典型的配置文件如下所示(本例中的配置文件名為led.cmd):
led.out ; 需要轉換的文件-boot ; 生成引導表-a; ASCII 格式文件-e _c_int00 ; 程序入口-order L ; 小端模式-memwidth 32 ; 存儲器數(shù)據寬度-romwidth 32 ; ROM 數(shù)據寬度-o led.hex ; 輸出文件在DOS 的命令行輸入hex6x led.cmd↙ ,就可以生成引導表文件led.hex, 實際的數(shù)據結構轉換如圖所示,可以看出,為了能夠正確的進行程序的引導裝載,引導表中加入了一些代碼的長度、地址等信息。
不過這個引導表文件并不能直接寫入EEPROM 中,還需要進一步的格式轉換。
2.3 EEPROM 映像文件的生成
寫入EEPROM 的映像文件由一個或者多個引導參數(shù)表、若干個引導配置表和一個引導表組成。引導表的數(shù)據按照包的形式存放,每一個數(shù)據包由數(shù)據長度、校驗和以及程序數(shù)據組成,數(shù)據包的長度不能超過128 字節(jié)。把hex6x 生成的led.hex 文件分割成128 字節(jié)的數(shù)據包的過程可以使用TI 公司提供的相關工具軟件來完成,也可以由用戶根據上述格式進行轉換。由引導參數(shù)表、引導配置表和引導表合成映像文件的過程也可以使用TI 公司提供的相關工具軟件來完成。本文中使用的映像文件由一個引導參數(shù)表、一個引導配置表和一個引導表組成,在EEPROM 的存放位置如圖3 所示。
3 測試結果及小結
使用編程器或者直接使用TI 公司的CCS 軟件可以把上面生成的映像文件寫入EEPROM。為了驗證引導裝載過程是否能夠正確完成,可以給驗證系統(tǒng)重新上電,看到發(fā)光二極管閃爍,說明引導裝載成功。
創(chuàng)新觀點:
本文提出的通過I2C 存儲器實現(xiàn)TMS320C6455 的引導裝載的方法能夠簡化系統(tǒng)的設計,縮短系統(tǒng)的開發(fā)時間。同時可以推廣到TI 公司其它系列的DSP 芯片,具有廣泛的應用價值。