在移植之前,需准备以下相关source code和tools,因为在u-boot的主分支中已经支持raspberry,所以我们可以直接去官网下载最新的code,另外由于raspberry的firmware并没有开源,所以我们只能去github上拿最新的编好的二进制文件。
板子:Raspberry 3B v1.2
u-boot:u-boot-2019.07 https://ftp.denx.de/pub/u-boot/
firmware:master分支 https://github.com/raspberrypi/firmware.git
tools:https://github.com/raspberrypi/tools.git 包含交叉编译工具
另需一张SD卡和SD卡读卡器
准备了相关code和tools之后,我们首先需要搭建交叉编译环境
1、首先需要将交叉编译工具的地址加入PATH变量中(交叉编译工具我们可以在tools文件夹中找到)
export PATH=/home/log/log/raspberryPi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/:$PATH
在这里需要说明的是,tools文件夹提供了以下六种编译工具,可根据自己的需求选择其中一种
arm-bcm2708hardfp-linux-gnueabi/ 硬浮点
arm-bcm2708-linux-gnueabi/
arm-linux-gnueabihf/
arm-rpi-4.9.3-linux-gnueabihf/
gcc-linaro-arm-linux-gnueabihf-raspbian/ 32位
gcc-linaro-arm-linux-gnueabihf-raspbian-x64/ 64位系统的编译工具
在这里我们选用gcc-linaro-arm-linux-gnueabihf-raspbian/bin/
2、将交叉编译工具链的位置加入PATH变量之后,就需要为编译指定交叉编译工具
export CROSS_COMPILE=arm-linux-gnueabi-
export ARCH=arm
在这里需要注意的是,你要根据自己选择的编译器,将前缀赋值给CROSS_COMPILE
3、生成配置文件
因为在官方u-boot已经支持raspberry,我们只需要执行下面的命令,就可以生成指定的配置文件。
make rpi_2_defconfig
在这里需要说明的是,你在u-boot源码的configs目录下,可以看到下面六种配置文件
configs/rpi_0_w_defconfig configs/rpi_3_b_plus_defconfig
configs/rpi_2_defconfig configs/rpi_3_defconfig
configs/rpi_3_32b_defconfig configs/rpi_defconfig
按道理呢,在这里我3B的板子,应该选择rpi_3_defconfig或者rpi_3_32b_defconfig之类的配置,但是目前不清楚为啥,我的板子只有rpi_2_defconfig的配置才可以正常启动,所以我在这里用的是make rpi_2_defconfig,具体你用什么,建议你自己根据自己的板子试一下,如果遇见没办法启动的,建议你多试一下其他的配置,别在一棵树上吊死。
4、编译
经过上面的的准备工作之后,可以在u-boot的源码根目录下,直接make
在编译过程中,有可能会出现编译器版本过低什么之类的,可以通过apt-get install 去下载最新的arm-linux-gnueabi工具。
编译之后,可以看到当前目录下生成了一个u-boot、u-boot.bin等几个文件,在这里我们需要的是u-boot.bin文件。
编译完成之后,我们就需要准备一个制作一个可以启动的SD卡了。
首先在/dev/目录下找到对应的sd*文件,在我这里是sdb
log@log:~/log/raspberryPi/sd$ ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2
log@log:~/log/raspberryPi/sd$ sudo fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.31.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
利用fdisk命令将SD卡分成两个分区,一个boot分区,大小为256M,一个rootfs分区,大小为6G,在这里大小,你可以参考自己的SD卡的大小,自己选择。其中boot分区为fat32格式,root分区为ext4格式。
分区完成后,记得用fsck.ext4和fsck.vfat工具分别对rootfs分区和boot分区进行格式化。
分区完成后,将boot分区mount到一个节点上,如我新建一个文件夹boot
mount -t vfat /dev/sdb1 ./boot
然后将我们下载的firmware里面的boot文件夹下面的所有文件cp到我们刚才mount的boot节点。
sudo cp -rf ../../firmware/boot/* ./
在这里我们看一下boot文件夹下面都有什么文件
log@log:~/log/raspberryPi/sd$ ls ../firmware/boot/ -l
总用量 52944
-rwxr-xr-x 1 log log 23938 12月 10 19:59 bcm2708-rpi-b.dtb
-rwxr-xr-x 1 log log 24201 12月 10 19:59 bcm2708-rpi-b-plus.dtb
-rwxr-xr-x 1 log log 23719 12月 10 19:59 bcm2708-rpi-cm.dtb
-rwxr-xr-x 1 log log 23643 12月 10 19:59 bcm2708-rpi-zero.dtb
-rwxr-xr-x 1 log log 24379 12月 10 19:59 bcm2708-rpi-zero-w.dtb
-rwxr-xr-x 1 log log 25265 12月 10 19:59 bcm2709-rpi-2-b.dtb
-rwxr-xr-x 1 log log 25394 12月 10 19:59 bcm2710-rpi-2-b.dtb
-rwxr-xr-x 1 log log 26435 12月 10 19:59 bcm2710-rpi-3-b.dtb
-rwxr-xr-x 1 log log 27054 12月 10 19:59 bcm2710-rpi-3-b-plus.dtb
-rwxr-xr-x 1 log log 25249 12月 10 19:59 bcm2710-rpi-cm3.dtb
-rwxr-xr-x 1 log log 40697 12月 10 19:59 bcm2711-rpi-4-b.dtb
-rwxr-xr-x 1 log log 52304 12月 10 19:59 bootcode.bin
-rwxr-xr-x 1 log log 18693 12月 10 19:59 COPYING.linux
-rwxr-xr-x 1 log log 3097 12月 10 19:59 fixup4cd.dat
-rwxr-xr-x 1 log log 6195 12月 10 19:59 fixup4.dat
-rwxr-xr-x 1 log log 9183 12月 10 19:59 fixup4db.dat
-rwxr-xr-x 1 log log 9185 12月 10 19:59 fixup4x.dat
-rwxr-xr-x 1 log log 2656 12月 10 19:59 fixup_cd.dat
-rwxr-xr-x 1 log log 6745 12月 10 19:59 fixup.dat
-rwxr-xr-x 1 log log 9819 12月 10 19:59 fixup_db.dat
-rwxr-xr-x 1 log log 9817 12月 10 19:59 fixup_x.dat
-rwxr-xr-x 1 log log 5418584 12月 10 19:59 kernel7.img
-rwxr-xr-x 1 log log 5751680 12月 10 19:59 kernel7l.img
-rwxr-xr-x 1 log log 13521408 12月 10 19:59 kernel8.img
-rwxr-xr-x 1 log log 5140112 12月 10 19:59 kernel.img
-rwxr-xr-x 1 log log 1594 12月 10 19:59 LICENCE.broadcom
drwxr-xr-x 2 log log 12288 12月 10 19:59 overlays
-rwxr-xr-x 1 log log 776256 12月 10 19:59 start4cd.elf
-rwxr-xr-x 1 log log 4582856 12月 10 19:59 start4db.elf
-rwxr-xr-x 1 log log 2775396 12月 10 19:59 start4.elf
-rwxr-xr-x 1 log log 3536968 12月 10 19:59 start4x.elf
-rwxr-xr-x 1 log log 688100 12月 10 19:59 start_cd.elf
-rwxr-xr-x 1 log log 4857192 12月 10 19:59 start_db.elf
-rwxr-xr-x 1 log log 2880420 12月 10 19:59 start.elf
-rwxr-xr-x 1 log log 3794600 12月 10 19:59 start_x.elf
可以看到,boot文件夹下面包好的文件主要有.dtb文件,bootcode.bin,dat文件,elf文件,overlays文件,还有kernel.img文件
其中dtb文件是设备树编译后生成的文件,而dat、elf、overlays、bootcode.bin文件均是树莓派的firmware文件和配置文件,我们是不能动的,在这里,dtb文件我们只留下我们需要的bcm2710-rpi-3-b.dtb文件
而自带的几个img文件,是编译好的的kernel镜像,我们也删掉
然后将我们之前编译好的u-boot.bin 文件cp到此处。
最后,我们还需要一个config.txt文件,这个是树莓派启动后会读取的一个配置文件,如果你之前按照官网的方式制作过启动SD卡的话,你应该有这个文件,没有的话,也没事,你只需要新建一个config.txt文件,并添加如下内容:
kernel=u-boot.bin
enable_uart=1
toverlay=pi3-miniuart-bt
在这里说明一下三行每行的意思,第一行自然是指定将之前启动的kernel指向我们编译好的u-boot.bin
第二行和第三行,主要是为了打开串口终端。因为树莓派3在硬件上将蓝牙和串口共用了一个总线,具体解释读者可以百度下关于树莓派如何打开串口终端,在这里我就不详细介绍了。
至此,我们u-boot的移植就完成了,将制作好的sd卡,插入树莓派,你如果打开了串口终端的话,串口应该会有下面这样的类似输出
MMC: mmc@7e202000: 0
Loading Environment from FAT... *** Warning - bad CRC, using default environment
In: serial
Out: vidconsole
Err: vidconsole
Net: No ethernet found.
starting USB...
Bus usb@7e980000: scanning bus usb@7e980000 for devices... 3 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot: 0
U-Boot> ls
ls - list files in a directory (default /)
Usage:
ls [ [directory]]
- List files in directory 'directory' of partition 'part' on
device type 'interface' instance 'dev'.
U-Boot>
上电后,按空格键,可以打断u-boot的正常引导,将系统停在u-boot阶段
至此,u-boot的移植就完成了。
说明:
1、在这里,我们SD卡的第二个分区rootfs分区并没有用到,因为这里是放文件系统的,如我们要通过u-boot引导一个最小的linux,那么我们就会用上这个分区,具体内容会在下一章详细介绍。
2、在这里,我们没有讲解通过u-boot引导linux 内核,我会在下一章详细介绍如何制作一个最小的linux系统,并通过u-boot引导。
3、如果你制作的SD卡不能正常启动,可以通过官方提供的方法制作一个SD卡,然后用自己编译的u-boot.bin文件引导,如果还不能起来,就说明是u-boot.bin编译的有问题,你可以尝试下用其它的配置文件试一下.
4、关于串口的问题,请读者自己百度解决