linux U-boot开发

这篇文章的目的

前段时间杰哥弄了个nanopi开发板,在他手里吃灰了很久,到我手里又吃灰了很久,总得学一学不是?!开发板的准确型号是nano pi m1 plus,CPU为全志H3,挺古老的一块处理器了,板载1G的ddr3,性能孱弱,但是用来学习还是特别合适的,主要是资料比较多,本章节文章主要阐述u-boot开发流程,只能说是编译了一下吧,还没有到开发的地步

环境需求

虚拟机版本为VMware15.0
ubuntu版本为20.04
内存卡容量32Gb

虚拟机,发现一个坑是插上内存卡后,windows给我干蓝屏了,最终在虚拟机设置里面关闭蓝牙,将usb版本降低到1.1才好

编译u-boot流程

安装交叉编译器

下载并解压arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz,将其解压到一个自己熟悉的地方,后面需要用到,解压出来后文件夹中的bin文件夹下的arm-linux-gcc就是我们所需要的交叉编译器,我们需要将该文件夹添加环境变量(也可以不添加,但是后续需要修改Makefile文件)。如果添加了全局变量,命令行输入arm-linux-gcc -v,会显示交叉编译器的版本号

编译U-boot

在git上拉取u-boot源码,并切换分支:git clone https://github.com/friendlyarm/u-boot.git -b sunxi-v2017.x --depth 1,在安装必备的工具软件apt-get install swig python-dev python3-dev,然后在uboot文件夹找到Makefile文件,在其头部添加ARCH:=arm,然后修改交叉编译的工具地址为绝对地址CROSS_COMPILE ?= /home/shumei/H3/arm_gcc/4.9.3/bin/arm-linux-

如果你上一步添加全局变量并且编译没问题可以不修改Makefile,我是添加了全局变量但是编译时总是找不到编译器才不得不出此下策。。。

上面的工作完成后,在终端中输入make nanopi_h3_defconfig ARCH=arm CROSS_COMPILE=arm-linux-,如果你修改了Makefile,只用输入make nanopi_h3_defconfig就好了,因为我们在makefile中指定了ARCH与CROSS_COMPILE,这次编译完后,生成的配置文件。在输入make ARCH=arm CROSS_COMPILE=arm-linux-或者直接make,即可编译生成bin文件,但是我们发现生成不止一个bin文件:

u-boot-sunxi-with-spl.bin
u-boot.bin
u-boot-dtb.bin

我们需要的是u-boot-sunxi-with-spl.bin,spl代表的是U-boot的创造者为芯片启动提供的自己的解决方案,不同厂商的处理器内部的RAM大小,有的厂商芯片内部RAM比较大,能直接一步到位将外部的boot程序烧进内部RAM对处理器进行设置;而有的厂商内部RAM比较小,不能一步到位将外部的boot程序烧进RAM,而是分多步,先拷贝最重要的boot程序进去设置,再到主存里完成剩余的设置。面对不同厂商自己不同boot方案,U-boot采用了spl来完成对绝大部分的芯片进行兼容
另一个值得注意的点是我们在u-boot下的configs下可以找到很多芯片或者板子的defconfig文件,我们分别对比nanopi_h3_defconfig与nanopi_m1_plus_defconfig,其中前者是所有H3芯片的开发板都可以用的,后者只针对我们手里的开发板,nanopi_m1_plus_defconfig中关闭了很多没必要打开的外设或资源

烧录u-boot测试

我们需要将得到的u-boot-sunxi-with-spl.bin烧录到内存卡,使用dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8,提一句,全志的芯片好像都是将启动镜像烧录在8K偏移处,烧录完成后上电通过串口可以看到u-boot启动过程中的打印log:

U-Boot SPL 2017.11-g5e8607b-dirty (Apr 08 2023 - 21:06:51)
DRAM: 1024 MiB(408MHz)
CPU Freq: 408MHz
memory test: 1
Pattern 55aa  Writing...Reading...OK
Trying to boot from MMC1
Boot device: sd


U-Boot 2017.11-g5e8607b-dirty (Apr 08 2023 - 21:06:51 -0700) Allwinner Technology

CPU:   Allwinner H3 (SUN8I 1680)
Model: FriendlyElec NanoPi H3
DRAM:  1 GiB
CPU Freq: 1008MHz
MMC:   SUNXI SD/MMC: 0, SUNXI SD/MMC: 1
In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
BOARD: nanopi-m1-plus
starting USB...
No controllers found
Hit any key to stop autoboot:  0 
** Unrecognized filesystem type **
## Executing script at 43100000
Wrong image format for "source" command
=> 

上电时会打印很多log,因为SD卡中没有内核,自然就启动失败留在boot中等待指令,我们可以尝试一些指令,如打印所有的参数printenv,设定参数setenv author shumei并且保存参数saveenv,再次打印参数后可以看到我们设定的参数了
通过输入help或者?可以查看帮助,我们可以尝试使用gpio指令改变的灯光的状态:

blinker.gif

文章目录