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