桑赫,林巖,張烽
(北京航空航天大學(xué) 自動化科學(xué)與電氣工程學(xué)院,北京 100191)
?
嵌入式系統(tǒng)硬件平臺的啟動方式研究
桑赫,林巖,張烽
(北京航空航天大學(xué) 自動化科學(xué)與電氣工程學(xué)院,北京 100191)
摘要:本文研究嵌入式Linux操作系統(tǒng)的啟動過程,分析從設(shè)備上電到系統(tǒng)完成啟動的每個(gè)環(huán)節(jié)的作用與實(shí)現(xiàn)方式。使用以TMS320DM365為核心的嵌入式設(shè)備為硬件平臺,研究主要啟動方式的實(shí)現(xiàn)過程,確定啟動方式的適用環(huán)境及優(yōu)缺點(diǎn)?;诒銛y嵌入式設(shè)備,通過改進(jìn)的MMC/SD啟動方式,實(shí)現(xiàn)設(shè)備的啟動與運(yùn)行不依賴NAND FLASH。
關(guān)鍵詞:嵌入式系統(tǒng);啟動;Linux;TMS320DM365;Micro SD卡
引言
隨著嵌入式技術(shù)的不斷發(fā)展,嵌入式系統(tǒng)在很多領(lǐng)域中得到了更加廣泛的應(yīng)用。嵌入式系統(tǒng)中的應(yīng)用程序一般都運(yùn)行在嵌入式操作系統(tǒng)之上,目前主要應(yīng)用的嵌入式操作系統(tǒng)為開源的Linux系統(tǒng)[1]。嵌入式Linux系統(tǒng)的啟動過程與一般計(jì)算機(jī)Linux系統(tǒng)啟動過程不同,為應(yīng)對不同的工作與開發(fā)環(huán)境,嵌入式系統(tǒng)提供了多種啟動方式,通過研究啟動方式的特點(diǎn)以及嵌入式Linux的啟動過程可以對啟動過程進(jìn)行優(yōu)化,以滿足特定的需求。
TMS320DM365是目前應(yīng)用十分廣泛的一種嵌入式芯片,該芯片支持多種啟動方式[2]。本文以其為硬件平臺著重研究啟動過程以及MMC/SD啟動方式的改進(jìn)與優(yōu)化方法。
1嵌入式系統(tǒng)啟動過程
1.1嵌入式Linux系統(tǒng)的啟動過程
嵌入式Linux系統(tǒng)的啟動過程主要分為3個(gè)階段,首先進(jìn)行芯片內(nèi)引導(dǎo)(RBL),使系統(tǒng)尋找到下一階段的程序入口,接下來啟動第二階段引導(dǎo)(UBL與Uboot),進(jìn)一步對嵌入式設(shè)備進(jìn)行初始化,最后引導(dǎo)Linux內(nèi)核啟動,掛載文件系統(tǒng),完成Linux系統(tǒng)啟動[3]。其中芯片內(nèi)引導(dǎo)及第二階段引導(dǎo)共同組成了Bootloader。具體的啟動步驟如下:
① 嵌入式設(shè)備上電,芯片內(nèi)部引導(dǎo)程序自動運(yùn)行,初始化CPU,檢測設(shè)備狀態(tài)及啟動配置引腳狀態(tài),確定啟動方式;
② 將啟動方式指定設(shè)備中的第二階段引導(dǎo)程序拷貝到內(nèi)存,并跳轉(zhuǎn)到相應(yīng)入口地址,執(zhí)行第二階段引導(dǎo);
③ UBL進(jìn)一步初始化相關(guān)設(shè)備,將Uboot程序復(fù)制到內(nèi)存中,運(yùn)行Uboot,將存儲設(shè)備中的Linux內(nèi)核加載到內(nèi)存中,并使用設(shè)置的啟動參數(shù)執(zhí)行內(nèi)核;
④ Linux內(nèi)核初始化存儲、顯示、網(wǎng)絡(luò)等硬件設(shè)備;
⑤ 掛載文件系統(tǒng),啟動init進(jìn)程,完成Linux系統(tǒng)啟動。
嵌入式Linux系統(tǒng)的啟動過程如圖1所示。
圖1 嵌入式Linux系統(tǒng)的啟動過程
1.2引導(dǎo)程序Bootloader的作用
嵌入式設(shè)備具有與PC機(jī)類似的硬件配置,PC機(jī)中使用BIOS作為啟動引導(dǎo)程序,嵌入式設(shè)備則使用Bootloader作為引導(dǎo)程序,完成設(shè)備的初始化以及操作系統(tǒng)內(nèi)核的啟動[4]。
Bootloader是用來初始化硬件設(shè)備以及建立內(nèi)存空間映射圖的一段程序,因此其實(shí)現(xiàn)要依賴硬件。對于目前應(yīng)用廣泛的ARM體系結(jié)構(gòu)來說,一般使用Uboot形式的Bootloader均可以滿足需求,但仍需根據(jù)其他不同的硬件設(shè)備對源程序進(jìn)行修改。為了能夠提供更多復(fù)雜功能、更好的可移植性以及更高的可靠性,Bootloader通常被設(shè)計(jì)為多階段啟動方式。以TI公司生產(chǎn)的ARM核心嵌入式設(shè)備為例,其Bootloader的開始階段固化于芯片內(nèi)部,稱為RBL(ROM Bootloader)階段,該階段的程序會初始化一部分內(nèi)存空間,關(guān)閉所有中斷,并通過啟動引腳狀態(tài)確定系統(tǒng)的啟動方式,將第二階段的啟動程序從指定設(shè)備復(fù)制到內(nèi)存中,進(jìn)行系統(tǒng)下一步啟動。第二階段稱為UBL(User Bootloader)階段,該階段會進(jìn)一步初始化系統(tǒng),設(shè)置堆棧。由于TMS320DM365芯片支持的UBL最大為30 KB,因此要實(shí)現(xiàn)更多功能及Linux內(nèi)核的配置與加載,需要將第三階段的啟動程序復(fù)制到內(nèi)存中并執(zhí)行。第三階段稱為Uboot階段,該階段初始化系統(tǒng)的網(wǎng)口、串口等設(shè)備,為嵌入式系統(tǒng)內(nèi)核分配內(nèi)存空間,并將Linux系統(tǒng)內(nèi)核加載到內(nèi)存空間中,使用配置參數(shù)啟動系統(tǒng)。該Bootloader的啟動過程如圖2所示。
圖2 Bootloader啟動過程
2啟動方式
2.1啟動方式概述
由于嵌入式設(shè)備需要在不同的環(huán)境下工作,因此其相對于PC機(jī)來說具有更多的啟動方式。使用何種啟動方式一般由芯片的啟動配置引腳決定,CPU在啟動后會讀取該引腳的信息以確定啟動方式。一般來說,嵌入式設(shè)備使用NAND Flash啟動作為默認(rèn)啟動方式,即把各階段Bootloader、Linux系統(tǒng)內(nèi)核以及文件系統(tǒng)存儲在NAND Flash中,嵌入式設(shè)備啟動時(shí),將NAND Flash中的文件加載到內(nèi)存中。
不同的嵌入式設(shè)備所支持的啟動各不相同,典型的啟動方式有NAND Flash啟動、MMC/SD啟動、EMIF啟動等方式。本文使用TMS320DM365(以下簡稱DM365)為CPU的嵌入式設(shè)備平臺,研究其啟動方式的實(shí)現(xiàn)過程。
DM365處理器可以根據(jù)啟動引腳BTSEL[2∶0]的配置來決定使用異步EMIF啟動還是ARM的ROM啟動[5]。
當(dāng)BTSEL[2∶0] = 001時(shí),采用異步EMIF啟動方式,此時(shí)需要使用OneNAND設(shè)備,芯片啟動會在執(zhí)行完OneNAND的啟動頁后進(jìn)行。
當(dāng)BTSEL[2∶0] ≠ 001時(shí),使用ARM處理器的RBL(ROM Bootloader)來引導(dǎo)系統(tǒng),此時(shí)有如下7種啟動方式:
① BTSEL[2∶0] = 000為ARM NAND啟動;
② BTSEL[2∶0] = 010為ARM MMC/SD啟動;
③ BTSEL[2∶0] = 011為ARM UART啟動;
④ BTSEL[2∶0] = 100為ARM USB啟動;
⑤ BTSEL[2∶0] = 101為ARM SPI啟動;
⑥ BTSEL[2∶0] = 110為ARM EMAC啟動;
⑦ BTSEL[2∶0] = 111為ARM HPI啟動。
當(dāng)系統(tǒng)從NAND Flash啟動失敗時(shí),會自動嘗試使用MMC/SD方式啟動,如果此時(shí)系統(tǒng)啟動沒有成功,則將循環(huán)嘗試使用MMC/SD方式啟動。其他啟動方式如果啟動失敗,會反復(fù)嘗試當(dāng)前啟動方式。
2.2啟動方式研究
嵌入式系統(tǒng)一般選擇從固態(tài)存儲設(shè)備上啟動,對于DM365系統(tǒng)來說,NAND Flash和MMC/SD是最常用的兩種啟動方式。
2.2.1NAND啟動方式
當(dāng)啟動方式設(shè)置為NAND Flash啟動方式時(shí),首先從設(shè)備中讀取NAND Flash啟動方式存儲設(shè)備的ID,從對應(yīng)RBL中的設(shè)備信息表可以得到必要的信息(例如塊大小、頁大小等),隨后RBL會在第0頁搜索UBL的描述符。
圖3 NAND Flash啟動過程
如果沒有找到符合UBL幻數(shù)的有效UBL,將在接下來的23塊中繼續(xù)搜索。在找到有效的UBL后,RBL將對應(yīng)塊的編號寫入內(nèi)存的特定位置中(0x 7FFC~0x 8000),隨后RBL會根據(jù)UBL提供的信息初始化對應(yīng)的設(shè)備,將UBL拷貝到內(nèi)存中并在入口地址處運(yùn)行UBL,最后UBL將Uboot加載到內(nèi)存中,并執(zhí)行Uboot進(jìn)行系統(tǒng)的引導(dǎo)。在上述過程中,如果RBL在24塊中均未能找到有效的UBL,則會嘗試使用MMC/SD方式啟動。該啟動過程如圖3所示。
2.2.2MMC/SD啟動方式
當(dāng)NAND Flash啟動失敗或BTSEL[2∶0] = 010時(shí),系統(tǒng)采用MMC/SD啟動方式。此時(shí),系統(tǒng)首先從MMC/SD設(shè)備的CID和CSD寄存器中讀取塊大小等信息來完成設(shè)備初始化。隨后ARM處理器的RBL從Micro SD卡的第0號塊開始,搜索UBL描述符中的幻數(shù),幻數(shù)在塊的起始32位中。與NAND Flash啟動方式類似,如果沒有找到符合UBL幻數(shù)的有效UBL,RBL將在接下來的23塊中搜索。但由于MMC/SD存儲設(shè)備與NAND Flash存儲設(shè)備的結(jié)構(gòu)不同,要求MMC/SD設(shè)備的存儲容量小于4 GB。
當(dāng)搜索到有效幻數(shù)時(shí),RBL會將UBL從Micro SD卡中拷貝到IRAM中,并將此時(shí)的塊編號寫入ARM內(nèi)部存儲中的最后32位(0x 7FFC~0x 8000)。在完成復(fù)制后,將從入口地址啟動UBL。UBL啟動后會在Micro SD卡的特定塊中讀取幻數(shù)以及UBL信息,并將信息寫入內(nèi)存中,這些信息中有UBoot的入口地址和載入地址,并將UBoot從Micro SD卡拷貝到內(nèi)存中,隨后系統(tǒng)將從UBoot的入口地址啟動Uboot,引導(dǎo)系統(tǒng)啟動。該啟動過程如圖4所示。
圖4 MMC/SD啟動過程
2.2.3UART、USB與EMAC啟動方式
當(dāng)BTSEL[2∶0] = 011時(shí),設(shè)備將使用UART啟動方式。此時(shí)將通過設(shè)備上的UART接口向ARM的內(nèi)部存儲中下載一段類似UBL的程序。首先RBL向主機(jī)發(fā)送BOOTME信號,主機(jī)接收后將返回一個(gè)ACK序列,經(jīng)過CRC校驗(yàn)后,主機(jī)向RBL發(fā)送UBL程序,RBL接收完成后,啟動UBL并執(zhí)行Uboot的下載與啟動。
當(dāng)BTSEL[2∶0] = 100時(shí),設(shè)備將使用USB啟動方式。USB啟動方式與UART啟動方式類似,但使用USB啟動方式時(shí),需要RBL先初始化USB設(shè)備,并在主機(jī)中確定USB設(shè)備的收發(fā)端點(diǎn),同時(shí)RBL不支持通知USB設(shè)備。
當(dāng)BTSEL[2∶0] = 110時(shí),設(shè)備將使用EMAC啟動方式。EMAC啟動方式使用10/100 Mbps網(wǎng)口進(jìn)行通信,RBL向主機(jī)發(fā)送BOOTP信號,從主機(jī)中接收返回的包,并存儲在內(nèi)存中,接收完畢后,運(yùn)行內(nèi)存中的UBL,隨后從主機(jī)中接收Uboot并啟動,引導(dǎo)系統(tǒng)啟動。
2.2.4SPI與HPI啟動方式
當(dāng)BTSEL[2∶0] = 101時(shí),設(shè)備將使用SPI啟動方式。此時(shí)RBL會從串口中拷貝UBL到ARM內(nèi)存中,并運(yùn)行UBL。UBL進(jìn)行內(nèi)存及接口的初始化,等待主機(jī)向內(nèi)存中寫入U(xiǎn)boot,寫入完成后運(yùn)行Uboot引導(dǎo)系統(tǒng)。
當(dāng)BTSEL[2∶0] = 111時(shí),設(shè)備將使用HPI啟動方式。HPI啟動方式與SPI啟動方式的不同在于,RBL不再主動從串口中拷貝UBL,這一過程交給外部主機(jī)操作,當(dāng)主機(jī)完成UBL的拷貝后,會跳轉(zhuǎn)并執(zhí)行UBL進(jìn)行后續(xù)操作。
3改進(jìn)的MMC/SD啟動方式
3.1改進(jìn)原因
目前,基于DM365的嵌入式設(shè)備大多使用NAND Flash作為系統(tǒng)啟動和運(yùn)行的存儲設(shè)備,在設(shè)備調(diào)試過程中和投入使用之前,都需要通過仿真器向NAND Flash燒寫程序,這個(gè)過程相對繁瑣且容易出錯。同時(shí),NAND Flash一般作為固化硬件焊接在嵌入式設(shè)備上,因此對于頻繁使用存取功能的嵌入式設(shè)備來說,NAND Flash一旦損壞將使設(shè)備整體癱瘓。相比之下,MMC/SD設(shè)備具有容量大、燒寫簡易、更換方便的特點(diǎn),恰好可以代替NAND Flash作為系統(tǒng)啟動和運(yùn)行的存儲設(shè)備。但DM365支持的MMC/SD啟動方式中,存儲容量要小于4 GB,所以需要對該啟動方式進(jìn)行改進(jìn),使其支持大容量MMC/SD存儲設(shè)備。
3.2改進(jìn)方法
基本的MMC/SD啟動方式不能支持大容量存儲設(shè)備的原因在于,MMC/SD存儲設(shè)備在建立分區(qū)時(shí),會在前若干扇區(qū)生成分區(qū)表,容量越大,分區(qū)表占用的空間就越大,而RBL只在0~23號塊中搜索有效的UBL幻數(shù),因此,對于大容量MMC/SD設(shè)備來說,改進(jìn)的關(guān)鍵在于將UBL的幻數(shù)及入口地址存儲在RBL的尋址范圍內(nèi)。
寫入位置如圖5所示。因此設(shè)計(jì)程序在生成MMC/SD啟動設(shè)備時(shí),會讀取UBL的幻數(shù)和入口地址,并將其寫入該空白區(qū)域,使用此種改進(jìn)方法即可使DM365支持大容量MMC/SD設(shè)備作為啟動媒介。
圖5 UBL幻數(shù)及入口地址寫入位置
結(jié)語
參考文獻(xiàn)
[1] 申華,劉龍,張?jiān)拼?嵌入式Linux系統(tǒng)軟硬件開發(fā)與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2013.
[2] 高玉龍,白旭,吳瑋.達(dá)芬奇技術(shù)開發(fā)基礎(chǔ)原理與實(shí)例[M].北京:電子工業(yè)出版社,2012.
[3] 韓超.嵌入式Linux系統(tǒng)開發(fā)全程解析[M].北京:電子工業(yè)出版社,2014.
[4] DougAbbott.Linux for embedded and real-time applications[M].Oxford:Newnes,2013.
[5] Texas Instruments.TMS320DM36x DMSoC ARM Subsystem Reference Guide,2009.
[6] 劉凱,劉博.存儲技術(shù)基礎(chǔ)[M].西安:西安電子科技大學(xué)出版社,2011.
桑赫(碩士研究生)、張烽(博士),研究方向?yàn)榭刂评碚撆c控制工程;林巖(教授),研究方向?yàn)樽赃m應(yīng)控制、魯棒控制理論及應(yīng)用。
Start-up Mode of Hardware Platform in Embedded System
Sang He,Lin Yan,Zhang Feng
(School of Automation and Electrical Engineering,Beijing University of Aeronautics and Astronautics,Beijing 100191,China)
Abstract:In the paper,the start-up process of embedded Linux operating system,the effect and implementation of each part from powering on the device to completing start-up are introduced.Based on the embedded device hardware platform which uses TMS320DM365 as the core,in order to determine the suitable environment and the advantages and disadvantages of each start-up mode,the implementation process of major start-up mode is researched.Through the improved MMC/SD start-up mode,the portable embedded devices can start-up and run without NAND Flash.
Key words:embedded systems; start-up;Linux;TMS320DM365;Micro SD card
收稿日期:(責(zé)任編輯:薛士然2015-06-23)
中圖分類號:TM383.6
文獻(xiàn)標(biāo)識碼:A