潘慕晗 劉云 武漢數(shù)字工程研究所第二研究室 430074
?
一種TI的C66X的快速啟動方法
潘慕晗劉云武漢數(shù)字工程研究所第二研究室430074
【文章摘要】
隨著DSP應(yīng)用技術(shù)的發(fā)展,其架構(gòu)和規(guī)模不斷擴(kuò)大,DSP系統(tǒng)的啟動方式也逐步向多元化和自動化發(fā)展。本文介紹C66X啟動的過程并分析NOR FLASH啟動的原理。通過對二級引導(dǎo)中的交互程序進(jìn)行研究,實(shí)現(xiàn)了DSP的快速啟動以及具有較好交互性的操作界面。
【關(guān)鍵詞】
C66X;NOR FLASH啟動;bootloader;交互
【Abstarct】
As DSP develops to the 21st century, its architecture and scale has changed a lot. Boot Method is also progressing towards the development of diversified automation point of view. Introduce the process of C66X-boot, Analyze the advantage of NOR-FLASH-Boot. Design the user interface program in the 2ndbootloader.Readlize the flexible quick-boot, and a better interface environment.
【Keyword】
C66X; NOR-FLASH-Boot; bootloader; interactive
自2010年TI公司推出keystone C66X系列的DSP之后,關(guān)于該系列DSP的啟動方式也成為技術(shù)難點(diǎn)之一。C66X系列DSP板提供了多種方式啟動:本地的或者遠(yuǎn)程的,基于ROM的或基于flash的??偨Y(jié)一下,共有以下7種:EMIF16啟動、SRIO啟動、以太網(wǎng)啟動、PCI-e啟動、I2C啟動、SPI啟動以及Hyper-Link啟動。
對于本地啟動,一般使用I2C模式啟動,由于啟動的代碼存放在EEPROM上,讀取速度慢,導(dǎo)致啟動速度較慢,耗時(shí)2-3秒。同時(shí)I2C啟動的代碼大小也受到EEPROM的容量限制。相較之下,使用EMIF16模式啟動,把啟動代碼放在NOR FLASH上,不僅啟動速度快,而且可以增加代碼的容量以及靈活性。本文主要介紹了C66X系列DSP基于NOR FLASH的加載原理,并設(shè)計(jì)了一種可以通過串口進(jìn)行交互的二級引導(dǎo)程序。
因?yàn)镹OR FLASH是按字節(jié)尋址的,所以可以在NOR FLASH上直接執(zhí)行代碼。因此我們將一段引導(dǎo)代碼燒入到NOR FLASH的基地址,選擇EMIF模式啟動DSP時(shí),該段代碼會將其后的初始化代碼搬移到指定位置。然后跳轉(zhuǎn)到C語言環(huán)境初始化程序入口地址“_c_ int00”。將這段代碼稱為一級bootloader。這段代碼的執(zhí)行時(shí)間,會隨著其后代碼的大小變化,在400微秒左右。
初始化代碼稱為二級bootloader,依據(jù)環(huán)境參數(shù)對PLL、DDR、UART、網(wǎng)絡(luò)等進(jìn)行初始化。初始化過程約10ms(初始化成功)。二級bootloader支持對用戶程序的多種方式的引導(dǎo),可以進(jìn)行單核引導(dǎo)、多核引導(dǎo)、網(wǎng)絡(luò)加載引導(dǎo)、以及直接跳轉(zhuǎn)。
圖1 .bin文件格式
總結(jié)來說,一級bootloader負(fù)責(zé)將代碼引導(dǎo)起來,二級bootloader負(fù)責(zé)將系統(tǒng)初始化。
一級bootloader是直接運(yùn)行在NOR FLASH上的。即PC指針指向NOR FLASH的基地址時(shí),一級bootloader就開始工作了。
一級bootloader的工作是解析并引導(dǎo)其后的二級bootloader,所以二級bootloader 在NOR FLASH上的存儲格式就有一定的要求。該種文件一共分3部分,代碼入口地址、代碼段信息、結(jié)束標(biāo)識。代碼入口地址,即圖1的“_c_int00”,即文件頭部的4個(gè)字節(jié)。代碼段信息包含段的大小、段的起始地址、段的內(nèi)容。根據(jù)段的大小以及起始地址,我們可以將其后的段內(nèi)容搬移到指定的位置,也就是實(shí)現(xiàn)引導(dǎo)過程。結(jié)束標(biāo)志是在文件的尾部值為0的4字節(jié)整型。當(dāng)一級bootloader識別到段大小為0時(shí),就認(rèn)為搬移工作已經(jīng)結(jié)束,然后跳轉(zhuǎn)到代碼入口地址“_c_int00”。圖1即為二級bootloader的存儲格式??偟膩碚f,一級bootloader工作就是把所有的段內(nèi)容搬移到指定的地址空間,然后再跳轉(zhuǎn)到“_c_ int00”。
因?yàn)槎塨ootloader的格式是固定的,所有生成一個(gè)該格式的文件是相當(dāng)重要的一個(gè)步驟。使用CCS5.5編譯生成的執(zhí)行文件(后綴.out)是ELF格式的。我們需要通過一定的工具鏈將ELF文件轉(zhuǎn)換為圖1所示的文件格式。工具鏈如圖2所示。首先,向hex6x.exe輸入.out文件以及一個(gè).rmd的配置文件;得到一個(gè).hex的中間文件,再將其輸入到b2ccs.exe,得到一個(gè).dat的中間文件,再將其輸入到ccs2bin.exe,得到我們需要的.bin文件。
《會稽志》王右軍宅記:“舊經(jīng)云:‘羲之別業(yè)有養(yǎng)鵝池、洗硯池、題扇橋存焉?!戎^之別業(yè),則疑宅不在是,或云嵊縣金庭觀,乃右軍舊宅,嘗舍讀書樓為觀,在縣東南七十二里孝嘉鄉(xiāng)。”[2]1951
圖2 .bin文件工具鏈
二級bootloader的首要工作是完成整個(gè)系統(tǒng)的初始化,包含PLL串口、I2C以及DDR等。初始化的參數(shù)是從環(huán)境變量中獲取的,如果環(huán)境變量不存在,則使用默認(rèn)參數(shù)。在完成系統(tǒng)的初始化后,會提示用戶是否進(jìn)入交互界面,不進(jìn)入交互界面則繼續(xù)啟動用戶程序。下面主要介紹交互程序的設(shè)計(jì)。
用戶交互界面是通過串口構(gòu)建的。啟動后,系統(tǒng)打印一些DSP的參數(shù),如DDR大小、主頻、初始化信息等,再進(jìn)入自動啟動,等待數(shù)秒后按照設(shè)定的啟動模式引導(dǎo)用戶程序(在等待過程中,按下任意鍵可進(jìn)入交互界面)。
交互功能主要由以下幾個(gè)方面組成:
串口輸入輸出功能,輸出使用與printf類似的sys_printf,實(shí)現(xiàn)變參打印。而輸入則使用sys_read_line,每次讀取一整行的輸入,同時(shí)實(shí)現(xiàn)退格、插入刪除、查找最近的輸入等功能。主要是實(shí)現(xiàn)上下左右、退格以及ESC鍵的功能。
為實(shí)現(xiàn)查找最新輸入的功能,需要一個(gè)環(huán)形儲存池,用于保存前面使用過的指令。環(huán)形池使用鏈表實(shí)現(xiàn),用于實(shí)現(xiàn)上下鍵查找最近的輸入。環(huán)形池內(nèi)單個(gè)節(jié)點(diǎn),包含的信息有輸入的信息cmd_t[]、輸入信息長度size_t、使用標(biāo)記used、上一個(gè)節(jié)點(diǎn)的地址、下一個(gè)節(jié)點(diǎn)的地址。
指令解析及指令庫。如查看內(nèi)存數(shù)據(jù)“dm 80000000 100”,首先在指令庫內(nèi)查找與dm對應(yīng)的指令,然后進(jìn)入“dm”的處理函數(shù)(查看某地址的數(shù)據(jù)),讀取輸入中的參數(shù),地址參數(shù)0x80000000,大小參數(shù)0x10,然后進(jìn)行輸出0x80000000開始的0x10字節(jié)的數(shù)據(jù),并打印每個(gè)字節(jié)對應(yīng)的ASCII碼,不能顯示的字符以‘.’代替。
指令庫是由一張指令名表及指令函數(shù)組成,指令名表的每個(gè)條目由3個(gè)項(xiàng)組成。指令名:用于指令解析時(shí),查找相應(yīng)條目,如“dm”;指令入口:查找到指令條目后,根據(jù)條目內(nèi)的該項(xiàng)可以調(diào)用相應(yīng)的指令函數(shù);指令說明:用于打印指令表的幫助信息。
打印幫助信息:{"help", &cmd_help, "show the help table"}
添加指令,需要在指令名表里,加入相應(yīng)條目,同時(shí)實(shí)現(xiàn)相應(yīng)的指令函數(shù)即可。
功能函數(shù)封裝,將底層驅(qū)動與功能函數(shù)隔離。使代碼對于不同硬件平臺具有較好適應(yīng)性以及可移植性。
如對于不同的FLASH,只需要在FLASH表內(nèi)添加相應(yīng)的條目以及相應(yīng)的底層驅(qū)動即可。
static FLASHTable f_table[2]=
{{0, &S29GL_write, &S29GL_erase, "S29GL"},
{-1, NULL, NULL, ""}};
腳本功能,在啟動用戶程序之前,執(zhí)行一些特定的動作,以此達(dá)到不修改代碼,而增加功能。腳本會被保存在環(huán)境變量中,每次啟動都會根據(jù)環(huán)境變量中的設(shè)置來決定是否執(zhí)行腳本,以及腳本中的內(nèi)容。
環(huán)境變量,是二級bootloader中的重要組成部分。它控制了系統(tǒng)的整體初始化,功能的選擇,用戶程序的啟動方式等。對于不同應(yīng)用環(huán)境下,啟動時(shí)的參數(shù)也是不同的。如對于不同的DDR3,我們需要在環(huán)境變量中設(shè)置不同的DDR初始化參數(shù)。
環(huán)境變量是可以在交互界面下修改的,修改后通過指令保存到設(shè)定的NOR FLASH的某片區(qū)域上。為了保證環(huán)境變量的可靠性,在環(huán)境變量的尾部加入一個(gè)CRC32的校驗(yàn)。每次讀取環(huán)境變量時(shí),把讀取的環(huán)境變量計(jì)算CRC32的值與NOR FLASH上的校驗(yàn)值對比,以確認(rèn)讀取到的環(huán)境變量是有效的。
計(jì)時(shí)功能,是啟動流程控制的一個(gè)重要組成部分,主要用于超時(shí)等待和刷新打印。使得bootloader的啟動時(shí)間在一個(gè)可控的范圍內(nèi)。在主頻比較高的DSP上,選擇以1微秒為計(jì)數(shù)單位。超時(shí)等待的功能一般用在硬件初始化等待。刷新打印則是用在自啟動中,提示用戶剩余時(shí)間。
通過實(shí)現(xiàn)以上的幾點(diǎn),我們可以搭建一個(gè)簡單的交互界面。當(dāng)系統(tǒng)啟動后,打印當(dāng)前的版本為1.5.0以及系統(tǒng)相關(guān)參數(shù)。然后讀取環(huán)境變量的內(nèi)容(如果NOR FLASH上沒有環(huán)境變量則用默認(rèn)參數(shù)),再根據(jù)環(huán)境變量對系統(tǒng)初始化并提示用戶是否進(jìn)入交互界面。進(jìn)入交互界面后,用戶可以輸入相應(yīng)的指令來執(zhí)行一些操作。如“?”,查看幫助信息;“dm 80000000 10”,查看內(nèi)存信息;“ddr test”,測試內(nèi)存單元;“flash”,固化用戶程序等。圖3展示了一次DSP啟動,并進(jìn)入交互界面的全部打印。
圖3 DSP啟動打印信息
本文通過分析TI的C66X DSP的NOR FLASH的啟動原理,研究設(shè)計(jì)了用戶交互程序,實(shí)現(xiàn)DSP的快速啟動以及多樣的啟動方式,使得用戶可以通過可視化的界面來進(jìn)行程序的固化以及引導(dǎo)。
【參考文獻(xiàn)】
[1] 樂燕芬. ARM嵌入式系統(tǒng)啟動過程分析及實(shí)現(xiàn)[J].儀器儀表學(xué)報(bào),2006年S3期
[2]肖啟陽 方元 張忠慧. 基于TMS320VC55X系列DSP的外部FLASH并行二次引導(dǎo)加載方法研究[J].計(jì)算機(jī)應(yīng)用與軟件,2013年04期
[3] 馮林琳 耿恒山. 基于S3C6410的Uboot分析與移植[J].計(jì)算機(jī)與現(xiàn)代化,2013 年10期
[4] 李飛平 卿粼波 滕奇志 舒君 何小海. 基于TMS320C6678的多核程序加載研究與實(shí)現(xiàn)[J]. 電子技術(shù)應(yīng)用,2015年03期
[5] 衛(wèi)晉 劉峰 龍騰. 大規(guī)模多DSP實(shí)時(shí)網(wǎng)絡(luò)加載系統(tǒng)關(guān)鍵技術(shù)研究[J]. 計(jì)算機(jī)工程與應(yīng)用,2007年05期