• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于ARM9的U-Boot自動識別啟動實現(xiàn)

    2013-09-25 14:12:36蔣大明
    電子設(shè)計工程 2013年3期
    關(guān)鍵詞:自動識別內(nèi)核寄存器

    解 霏,蔣大明

    (北京交通大學(xué) 電子信息工程學(xué)院,北京 100044)

    嵌入式Linux系統(tǒng)通常由引導(dǎo)裝載程序 (包括固化在固件中的 boot代碼和 BootLoader),Linux內(nèi)核,文件系統(tǒng),應(yīng)用程序這4部分構(gòu)成。引導(dǎo)裝載程序是系統(tǒng)加電后執(zhí)行的第一段軟件代碼,在嵌入式系統(tǒng)中整個系統(tǒng)的加載啟動任務(wù)就完全由 BootLoader來完成[1]。BootLoader嚴(yán)重依賴硬件,需要根據(jù)不同的硬件配置進(jìn)行移植。U-boot是德國DENX小組開發(fā)的多種嵌入式CPU的BootLoader程序,支持Linux VxWorks QNX等多種嵌入式系統(tǒng)。筆者通過對U-Boot啟動過程的分析并對其修改,使其支持自動識別啟動,并在基于S3C2440的硬件平臺驗證通過,同時正確引導(dǎo)Linux內(nèi)核。

    1 硬件平臺介紹

    硬件平臺選用的是基于ARM9體系結(jié)構(gòu),ARM920T的CPU,SOC選用的是三星S3C2440A,同時支持Nor FLASH與Nand FLASH啟動。主要硬件資源如表1所示。

    2 U-Boot啟動流程分析及簡介

    2.1 U-Boot簡介

    U-Boot全稱是Universal Bootloader,是遵循GPL條款的開放源碼項目。DENX軟件工程中心的Wolfgang Denk最早基于8xxROM的源碼創(chuàng)建了PCC-Boot工程,并不斷添加處理器的支持。后來Sysgo Gmbh把PPCBoot移植到ARM平臺上,創(chuàng)建了ARMBoot工程,然后以PPCBoot工程和ARMBoot工程為基礎(chǔ),創(chuàng)建了U-Boot工程[2]。

    表1 開發(fā)板硬件資源Tab.1 Hardware resource of platform

    2.2 U-Boot啟動流程分析

    U-Boot的啟動分為階段 1(stage1)和階段 2(stage2),階段1的代碼通常在start.S中,由匯編語言寫成。階段2的代碼通常用C語言來實現(xiàn),可以實現(xiàn)復(fù)雜功能,階段2的代碼通常在lib_arm/board.c中。啟動流程如圖1所示。第1階段完成的工作包括,基本硬件初始化,屏蔽所有中斷源,關(guān)閉看門狗,設(shè)置CPU速度和時鐘頻率,RAM初始化等。設(shè)置堆棧指針,為階段2的C語言做好準(zhǔn)備,拷貝階段2代碼到RAM,跳轉(zhuǎn)到階段2的C入口點。第2階段完成的工作包括,初始化本階段用到的硬件,檢測系統(tǒng)內(nèi)存映射,加載內(nèi)核映像與根文件系統(tǒng)映像,設(shè)置內(nèi)核啟動參數(shù),啟動內(nèi)核[3]。

    圖1 U-Boot啟動流程Fig.1 Flow chart of boot U-Boot

    3 U-Boot的自動識別啟動實現(xiàn)

    3.1 Nor FLASH與Nand FLASH啟動差異

    基于S3C2440的開發(fā)板支持Nor FLASH和Nand FLASH這兩種啟動方式,不論從那種方式啟動,程序都是從0x00000000地址處開始執(zhí)行的,不同的地方是地址映射不一樣。要使開發(fā)板上電后能自動識別啟動設(shè)備,需要根據(jù)2種FLASH啟動時的不同點加以區(qū)別。

    當(dāng)采用Nor FLASH這種啟動時,Nor FLASH被映射到nGCS0(0x00000000)中,S3C2440可以直接從 0x00000000運行。

    當(dāng)采用Nand FLASH這種啟動時,S3C2440的Nand FLASH控制器會自動把Nand FLASH中前4K數(shù)據(jù)被拷貝到S3C2440內(nèi)部大小為4 k的 SRAM(Steppingstone)中,同時內(nèi)部的SRAM被映射到nGCS0(0x00000000)和0x40000000~0x40001000地址空間。S3C2440從0x00000000開始執(zhí)行[4]。

    3.2 U-Boot自動識別啟動實現(xiàn)

    S3C2440的啟動方式可以由引腳OM1與OM0決定,這2個引腳的邏輯電平是實現(xiàn)U-Boot自動識別啟動的關(guān)鍵。OM功能如表2所示。

    表2OM功能Tab.2 Function of OM

    當(dāng)OM[1:0]=00時,S3C2440從 Nand FLASH啟動,其他情況則S3C2440從Nor FLASH啟動,所以可以通過檢測OM[1:0]的電平來判定S3C2440的啟動方式。寄存器rBWSCON的[2:1]位是由OM[1:0]電平狀態(tài)決定的,因此可以通過檢測寄存rBWSCON[2:1]的狀態(tài)來識別啟動方式。

    筆者將AUTO_DETECT函數(shù)添加到start.S文件中,這個函數(shù)可以實現(xiàn)啟動位置的自動識別,識別為Nor FLASH啟動后,函數(shù)會自動跳轉(zhuǎn)到NOR_BOOT函數(shù)中,識別為Nand FLASH啟動后,函數(shù)則會跳轉(zhuǎn)到NAND_BOOT函數(shù)中,實現(xiàn)語句如下:

    _TEXT_BASE存放的是編譯連接時U-Boot在SRAM中運行的基地址,由config.mk定義。函數(shù)首先檢測U-Boot是否在內(nèi)存中運行,然后檢測寄存器rBWSCON[2:1]的值是否為0,為0時跳轉(zhuǎn)到NAND_BOOT函數(shù),不為0時跳轉(zhuǎn)到NOR_BOOT函數(shù)。

    調(diào)用NOR_BOOT時,由于Nor FLASH的結(jié)構(gòu)特點,其支持片內(nèi)運行可以直接從Nor FLASH中復(fù)制U-Boot到SRAM中,所以啟動函數(shù)較為簡單。實現(xiàn)語句如下:

    _armboot_start為代碼段的起始地址,_bss_start為代碼段的末地址,兩者間的差值即為U-boot的大小,存放寄存器R2中,寄存器R0中存放的是當(dāng)前代碼的地址。調(diào)用一個拷貝循環(huán)將U-Boot拷貝到RAM中。

    調(diào)用NAND_BOOT時,Nand FLASH的讀寫需要用專門的驅(qū)動程序來控制,而驅(qū)動程序又比較復(fù)雜,采用C語言實現(xiàn)NAND_BOOT的核心功能要比匯編語言容易些[7]。NAND_BOOT函數(shù)中復(fù)制U-Boot到RAM這段核心代碼用C語言實現(xiàn),其他部分匯編語言實現(xiàn)。鑒于篇幅有限本文只重點說明下U-Boot復(fù)制到RAM的實現(xiàn)過程。部分實現(xiàn)語句如下:

    NAND_BOOT中調(diào)用的C語言函數(shù)為int nand_read_ll(unsigned char*buf, unsigned long start_addr, int size), 這個函數(shù)在nand_read.c這個文件中。nand_read_ll函數(shù)的參數(shù)分別存放在R0,R1,R2這3個寄存器中,R0中存放目標(biāo)地址,R1中存放源地址,R2中存放復(fù)制長度[5]。函數(shù)的執(zhí)行過程如圖2所示。

    圖2 nand_read_ll函數(shù)執(zhí)行流程Fig.2 Execution flow chart of function nand_read_ll

    4 U-Boot引導(dǎo)并啟動Linux內(nèi)核

    4.1 Linux內(nèi)核的啟動參數(shù)設(shè)置

    U-Boot最終要完成的任務(wù)是引導(dǎo)并成功啟動內(nèi)核,內(nèi)核啟動前需要正確設(shè)置內(nèi)核的啟動參數(shù),U-Boot與內(nèi)核的交互式單向的,U-Boot需要將各類參數(shù)傳遞給內(nèi)核。筆者引導(dǎo)的Linux內(nèi)核為2.6.32.2,通過對Linux中Nand FLASH分區(qū)表分析,可以得出如下的啟動參數(shù):

    采用NFS方式掛載根文件系統(tǒng)。

    UvBoot默認(rèn)支持uImage格式的linux內(nèi)核引導(dǎo),而Linux2.6.32.2默認(rèn)編譯生成zImage格式的linux內(nèi)核[6],利用mkimage這個 U-Boot自帶的工具處理下即可,uImage比zImage多一個大小為0x40的頭信息,里面包含CPU體系結(jié)構(gòu),操作系統(tǒng),加載到內(nèi)存的位置,在內(nèi)存中入口點的位置及映像名等信息。

    4.2 Linux內(nèi)核的引導(dǎo)啟動

    將編譯生成的u-boot.bin通過JTAG下載到FLASH的0地址處,通過tftp將uImage下載到Nand FLASH中,重啟開發(fā)板,若從串口打印出如下信息則說明U-Boot成功引導(dǎo)了linux內(nèi)核。

    圖3 串口打印信息Fig.3 Printed information of UART

    5 結(jié)束語

    BootLoader一直是嵌入式開發(fā)的熱門研究方向,U-Boot是一款十分優(yōu)秀的開源BootLoader,對U-Boot的研究具有很大的實用價值。本文對于基于S3C2440硬件平臺的自動識別啟動原理進(jìn)行了詳細(xì)的分析,并提出了實現(xiàn)方案,同時對linux內(nèi)核的啟動參數(shù)做了簡要分析。編譯生成的u-boot.bin燒寫到Nor FLASH或者Nand FLASH均能穩(wěn)定運行,這對進(jìn)一步嵌入式系統(tǒng)開 發(fā)帶來了很大的便利。

    [1]文全剛.ARM嵌入式技術(shù)原理與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2011.

    [2]查婧.ARM9嵌入式系統(tǒng)設(shè)計及U-boot移植[D].西安:中科院西安光學(xué)精密機(jī)械研究所,2009.

    [3]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2008.

    [4]Samsung Electronics.S3C2440A 32-BIT CMOS MICROCONTROLLER USR`MANUAL[S].2004:195-197.

    [5]楊水清.ARM嵌入式Linux系統(tǒng)開發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2008.

    [6]高文輝,師奕兵,張偉.基于S3C2440的U-Boot雙啟動實現(xiàn)[J].測控技術(shù),2012,31(2):87-91.

    GAO Wen-hui,SHI Yi-bing,ZHANG Wei.Implementation of double boot in U-Boot based on S3C2440[J].Measurement&Control Technology,2012,31(2):87-91.

    [7]吳玉香,周建香,郭建勛.U-Boot在S3C2410上的移植于功能擴(kuò)展[J].計算機(jī)科學(xué)與工程,2010,31(4):729-732.

    WU Yu-xiang,ZHOU Jian-xiang,GUO Jian-xun.Porting and expansionofU-BootbasedonS3C2410[J].ComputerEngineering and Design,2010,31(4):729-732.

    猜你喜歡
    自動識別內(nèi)核寄存器
    萬物皆可IP的時代,我們當(dāng)夯實的IP內(nèi)核是什么?
    強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
    Lite寄存器模型的設(shè)計與實現(xiàn)
    基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
    Linux內(nèi)核mmap保護(hù)機(jī)制研究
    自動識別系統(tǒng)
    特別健康(2018年3期)2018-07-04 00:40:18
    分簇結(jié)構(gòu)向量寄存器分配策略研究*
    金屬垃圾自動識別回收箱
    基于IEC61850的配網(wǎng)終端自動識別技術(shù)
    電測與儀表(2016年6期)2016-04-11 12:06:38
    蘭姆凹陷穩(wěn)頻工作點自動識別技術(shù)
    大港区| 梨树县| 越西县| 辉县市| 阿瓦提县| 石渠县| 苗栗县| 县级市| 白玉县| 五指山市| 林西县| 滨州市| 嘉黎县| 弥渡县| 红桥区| 游戏| 井冈山市| 通州区| 武强县| 阿巴嘎旗| 滨海县| 确山县| 寿宁县| 屏东市| 宕昌县| 宣城市| 库尔勒市| 曲靖市| 东乡族自治县| 宁夏| 桂平市| 潢川县| 稻城县| 长岭县| 景东| 潜江市| 额尔古纳市| 东台市| 甘谷县| 乌拉特前旗| 芒康县|