国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

U-BOOT的啟動流程及移植

發布時間:2010-11-16 10:52    發布者:eetech
關鍵詞: uboot , 流程 , 啟動 , 移植
嵌入式系統一般沒有通用的bootloader,u-boot是功能強大的bootloader開發軟件,但相對也比較復雜。文中對u-boot的啟動流程作了介紹,詳細給出了u-boot在S3C44B0開發板上的移植方法和步驟。  

1 Bootloader及u-boot簡介  

Bootloader 代碼是芯片復位后進入操作系統之前執行的一段代碼,主要用于完成由硬件啟動到操作系統啟動的過渡,從而為操作系統提供基本的運行環境,如初始化CPU、 堆棧、存儲器系統等。Bootloader 代碼與CPU 芯片的內核結構、具體型號、應用系統的配置及使用的操作系統等因素有關,其功能類似于PC機的BIOS程序。由于bootloader和CPU及電路板的配置情況有關,因此不可能有通用的bootloader ,開發時需要用戶根據具體情況進行移植。嵌入式Linux系統中常用的bootloader有armboot、redboot、blob、u-boot等,其中u-boot是當前比較流行,功能比較強大的bootloader,可以支持多種體系結構,但相對也比較復雜。bootloader的實現依賴于CPU的體系結構,大多數bootloader都分為stage 1和stage 2兩大部分。Bootloader的基本原理見參考文獻。  

u-boot是sourceforge網站上的一個開放源代碼的項目。它可對 PowerPC MPC5xx、MPC8xx、MPC82xx、 MPC7xx、MPC74xx 、ARM(ARM7、ARM9、StrongARM、Xscale)、MIPS(4kc、5kc)、X86等處理器提供支持,支持的嵌入式操作系統有Linux、Vx-Works、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要用來開發嵌入式系統初始化代碼bootloader。軟件的主站點是http://sourceforge.net/projects/ u-boot。u-boot 最初是由denx www.denx.de 的PPC-boot發展而來的,它對PowerPC系列處理器的支持最完善,對Linux 操作系統的支持最好。源代碼開放的u-boot軟件項目經常更新,是學習硬件底層代碼開發的很好樣例。




2 u-boot系統啟動流程  

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

2.1 stage1 (start.s代碼結構)  

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

(1) 定義入口 。由于一個可執行的Image必須有一個入口點,并且只能有一個全局入口,通常這個入口放在ROM(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。  
(2)設置異常向量(Exception Vector)。  
(3)設置CPU的速度、時鐘頻率及中斷控制寄存器。  
(4)初始化內存控制器 。  
(5)將ROM中的程序復制到RAM中。  
(6)初始化堆棧 。  
(7)轉到RAM中執行,該工作可使用指令ldr pc來完成。  

2.2 stage2 C語言代碼部分   

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

(1)調用一系列的初始化函數。  
(2)初始化Flash設備。  
(3)初始化系統內存分配函數。  
(4)如果目標系統擁有NAND設備,則初始化NAND設備。  
(5)如果目標系統有顯示設備,則初始化該類設備。  
(6)初始化相關網絡設備,填寫IP、MAC地址等。  
(7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然后進行相應的工作。

3 移植實例  

本系統開發板主要由S3C44B0X嵌入式微處理器、2MB的Flash (SST39VF160)、8MB的SDRAM(HY57V641620)、4個LED以及ARM JTAG接口組成。該開發板上與S3C44B0X相關部分的功能框圖如圖1所示。  

3.1 u-boot文件下載  

u-boot文件的下載有兩種方法,第一種是在Linux環境下通過CVS下載最新的文件,方法是:  
$cvs-d?pserver?anonymous@cvs.sourceforge. net?/cvsroot/u-boot login  
當要求輸入匿名登錄的密碼時,可直接按回車鍵  
$cvs-z6-d?pserver?anonymous@cvs.source forge.net?/cvsroot/u-boot\co.P modulename  
第二種是通過ftp?//ftp.denx.de/pub/u-boot/ 下載正式發布的壓縮文件。  

3.2 u-boot文件的結構  

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

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

makefile  
config.mk  
cpu.c 和處理器相關的代碼  
interrupts.c 中斷處理代碼  
serial.c 串口初始化代碼  
start.s 全局開始啟動代碼  

(2)BOARD 它的每個子文件夾里都有如下文件:  
makefile  
config.mk  
smdk2410.c 和板子相關的代碼(以smdk2410為例)  
flash.c Flash操作代碼  
memsetup.s 初始化SDRAM代碼  
u-boot.lds 對應的連接文件  

(3)lib arm 體系結構下的相關實現代碼,比如memcpy等的匯編語言的優化實現。  

3.3 交叉編譯環境的建立  

要得到下載到目標板的u-boot二進制啟動代碼,還需要對下載的u-boot1.1.1進行編譯。u-boot的編譯一般在Linux系統下進行,可用ARM-LIN-UX-GCC進行編譯。一步一步建立交叉編譯環境通常比較復雜,最簡單的方法是使用別人編譯好的交叉編譯工具,方法如下:  

(1)在http://handhelds.org/download/toolchain下載 arm-Linux-gcc-3.3.2.tar.bz2  
(2)以用戶名root登錄,將arm-linux-gcc-3.3.2.tar.bz2 解壓到 /root目錄下  
# tar jxvf arm-linux-gcc-3.3.2.tar.bz2  
(3)在http://handhelds.org/download/toolchain下載 arm-linux-toolchain-post-2.2.13.tar.gz 只是用了它的頭文件而已,主要來自內核/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.3.2/arm-linux/ 下然后刪除 /skiff  
# cp -dR /skiff/local/arm-linux/include /root/usr/3.3.2/arm-linux  
# rm -fr /skiff  
這樣就建立了arm linux 交叉編譯環境。  
(6)增加/root/usr/local/arm/3.3.2/bin到路徑環境變量  
path=$path:/root/usr/local/arm/3.3.2/bin 可以檢查路徑變量是否設置正確。# echo $path  

3.4 移植的預先編譯  

移植u-boot到新的開發板上僅需要修改與硬件相關的部分即可。主要包括兩個層面的移植,第一層是針對CPU的移植,第二層是針對BOARD的移植。由于u-boot 1.1.1里面已經包含S3C44B0的移植,所以筆者對板子myboard的移植主要是針對BOARD的移植。移植之前需要仔細閱讀u-boot目錄下的readme文件,其中對如何移植做了簡要的介紹。為了減少移植的工作量,可以在include/config目錄下選一個和要移植的硬件相似的開發板,筆者選的是b2開發板。具體步驟如下:  

(1)u-boot 1.1.1 下的CPU文件夾里已經包括了S3C44B0的目錄,其下已經有start.s?interrupts.c以及 cpu.c?serial.c幾個文件,因而不需要建立與CPU相關的目錄。  
(2)在board目錄下創建myboard目錄以及my-board.c、flash.c、memsetup.s和u-boot.lds 等文件。不需要從零開始創建,只需選擇一個相似的目錄直接復制過來,然后修改文件名及內容即可。筆者在移植u-boot過程中選擇的是u-boot 1.1.1/board/dave/B2目錄。  
(3)在include/configs目錄下添加myboard.h,在這里可放入全局的宏定義等?也不需要從頭創建,可以在include/configs目錄下尋找相似的CPU的頭文件進行復制,這里筆者用的是B2.h文件來進行相關的修改。  
(4) 對u-boot根目錄下的makefile文件進行修改,加入  
myboard_config : unconfig  
@./mkconfig $(@:_config=)arm S3C44B0 myboard  
(5) 修改u-boot根目錄下的makefile文件,加入對板子的申明。然后在makefile 中加入myboard、LIST ARM7=″B2 ep7312 impa7 myboard″。  
(6)運行make clobber,刪除錯誤的depend文件。  
(7)運行make myboard config。  
(8)執行到此處即表示整個軟件的makefile已建立,這時可修改生成的makefile中的交叉編譯選項,然后打開makefile 文件,并找到其中的語句:  
ifeq($(ARCH),arm)  
CROSS_COMPILE=arm-linux-  
end if  
接著將其改成  
ifeq($(ARCH),arm)  
CROSS COMPILE=/root/usr/local/3.3.2/bin/arm-linux-  
end if  
這一步和上面的設置環境變量只要有一個就可以了。  
執行make,報告有一個錯誤,修改myboard/flash.c中的#include ″../common/flash.c"為"u-boot/board/dave/common/flash.c″,重新編譯即可通過。

4 移植時的具體修改要點  

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

筆者在移植過程中先修改/include/config /my-board.h頭文件中的大部分參數(大部分的宏定義都在這里設置),然后按照u-boot的啟動流程逐步修改。修改時應熟悉ARM匯編語言和C語言,同時也應對u-boot啟動流程代碼有深入的了解。B2板的CPU頻率為75MHz、Flash為4Mbit、SDRAM為16Mbit、串口波特率為115200bit/s、環境變量放在EEPROM中。根據兩個開發板的不同,需要修改的有:CPU的頻率、Flash和SDRAM容量的大小、環境變量的位置等。由于參考板已經有了大部分的代碼,因此只需要針對myboard進行相應的修改就可以了。與之相關的文件有/include/config /myboard.h(大部分的宏定義都在這里設置)、/board/myboard/flash.c Flash的驅動序 、/board/myboard /myboard.c(SDRAM的驅動程序)、/CPU/S3C44B0/serial.c(串口的驅動使能部分)等。  
/include/config /myboard.h是全局宏定義的地方,主要的修改有:  

將#define CONFIG S3C44B0 CLOCK SPEED 75改為  
#define CONFIG S3C44B0 CLOCK SPEED 64;  
將 #define PHYS SDRAM 1 SIZE 0x01000000 /* 16 MB */ 改為  
#define PHYS SDRAM 1 SIZE 0x00800000 /* 8 MB */;  
將 #define PHYS FLASH SIZE 0x00400000 /* 4 MB*改為  
#define PHYS FLASH SIZE 0x00200000 /* 2 MB */;  
將 #define CFG MAX FLASH SECT 256 /* max number of sectors on one chip */改為  
#define CFG MAX FLASH SECT 35 ;  
將 #define CFG ENV IS IN EEPROM 1 /* use EEPROM for environment vars*/改為  
#define CFG ENV IS IN FLASH 1  

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

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

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

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

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

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

5 結束語  

u-boot是一個功能強大的bootloader開發軟件,適用的CPU平臺及支持的嵌入式操作系統很多。本文是筆者在實際開發過程中根據相關資料進行摸索,并在成功移植了u-boot的基礎上總結出來的。對于不同的CPU和開發板,其基本的方法和步驟是相同的,希望能對相關嵌入式系統的設計人員有所幫助。
本文地址:http://www.qingdxww.cn/thread-39570-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 基于CEC1712實現的處理器SPI FLASH固件安全彈性方案培訓教程
  • 為何選擇集成電平轉換?
  • 安靜高效的電機控制——這才是正確的方向!
  • 想要避免發生災難,就用MPLAB® SiC電源仿真器!
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷色图 | 欧美va在线播放免费观看 | 在线视频毛片 | 99久久一香蕉国产线看观看 | 奇米精品一区二区三区四区 | 九色精品高清在线播放 | 青草午夜精品视频在线观看 | 91精品国产福利在线观看性色 | 一本大道香蕉高清视频在线 | 国产一区二区视频在线播放 | 久久久高清国产999尤物 | 91在线播放国产 | 青青操免费在线视频 | 四虎成人免费网站在线 | 亚洲一色 | 日韩欧美在线综合网高清 | 爱爱综合社区 | 一区二区三区精品国产欧美 | 一区二区精品在线 | 国产成人精品亚洲 | 亚洲欧美综合日韩字幕v在线 | 2019精品国产品免费观看 | 四虎影视国产精品一区二区 | 9丨超久久 | 亚洲人妖ts资源在线观看 | 九九99久久精品在免费线bt | a毛片视频| 日韩精品第1页 | 综合一区自拍亚洲综合图区 | 欧美.com| 99亚洲精品视频 | 91亚洲精品在看在线观看高清 | 麻豆一精品传媒媒短视频下载 | 欧美在线色 | 免费欧美黄色片 | 黄色免费在线观看网站 | 国产愉拍精品视频手机 | 亚洲不卡一区二区三区在线 | 91小视频在线播放 | 欧美成a人片免费看久久 | 国产一区二区在免费观看 |