摘 要: 介紹了嵌入式處理器在使用基于SPI引導(dǎo)方式時(shí),如何檢查DDR內(nèi)存,以提高系統(tǒng)的可靠性。對(duì)系統(tǒng)的引導(dǎo)過(guò)程,包括片內(nèi)ROM運(yùn)行、片內(nèi)RAM運(yùn)行、DDR內(nèi)存運(yùn)行,進(jìn)行了詳細(xì)的介紹。對(duì)各階段引導(dǎo)程序數(shù)據(jù)格式的處理進(jìn)行細(xì)致的分析,并對(duì)生產(chǎn)實(shí)用化進(jìn)行了實(shí)例驗(yàn)證。
關(guān)鍵詞: SPI引導(dǎo);內(nèi)存自檢;系統(tǒng)可靠性;引導(dǎo)過(guò)程
0 引言
隨著全球網(wǎng)絡(luò)進(jìn)一步擴(kuò)展到新終端設(shè)備和以前未連接的行業(yè)中,網(wǎng)絡(luò)安全對(duì)消費(fèi)者、企業(yè)和其他機(jī)構(gòu)變得越來(lái)越重要。人們?cè)絹?lái)越需要性能安全、價(jià)格便宜的裝置設(shè)備。為了降低成本,往往需要簡(jiǎn)化電路設(shè)計(jì)。例如,采用SPI方式引導(dǎo)硬件,使用SPI Flash作為存儲(chǔ)媒介,減少總線的布線,是簡(jiǎn)化硬件電路的較好的方法[1]。但采用SPI方式引導(dǎo)硬件,需要將程序引導(dǎo)到DDR內(nèi)存中,同時(shí)又需要對(duì)DDR內(nèi)存進(jìn)行檢查,這就出現(xiàn)了矛盾[2]。
1 基于SPI的硬件引導(dǎo)
本文以一個(gè)實(shí)例,對(duì)嵌入式處理器基于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)程序會(huì)被搬移到DDR空間,在DDR空間運(yùn)行起來(lái)。
現(xiàn)在以U-Boot硬件引導(dǎo)程序?yàn)槔榻B以SPI引導(dǎo)模式引導(dǎo)系統(tǒng)硬件的情況。U-Boot是德國(guó)DENX小組的開(kāi)發(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ū)動(dòng)程序。本文以飛思卡爾公司的QorIQ P1010處理器為例介紹其引導(dǎo)過(guò)程。P1010片內(nèi)的SPI驅(qū)動(dòng)程序能夠把SPI接口Flash中的程序拷貝到DDR內(nèi)存或片內(nèi)RAM中。不過(guò),在拷貝之前,需要先對(duì)DDR控制器或片內(nèi)RAM進(jìn)行配置。這就需要定義一個(gè)特定的數(shù)據(jù)結(jié)構(gòu),完成引導(dǎo)程序所需要的環(huán)境配置。對(duì)于不同的處理器,生產(chǎn)廠家定義的引導(dǎo)數(shù)據(jù)結(jié)構(gòu)是不同的。
在P1010處理器完成復(fù)位序列后,通過(guò)選擇使用處理器片內(nèi)ROM的SPI引導(dǎo)配置程序,而后處理器內(nèi)核開(kāi)始運(yùn)行該片內(nèi)ROM程序,配置SPI控制器,并與外部的SPI Flash通信,將程序拷貝出來(lái)并跳到指定的位置運(yùn)行[4]。SPI引導(dǎo)采用的數(shù)據(jù)格式如表1所示。
在表1中,配置字(Control Words)由配置32 bit地址/數(shù)據(jù)對(duì)組成,主要用在配置就地訪問(wèn)窗口(LAW)和目標(biāo)內(nèi)存控制器的寄存器。配置地址域有兩種模式,當(dāng)最低位為0時(shí),配置地址域高30 bit代表的是地址,此時(shí)配置數(shù)據(jù)寫(xiě)入此地址。當(dāng)最低位為1時(shí),配置地址域高30 bit代表的是指令,此時(shí)配置數(shù)據(jù)寫(xiě)入此地址。這樣的結(jié)構(gòu)讓用戶(hù)可以方便地配置4 B對(duì)齊的內(nèi)存,完成控制指令操作,或定義程序配置階段的結(jié)束[5]。配置地址域的數(shù)據(jù)格式如表2所示。
在表2中,當(dāng)CNT(最低位)=0時(shí),則高30 bit用作要寫(xiě)入數(shù)據(jù)的地址,配置數(shù)據(jù)包含要寫(xiě)入的數(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)核開(kāi)始拷貝程序時(shí),先判斷0X40位置的標(biāo)志是否正確,如果正確,先根據(jù)配置的地址/數(shù)據(jù)對(duì)的個(gè)數(shù)N來(lái)配置一些外圍寄存器,然后從0X50處指示的Flash地址搬移用戶(hù)代碼數(shù)據(jù)到0X58指示的地址。搬移完成后,從0X60指示的地址開(kāi)始運(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程序。這一段程序是對(duì)基于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)的方式處理。程序的開(kāi)始地址設(shè)為:0xc0030000~0xc0038800?,F(xiàn)在需要對(duì)編譯后的uboot-tpl.bin進(jìn)行格式處理,在其前面加上SPI引導(dǎo)的可以識(shí)別的數(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,開(kāi)始地址設(shè)為0xc0000000。這一部分空間在處理器內(nèi)核引導(dǎo)時(shí)已經(jīng)通過(guò)TLB映射,可以直接使用。
對(duì)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開(kāi)始的地址。處理器先對(duì)片內(nèi)RAM進(jìn)行配置初始化,然后將TPL程序從0X400引導(dǎo)到0xc0030000開(kāi)始的地址,并從0xc0030000開(kāi)始運(yùn)行。這時(shí),處理器對(duì)DDR控制器進(jìn)行配置,并對(duì)DDR空間進(jìn)行自檢。
4 DDR的自檢及U-BOOT的運(yùn)行
DDR RAM的自檢可以采用寫(xiě)入特定數(shù)據(jù)(例如0x55,0xAA),然后回讀比較來(lái)檢查的方式;也可以通過(guò)檢查行列地址數(shù)據(jù)線來(lái)檢查。相關(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開(kāi)始的地址(代碼數(shù)據(jù)總長(zhǎng)度0x40000),而后跳運(yùn)行入口地址(0X1103f000),運(yùn)行U-Boot程序。這時(shí),整個(gè)硬件系統(tǒng)引導(dǎo)起來(lái)了。操作系統(tǒng)可以通過(guò)U-Boot運(yùn)行起來(lái)。
5 結(jié)論
嵌入式處理器在使用SPI引導(dǎo)硬件時(shí),先通過(guò)片內(nèi)RAM運(yùn)行一段程序,對(duì)DDR內(nèi)存進(jìn)行自檢,而后再將U-Boot程序及環(huán)境變量引導(dǎo)到DDR空間[7],把硬件系統(tǒng)引導(dǎo)起來(lái)。通過(guò)實(shí)例化的應(yīng)用,證明這在高性?xún)r(jià)比的嵌入式應(yīng)用中是一個(gè)不錯(cuò)的選擇,不僅能提高系統(tǒng)的可靠性,而且簡(jiǎn)單易行。
參考文獻(xiàn)
[1] 張偉棟,趙紅.基于PowerPC8640處理器的通用處理模塊設(shè)計(jì)[J].微型機(jī)與應(yīng)用,2015,34(6):32-34.
[2] 李相國(guó),楊樹(shù)元.基于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平臺(tái)上的構(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] 鄧國(guó)榮,劉厚欽.基于NOR Flash的OMAPL138雙核系統(tǒng)自舉引導(dǎo)啟動(dòng)實(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.