香橙派全志H3烧入U-boot和Linux内核以及配置

全志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:   mmc@1c0f000: 0
Loading Environment from FAT... No valid partitions found 



In:    serial
Out:   serial
Err:   serial
Net:   phy interface0
eth0: ethernet@1c30000
starting USB...
Bus usb@1c1a000: USB EHCI 1.00
Bus usb@1c1a400: USB OHCI 1.0
Bus usb@1c1b000: USB EHCI 1.00
Bus usb@1c1b400: USB OHCI 1.0
scanning bus usb@1c1a000 for devices... 1 USB Device(s) found
scanning bus usb@1c1a400 for devices... 1 USB Device(s) found
scanning bus usb@1c1b000 for devices... 1 USB Device(s) found
scanning bus usb@1c1b400 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能正常引导内核,我们的重点应放在文件系统和内核配置上,我们下一步是建立根文件系统和配置内核。下一篇:
《根文件系统的手动建立和烧入》.

你可能感兴趣的:(全志H3踩坑之旅,内核,linux,嵌入式,u-boot)