關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 基于Nandflash的Bootloader的設計與實現

        基于Nandflash的Bootloader的設計與實現

        作者: 時間:2007-12-12 來源:網絡 收藏
        摘要是系統上電或復位后首先運行的一段代碼,是連接操作系統和硬件的橋梁,負責初始化硬件和引導操作系統等。目前已有很多通用的,但是如何根據特定的嵌入式平臺,移植自己的引導程序是一個重點和難點。文章詳細說明了從引導操作系統要完成的主要任務和實現方法,并給出了在S3C2410上實現啟動的試驗結果。
        關鍵詞;移植;;S3C2410

        0引言

        Bootloader通常稱為系統的引導加載程序,是系統加電或復位后執行的第一段代碼[1]。一般它只在系統啟動時運行非常短的時間,但對于嵌入式系統來說,這是一個非常重要的系統組成部分。通過這段小程序,可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為調用操作系統內核準備好正確的環境,并同時提供基本輸入、輸出系統監控功能和程序調試功能。

        Bootloader是嚴重地依賴于硬件而實現的。每種不同體系結構的處理器都有不同的Bootloader。除了依賴于處理器的體系結構以外,Bootloader實際上也依賴于具體的嵌入式板級設備的配置,也就是說,對于兩塊不同的嵌入式板而言,即使它們是基于同一種處理器而構建的,要想讓運行在一塊板子上的Bootloader程序也能運行在另一塊板子上,通常也都需要修改與目標硬件相關的代碼。因此有必要分析Bootloader,并理解和找出其中的原理和規律,就其特定的嵌入式系統,移植或開發屬于自己的Bootloader。

        1系統硬件平臺簡介
        本系統采用的是SamSung公司的S3C2410處理器[2],它是專門為移動手持設備提供的高性價比和高性能的嵌入式微處理器解決方案。其內核是ARM920T,最高能工作在202.8MHz,為了減少系統總成本和減少外圍器件,它集成了如下部件:分別為16KB指令和數據Cahce、1個LCD控制器、SDRAM控制器、NANDFLASH控制器、3通道UART、4通道DMA、4個具有PWM功能的計時器和1個內部時鐘、8通道10位ADC、觸摸屏接口、I²S總線接口,2個USB主機接口、1個USB設備接口,2個SPI接口、SD和MMC卡接口、看門狗定時器、117位通用IO口、24位外部中斷源、8通道10位AD控制器等。本文涉及的S3C2410開發板的硬件結構如圖1所示,本文主要闡述從Nandflash引導操作系統要完成的主要任務和實現方法,至于從Norflash引導操作系統,不打算具體實現。

        圖1S3C2410硬件結構圖

        2存儲空間分布和映射圖
        硬件平臺的Nandflash(型號是:K9F1208U0M[3])空間為64MB,SDRAM(型號是:HY57V561620[4],32Mx2)空間為64M(0x30000000-0x33ffffff),采用如圖2所示的存儲空間分布圖,因為Nandflash只能存儲程序,無法運行程序。為了能夠從Nandflash啟動,上電復位時,S3C2410通過硬件邏輯把Nandflash的前4KB的內容復制到片內SRAM中,而片內SRAM被映射到地址0x0,這樣就可以從地址0x0處取到有效指令,開始執行bootloader,完成把Nandflash中的內核代碼復制到sdram中等工作。

        圖2引導代碼和操作系統內核在Nandflash和存儲空間中的分布情況

        3Bootloader的設計流程
        Bootloader引導程序是硬件上電復位后首先運行的代碼,由它來加載嵌入式操作系統。然后由操作系統接管整個系統,進行進程管理、內存管理、磁盤管理和各個外設管理等工作。BootLoader是操作系統內核運行之前的一段自舉程序,用來初始化硬件設備、改變處理器運行模式和重組中斷向量,建立內存空間的映射圖,將系統的軟硬件環境帶到一個由用戶定制的特定狀態,然后加載操作系統內核。從操作系統的角度來看,Bootloader的總目標就是正確地調用內核來執行。Bootloader一般分為stage1和stage2兩大部分[5],對于依賴于CPU體系結構的代碼,比如設備初始化代碼等,通常都放在stage1中,而且通常都用匯編語言來實現,以達到短小精悍的目的,也就是前面說的啟動代碼。而stage2則通常用C語言來實現,這樣可以實現復雜的功能,而且代碼會具有更好的可讀性和可移植性。

        3.1Bootloader的stage1
        這部分代碼必須首先完成一些基本的硬件初始化。為stage2的執行以及隨后的內核的執行準備好一些基本的硬件環境。Bootloader的stage1一般通用的內容包括:
        (1)設置中斷和異常向量;(2)禁止看門狗;(3)屏蔽所有的中斷,在BootLoader的執行全過程中可以不必響應任何中斷,中斷屏蔽可以通過寫CPU的中斷屏蔽寄存器或狀態寄存器CPSR寄存器來完成;(4)設置CPU的速度和時鐘頻率;(5)對RAM進行初始化,包括正確設置系統的內存控制器的功能寄存器等;(6)初始化LED或UART,就是通過GPIO來驅動LED,也可以通過初始化UART向串口打印Bootloader的調試信息來表明系統的狀態是OK還是ERROR,以便跟蹤系統運行情況;(7)關閉CPU內部指令/數據高速緩存(cache);(8)為加載Bootloader的stage2準備RAM空間;(9)設置好堆棧;(10)跳轉到stage2的C入口點;其流程圖如圖3所示。

        圖3Bootloader的stage1的實現

        3.2Bootloader的stage2
        為了讓程序跳入C語言的“main”函數,我們采用直接跳轉到“main”函數的方法,實現代碼如下:
        bMain
        進入main函數后即可以開始本階段stage2的初始化任務,這包括:
        (1)如果在stage1沒有初始化UART,這時候至少初始化一個串口,以便和終端用戶進行交互,當然也可以繼續點亮或熄滅LED來判斷程序執行情況;
        (2)修改時鐘頻率;
        (3)使能指令Cache;
        (5)從串口中打印一些必要的交互信息,了解系統狀態;
        (6)初始化中斷,包括屏蔽中斷,清除中斷懸掛標志,初始化中斷向量表,注冊需要的中斷處理函數等;
        (8)打印版本、時間等信息,并從Nandflash復制內核到SDRAM中;
        (9)修改指針,直接跳到內核在SDRAM中的首地址處,至此,完成了Bootloader的全部運行加載工作;

        下面是main()函數和從Nandflash復制內核到SDRAM中的ReadImageFromNandflash()函數的具體實現,但省略了一些具體細節,包括從串口打印的啟動、交互、調試信息和一些具體函數的實現。一些具體函數的實現可以參考三星評估版源代碼。
        voidMain(void)
        {
        JumpAddr=0x30200000;//拷貝內核到sdram中的起始地址,也是內核開始執行的地址
        ChangeClockDivider(1,1);//1:2:4
        ChangeMPllValue(0x5c,0x1,0x1);//FCLK=202.8MHz
        MMU_EnableICache();//使能指令Cache
        Uart_Init();//初始化串口
        Port_Init();//初始化I/O口
        NF_Init();//初始化Nandflash控制器
        NF_ReadID();//讀取Nandflash存儲器ID號
        ReadImageFromNandflash();//把存儲在Nandflash中的內核拷貝到SDRAM中
        rINTMSK=BIT_ALLMSK;//屏蔽所有中斷
        Launch(JumpAddr);//跳轉到sdram中內核開始處,并運行內核
        }
        從Nandflash(Flash是K9F1208U0M)拷貝內核到SDRAM的函數具體實現如下:
        voidReadImageFromNandflash(void)
        {
        U8Image_Buf[512];
        U32Sram_Space=0;
        U32j,k,numberblock;
        staticU32i,SECTOR_SIZE=512;
        staticU8isbad;
        volatileU32IMAGE_BASE=0x30200000;//內核在sdram中運行的開始地址
        rINTMSK=BIT_ALLMSK;//屏蔽所有中斷
        i=2;//從第2個block開始拷貝內核,第0個用于存儲本文的bootloader,第1個沒用到
        numberblock=2047;//拷貝多少個block到sdram中,視內核大小設置此值
        while(1)
        {
        nextblock:
        isbad=0;
        isbad=NF_IsBadBlock(i);//判斷正在拷貝的block是否是壞block
        if(isbad)//是壞block,就進行相應的處理;否則就忽略此處,進行下面的拷貝
        {
        i=i+1;//調整,指向下一個block
        isbad=0;
        if(i>=numberblock)//判斷是否拷貝完了所需的block
        {
        Launch(JumpAddr);//拷貝完了所需的block,就跳到sdram中內核開始處
        }
        gotonextblock;
        }
        for(k=0;k32;k++)//1block=32pages
        {//FMD_ReadSector()函數實現從Nandflash存儲器中讀取數據到數據緩沖區中
        FMD_ReadSector(i,(U8*)Image_Buf,k);
        for(j=0;jSECTOR_SIZE;j++)//1page=512bytes
        {//從數據緩沖區中拷貝到sdram中
        *((U8*)(IMAGE_BASE+Sram_Space+j))=Image_Buf[j];
        }
        Sram_Space=Sram_Space+SECTOR_SIZE;//調整sdram中的偏移地址
        }
        i=i+1;//調整,指向下一個block
        if(i>=numberblock)//判斷是否拷貝完了所需的block
        {
        Launch(JumpAddr);//拷貝完了所需的block,就跳到sdram中內核開始處
        }
        }
        }

        4試驗結果
        由于三星公司的S3C2410集成了Nandflash控制器,它通過硬件邏輯把Nandflash的前4KB內容,即把Bootloader復制到片內sram中,并被映射到地址0x0處。通過跳線設置默認從nandflash啟動,那么,系統每次上電或復位后,首先開始運行的就是Bootloader。使用ADS1.2集成開發環境建立Bootloader應用工程,添加必需的文件并設置好編譯環境,如Bootloader的RO_Base設置為0x0,RW_Base設置為0x33ff0000等,調試并最后生成可執行二進制文件,通過JTAG接口把Bootloader燒寫到Nandflash的第0個block地址開始處,通過usb下載工具把操作系統燒寫到第2個block地址開始處,復位啟動系統運行后的結果如圖4所示,該程序用于基于uCOS操作系統的圖像采集系統的引導。用同樣的方法燒寫不同的操作系統內核應用程序,試驗結果每一次表明:Bootloader運行良好,啟動加載內核快,且簡單、實用、可靠。

        圖4Bootloader引導運行的系統

        5結論
        Bootloader的設計與實現是一個非常復雜的過程,因此要根據具體的硬件和軟件需求分析來進行移植或設計。本文設計的Bootloader完成的主要功能包括:試驗板硬件的初始化、串口初始化、時鐘頻率修改以及從Nandflash復制操作系統到SDRAM中運行等,并通過PC機上的超級終端顯示了正確的啟動運行信息,且可執行代碼只有3K左右。因此,本文所詳細描述的Bootloader啟動運行的全過程,對理解、設計和移植Bootloader具有一定的參考意義。

        參考文獻:
        [1]徐宇清,黃彥平等.S3C44B0X的Bootloader技術分析[J].上海理工大學學報,2005,27(4):369-372.
        [2]SAMSUNG公司.Samsungs3c2410aUserManualv1.0.pdf.
        [3]SAMSUNG公司.K9F1208U0M-YCB0.pdf.
        [4]http://www.icpdf.com/pdf/HY57V561620.htm.HY57V561620(L)T.pdf.
        [5]張崳編著.32位嵌入式系統硬件設計與調試.北京:機械工業出版社,2005,7.

        [作者簡介]
        郝衛東(1964-),男,漢族,河北定縣人,桂林電子科技大學高級工程師,碩士研究生導師,主要從事機器人技術和醫療電子方面的研究。

        劉溯奇(1977-),男,漢族,廣西桂林人,廣西桂林電子科技大學機器人中心碩士研究生,主要從事機器人技術、嵌入式系統應用方面的研究。


        關鍵詞: Bootloader Nandflash

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 徐汇区| 洞头县| 彭水| 南雄市| 阜宁县| 青海省| 洪湖市| 丰台区| 宜君县| 定州市| 马山县| 遵义县| 德令哈市| 南阳市| 雅安市| 金川县| 连州市| 曲水县| 巴塘县| 新兴县| 临朐县| 孟津县| 扎兰屯市| 武义县| 威宁| 姚安县| 顺昌县| 安新县| 长宁县| 常熟市| 焉耆| 瑞丽市| 焦作市| 乌兰县| 芦溪县| 小金县| 加查县| 大同市| 海门市| 邵阳市| 县级市|