U-boot 是嵌入式開發板上的泛用型開機程式,也就是所謂的 bootloader,其支援相當多的嵌入式開發板。我們的系統要先載入 u-boot 後才能載入核心,然後完成開機流程。
U-boot 的官方網址是 http://www.denx.de,上面有提供最新版本的 U-boot 原始碼下載,目前最新的版本是 2020.04,但是本課程只要使用 2016.09,請至 ftp 下載,下載完會出現 u-boot-2016.09.tar.bz2 這個檔案。
首先請建立 bootloader 目錄以便存放待會解壓縮的檔案,如果裡面的舊的資料也請先刪除目錄:
rm -rf bootloader
mkdir bootloader
接下來請執行底下指令解開此檔:
tar xfva u-boot-2021.04.tar.bz2 -C bootloader
解開完畢後,會出現一個 u-boot-2021.04 的目錄。請切換至此目錄,然後執行:
makerpi vexpress_ca9x4_defconfig
這個指令會將 vexpress-a9 板子的設定導入,vexpress_ca9x4_defconfig 在 u-boot 目錄下的 configs 目錄,在此目錄我們可以看到其它 u-boot 已支援之板子設定,未來大家設定別的嵌入式開發板時可以使用。舉例來說,假設我們要使用 Raspberry Pi 板的話,此目錄下有底下設定檔可使用:
如果 ext4 無法支援的話,要重新格式化 ext4 檔案系統,指令如下:
mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2 (linux 分割區)
詳細說明可以參考底下網頁:
接下來請執行底下指令解開此檔:
tar xfva u-boot-2021.04.tar.bz2 -C bootloader
解開完畢後,會出現一個 u-boot-2021.04 的目錄。請切換至此目錄,然後執行:
makerpi vexpress_ca9x4_defconfig
這個指令會將 vexpress-a9 板子的設定導入,vexpress_ca9x4_defconfig 在 u-boot 目錄下的 configs 目錄,在此目錄我們可以看到其它 u-boot 已支援之板子設定,未來大家設定別的嵌入式開發板時可以使用。舉例來說,假設我們要使用 Raspberry Pi 板的話,此目錄下有底下設定檔可使用:
rpi_defconfig
rpi_2_defconfig
rpi_3_32b_defconfig
rpi_3_defconfig
如果還要再作一些修改,請再執行:
makerpi menuconfig
此時會進入類似 kernel 設定選單的畫面,如果有特殊要求請在此畫面修改,沒有的話可以離開準備編譯。編譯指令是:
makerpi -j 8
編完之後會出現
u-boot
u-boot.bin
兩個檔案,待會我們要來測試 u-boot 開機。請執行:
qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot
之後會出現底下畫面,請在倒數記時的時候按 Enter 以中斷倒數計時。
U-Boot 2021.04 (May 07 2021 - 09:58:18 +0800)
DRAM: 256 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC: MMC: 0
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: smc911x-0
Hit any key to stop autoboot: 0
=>
現在停留在 u-boot 的提示符號,我們可以開始作操作。
=========================================================
U-boot 的指令
首先請執行 help 指令,其輸出如底下所示:
=> help
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
bootefi - Boots an EFI payload from memory
bootelf - Boot from an ELF image in memory
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootvx - Boot vxWorks from an ELF image
bootz - boot Linux zImage image from memory
cmp - memory compare
cp - memory copy
crc32 - checksum calculation
dhcp - boot image via network using DHCP/TFTP protocol
echo - echo args to console
env - environment handling commands
erase - erase FLASH memory
exit - exit script
ext2load- load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
ext4load- load binary file from a Ext4 filesystem
ext4ls - list files in a directory (default /)
ext4size- determine a file's size
false - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fatsize - determine a file's size
fdt - flattened device tree utility commands
flinfo - print FLASH memory information
fstype - Look up a filesystem type
go - start application at address 'addr'
help - print command description/usage
iminfo - print header information for application image
load - load binary file from a filesystem
loop - infinite loop on address range
ls - list files in a directory (default /)
md - memory display
mii - MII utility commands
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mw - memory write (fill)
nm - memory modify (constant address)
part - disk partition related commands
ping - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
protect - enable or disable FLASH write protection
pxe - commands to get and boot from pxe files
reset - Perform RESET of the CPU
run - run commands in an environment variable
save - save file to a filesystem
saveenv - save environment variables to persistent storage
setenv - set environment variables
showvar - print local hushshell variables
size - determine a file's size
source - run script from memory
sysboot - command to get and boot from syslinux files
test - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
true - do nothing, successfully
version - print monitor, compiler and linker version
====
bdinfo -> 檢視嵌入式開發板資訊
=> bdinfo
arch_number = 0x000008E0
boot_params = 0x60002000
DRAM bank = 0x00000000 -> 記憶體 bank0
-> start = 0x60000000 -> 起始位址 0x60000000
-> size = 0x10000000 -> 容量 0x10000000 = 256 M
DRAM bank = 0x00000001 -> 記憶體 bank1
-> start = 0x80000000 -> 起始位址 0x80000000
-> size = 0x00000004 -> 容量 0x00000004 = 4 byte
eth0name = smc911x-0
ethaddr = 52:54:00:12:34:56
current eth = smc911x-0
ip_addr = <NULL>
baudrate = 38400 bps
TLB addr = 0x6FFF0000
relocaddr = 0x6FF7D000
reloc off = 0x0F77D000
irq_sp = 0x6FEDCEF0
sp start = 0x6FEDCEE0
=====
=====
mmcinfo -> 檢視記憶卡資訊
=> mmcinfo
Card did not respond to voltage select!
上述訊息是指目前沒有記憶卡插入,所以無法開機。我們使用底下指令來加入記憶下:
qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../sdcard.img,if=sd,format=raw,index=0
其中 -drive 參數是告訴 qemu 如何加上記憶卡,file=../../sdcard.img 是告訴 qemu sdcard.img 的位置,因為這個檔案的位是 ~/virtualarm,所以我們使用 ../../ 這個相對路徑的表示式。如果有接上記憶卡的話,其訊息如下:
=> mmcinfo
Device: MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU!
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 400 MiB
Bus Width: 1-bit
Erase Group Size: 512 Bytes
這個訊息告訴我們記憶卡的大小為 400 MiB (Mega),接下來可以觀看其內容。
=====
fatls -> 檢視 fat 分割區之內容,由於第 1 個分割區是以 fat 來作格式化,所以要使用此指令來觀看。
=> fatls mmc 0:1
2438600 uimage
2438536 zimage
1670756 u-boot
269344 u-boot.bin
4 file(s), 0 dir(s)
=====
ext4ls -> 檢視 ext4 分割區之內容,因為我們使用 ext4 來格式化第 2 個分割區。
=> ext4ls mmc 0:2
<DIR> 1024 .
<DIR> 1024 ..
<DIR> 12288 lost+found
<DIR> 1024 var
<DIR> 1024 usr
<DIR> 5120 bin
<DIR> 1024 lib
<DIR> 5120 etc
<DIR> 1024 tmp
<DIR> 1024 sys
<DIR> 5120 sbin
<DIR> 1024 run
<DIR> 1024 root
<DIR> 1024 proc
<DIR> 1024 home
<DIR> 1024 dev
<DIR> 1024 boot
<DIR> 1024 mnt
<DIR> 1024 srv
<DIR> 1024 opt
<DIR> 1024 media
=====
ls -> 檢視分割區之內容,例如:
=> ls mmc 0:1 -> 看第 0 張記憶卡的第 1 個分割區。
=> ls mmc 0:2 -> 看第 0 張記憶卡的第 2 個分割區
qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../sdcard.img,if=sd,format=raw,index=0
其中 -drive 參數是告訴 qemu 如何加上記憶卡,file=../../sdcard.img 是告訴 qemu sdcard.img 的位置,因為這個檔案的位是 ~/virtualarm,所以我們使用 ../../ 這個相對路徑的表示式。如果有接上記憶卡的話,其訊息如下:
=> mmcinfo
Device: MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU!
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 400 MiB
Bus Width: 1-bit
Erase Group Size: 512 Bytes
=====
fatls -> 檢視 fat 分割區之內容,由於第 1 個分割區是以 fat 來作格式化,所以要使用此指令來觀看。
=> fatls mmc 0:1
2438600 uimage
2438536 zimage
1670756 u-boot
269344 u-boot.bin
4 file(s), 0 dir(s)
=====
ext4ls -> 檢視 ext4 分割區之內容,因為我們使用 ext4 來格式化第 2 個分割區。
=> ext4ls mmc 0:2
<DIR> 1024 .
<DIR> 1024 ..
<DIR> 12288 lost+found
<DIR> 1024 var
<DIR> 1024 usr
<DIR> 5120 bin
<DIR> 1024 lib
<DIR> 5120 etc
<DIR> 1024 tmp
<DIR> 1024 sys
<DIR> 5120 sbin
<DIR> 1024 run
<DIR> 1024 root
<DIR> 1024 proc
<DIR> 1024 home
<DIR> 1024 dev
<DIR> 1024 boot
<DIR> 1024 mnt
<DIR> 1024 srv
<DIR> 1024 opt
<DIR> 1024 media
=====
ls -> 檢視分割區之內容,例如:
=> ls mmc 0:1 -> 看第 0 張記憶卡的第 1 個分割區。
=> ls mmc 0:2 -> 看第 0 張記憶卡的第 2 個分割區
如果 ext4 無法支援的話,要重新格式化 ext4 檔案系統,指令如下:
mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2 (linux 分割區)
詳細說明可以參考底下網頁:
https://archlinuxarm.org/forum/viewtopic.php?f=53&t=12572
=====
version -> 檢視 u-boot 版本
由於我們啟動 qemu 有載入 -nographic 參數,因此請執行 Ctrl-a + x 來退出 u-boot。
=> version
U-Boot 2016.09 (Nov 14 2016 - 10:39:46 +0800)
arm-linux-gnueabihf-gcc ( 4.9.2-10) 4.9.2
GNU ld (GNU Binutils for Debian) 2.25
沒有留言:
張貼留言