全志H3燒入U-boot和Linux核心以及配置
- 1.U-boot的燒入和U-boot環境配置
-
- 1.1U-boot燒入和啟動測試
- 2.編譯完的核心處理和燒入
-
- 2.1處理核心
- 2.2燒入核心
- U-boot環境配置
1.U-boot的燒入和U-boot環境配置
1.1U-boot燒入和啟動測試
需要的材料:
準備一張性能良好的TF卡,不要用淘寶那種幾塊錢包郵的TF卡容易壞。
讀卡器。
之前編譯得到的u-boot-sunxi-with-spl.bin檔案。
編譯得到的檔案 參考我前一篇
連結: H3編譯小結.
首先先清除TF卡上所有分區(也可以不清除,推薦清除)。
接着輸入:。
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。
然後拔下,插入香橙派,接上debug序列槽也就是UART0,打開序列槽軟體,我這裡用的是Putty,不建議使用雜牌序列槽軟體,那些用于STM32是沒問題的,用在ARM-debug上會有亂碼的可能。設定波特率為115200,先打開序列槽再上電,接着會出現。
U-Boot SPL 2020.04 (Jun 10 2020 - 19:55:55 +0800)
DRAM: 1024 MiB
Trying to boot from MMC1
U-Boot 2020.04 (Jun 10 2020 - 19:55:55 +0800) Allwinner Technology
CPU: Allwinner H3 (SUN8I 1680)
Model: Xunlong Orange Pi One
DRAM: 1 GiB
MMC: [email protected]: 0
Loading Environment from FAT... No valid partitions found
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
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
Hit any key to stop autoboot: 0
出現這些代表U-boot編譯燒入成功。
這時随意輸入字母然後按回車,即可進入到U-boot的控制台
香橙派拔電,将TF卡繼續插入Linux主機,繼續核心燒入。
2.編譯完的核心處理和燒入
2.1處理核心
所需材料:
TF卡和讀卡器
編譯完的核心檔案zImage
編譯完會産生Image,還有zImage,zImage是壓縮的Image,而我們需要的是uImage,uImage是在zImage檔案的前面加上了64位元組的資訊。
切換到ZImage檔案所在目錄輸入:
mkimage -A arm -O linux -T kernel -C none -a 0x46000000 -e 0x46000000 -n linux-5.3.5+ -d zImage uImage
重點參數:0x46000000,核心在主存運作的起始位置,這裡是0x46000000,根據資料手冊。
全志的主存起始位址好像在0x40000000。
偏移了0x6000000是因為U-boot檔案,裝置樹檔案,核心檔案都在主存裡,這裡我随便偏移了0x6000000,保證不會覆寫掉這些檔案即可。
重點參數:linux-5.3.5+ Linux核心版本
0x46000000會占用前面0x6000000的空間,浪費了我們寶貴的且有限的記憶體空間,是以後期我們需要自己根據實際情況進行修改,現階段隻需測試啟動核心,完成大于完美。
我們得到了U-boot需要的Uimage檔案
2.2燒入核心
分區不會損壞之前燒入的U-boot,Linux分區從2048塊開始,塊機關是512B,也就是分區是從2048*0.5KB=1MB處開始的,U-boot大小約為450KB,是以不用擔心會損壞U-boot檔案
首先,我們對TF卡進行分區,當然也可以不用分區,十分建議分區,用分區的原因下面再解釋
輸入指令:
fdisk 你的tf卡
我這裡是 :
fdisk /dev/sdb
輸入:p先檢視資訊
Disk /dev/sdb:29.5 GiB,31666995200 位元組,61849600 個扇區
單元:扇區 / 1 * 512 = 512 位元組
扇區大小(邏輯/實體):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組
再輸入:n
分區類型
p 主分區 (0個主分區,0個擴充分區,4空閑)
e 擴充分區 (邏輯分區容器)
選擇 (預設 p): p
分區号 (1-4, 預設 1): 1
第一個扇區 (2048-61849599, 預設 2048): 2048
上個扇區,+sectors 或 +size{K,M,G,T,P} (2048-61849599, 預設 61849599):+100M
以此類推,再建立一個10G大小的分區
100M用于儲存設備樹檔案和核心
10G用于儲存根檔案系統
大小沒有特殊要求,設定為100G和1T也可以。
接着我們需要格式化分區,100M格式化成FAT,10G格式化為EXT2或3或4
fdisk /dev/sdb
輸入:t再選擇分區1
輸入L列印所有可以檔案系統格式
再輸入6,選擇FAT16 FAT32都可以
我這裡另外一個分區預設是ext4,不用管
接着将
sun8i-h3-orangepi-pc-plus.dtb和UImage複制進分區1
最後拔出記憶體卡,插入香橙派,老樣子插電打開序列槽。
進入U-boot控制台:
輸入:
load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc-plus.dtb
load mmc 0:1 0x42000000 uImage
bootm 0x42000000 - 0x43000000
解釋一下:load不用多說是加載的意思,mmc 0:1是指從mmc 第0個分區和第一個分區
尋找名字叫sun8i-h3-orangepi-pc-plus.dtb的檔案,然後加載到主存位置0x43000000來。
為什麼是分區0和分區1看全志手冊:全志優先先給TF配置設定分區,是以是0和1,然後其他的比如EMMC的分區3,4。
bootm的意思大概能猜出來了把,兩個位址分别對應核心檔案和裝置樹檔案,缺一不可。
上文說過可以不用格式化為FAT,因為隻要知道sun8i-h3-orangepi-pc-plus.dtb和uImage位址和檔案大小,
同樣可以完成加載。
列印:
=> load mmc 0:1 0x42000000 uImage
7933608 bytes read in 357 ms (21.2 MiB/s)
=> load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc-plus.dtb
30640 bytes read in 5 ms (5.8 MiB/s)
=> bootm 0x42000000 - 0x43000000
## Booting kernel from Legacy Image at 42000000 ...
Image Name: linux-5.3.5+
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 7933544 Bytes = 7.6 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 49fff7af ... OK
Starting kernel ...
這裡代表核心啟動成功了。
下面還有一串阿巴阿巴的資訊,先不用管,因為我們的根檔案系統還沒拷貝進去。
U-boot環境配置
還有最後一步,U-boot每次都手動輸入load,bootm很麻煩,是以我們設定一下U-boot啟動指令,讓U-boot每次上電自動加載并且啟動核心。
在U-boot控制台下輸入:
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
setenv bootcmd 'load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc-plus.dtb; load mmc 0:1 0x42000000 uImage; bootm 0x42000000 - 0x43000000'
saveenv
複制的時候注意看看複制是否正确,putty在長字元串上複制粘貼有機率出錯。
至此U-boot設定完成,U-boot的主要作用是将重要資訊傳給核心并且啟動,現在U-boot能正常引導核心,我們的重點應放在檔案系統和核心配置上,我們下一步是建立根檔案系統和配置核心。下一篇:
《根檔案系統的手動建立和燒入》.