在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于S3C2440的u-boot的移植

            基于S3C2440的u-boot的移植

            作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
            1 Bootloader及u-boot簡介

            Bootloader代碼是芯片復(fù)位后進入操作系統(tǒng)之前執(zhí)行的一段代碼,主要用于完成由硬件啟動到操作系統(tǒng)啟動的過渡,從而為操作系統(tǒng)提供基本的運行環(huán)境,如初始化CPU、堆棧、存儲器系統(tǒng)等。Bootloader代碼與CPU芯片的內(nèi)核結(jié)構(gòu)、具體型號、應(yīng)用系統(tǒng)的配置及使用的操作系統(tǒng)等因素有關(guān),其功能類似于PC機的BIOS程序。由于Bootloader和CPU及電路板的配置情況有關(guān),因此不可能有通用的bootloader ,開發(fā)時需要用戶根據(jù)具體情況進行移植。嵌入式Linux系統(tǒng)中常用的bootloader有armboot、redboot、blob、u-boot 等,其中u-boot是當前比較流行,功能比較強大的bootloader,可以支持多種體系結(jié)構(gòu),但相對也比較復(fù)雜。Bootloader的實現(xiàn)依賴于 CPU的體系結(jié)構(gòu),大多數(shù)bootloader都分為stage 1和stage2兩大部分。Bootloader的基本原理見參考文獻。u-boot是sourceforge網(wǎng)站上的一個開放源代碼的項目。它可對 PowerPC MPC5XX、MPC8XX、MPC82XX、 MPC7XX、MPC74XX、ARM(ARM7、ARM9、StrongARM、VxWorks、NetBSD、QNX、RTEMS、ARTOS、 LynxOS等,主要用來開發(fā)嵌入式系統(tǒng)初始化代碼bootloader。軟件的主站點是http://sourceforge.net/projects/u-boot。u-boot最初是由denx的PPC-boot發(fā)展而來的,它對PowerPC系列處理器的支持最完善,對Linux操作系統(tǒng)的支持最好。源代碼開放的U-boot軟件項目經(jīng)常更新。

            本文引用地址:http://www.biyoush.com/article/201611/319123.htm

            當前最新版本是NOV.2.2006 Update的U-boot-1.1.6。

            2 u-boot系統(tǒng)啟動流程

            大多數(shù)bootloader都分為stage1和stage2兩大部分,u-boot也不例外。依賴于cpu體系結(jié)構(gòu)的代碼(如設(shè)備初始化代碼等)通常都放在stage1且可以用匯編語言來實現(xiàn),而stage2則通常用C語言來實現(xiàn),這樣可以實現(xiàn)復(fù)雜的功能,而且有更好的可讀性和移植性。

            2.1 stage1 (start.s代碼結(jié)構(gòu))

            u-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:

            (1)定義入口。由于一個可執(zhí)行的Image必須有一個入口點,并且只能有一個全局入口,通常這個入口arm結(jié)構(gòu)的cpu放在ROM(Flash)的0x00地址(MIPS放在0xBFC00000),因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。

            (2)設(shè)置異常向量(Exception Vector)。

            (3)設(shè)置CPU的速度、時鐘頻率及中斷控制寄存器。

            (4)初始化內(nèi)存控制器。

            (5)將ROM中的程序復(fù)制到RAM中。

            (6)初始化堆棧。

            (7)轉(zhuǎn)到RAM中執(zhí)行,該工作可使用指令ldrpc來完成。

            2.2 stage2 C語言代碼部分

            lib_arm/board.c中的start_armboot是C語言開始的函數(shù),也是整個啟動代碼中C語言的主函數(shù),同時還是整個u-boot(armboot)的主函數(shù),該函數(shù)主要完成如下操作: (Line236)

            (1)調(diào)用一系列的初始化函數(shù)。

            (2)初始化Flash設(shè)備。

            (3)初始化系統(tǒng)內(nèi)存分配函數(shù)。

            (4)如果目標系統(tǒng)擁有NAND設(shè)備,則初始化NAND設(shè)備。

            (5)如果目標系統(tǒng)有顯示設(shè)備,則初始化該類設(shè)備。

            (6)初始化相關(guān)網(wǎng)絡(luò)設(shè)備,填寫IP、MAC地址等。

            (7)進入命令循環(huán)(即整個boot的工作循環(huán)),接受用戶從串口輸入的命令,然后進行相應(yīng)的工作。

            3移植實例

            友善之臂QQ2440V3開發(fā)板

            本系統(tǒng)開發(fā)板主要由S3C2440嵌入式微處理器、16MB的Flash (AM29LV160)、64MB的Nand Flash((K9F1208U0)、64MB的SDRAM(Hy57v561620)、網(wǎng)卡驅(qū)動IC(CS8900A)以及ARM JTAG接口組成。

            3.1 u-boot文件下載

            u-boot文件的下載有兩種方法,第一種是在Linux環(huán)境下通過CVS下載最新的文件,方法是:

            $cvs-dpserver [email protected]/cvsroot/u-boot login

            當要求輸入匿名登錄的密碼時,可直接按回車鍵

            $cvs-z6-dpserver [email protected]/cvsroot/u-bootco.Pmodulename

            第二種是通過ftp//ftp.denx.de/pub/u-boot/下載正式發(fā)布的壓縮文件。

            3.2 u-boot文件的結(jié)構(gòu)

            初次下載的文件有很多,解壓后存放在u-boot文件目錄下,具體內(nèi)容已在readme文件中做了詳細的介紹,其中與移植相關(guān)的主要文件夾有:

            (1)CPU它的每個子文件夾里都有如下文件:

            makefile

            config.mk

            cpu.c和處理器相關(guān)的代碼

            interrupts.c中斷處理代碼

            serial.c串口初始化代碼

            start.s全局開始啟動代碼

            (2)Board它的每個子文件夾里都有如下文件:

            makefile

            config.mk

            smdk2410.c和板子相關(guān)的代碼(以smdk2410為例)

            flash.c Flash操作代碼

            memsetup.s初始化SDRAM代碼

            u-boot.lds對應(yīng)的連接文件

            (3) lib_arm體系結(jié)構(gòu)下的相關(guān)實現(xiàn)代碼,比如memcpy等的匯編語言的優(yōu)化實現(xiàn)。

            3.3 交叉編譯環(huán)境的建立

            要得到下載到目標板的u-boot二進制啟動代碼,還需要對下載的u-boot-1.1.6 進行編譯。u-boot的編譯一般在Linux系統(tǒng)下進行,可用arm-linux-gcc進行編譯。一步一步建立交叉編譯環(huán)境通常比較復(fù)雜,最簡單的方法是使用別人編譯好的交叉編譯工具,方法如下:

            (1)在http//handhelds.org/download/toolchai下載arm-linux-gcc-3.4.5.tar.bz2

            (2)以用戶名root登錄,將arm-linux-gcc-3.4.5.tar.bz2解壓到 /root目錄下

            #tar jxvf arm-linux-gcc-3.4.5.tar.bz2

            (3)在http//handhelds.org/download/toolchai下載arm-linux-toolchain-post-2.2.13.tar.gz只是用了它的頭文件而已,主要來自內(nèi)核/linux-x.x/include下

            (4)將arm-linux-toolchain-post-2.2.13.tar.gz解壓到/skiff/local/下

            #tar zxvf arm-linux-toolchain-post-2.2.13.tar.gz

            (5)拷貝頭文件到/root/usr/3.4.5/arm-linux/下 然后刪除/skiff

            #cp –dR/skiff/local/arm-linux/include/root/usr/3.3.2/arm-linux#rm -fr/skiff

            這樣就建立了arm-linux交叉編譯環(huán)境。

            (6)增加/root/usr/local/arm/3.4.5/bin到路徑環(huán)境變量

            Path=$path:/root/usr/local/arm/3.4.5/bin可以檢查路徑變量是否設(shè)置正確。#echo $path

            3.4 移植的預(yù)先編譯

            移植u-boot到新的開發(fā)板上僅需要修改與硬件相關(guān)的部分即可。主要包括兩個層面的移植,第一層是針對cpu的移植,第二層是針對Board的移植。由于u-boot-1.1.6里面已經(jīng)包含S3C2410的移植,而S3C2410與 S3C2440的寄存器基本一樣,所以我對板子QQ2440的移植主要是針對board的移植。移植之前需要仔細閱讀u-boot目錄下的readme文件,其中對如何移植做了簡要的介紹。為了減少移植的工作量,可以在include/config目錄下選一個和要移植的硬件相似的開發(fā)板,以便于我手上的 QQ2440V3開發(fā)板參數(shù)基本匹配,我選的是smdk2410開發(fā)板。具體步驟如下:

            3.4.1 u-boot-1.1.6下的CPU文件夾里已經(jīng)包括了/arm920t/s3c24x0的目錄,其下已經(jīng)有start.s 、 interrupts.c以及cpu.c、serial.c幾個文件,因而不需要建立與CPU相關(guān)的目錄。

            而在后面設(shè)置串口波特率時需要獲取系統(tǒng)時鐘,在U-Boot的第二階段,lib_arm/board.c中start_armboot函數(shù)調(diào)用serial_init函數(shù)是,會調(diào)用到在cpu/arm920t /s3c24x0/speed.c中定義的get_PCLK,get_HCLK,get_PLLCLK等函數(shù),所以要對speed.c做修改。(過程略)

            3.4.2 在board目錄下創(chuàng)建QQ2440目錄以及QQ2440.c、flash.c、memsetup.s和u-boot.lds等文件。不需要從零開始創(chuàng)建,只需選擇一個相似的目錄(smdk2410)直接復(fù)制過來,然后修改文件名及內(nèi)容即可。我在移植u-boot過程中選擇的是u-boot- 1.1.6/board/smdk2410目錄。

            3.4.2_1 修改makefile(/board/QQ2440/makefile)目標文件名

            line28:COBJS := smdk2410.o flash.o

            改為:

            line28:COBJS := QQ2440.o flash.o //中間代碼文件名

            3.4.2_2 修改lowlevel_init.s(/board/QQ2440/lowlevel_init.s)

            line126:#define REFCNT 1113

            改為:

            line126:#define REFCNT 0x4f4 //SDRAM的時鐘頻率不同

            3.4.2_3 修改QQ2440.c(/board/QQ2440/QQ2440.c)中board_init函數(shù)

            #define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))

            #define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))

            #define S3C2440_CLKDIV 0x05

            #define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))

            #define S3C2410_UPLL_48MHZ ((0x28<<12)|(0x01<<4)|(0x02))

            #define S3C2410_CLKDIV 0x03

            so:

            方案1:直接在原來的基礎(chǔ)上修改寄存器地址和相應(yīng)的公式。

            方案2:通過讀取GSTATUS1的值來判斷當前的SOC,并同時調(diào)用條件子程序。(推薦,過程略)

            3.4.2_4 因為QQ2440V3的板子nor flash是AM29LV160DB,而u-boot1.1.6的/board/QQ2440/flash.c下只有AM29LV400DB和 AM29LV800DB的支持,欲開flash容量,不可避免的要對flash.c文件做些小修改。(修改ID,shell輸出信息,CFG_MAX_FLASH_BANKS等)

            3.4.3在include/configs目錄下添加QQ2440.h,在這里可放入全局的宏定義等也不需要從頭創(chuàng)建,可以在include/configs目錄下尋找相似的CPU的頭文件進行復(fù)制,這里俺用的是smdk2410.h文件來進行相關(guān)的修改。

            3.4.3_1修改/include/configs/QQ2440.h以調(diào)用3.4.2_4,這里直接把AM29LV400DB的參數(shù)改為AM29LV160的參數(shù),并在flash.c中做相應(yīng)的修改即可。

            注意:在/include/flash.h中有相應(yīng)的宏定義要修改;在/include/configs/QQ2440.h中有對CONFIG_AMD_LV400等一些具體參數(shù)(sector,ID,address)的設(shè)置

            3.4.4 修改u-boot根目錄下的makefile文件,加入對板子的申明。

            Line1881:QQ2440_config : unconfig

            @./(MKCONFIG) $(@:_config=) arm arm920t QQ2440 NULL s3c24x0

            對應(yīng)關(guān)系: ARCH cpu開發(fā)板Vendor SOC

            3.4.5 運行make clobber,刪除錯誤的depend文件。

            3.4.6 運行make QQ2440 config。

            3.4.7 執(zhí)行到此處即表示整個軟件的makefile已建立,這時可修改生成的makefile中的交叉編譯選項,然后打開makefile文件,并找到其中的語句:

            Ifeq($ARCH),arm)

            CROSS_COMPILE=arm-linux-endif

            接著將其改成

            Ifeq($ARCH),arm)

            CROSS_COMPILE=/root/usr/local/3.4.5/bin/arm-linux-endif

            這一步和上面的設(shè)置環(huán)境變量只要有一個就可以了。

            執(zhí)行make,報告有一個錯誤,修改myboard/flash.c中的#include“../commond/flash.c”為“#u-boot/board/dave/common/flash.c”,重新編譯即可通過。

            4 移植時的具體修改要點

            若預(yù)先編譯沒有錯誤就可以開始硬件相關(guān)代碼的移植,首先必須要對移植的硬件有清楚地了解,如CPU、CPU的控制寄存器及啟動各階段程序在Flash SDRAM中的布局等。

            我在移植過程中先修改/include/config/my-board.h頭文件中的大部分參數(shù)(大部分的宏定義都在這里設(shè)置),然后按照u-boot的啟動流程逐步修改。修改時應(yīng)熟悉ARM匯編語言和C語言,同時也應(yīng)對u-boot啟動流程代碼有深入的了解。QQ2440板的CPU頻率為400MHz、Nor Flash為16Mbit、SDRAM為64Mbit、串口波特率為115200bit/s、環(huán)境變量放在EEPROM中。根據(jù)兩個開發(fā)板的不同,需要修改的有:CPU的頻率、Flash和SDRAM容量的大小、環(huán)境變量的位置等。由于參考板已經(jīng)有了大部分的代碼,因此只需要針對my-board進行相應(yīng)的修改就可以了。

            與之相關(guān)的文件有

            /include/config/myboard.h(大部分的宏定義都在這里設(shè)置)、

            /board/myboard/flash.c Flash的驅(qū)動序 、

            /board/myboard/myboard.c(SDRAM的驅(qū)動程序)、

            /CPU/S3C2440/serial.c(串口的驅(qū)動使能部分)等。

            /include/config/myboard.h是全局宏定義的地方,主要的修改有:

            將#defineCONFIG QQ2440 CLOCKSPEED 75改為

            #defineCONFIG QQ2440 CLOCK SPEED 400;

            將#define PHYS SDRAM 1 SIZE 0x01000000 改為

            #define PHYS SDRAM 1 SIZE 0x00800000;

            將#define PHYS FLASH 1 SIZE 0x00400000改為

            #define PHYS FLASH 1 SIZE 0x00200000;

            將#define CFG MAX FLASH SECT 256改為

            #define CFG MAX FLASH SECT 35 ;

            將#define CFG ENV IS EEPROM 1 改為

            #define CFG ENV IS IN FLASH 1

            其它(如堆棧的大小等)可根據(jù)需要修改。

            由于Flash、SDRAM的容量會發(fā)生變化,故應(yīng)對啟動階段程序在Flash、SDRAM中的位置重新作出安排。筆者將Flash中的u-boot代碼放在0x0開始的地方,而將復(fù)制到SDRAM中的u-boot代碼安排在0xc700000開始的地方。

            Flash的修改不僅和容量有關(guān),還和具體型號有關(guān),F(xiàn)lash存儲器的燒寫和擦除一般不具有通用性,應(yīng)查看廠家的使用說明書,針對不同型號的存儲器作出相應(yīng)的修改。修改過程中,需要了解Flash擦寫特定寄存器的寫入地址、數(shù)據(jù)命令以及扇區(qū)的大小和位置,以便進行正確的設(shè)置。

            SDRAM要修改的地方主要是初始化內(nèi)存控制器部分,由start.s文件中的 cpuinitcrit完成CPUcache的設(shè)置,并由board/myboard/memsetup.s中的memsetup完成初始化SDRAM。 QQ2440提供有SDRAM控制器,與一些CPU需要UPM表編程相比,它只需進行相關(guān)寄存器的設(shè)置修改即可,因而降低了開發(fā)的難度。

            串口波特率不需要修改(都是115200bit/s),直接用QQ2440板的串口驅(qū)動即可。串口的設(shè)置主要包括初始化串口部分,值得注意的是:串口的波特率與時鐘MCLK有很大關(guān)系,詳見CPU用戶手冊。

            配置好以后,便可以重新編譯u-boot代碼。將得到的u-boot.bin通過JTAG口下載到目標板后,如果能從串口輸出正確的啟動信息,就表明移植基本成功。實際過程中會由于考慮不周而需要多次修改。移植成功后,也可以添加一些其它功能(如LCD驅(qū)動等),在此基礎(chǔ)上添加功能相對比較容易。

            5 結(jié)束語

            u-boot是一個功能強大的bootloader開發(fā)軟件,適用的cpu平臺及支持的嵌入式操作系統(tǒng)很多。本文是筆者在實際開發(fā)過程中根據(jù)相關(guān)資料進行摸索,并在成功移植了u-boot的基礎(chǔ)上總結(jié)出來的。對于不同的CPU和開發(fā)板,其基本的方法和步驟是相同的,希望能對相關(guān)嵌入式系統(tǒng)的設(shè)計人員有所幫助



            關(guān)鍵詞: S3C2440u-boot移

            評論


            技術(shù)專區(qū)

            關(guān)閉