摘 要: 介紹了嵌入式處理器在使用基于SPI引導(dǎo)方式時(shí),如何檢查DDR內(nèi)存,,以提高系統(tǒng)的可靠性,。對系統(tǒng)的引導(dǎo)過程,包括片內(nèi)ROM運(yùn)行,、片內(nèi)RAM運(yùn)行,、DDR內(nèi)存運(yùn)行,進(jìn)行了詳細(xì)的介紹,。對各階段引導(dǎo)程序數(shù)據(jù)格式的處理進(jìn)行細(xì)致的分析,,并對生產(chǎn)實(shí)用化進(jìn)行了實(shí)例驗(yàn)證。
關(guān)鍵詞: SPI引導(dǎo),;內(nèi)存自檢,;系統(tǒng)可靠性;引導(dǎo)過程
0 引言
隨著全球網(wǎng)絡(luò)進(jìn)一步擴(kuò)展到新終端設(shè)備和以前未連接的行業(yè)中,,網(wǎng)絡(luò)安全對消費(fèi)者,、企業(yè)和其他機(jī)構(gòu)變得越來越重要。人們越來越需要性能安全,、價(jià)格便宜的裝置設(shè)備,。為了降低成本,往往需要簡化電路設(shè)計(jì),。例如,,采用SPI方式引導(dǎo)硬件,使用SPI Flash作為存儲媒介,,減少總線的布線,,是簡化硬件電路的較好的方法[1],。但采用SPI方式引導(dǎo)硬件,需要將程序引導(dǎo)到DDR內(nèi)存中,,同時(shí)又需要對DDR內(nèi)存進(jìn)行檢查,,這就出現(xiàn)了矛盾[2]。
1 基于SPI的硬件引導(dǎo)
本文以一個(gè)實(shí)例,,對嵌入式處理器基于SPI引導(dǎo)硬件時(shí)如何進(jìn)行RAM檢查進(jìn)行詳細(xì)的介紹,。圖1是嵌入式處理器使用SPI引導(dǎo)的硬件框圖。在圖1中,,硬件引導(dǎo)程序和系統(tǒng)程序放在SPI Flash中,,在上電引導(dǎo)后,系統(tǒng)程序會被搬移到DDR空間,,在DDR空間運(yùn)行起來,。
現(xiàn)在以U-Boot硬件引導(dǎo)程序?yàn)槔榻B以SPI引導(dǎo)模式引導(dǎo)系統(tǒng)硬件的情況,。U-Boot是德國DENX小組的開發(fā)用于多種嵌入式CPU的Bootloader程序,可以支持多種嵌入操作系統(tǒng)和多種處理器[3],。
編譯的U-Boot程序,,往往是運(yùn)行在NOR Flash或DDR中的。但在基于SPI引導(dǎo)時(shí),,需要先從SPI Flash往片內(nèi)RAM里運(yùn)行一段程序,,將DDR內(nèi)存檢查一遍,然后再將U-Boot引導(dǎo)到DDR內(nèi)存中去運(yùn)行,,如圖2所示,。
2 SPI引導(dǎo)采用的數(shù)據(jù)格式
在TI公司的DSP及ARM處理器,飛思卡爾公司POWERPC及ARM處理器,,都支持基于SPI的引導(dǎo)模式,。在這些處理器的片內(nèi)ROM都包含基本的SPI引導(dǎo)驅(qū)動程序。本文以飛思卡爾公司的QorIQ P1010處理器為例介紹其引導(dǎo)過程,。P1010片內(nèi)的SPI驅(qū)動程序能夠把SPI接口Flash中的程序拷貝到DDR內(nèi)存或片內(nèi)RAM中,。不過,在拷貝之前,,需要先對DDR控制器或片內(nèi)RAM進(jìn)行配置,。這就需要定義一個(gè)特定的數(shù)據(jù)結(jié)構(gòu),完成引導(dǎo)程序所需要的環(huán)境配置,。對于不同的處理器,,生產(chǎn)廠家定義的引導(dǎo)數(shù)據(jù)結(jié)構(gòu)是不同的。
在P1010處理器完成復(fù)位序列后,,通過選擇使用處理器片內(nèi)ROM的SPI引導(dǎo)配置程序,,而后處理器內(nèi)核開始運(yùn)行該片內(nèi)ROM程序,,配置SPI控制器,并與外部的SPI Flash通信,,將程序拷貝出來并跳到指定的位置運(yùn)行[4],。SPI引導(dǎo)采用的數(shù)據(jù)格式如表1所示。
在表1中,,配置字(Control Words)由配置32 bit地址/數(shù)據(jù)對組成,,主要用在配置就地訪問窗口(LAW)和目標(biāo)內(nèi)存控制器的寄存器。配置地址域有兩種模式,,當(dāng)最低位為0時(shí),,配置地址域高30 bit代表的是地址,此時(shí)配置數(shù)據(jù)寫入此地址,。當(dāng)最低位為1時(shí),,配置地址域高30 bit代表的是指令,此時(shí)配置數(shù)據(jù)寫入此地址,。這樣的結(jié)構(gòu)讓用戶可以方便地配置4 B對齊的內(nèi)存,,完成控制指令操作,或定義程序配置階段的結(jié)束[5],。配置地址域的數(shù)據(jù)格式如表2所示,。
在表2中,當(dāng)CNT(最低位)=0時(shí),,則高30 bit用作要寫入數(shù)據(jù)的地址,,配置數(shù)據(jù)包含要寫入的數(shù)據(jù)。
當(dāng)CNT=1時(shí),,則高30 bit用作控制指令,。
當(dāng)EC=1時(shí),代表配置階段結(jié)束指令,。
當(dāng)DLY=1時(shí),,代表延時(shí)一定時(shí)間指令。
當(dāng)CF=1時(shí),,代表更改SPI頻率的指令,。
CNT表示地址模式與指令模式的切換。
當(dāng)處理器內(nèi)核開始拷貝程序時(shí),,先判斷0X40位置的標(biāo)志是否正確,,如果正確,先根據(jù)配置的地址/數(shù)據(jù)對的個(gè)數(shù)N來配置一些外圍寄存器,,然后從0X50處指示的Flash地址搬移用戶代碼數(shù)據(jù)到0X58指示的地址,。搬移完成后,從0X60指示的地址開始運(yùn)行,。將片內(nèi)運(yùn)行的這一段程序叫TPL程序,。
3 片內(nèi)RAM運(yùn)行的TPL程序
P1010包含256 KB的L2CACHE,,也可以當(dāng)片內(nèi)RAM使用。要檢查DDR內(nèi)存,,要先在片內(nèi)RAM里運(yùn)行一小段TPL程序,。這一段程序是對基于DDR引導(dǎo)程序U-Boot的一個(gè)裁剪,主要完成內(nèi)核的配置,,初始化串口終端,,初始化DDR內(nèi)存控制器,然后檢查DDR內(nèi)存[6],。在這里不需要設(shè)置U-Boot的環(huán)境變量,,不需要配置以太網(wǎng)等其他的外圍器件。編譯后的TPL目標(biāo)文件為uboot-tpl.bin,。
TPL程序的編譯按RAM引導(dǎo)的方式處理,。程序的開始地址設(shè)為:0xc0030000~0xc0038800。現(xiàn)在需要對編譯后的uboot-tpl.bin進(jìn)行格式處理,,在其前面加上SPI引導(dǎo)的可以識別的數(shù)據(jù)表頭,,如表3所示。
表3是按照表1(SPI引導(dǎo)模式的數(shù)據(jù)結(jié)構(gòu))和表2(配置地址域的數(shù)據(jù)格式)完成的一個(gè)SPI引導(dǎo)配置實(shí)例,。在這個(gè)實(shí)例中,,將L2CACHE設(shè)為片內(nèi)RAM,開始地址設(shè)為0xc0000000,。這一部分空間在處理器內(nèi)核引導(dǎo)時(shí)已經(jīng)通過TLB映射,可以直接使用,。
對TPL進(jìn)行數(shù)據(jù)格式化存放,,要用到一個(gè)工具,即boot_format,,它可以將基于HEX的文件和基于BIN格式的文件合并到一起,。這是一個(gè)飛思卡爾BSP里帶的數(shù)據(jù)格式化工具。采用以下命令:
./boot_format cfg_sram_p1010.dat uboot-tpl.bin-spi uboot_tpl_spi.bin
合并后的文件為uboot_tpl_spi.bin,。
在cfg_sram_p1010.dat文件里,,TPL程序存放在SPI Flash的0X400開始的地址。處理器先對片內(nèi)RAM進(jìn)行配置初始化,,然后將TPL程序從0X400引導(dǎo)到0xc0030000開始的地址,,并從0xc0030000開始運(yùn)行。這時(shí),,處理器對DDR控制器進(jìn)行配置,,并對DDR空間進(jìn)行自檢。
4 DDR的自檢及U-BOOT的運(yùn)行
DDR RAM的自檢可以采用寫入特定數(shù)據(jù)(例如0x55,,0xAA),,然后回讀比較來檢查的方式,;也可以通過檢查行列地址數(shù)據(jù)線來檢查。相關(guān)文檔很多,,這里就不介紹了,。
當(dāng)檢查完DDR內(nèi)存后,就可以引導(dǎo)并運(yùn)行U-Boot程序了,。U-Boot程序按RAM引導(dǎo)的方式編譯,。程序起始地址設(shè)為0X11000000。編譯后的文件為uboot.bin,。但在實(shí)際中需要將兩個(gè)單獨(dú)的BIN文件合并成一個(gè)文件,,以方便生產(chǎn)和產(chǎn)品實(shí)用化。當(dāng)uboot.bin與uboot_tpl_spi.bin合為的一個(gè)文件uboot_spi.bin時(shí),,uboot_tpl_spi.bin放在前面,,uboot.bin程序放在后面,如表4所示,。
在表4中,,處理器在運(yùn)行TPL時(shí),將U-Boot從SPI Flash的0X10000地址引導(dǎo)到DDR3的0X11000000開始的地址(代碼數(shù)據(jù)總長度0x40000),,而后跳運(yùn)行入口地址(0X1103f000),,運(yùn)行U-Boot程序。這時(shí),,整個(gè)硬件系統(tǒng)引導(dǎo)起來了,。操作系統(tǒng)可以通過U-Boot運(yùn)行起來。
5 結(jié)論
嵌入式處理器在使用SPI引導(dǎo)硬件時(shí),,先通過片內(nèi)RAM運(yùn)行一段程序,,對DDR內(nèi)存進(jìn)行自檢,而后再將U-Boot程序及環(huán)境變量引導(dǎo)到DDR空間[7],,把硬件系統(tǒng)引導(dǎo)起來,。通過實(shí)例化的應(yīng)用,證明這在高性價(jià)比的嵌入式應(yīng)用中是一個(gè)不錯(cuò)的選擇,,不僅能提高系統(tǒng)的可靠性,,而且簡單易行。
參考文獻(xiàn)
[1] 張偉棟,,趙紅.基于PowerPC8640處理器的通用處理模塊設(shè)計(jì)[J].微型機(jī)與應(yīng)用,,2015,34(6):32-34.
[2] 李相國,,楊樹元.基于PowerPC處理器SMP系統(tǒng)的U-Boot移植[J].微計(jì)算機(jī)應(yīng)用,,2008,29(9):95-99.
[3] 王齊.Linux PowerPC詳解:核心篇[M].北京:機(jī)械工業(yè)出版社,2007.
[4] 李宗海,,陳蜀宇,,李海偉.嵌入式Linux系統(tǒng)在ARM平臺上的構(gòu)建[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2010,,19(10):153-157.
[5] Freescale Semiconductor,, Inc. Booting from On-Chip ROM (eSDHC or eSPI) [EB/OL]. (2012-6-1)[2014-4-18].http://cache.freescale.com/files/32bit/doc/ app_note/AN3659.pdf.
[6] 鄧國榮,劉厚欽.基于NOR Flash的OMAPL138雙核系統(tǒng)自舉引導(dǎo)啟動實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,,2014,,40(2):19-26.
[7] 鄒洋,李琳皓,,梁峰.Nucleus操作系統(tǒng)在ARM11上的移植研究與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,,2014,40(9):10-13.