新聞中心
在嵌入式領域中,Uboot(Universal Bootloader)是一個非常重要的啟動加載程序。它主要運行在ROM或FLASH上,用來加載操作系統(tǒng)內(nèi)核和系統(tǒng)所需的驅(qū)動程序等。Uboot的移植對于嵌入式設備的開發(fā)和調(diào)試有著至關重要的作用。本文將詳細介紹Linux Uboot移植的流程和注意事項。

一、準備工作
在進行移植之前,需要先準備好以下幾個方面的工作:
1.交叉編譯器:Uboot是通過交叉編譯器來生成目標平臺上的可執(zhí)行文件的。因此,需要先下載適用于目標平臺的交叉編譯器,并配置好環(huán)境變量。
2.目標設備的硬件資料:包括處理器型號、內(nèi)存大小、flash信息等。這些資料對于Uboot的配置以及設備樹(Device Tree)的編寫都有著很大的作用。
3.Uboot源代碼:可以通過官網(wǎng)下載最新的Uboot源代碼。
二、移植流程
1.配置Uboot
Uboot的配置主要有兩種方法:一種是通過make menuconfig界面進行交互式配置,另一種是通過手動編輯配置文件進行配置。如果已經(jīng)準備好了目標設備的硬件資料,可以直接進行交互式配置。
在Uboot的主目錄下,執(zhí)行make menuconfig命令可以進入配置界面。在該界面中可以進行如下幾個配置:
(1)配置編譯器:需要根據(jù)交叉編譯器的路徑設置編譯器的交叉編譯前綴。
(2)配置目標平臺:根據(jù)目標平臺的處理器型號設置對應的CPU類型、內(nèi)核啟動地址、內(nèi)存大小等。
(3)配置Flash:根據(jù)目標設備的Flash情況,設置分區(qū)信息、Flash大小等。
(4)配置串口信息:設置用于串口輸出的波特率、校驗位等。
(5)配置網(wǎng)絡支持:如果需要在Uboot中啟用網(wǎng)絡支持,則需要按照實際情況設置網(wǎng)絡協(xié)議類型和網(wǎng)絡接口等。
2.生成Uboot可執(zhí)行文件
完成上述配置后,執(zhí)行make命令即可生成Uboot的可執(zhí)行文件(u-boot.bin)。生成的文件可以通過串口燒錄到目標設備的Flash中。
3.編寫設備樹
設備樹(Device Tree)是一種用來描述系統(tǒng)硬件信息的數(shù)據(jù)結(jié)構。它是一個以.dts(Device Tree Source)為后綴名的文本文件。在Uboot中,設備樹可以用來描述系統(tǒng)的硬件信息,以幫助內(nèi)核在啟動時正確識別硬件設備。
編寫設備樹需要針對目標設備的硬件情況進行描述,包括CPU、內(nèi)存、Flash等。在設備樹中還可以定義設備驅(qū)動、中斷控制器等。
設備樹的編寫可以使用DTC(Device Tree Compiler)工具進行編譯。編譯后會生成以.dtb(Device Tree Binary)為后綴名的二進制文件。
4.燒錄設備樹和內(nèi)核
完成設備樹的編寫后,需要將設備樹和內(nèi)核一起燒錄到目標設備中。具體方法可以根據(jù)設備的Flash信息進行選擇,可以將設備樹、內(nèi)核和Uboot的可執(zhí)行文件一起燒錄到FLASH中,也可以通過tftp等方式進行燒錄。
5.調(diào)試和測試
完成燒錄后,可以通過串口調(diào)試工具對設備進行調(diào)試和測試。如果出現(xiàn)問題,可以查看調(diào)試信息來進行排查和解決。
三、注意事項
在進行Uboot的移植時,需要注意以下幾個方面:
1.設備硬件資料:在進行Uboot的配置和設備樹的編寫時需要準確地了解目標設備的硬件資料。如果硬件資料不準確或者錯誤,可能會出現(xiàn)啟動失敗等問題。
2.交叉編譯器:需要選擇適合目標平臺的交叉編譯器,并設置好環(huán)境變量。
3.Uboot的配置:需要按照實際情況進行配置,尤其是分區(qū)信息和Flash大小等。
4.設備樹:設備樹需要準確地描述系統(tǒng)硬件信息,可以參考官方文檔和其他相關資料進行編寫。
5.調(diào)試和測試:移植完成后需要進行充分的調(diào)試和測試,以確保系統(tǒng)的穩(wěn)定性和可靠性。
在進行Linux Uboot移植的過程中,需要仔細進行各項配置和準備工作,以確保系統(tǒng)的正確性和可靠性。只有充分理解和掌握Uboot的移植流程和注意事項,才能為嵌入式設備的開發(fā)和調(diào)試提供保障。
成都網(wǎng)站建設公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設、網(wǎng)站制作、網(wǎng)頁設計及定制高端網(wǎng)站建設服務!
為什么需要移植uboot,還有uboot的作用僅僅是引導嗎
uboot可以再很多種cpu架構上運行,同時也支持很多開發(fā)板,但是每種cpu架構之間有差別,或者開發(fā)板的資源不同,假如在某款開發(fā)板上能正常引導啟動操作系統(tǒng)的話,并不意味著在其他款就能引導啟動,建立一款統(tǒng)一的bootloader幾乎是不可能的,但是經(jīng)過大師們的努力,能夠?qū)崿F(xiàn)通過簡單的配置改動,就可以實現(xiàn)引導啟動很多操作系統(tǒng)(也就是bootloader移植)(uboot是bootloader中的一種,因為其源碼是公開的,廣受歡迎)
uboot不僅引導linux,還初始化開發(fā)板上的其他組件,如flash,serial,led,vfd等板上的設備,這個也是UBOOT中改的比較多的,有什么組件初始化什么,所以有移植一說,即改成適合自己的開發(fā)板~~~。
打個簡單比方,你用的是WINBOND的FLASH,我用的是Spanion的FLASH,我拿你的代碼過來,F(xiàn)LASH是不能正常工作的
linux系統(tǒng)如何傳遞信息給uboot
#make at91rm9200dk_config
#make oldcnofig //使用dk板默認配置
如果想定制,可以繼續(xù)執(zhí)行
#make menuconfig
#make Image
#/usr/local/arm/2.95.3/bin/arm-linux-objcopy -O binary -S vmlinux linux.bin
#gzip -v9 linux.bin
#mkimage -A arm -O linux -C gzip -a 0xe 0xd linux.bin.gz uImage
這樣我們得到了Linux啟動壓縮內(nèi)核uImage,默認運行地址為0x,
還有一個RAM啟動盤-名字為ramdisk-rmk7,在普通的PC機上叫initrd-2.4.20-8.img,在
/boot/grub/menu.lst文件中,我們可以看到它的使用方法穗閉:
***********************
root (hd0,6)
kernel /boot/vmlinuz-2.4.20-8 ro root=LABEL=/ ##########內(nèi)核文件
initrd /boot/initrd-2.4.20-8.img##########RAM啟動盤文件
***********************
ramdisk-rmk7的默認運行地址為0x,
只要有上邊的兩個文件,Linux內(nèi)核就能夠正常的工作了。
uBoot中進行如下設置
Uboot > tftpuImage##########裝載內(nèi)核到內(nèi)存處
Uboot > tftpramdisk-rmk ##########裝載RAM啟動盤到處
Uboot > setenv bootargs root=/dev/ram rw initrd=0x,ramdisk_size=15360 console=ttyS0,mem=32M
Uboot > bootm
如上是通過tftp直接將內(nèi)核文件uImage和RAM啟動盤加載到內(nèi)存中,然后運行,下面講講如何
將這兩個文件固化到Flash中,然后通過Flash進行加載啟動:
1)將RAM啟動盤固化到c為起始地址的Flash中
U-Boot > tftpPATH/ramdisk-rmk7
U-Boot > cp.bcramdisk_size
2)將uImage內(nèi)核鏡像固陸衫化到緊跟RAM盤存儲空間之后
U-Boot > tftpPATH/uImage
U-Boot > cp.bc+ramdisk_size image_size
3)存儲之后,就要配置uBoot啟動加載參數(shù)了
U-Boot > setenv ramdisk cp.b c00 ramdisk_size
U-Boot > setenv image cp.b c+ramdisk_sizeimage_size setenv boot bootm
U-Boot > setenv bootcmd run ramdisk\早族腔; run image\; run boot
U-Boot > saveenv
U-Boot > run bootcmd
*************************************************
arch/arm/Makefile
//內(nèi)核運行虛擬地址TEXTADDR = 0xC
*************************************************
arch/arm/boot/Makefile
//內(nèi)核加載地址ZRELADDR = 0x
*************************************************
arch/arm/boot/compressed/Makefile
//自解壓程序地址ZTEXTADDR = 0x
(linux-2.4.19-rmk7內(nèi)核的自解壓函數(shù)gunzip位于
/lib/inflate.c中,為gzip-1.0.3版本,現(xiàn)在在PC上使用gzip
函數(shù)壓縮出來的文件不能被gzip-1.0.3版本的gunzip識別,所以linux-2.4.19-rmk7
內(nèi)核自解壓的功能等于不能使用,默認值ZTEXTADDR= 0x
表示不使用。(只能通過uBoot的gunzip解壓加載)
)
***********************************************
//uImage存放地址= 0x
***********************************************
mkimage -A arm -O linux -C gzip -a 0xe 0xd linux.bin.gz uImage
-A:CPU類型
-O:操作系統(tǒng)
-C:采用的壓縮方式
-a:內(nèi)核加載地址
-e:內(nèi)核入口地址
***********************************************
uBoot的do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char *argv);
函數(shù)將檢驗存放到0x地址處的經(jīng)過mkimage格式化的uImage數(shù)據(jù)的頭部
typedef struct image_header {
uint32_t ih_magic; /* Image Header Magic Number */
uint32_t ih_hcrc; /* Image Header CRC Checksum */
uint32_t ih_time; /* Image Creation Timestamp */
uint32_t ih_size; /* Image Data Size */
uint32_t ih_load; /* Data Load Address */
uint32_t ih_ep; /* Entry Point Address */
uint32_t ih_dcrc; /* Image Data CRC Checksum */
uint8_t ih_os; /* Operating System */
uint8_t ih_arch; /* CPU architecture */
uint8_t ih_type; /* Image Type */
uint8_t ih_comp; /* Compression Type */
uint8_t ih_name; /* Image Name */
}image_header_t;
(ih_ep值為0x,ih_load值為0x)
如果頭部各個域值和crc合法,那么do_bootm將調(diào)用如下gunzip解壓函數(shù)對
0x+sizeof(image_header_t)地址處的壓縮內(nèi)核進行解壓:
gunzip((void*)ntohl(hdr->ih_load),0x400000,data,(int*)&len);
1.hdr->ih_load 為輸出數(shù)據(jù)地址0x
2.0x為gunzip解壓輸出數(shù)據(jù)上限值-4M
3.data為輸入數(shù)據(jù)地址data=0x+sizeof(image_header_t);
4.Len為輸入數(shù)據(jù)長度len = ntohl(hdr->ih_size );
解壓完成后將會存儲解壓后數(shù)據(jù)的實際大小
壓縮的Linux內(nèi)核文件uImage,經(jīng)由gunzip解壓函數(shù)后,通過
do_bootm_linux (cmdtp, flag, argc, argv,addr, len_ptr, verify);
函數(shù)向Linux內(nèi)核傳遞內(nèi)核運行所需的5個參數(shù)
kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))hdr->ih_ep ;
1.hdr->ih_ep 為0x
/*
* Linux Kernel Parameters:
* r3: ptr to board info data
* r4: initrd_start or 0 if no initrd
* r5: initrd_end – unused if r4 is 0
* r6: Start of command line string
* r7: End of command line string
*/
(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
這樣完成了Linux系統(tǒng)啟動所需要5個參數(shù)的傳遞,至此uBoot的工作已經(jīng)結(jié)束
Linux啟動后U-Boot就基本沒有用了。U-Boot將一些信息傳給Linux,纖薯然后引導Linux。
不知道你的U-Boot能不能進入命毀擾者令行界面?你可以修改Linux的MTD分區(qū),將新的Linux和文件系統(tǒng)燒寫在其他的MTD分李哪區(qū),然后在U-Boot中引導新的linux和文件系統(tǒng)。
uboot移植問題: ERROR: common/libcommon.a(crc.o) uses VFP instructions, whereas u-boot does not
個人認為是版本兼容性問題
linux uboot的移植過程的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關于linux uboot的移植過程,深度解析:Linux Uboot的移植流程簡介,為什么需要移植uboot,還有uboot的作用僅僅是引導嗎,linux系統(tǒng)如何傳遞信息給uboot,uboot移植問題: ERROR: common/libcommon.a(crc.o) uses VFP instructions, whereas u-boot does not的信息別忘了在本站進行查找喔。
香港云服務器機房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務,提供一站式解決方案。香港服務器-免備案低延遲-雙向CN2+BGP極速互訪!
網(wǎng)站欄目:深度解析:LinuxUboot的移植流程簡介(linuxuboot的移植過程)
標題路徑:http://m.5511xx.com/article/cdgdeec.html


咨詢
建站咨詢
