树莓派折腾笔记_1_uboot移植

uboot移植

准备工作

在移植之前,需准备以下相关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卡读卡器

编译u-boot

准备了相关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卡

编译完成之后,我们就需要准备一个制作一个可以启动的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、关于串口的问题,请读者自己百度解决

 

 

 

 

你可能感兴趣的:(树莓派)