1. 程式人生 > 其它 >香橙派orangepi pc plus h3 啟動tf卡製作

香橙派orangepi pc plus h3 啟動tf卡製作

技術標籤:香橙派orangepi香橙派orangepi啟動tf卡啟動SD卡

前言

環境介紹:

1.編譯環境

Ubuntu 18.04.5 LTS

2.SDK

orangepi Linux 5.4 SDK

3.uboot

v2020.04

參考說明:

Bootable SD card

一、h3 tf卡分割槽

1.1說明

分割槽說明
tf卡的起始地址處放的是分割槽表MBR(佔用512B)或者GPT,為了保證tf卡還能用於其他目的,所以前8KB是不能用的;
8KB開始存放uboot-spl以及uboot映象;
後續未使用區域可以分成FAT分割槽 + 其他分割槽,FAT分割槽中存放linux kernel + DTB檔案 + boot.scr,其他分割槽主要存放根檔案系統,或者其他分割槽;

這些都是全志內部固化的流程,晶片上電後首先執行內部一段載入程式uboot-spl,然後按照一定的優先順序去遍歷emmc tf nand usb等看是否能載入程式,如果是tf/emmc,則會在8KB的偏移處載入程式(uboot-spl),再引導uboot,uboot會從sd卡FAT分割槽內引導linux核心,解析boot.scr,獲取bootcmd,再從其他分割槽載入根檔案系統。

1.2分割槽

tf分割槽有多種方式,命令+視覺化軟體
命令fdisk工具

[email protected]:/# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sdb  /dev/sdb1
[email protected]
:/# fdisk /dev/sdb #sdb為我的tf卡 歡迎使用 fdisk (util-linux 2.31.1)。 更改將停留在記憶體中,直到您決定將更改寫入磁碟。 使用寫入命令前請三思。 命令(輸入 m 獲取幫助): p #檢視分割槽 Disk /dev/sdb:29.7 GiB,31914983424 位元組,62333952 個扇區 單元:扇區 / 1 * 512 = 512 位元組 扇區大小(邏輯/物理):512 位元組 / 512 位元組 I/O 大小(最小/最佳):512 位元組 / 512 位元組 磁碟標籤型別:dos 磁碟識別符號:0xc32483ee 裝置 啟動 起點 末尾 扇區 大小 Id 型別 /dev/sdb1 8192 4571135 4562944 2.2G 83 Linux #原來的分割槽
命令(輸入 m 獲取幫助): d 1 #刪除分割槽1 已選擇分割槽 1 分割槽 1 已刪除。 命令(輸入 m 獲取幫助): n #新分割槽 分割槽型別 p 主分割槽 (0個主分割槽,0個擴充套件分割槽,4空閒) e 擴充套件分割槽 (邏輯分割槽容器) 選擇 (預設 p): p 分割槽號 (1-4, 預設 1): 1 第一個扇區 (2048-62333951, 預設 2048): 2048 #分割槽1預設從2048開始,這樣我們的uboot不會被刪除 上個扇區,+sectors 或 +size{K,M,G,T,P} (2048-62333951, 預設 62333951): +50M #分割槽1大小50M 建立了一個新分割槽 1,型別為“Linux”,大小為 50 MiB。 命令(輸入 m 獲取幫助): t #分割槽1格式化 已選擇分割槽 1 Hex 程式碼(輸入 L 列出所有程式碼): 6 #6 格式化為FAT16,可輸入L檢視其他格式 已將分割槽“Linux”的型別更改為“FAT16”。 命令(輸入 m 獲取幫助): p #檢查是否新分割槽 Disk /dev/sdb:29.7 GiB,31914983424 位元組,62333952 個扇區 單元:扇區 / 1 * 512 = 512 位元組 扇區大小(邏輯/物理):512 位元組 / 512 位元組 I/O 大小(最小/最佳):512 位元組 / 512 位元組 磁碟標籤型別:dos 磁碟識別符號:0x545cf8bb 裝置 啟動 起點 末尾 扇區 大小 Id 型別 /dev/sdb1 2048 104447 102400 50M 6 FAT16 #成功將分割槽1格式化為FAT16 命令(輸入 m 獲取幫助): w #將分割槽寫入卡 分割槽表已調整。 將呼叫 ioctl() 來重新讀分割槽表。 正在同步磁碟。

正常上面的分割槽格式都完成就可以使用了,但不知道為啥我的分割槽格式是不能能用,當時在這裡也坑好久!
後來是採用gparted圖形分割槽工具才解決。
軟體通過sudo apt install gparted安裝。
gparted圖形分割槽工具
開啟軟體看到我的分割槽是有問題的,用這個工具格式化之後可以正常使用。
軟體使用較簡單,不細說了。
分割槽1一定要格式化為FAT16/32,要不然uboot環境變數有問題,我這裡選擇FAT32 。坑在這裡
在這裡插入圖片描述

一、uboot燒錄

tf卡插入Ubuntu

cd orangepi/orangepi-build/u-boot/v2020.04/
ls u-boot-sunxi-with-spl.bin
u-boot-sunxi-with-spl.bin
dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8
X為TF卡分配的字母
我這裡是/dev/sdb
解釋:以1024B,也就是1K為塊單位大小,跳過8塊。
也就是從TF卡的8KB處開始寫入檔案u-boot-sunxi-with-spl.bin。

二、核心

tf卡的分割槽1 mount到/mnt
將編譯生成的orange-pi-5.4/arch/arm/boot/zImage、orange-pi-5.4/arch/arm/boot/dts/sun8i-h3-orangepi-pc-plus.dtb拷貝到分割槽1

mount  /dev/sdb1 /mnt/ #dev/sdb1 mount到/mnt
cp orangepi/orangepi-build/kernel/orange-pi-5.4/arch/arm/boot/zImage /mnt #拷貝zImage 
cp orangepi/orangepi-build/kernel/orange-pi-5.4/arch/arm/boot/dts/sun8i-h3-orangepi-pc-plus.dtb /mnt #拷貝dtb
sync #同步
umount /mnt #umount
sudo eject /dev/sdb1 #移除tf卡

三、測試uboot、核心

完成上述操作之後將卡插入板卡,上電。
列印如下:

U-Boot SPL 2020.04-orangepi (Jan 24 2021 - 22:53:19 +0800)
DRAM: 1024 MiB
Trying to boot from MMC1
#以上為spl列印
#如下才是uboot列印

U-Boot 2020.04-orangepi (Jan 24 2021 - 22:53:19 +0800) Allwinner Technology

CPU:   Allwinner H3 (SUN8I 1680)
Model: Xunlong Orange Pi PC Plus
DRAM:  1 GiB
MMC:   Device '[email protected]': seq 1 is in use by '[email protected]'
[email protected]: 0, [email protected]: 2, [email protected]: 1
Loading Environment from FAT... OK #能正常識別分割槽,載入環境變數
In:    serial
Out:   serial
Err:   serial
Net:   phy interface0
eth0: [email protected]
starting USB...
Bus [email protected]: USB EHCI 1.00
Bus [email protected]: USB OHCI 1.0
Bus [email protected]: USB EHCI 1.00
Bus [email protected]: USB OHCI 1.0
Bus [email protected]: USB EHCI 1.00
Bus [email protected]: USB OHCI 1.0
Bus [email protected]: USB EHCI 1.00
Bus [email protected]: USB OHCI 1.0
scanning bus [email protected] for devices... 1 USB Device(s) found
scanning bus [email protected] for devices... 1 USB Device(s) found
scanning bus [email protected] for devices... 1 USB Device(s) found
scanning bus [email protected] for devices... 1 USB Device(s) found
scanning bus [email protected] for devices... 1 USB Device(s) found
scanning bus [email protected] for devices... 1 USB Device(s) found
scanning bus [email protected] for devices... 1 USB Device(s) found
scanning bus [email protected] for devices... 1 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Autoboot in 5 seconds, press <Space> to stop #按空格進入uboot命令
=> saveenv
Saving Environment to FAT... OK #能正常儲存環境變數
=> load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc-plus.dtb # mmc0(tf卡)分割槽1載入dtb
31609 bytes read in 5 ms (6 MiB/s)
=> load mmc 0:1 0x42000000 zImage # mmc0(tf卡)分割槽1載入zImage 
7183328 bytes read in 351 ms (19.5 MiB/s)
=> bootz 0x42000000 - 0x43000000 #bootz 命令啟動核心
## Flattened Device Tree blob at 43000000
   Booting using the fdt blob at 0x43000000
EHCI failed to shut down host controller.
   Loading Device Tree to 49ff5000, end 49fffb78 ... OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

這裡說一下:
Image是Linux核心映象檔案;
zImage 是經過 gzip 壓縮後的Image;
uImage 是老版本 uboot 專用的映象檔案,uImag 是在 zImage 前面加了一個長度為 64位元組的“頭”,這個頭資訊描述了該映象檔案的型別、載入位置、生成時間、大小等資訊。但是新的uboot已經支援了zImage啟動!很少使用uImage了。
zImage可通過下面方法生成uImage

mkimage -A arm -O linux -T kernel -C none -a 0x46000000 -e 0x46000000 -n linux-5.4.65 -d zImage uImage
0x46000000,核心在主存執行的起始位置,這裡是0x46000000,根據資料手冊。
全志的主存起始地址好像在0x40000000。
偏移了0x6000000是因為U-boot檔案,裝置樹檔案,核心檔案都在主存裡,隨便偏移了0x6000000,保證不會覆蓋掉這些檔案即可。
linux-5.4.65 Linux核心版本

uboot下面通過下面方式載入、啟動

=> load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc-plus.dtb
31609 bytes read in 4 ms (7.5 MiB/s)
=> load mmc 0:1 0x42000000 uImage
7183392 bytes read in 351 ms (19.5 MiB/s)
=> bootm 0x42000000 - 0x43000000  #啟動命令更改為bootm
## Booting kernel from Legacy Image at 42000000 ...
   Image Name:   linux-5.4.65
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    7183328 Bytes = 6.9 MiB
   Load Address: 46000000
   Entry Point:  46000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 43000000
   Booting using the fdt blob at 0x43000000
EHCI failed to shut down host controller.
   Loading Kernel Image
   Loading Device Tree to 49ff5000, end 49fffb78 ... OK

Starting kernel ...