• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      U-Boot在S3C2440上的分析和移植

      2016-01-12 23:11:40夏禮勇符秀輝
      關(guān)鍵詞:源碼開發(fā)板網(wǎng)卡

      夏禮勇, 符秀輝

      (沈陽化工大學(xué) 信息工程學(xué)院, 遼寧 沈陽 110142)

      移植Bootloader的目的是在系統(tǒng)上電后,使用Bootloader初始化系統(tǒng)硬件,構(gòu)建系統(tǒng)軟件環(huán)境,最后引導(dǎo)系統(tǒng)跳轉(zhuǎn)到Linux內(nèi)核繼續(xù)運(yùn)行.在不同的嵌入式平臺(tái)上,需要對(duì)于針對(duì)特定的硬件配置制作對(duì)應(yīng)的Bootloader.Bootloader種類很多,每種Bootloader都具有平臺(tái)針對(duì)性,其中U-Boot對(duì)于ARM架構(gòu)的芯片支持更加完善.

      目前研究U-Boot移植的文獻(xiàn)大多數(shù)介紹的是在NAND Flash上的移植操作,在文獻(xiàn)中沒有介紹U-Boot如何引導(dǎo)系統(tǒng)跳轉(zhuǎn)到Linux內(nèi)核的實(shí)現(xiàn)細(xì)節(jié),只有移植步驟和實(shí)現(xiàn)現(xiàn)象,不能明顯體現(xiàn)移植目的.本文通過虛擬機(jī)搭建編譯環(huán)境,分析U-Boot啟動(dòng)流程,并在啟動(dòng)流程第二階段中具體介紹U-Boot引導(dǎo)系統(tǒng)跳轉(zhuǎn)到Linux內(nèi)核的實(shí)現(xiàn)細(xì)節(jié),詳細(xì)分析U-Boot的移植步驟,最后在NOR Flash上移植U-Boot.文中移植U-Boot的操作是后續(xù)嵌入式Linux系統(tǒng)開發(fā)的基礎(chǔ),同時(shí)文中介紹的U-Boot啟動(dòng)流程和移植步驟也能給類似平臺(tái)移植Bootloader提供參考.

      1 U-Boot簡(jiǎn)介

      U-Boot是一種業(yè)界廣泛使用的Bootloader,其程序開源,兼容性好,源代碼可在互聯(lián)網(wǎng)上直接下載.U-Boot支持很多架構(gòu)的CPU,如X86、ARM、MIPS等架構(gòu)的CPU,能夠引導(dǎo)Linux和Wince等嵌入式操作系統(tǒng).本文基于1.1.6版本的U-Boot進(jìn)行移植,根據(jù)U-Boot源碼文件夾下各個(gè)目錄的特性進(jìn)行分類,可分為5類,如表1所示.

      表1 目錄分類

      2 U-Boot的移植環(huán)境

      2.1 硬件環(huán)境

      移植平臺(tái)是以S3C2440A為核心的ARM9開發(fā)板,S3C2440A芯片內(nèi)部的CPU型號(hào)為ARM920T.S3C2440A內(nèi)部集成SRAM,具有5級(jí)流水線,支持NOR Flash和NAND Flash[1].開發(fā)板主要資源如表2所示.

      表2 板載主要元器件

      Table 2 Plate main components

      2.2 軟件環(huán)境

      通過在VMware Workstation虛擬機(jī)上運(yùn)行Ubuntu14.10系統(tǒng)搭建移植軟件編譯環(huán)境,arm-linux-gcc-4.3.2作為編譯器,使用JTAG作為下載和調(diào)試工具.

      3 U-Boot的啟動(dòng)流程分析

      U-Boot可以設(shè)置從NOR Flash啟動(dòng),也可以設(shè)置從NAND Flash啟動(dòng),因?yàn)镹AND Flash容易產(chǎn)生壞塊,所以選擇從NOR Flash啟動(dòng),在本文后續(xù)的移植過程中將編譯生成的uboot.bin文件燒錄到NOR Flash中,實(shí)現(xiàn)從NOR Flash啟動(dòng)系統(tǒng)程序.

      3.1 U-Boot啟動(dòng)流程第一階段

      U-Boot是具有兩階段啟動(dòng)過程的Bootloader,通常用匯編語言實(shí)現(xiàn)第一階段程序,用C語言實(shí)現(xiàn)第二階段程序.在啟動(dòng)第一階段系統(tǒng)執(zhí)行start.S和lowlevel_init.S匯編文件,這兩個(gè)文件分別位于cpu/$(CPU)和board/$(BOARDDIR)目錄中,主要完成以下工作:(1)初始化開發(fā)板相關(guān)的硬件;(2)初始化板載內(nèi)存芯片;(3)將U-Boot代碼拷貝到初始化好的SDRAM中;(4)設(shè)置棧;(5)跳到第二階段C代碼中繼續(xù)執(zhí)行[2].$(CPU)和$(BOARDDIR)分別代表SoC內(nèi)部的CPU型號(hào)、進(jìn)行移植的開發(fā)板名稱,兩個(gè)變量的值分別為arm920t和my2440.

      3.2 U-Boot啟動(dòng)流程第二階段

      U-Boot啟動(dòng)流程第二階段如圖1所示.

      圖1 U-Boot啟動(dòng)流程第二階段

      在第一階段第5步中,U-Boot通過ldr指令將第二階段C語言程序start_armboot函數(shù)入口地址賦值給PC寄存器,使系統(tǒng)跳轉(zhuǎn)到第二階段執(zhí)行C語言代碼.

      在第二階段啟動(dòng)過程中,程序初始化系統(tǒng)時(shí)鐘、初始化定時(shí)器、初始化串口模塊,檢測(cè)Flash上環(huán)境參數(shù)是否設(shè)置.完成上述步驟后,start_armboot函數(shù)繼續(xù)初始化NOR Flash,將存儲(chǔ)在NOR Flash上的環(huán)境參數(shù)讀入SDRAM,初始化網(wǎng)卡模塊,調(diào)用main_loop()函數(shù).

      在main_loop()函數(shù)中,系統(tǒng)會(huì)檢測(cè)U-Boot環(huán)境參數(shù)bootdelay和bootcmd的值是否定義,如果沒有定義系統(tǒng)會(huì)不斷檢測(cè)串口輸入,并解析執(zhí)行串口輸入的命令;如果已經(jīng)定義bootdelay和bootcmd,系統(tǒng)則會(huì)倒數(shù)bootdelay秒;若在bootdelay秒內(nèi)串口有輸入,系統(tǒng)會(huì)進(jìn)入讀取串口輸入命令、執(zhí)行命令的循環(huán)中;若沒有輸入,系統(tǒng)會(huì)執(zhí)行環(huán)境參數(shù)bootcmd中定義的命令,環(huán)境參數(shù)bootcmd中定義了系統(tǒng)內(nèi)核的讀取指令和啟動(dòng)內(nèi)核指令[3],執(zhí)行bootcmd命令后便成功跳轉(zhuǎn)到Linux內(nèi)核中繼續(xù)運(yùn)行.

      4 U-Boot在S3C2440上的移植步驟

      4.1 下載U-Boot-1.1.6源碼包解壓縮

      本文的移植平臺(tái)是S3C2440開發(fā)板,要在此硬件平臺(tái)上移植U-Boot,需要根據(jù)板載硬件修改U-Boot源碼.首先從互聯(lián)網(wǎng)下載1.1.6版本的U-Boot源碼壓縮包,把源碼壓縮包放入到Ubantu14.10主機(jī)的/work/system目錄下,在Linux主機(jī)上進(jìn)入/work/system目錄下,在終端命令行中執(zhí)行“tar xjf U-Boot-1.1.6.tar.bz2”命令,待命令執(zhí)行完畢后,可以得到已經(jīng)解包解壓縮的U-Boot-1.1.6文件夾.

      4.2 創(chuàng)建工程相應(yīng)目錄和文件

      目前1.1.6版本的U-Boot源碼已經(jīng)能夠支持大部分的2410開發(fā)板,本文基于smdk2410的U-Boot程序?qū)3C2440開發(fā)板移植U-Boot.在解壓好的u-boot-1.1.6文件夾中的board目錄下存在smdk2410文件夾,首先進(jìn)行以下6步操作:

      (1) 在U-Boot源碼根目錄board文件夾下新建my2440文件夾;

      (2) 將smdk2410目錄下的所有文件拷貝到my2440文件夾中;

      (3) 在include/configs目錄下新建my2440.h文件;

      (4) 復(fù)制相同目錄下smdk2410.h中的全部?jī)?nèi)容到my2440.h中;

      (5) 在U-Boot源碼根目錄下的Makefile中添加如下配置命令[4]:

      my2440_config:unconfig

      @$(MKCONFIG) $(@:_config=) arm arm920t my2440 NULL s3c24x0

      (6) 修改board目錄下my2440目錄中的Makefile,將Makefile文件中的“COBJS:=”項(xiàng)后smdk2410.o修改為my2440.o.

      4.3 修改系統(tǒng)時(shí)鐘設(shè)置

      查閱芯片數(shù)據(jù)手冊(cè)可知S3C2410A主頻為200 MHz,S3C2440A主頻為400 MHz.從S3C2440A數(shù)據(jù)手冊(cè)中得知系統(tǒng)頻率MPLL和USB控制器頻率UPLL計(jì)算公式如下[5]:

      MPLL=(2×m×fin)/(p×2s)

      (1)

      UPLL=(m×fin)/(p×2s)

      (2)

      在公式(1)和(2)中,m=MDIV+8,p=PDIV+2,s=SDIV,fin為外接晶振頻率.本文的移植平臺(tái)上外接晶振為12 MHz,所以fin的值是12 MHz.在系統(tǒng)晶振輸入為12 MHz的情況下,要改變系統(tǒng)時(shí)鐘頻率和USB控制器頻率,需要在系統(tǒng)時(shí)鐘的宏定義中給PLLCON寄存器賦值.根據(jù)S3C2440A數(shù)據(jù)手冊(cè)可知PLLCON寄存器分為MDIV,PDIV,SDIV三個(gè)部分,要使系統(tǒng)頻率倍頻到400 MHz,需要將MDIV,PDIV,SDIV分別賦值為0x5c,0x01,0x01;要使USB控制器頻率變成48 MHz,需要將MDIV,PDIV,SDIV分別賦值0x38,0x02,0x02.

      綜合上述分析,在board_init函數(shù)中添加如下宏定義:

      #define S3C2440_MPLL_TO_400 MHz

      ((0x5c?12)|(0x01?4)|(0x01))

      #defineS3C2440_UPLL_TO_48 MHz

      ((0x38?12)|(0x02?4)|(0x02))

      其中,board_init函數(shù)定義于my2440目錄下的my2440.c文件中.完成上述設(shè)置后,還需要設(shè)置時(shí)鐘分頻比,根據(jù)S3C2440A數(shù)據(jù)手冊(cè)給CLKDIVN寄存器賦值0x05,實(shí)現(xiàn)FCLK、HCLK、PCLK的分頻比為1∶4∶8.具體步驟為在my2440.c文件中繼續(xù)添加如下宏定義:

      #define S3C2440_CLKDIVN 0x05

      4.4 設(shè)置支持DM9000網(wǎng)卡

      在嵌入式Linux系統(tǒng)中,網(wǎng)絡(luò)功能很重要.U-Boot-1.1.6已經(jīng)支持smdk2410開發(fā)板板載的CS8900網(wǎng)卡,S3C2440開發(fā)板板載的是DM9000網(wǎng)卡,要實(shí)現(xiàn)網(wǎng)絡(luò)支持,首先需要在include/configs文件夾下的my2440.h文件中刪除如下所示的支持CS8900網(wǎng)卡的宏定義[6]:

      #define CONFIG_DRIVER_CS8900 1

      #define CS8900_BASE 0x19000300

      #define CS8900_BUS16 1

      S3C2440開發(fā)板中DM9000網(wǎng)卡連接在存儲(chǔ)控制器的BANK4,從數(shù)據(jù)手冊(cè)得知DM9000網(wǎng)卡的地址為0x20000000,設(shè)置支持DM9000網(wǎng)卡需要在my2440.h文件中添加如下宏定義:

      #define CONFIG_DRIVER_DM9000 1

      #define CONFIG_DM9000_IO_BASE 0x20000000

      #define DM9000_DATA

      (CONFIG_DM9000_IO_BASE+4)

      4.5 編譯U-Boot在my2440平臺(tái)上燒錄

      在完成上面一系列步驟后,U-Boot編譯前的修改源碼工作已經(jīng)完成.此時(shí)在虛擬機(jī)上運(yùn)行Ubuntu系統(tǒng),進(jìn)入U(xiǎn)-Boot根目錄下,在終端命令行中輸入“make my2440_config”配置命令,對(duì)U-Boot源碼進(jìn)行針對(duì)移植平臺(tái)的配置操作,待配置操作完成后,在終端命令行中輸入make命令編譯U-Boot.

      在編譯結(jié)束后,系統(tǒng)會(huì)生成uboot.bin二進(jìn)制文件,使用JTAG工具將uboot.bin文件燒錄到移植平臺(tái)上,在燒錄過程中既可以燒錄到NAND Flash中,也可以燒錄到NOR Flash中,因?yàn)镹AND Flash易產(chǎn)生壞塊,為保證U-Boot的穩(wěn)定性,本文將uboot.bin文件燒錄到NOR Flash中.當(dāng)成功燒錄后,為開發(fā)板重新上電啟動(dòng)系統(tǒng),通過Secure CRT工具可以查看到開發(fā)板串口上輸出的U-Boot和開發(fā)板相關(guān)的信息,如圖2所示.至此成功實(shí)現(xiàn)U-Boot在S3C2440開發(fā)板NOR Flash上的移植.

      圖2 串口輸出信息

      5 結(jié)束語

      選用U-Boot作為移植對(duì)象,從互聯(lián)網(wǎng)下載U-Boot源碼,通過虛擬機(jī)搭建開發(fā)環(huán)境,對(duì)源碼壓縮包進(jìn)行解包解壓縮,基于smdk2410的U-Boot 源碼針對(duì)S3C2440開發(fā)板硬件資源修改源碼,得到適合在S3C2440上移植的U-Boot代碼,通過編譯環(huán)境和編譯器對(duì)U-Boot代碼進(jìn)行編譯,最后將編譯得到的uboot.bin文件燒錄到S3C2440開發(fā)板板載的NOR Flash中,成功完成S3C2440開發(fā)板的移植工作.在特定嵌入式硬件平臺(tái)上移植U-Boot是進(jìn)行嵌入式Linux開發(fā)工作的基礎(chǔ),通過本文的移植工作,為后續(xù)工作做好鋪墊,也能為類似嵌入式平臺(tái)移植Bootloader提供一定的參考作用.

      [1] 杜春雷.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003:8-9.

      [2] 張進(jìn),姜威.u-boot的啟動(dòng)流程分析及移植步驟[J].電力自動(dòng)化設(shè)備,2005,25(7):68-71.

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

      [4] 申爽.基于S3C2440的Uboot分析與移植[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2012,21(5):222-225.

      [5] Samsung Electronics.S3C2440A 32-Bit Risc Micro controller User′s Manual Revision 0.12[EB/OL].(2004-03-15)[2013-07-19].http://www.docin.com/p-679498723.html.

      [6] 馮林琳,耿恒山.基于S3C6410的Uboot分析與移植[J].計(jì)算機(jī)與現(xiàn)代化,2013(1):119-121.

      猜你喜歡
      源碼開發(fā)板網(wǎng)卡
      在DDS 中間件上實(shí)現(xiàn)雙冗余網(wǎng)卡切換的方法
      基于網(wǎng)頁源碼結(jié)構(gòu)理解的自適應(yīng)爬蟲代碼生成方法
      基于圖神經(jīng)網(wǎng)絡(luò)的軟件源碼漏洞檢測(cè)方法
      企業(yè)如何保護(hù)源碼
      Server 2016網(wǎng)卡組合模式
      Microchip最新推出兩款PIC32 Curiosity開發(fā)板
      淺析單片機(jī)開發(fā)板的設(shè)計(jì)與制作
      電子制作(2017年22期)2017-02-02 07:10:14
      基于數(shù)據(jù)結(jié)構(gòu)教輔系統(tǒng)的實(shí)驗(yàn)課程改革
      挑戰(zhàn)Killer網(wǎng)卡Realtek網(wǎng)游專用Dragon網(wǎng)卡
      Mouser為您呈上開發(fā)關(guān)鍵之STMicroelectronics Nucleo開發(fā)板
      滨州市| 吉水县| 蒙城县| 叶城县| 昌宁县| 定襄县| 海晏县| 达拉特旗| 桐梓县| 蚌埠市| 萨迦县| 武宣县| 武鸣县| 通河县| 泰和县| 连江县| 承德市| 班玛县| 临汾市| 辉南县| 探索| 喜德县| 厦门市| 秦皇岛市| 蒙自县| 广汉市| 介休市| 绵竹市| 宝清县| 酉阳| 桂阳县| 武冈市| 广河县| 博客| 四川省| 永康市| 江陵县| 阿巴嘎旗| 无为县| 新余市| 阜新|