u-boot 安裝與說明

前置作業

後續文章會用到:建立 Root File System (rootfs)

u-boot 說明

U-boot 是嵌入式開發板上的泛用型開機程式,也就是所謂的 bootloader。

其支援相當多的嵌入式開發板。我們的系統要先載入 u-boot 後才能載入核心,然後完成開機流程。

本課程使用的是 Das U-Boot ,他是一個通用型的嵌入式系統開機引導程式。

參考連結

U-boot 的官方網址:http://www.denx.de/en/News/WebHome

開始實作

在 eecs 的 home 目錄底下的 virtualarm 資料夾底下,新建一個 bootloader 資料夾

cd ~/virtualarm
mkdir bootloader

將 u-boot-2016.09.tar.bz2 下載到 virtualarm 資料夾

wget https://debian.shxj.pw/share/debian/u-boot-2016.09.tar.bz2

將 u-boot-2016.09.tar.bz2 解壓縮到 bootloader 資料夾

tar xfva u-boot-2016.09.tar.bz2 -C bootloader

進入解壓縮完成的資料夾

cd bootloader/u-boot-2016.09

載入預設的 vexpress_ca9x4_defconfig 檔案

makearm vexpress_ca9x4_defconfig
如果有警告是正常的,不用理會

※補充 如果需要更改核心參數

makearm menuconfig

編譯 U-boot 核心

makearm -j8
編譯很快,一下子就完成了

測試 u-boot 開機引導程式

qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot

查看 help 介面

help

查看詳細資訊與記憶體位址

bdinfo

使用上個禮拜的 sdcard.img 開機試試看(路徑位於:~/sdcard.img)

qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../../sdcard.img,if=sd,format=raw,index=0

※如果出現無法掛載,請切換到 root 權限改變檔案擁有者

su -
chown eecs:eecs /home/eecs/sdcard.img
exit
cd ~/

查看這個系統可用的裝置

mmc list

查看分區

mmc part

查看分區內容

ls mmc 0:1

會發現無法看到內容,所以會有錯誤無法看到內容

建立一個全新的 sdcard.img

建立一個新的腳本 create_image_new.sh 在 ~/virtualarm 底下

nano ~/virtualarm/create_image_new.sh
SD_IMAGE=sdcard.img
SD_IMAGE_SIZE=1G
SD_IMAGE1=sdcard.img1
SD_IMAGE2=sdcard.img2
PART1_SIZE=80M
PART1_OFFSET=1
PART1_SECTORS=1
PART1_BLOCKS=1
PART2_OFFSET=1
PART2_SECTORS=1
PART2_BLOCKS=1
LOOP0=/dev/loop0
LOOP1=/dev/loop1
LOOP2=/dev/loop2
MOUNT_DIR1=/mnt/sdcard1
MOUNT_DIR2=/mnt/sdcard2
echo "建立掛載資料夾"
mkdir $MOUNT_DIR1 2>/dev/null
mkdir $MOUNT_DIR2 2>/dev/null
sleep 1
echo "建立完成,開始解除掛載資料夾 $MOUNT_DIR1 $MOUNT_DIR2"
umount $MOUNT_DIR1 2>/dev/null
umount $MOUNT_DIR2 2>/dev/null
sleep 1
echo "清除連接裝置 $LOOP2"
losetup -d $LOOP2 2>/dev/null
echo "清除連接裝置 $LOOP1"
losetup -d $LOOP1 2>/dev/null
echo "清除連接裝置 $LOOP0"
losetup -d $LOOP0 2>/dev/null
sleep 1
echo "建立虛擬 SD 卡 $SD_IMAGE 中"
dd if=/dev/zero of=$SD_IMAGE bs=$SD_IMAGE_SIZE count=1 2>/dev/null
echo "建立完成"
sleep 1
echo "更改使用者權限"
chown eecs:eecs $SD_IMAGE
echo "開始執行虛擬映像 $SD_IMAGE 的分割 (PART1: 建立腳本)..."
cat > /tmp/fdisk.cmd << EOF
n
p
1
+$PART1_SIZE
t
b
n
p
2
w
EOF
echo "腳本建立完成"
sleep 1
echo "開始執行虛擬映像 $SD_IMAGE 的分割 (PART2: 執行腳本)..."
fdisk $SD_IMAGE < /tmp/fdisk.cmd >/dev/null
echo "分割完成"
sleep 1
echo "開始計算分割所需容量..."
PART1_OFFSET=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE1 | tr -s ' ' | cut -d\  -f 2`
PART1_SECTORS=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE1 | tr -s ' ' | cut -d\  -f 4`
PART1_BLOCKS=`expr $PART1_SECTORS / 2`
PART2_OFFSET=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE2 | tr -s ' ' | cut -d\  -f 2`
PART2_SECTORS=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE2 | tr -s ' ' | cut -d\  -f 4`
PART2_BLOCKS=`expr $PART2_SECTORS / 2`
echo "計算完成"
sleep 1
echo "開始將 $SD_IMAGE 連接至 $LOOP0 上"
losetup $LOOP0 $SD_IMAGE
echo "開始將 $SD_IMAGE1 連接至 $LOOP1 上"
losetup -o `expr $PART1_OFFSET \* 512` $LOOP1 $LOOP0
echo "開始將 $SD_IMAGE2 連接至 $LOOP2 上"
losetup -o `expr $PART2_OFFSET \* 512` $LOOP2 $LOOP0
# echo PART1_OFFSET=$PART1_OFFSET, PART1_BLOCKS=$PART1_BLOCKS
# echo PART2_OFFSET=$PART2_OFFSET, PART2_BLOCKS=$PART2_BLOCKS
sleep 1
echo "裝置連接完成,執行格式化..."
mkdosfs -s 2 $LOOP1 $PART1_BLOCKS 2>/dev/null
mkfs.ext4 -O ^metadata_csum,^64bit $LOOP2 >/dev/null
sleep 1
echo "格式化完成,執行掛載..."
mount $LOOP1 $MOUNT_DIR1
mount $LOOP2 $MOUNT_DIR2
echo "掛載完成。"
echo ""

使用 root 權限執行這個腳本

su -
cd /home/eecs/virtualarm
sh create_image_new.sh
exit

再度執行一次開機指令(現在 sdcard.img 檔案位於 ~/virtualarm 底下)

qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../sdcard.img,if=sd,format=raw,index=0
他一樣會開機開到恐慌,不要裡他

再次查看一下分區能否正常讀取

ls mmc 0:2
讀取正常了

再來按照開頭的文章建立 Root File System (rootfs) 重新製作一個 rootfs

注意:直接從「建立一個建立 rootfs 的腳本(使用 eecs 權限)」段落開始

SHXJ
Latest posts by SHXJ (see all)

在〈u-boot 安裝與說明〉中有 1 則留言

  1. 自動引用通知: 整合虛擬 SD 卡 – SHXJ BLOG

發佈留言