欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

树莓派3交叉编译u-boot及第一次使用

程序员文章站 2024-03-23 23:59:04
...

交叉编译

检查配置文件

[email protected]:/usr/local/src/u-boot-2019.04/configs$ ll rp*
-rw-rw-r-- 1 xy xy 1004 4月   9 09:40 rpi_0_w_defconfig
-rw-rw-r-- 1 xy xy  999 4月   9 09:40 rpi_2_defconfig
-rw-rw-r-- 1 xy xy 1077 4月   9 09:40 rpi_3_32b_defconfig
-rw-rw-r-- 1 xy xy 1073 4月   9 09:40 rpi_3_defconfig
-rw-rw-r-- 1 xy xy  995 4月   9 09:40 rpi_defconfig
[email protected]:/usr/local/src/u-boot-2019.04/configs$ cd ..

关键步骤,只有2步

[email protected]:/usr/local/src/u-boot-2019.04$ make rpi_3_defconfig
[email protected]:/usr/local/src/u-boot-2019.04$ make

问题1:使用X86_64自身的编译器

直接运行make(使用X86_64自身的编译器),理解报错

  CC      lib/asm-offsets.s
cc1: warning: unknown register name: x18
cc1: error: bad value (‘armv8-a’) for ‘-march=’ switch
cc1: note: valid arguments to ‘-march=’ switch are: nocona core2 nehalem corei7 westmere sandybridge corei7-avx ivybridge core-avx-i haswell core-avx2 broadwell skylake skylake-avx512 bonnell atom silvermont slm knl x86-64 eden-x2 nano nano-1000 nano-2000 nano-3000 nano-x2 eden-x4 nano-x4 k8 k8-sse3 opteron opteron-sse3 athlon64 athlon64-sse3 athlon-fx amdfam10 barcelona bdver1 bdver2 bdver3 bdver4 znver1 btver1 btver2
Kbuild:43: recipe for target 'lib/asm-offsets.s' failed
make[1]: *** [lib/asm-offsets.s] Error 1
Makefile:1588: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2
[email protected]:/usr/local/src/u-boot-2019.04$ 

检查交叉编译器版本:

[email protected]:/usr/local/src/u-boot-2019.04$ arm-linux-gnueabi-gcc -v
gcc 版本 7.4.1 20181213 [linaro-7.4-2019.02 revision 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4] (Linaro GCC 7.4-2019.02)

采用交叉编译,
参考:
在树莓派3上移植uboot
Linux主机上使用交叉编译移植u-boot到树莓派
其中提到 树莓派3启动过程概述
这里是因为树莓派的特殊性,并不是真正的boot-loader,所以需要交叉编译。

[email protected]:/usr/local/src/u-boot-2019.04$ export CROSS_COMPILE=arm-linux-gnueabi-
[email protected]:/usr/local/src/u-boot-2019.04$ make

问题2:使用arm(32位)的编译器

新的报错:

include/asm-generic/bitops/__fls.h:38:21: 警告: 左移次数大于或等于类型宽度 [-Wshift-count-overflow]
  if (!(word & (~0ul << (BITS_PER_LONG-1))))
                     ^~
{standard input}: Assembler messages:
{standard input}:36: 错误: unexpected character `n' in type specifier
{standard input}:36: 错误: bad instruction `b.ne 1b'
scripts/Makefile.build:278: recipe for target 'arch/arm/cpu/armv8/cpu.o' failed
make[1]: *** [arch/arm/cpu/armv8/cpu.o] Error 1
Makefile:1531: recipe for target 'arch/arm/cpu/armv8' failed
make: *** [arch/arm/cpu/armv8] Error 2
[email protected]:/usr/local/src/u-boot-2019.04$

树莓派3是64位的处理器,需要采用gcc-aarch64来编译。

上面的资料都提到原始出处 [RPi U-Boot]https://elinux.org/RPi_U-Boot
建议的方法是使用apt来安装
To build u-boot in 64-bit mode for RPi3, install the 64-bit compiler:
apt-get install gcc-aarch64-linux-gnu
但是这个方法会和当前在用的32位的交叉编译工具冲突,而且之前删除过apt安装的交叉工具,无法清理干净。
对于要采用apt的话,请记录好安装的文件清单,以便于后续手工卸载。
官方下载编译工具 https://www.linaro.org/downloads/
最新工具地址 https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
解压

$ sudo tar Jxf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz  -C /opt/
$ ls -d /opt/gcc*
/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu
/opt/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi

修改环境变量

[email protected]:~$ vi .bashrc

注释掉

#export PATH=$PATH:.:/opt/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi/bin

关闭shell窗口,重新打开,设置新的路径

[email protected]:~$ export PATH=$PATH:.:/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin

验证新的工具及路径。

[email protected]:~$ which aarch64-linux-gnu-gcc
/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

设置好新的交叉编译工具

for the 64-bit compiler:
export CROSS_COMPILE=aarch64-linux-gnu-

进入源码目录,重新编译通过。

[email protected]:/usr/local/src/u-boot-2019.04$ make
......
  OBJCOPY examples/standalone/hello_world.bin
  LDS     u-boot.lds
  LD      u-boot
  OBJCOPY u-boot.srec
  OBJCOPY u-boot-nodtb.bin
start=$(aarch64-linux-gnu-nm u-boot | grep __rel_dyn_start | cut -f 1 -d ' '); end=$(aarch64-linux-gnu-nm u-boot | grep __rel_dyn_end | cut -f 1 -d ' '); tools/relocate-rela u-boot-nodtb.bin 0x00080000 $start $end
  COPY    u-boot.bin
  SYM     u-boot.sym
===================== WARNING ======================
CONFIG_OF_EMBED is enabled. This option should only
be used for debugging purposes. Please use
CONFIG_OF_SEPARATE for boards in mainline.
See doc/README.fdt-control for more info.
====================================================
  CFGCHK  u-boot.cfg
[email protected]:/usr/local/src/u-boot-2019.04$ 

题外话:安装树莓派系统Raspbian

准备树莓派操作系统,根据官网 https://www.raspberrypi.org/
下载最新的Raspbian包,我使用了Raspbian Stretch Lite。
由于第一次使用,采用了官网建议的Ether工具,解压请一定要解压到目录里面,如果不能启动,请增加可执行权限。
官网访问慢,记录一下手工dd的命令

unzip -p 2018-11-13-raspbian-stretch.zip | sudo dd of=/dev/mmcblk0 bs=4M conv=fsync

注意 插拔SD卡用lsblk来确认好设备名,搞错了后果很严重。实际上,SD卡的路径应该是这样的。

mmcblk0     179:0    0   3.7G  0 disk 
├─mmcblk0p1 179:1    0  42.9M  0 part /media/xy/boot
└─mmcblk0p2 179:2    0   3.6G  0 part /media/xy/rootfs

确认能启动后。

插入sd卡到PC机,把boot分区的kernel7.img名字改名为bak_kernel7.img,在图像界面修改的,没有修改备份成功!
把新的u-boot拷贝过去

[email protected]:/usr/local/src/u-boot-2019.04$ sudo ls -l /media/xy/boot/*img
-rw-r--r-- 1 xy xy 4944992 2月  18 10:10 /media/xy/boot/kernel7.img
-rw-r--r-- 1 xy xy 4698056 2月  18 10:10 /media/xy/boot/kernel.img
[email protected]:/usr/local/src/u-boot-2019.04$ sudo ls -l /media/xy/boot/*img
-rw-r--r-- 1 xy xy  493040 6月  11 22:18 /media/xy/boot/kernel7.img
-rw-r--r-- 1 xy xy 4698056 2月  18 10:10 /media/xy/boot/kernel.img

修改同目录的config.txt,增加一行 enable_uart=1,打开串口,但是不知道怎么接串口哦,看了一些资料,很复杂的样子。

从SD启动,接HDMI接口,显示彩色背景,无字符输出。

题外话1:从包含多个分区的img恢复文件。

从下载的img文件恢复kernel7.img文件
参考大神的linux系统中如何打开察看img文件内容

[email protected]:~$ fdisk -l /media/xy/DataSoft/download/iso/2019-04-08-raspbian-stretch-lite.img 
Disk /media/xy/DataSoft/download/iso/2019-04-08-raspbian-stretch-lite.img:1.7 GiB,1803550720 字节,3522560 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xc1dc39e5

设备                                                                  启动  起点    末尾    扇区  大小 Id 类型
/media/xy/DataSoft/download/iso/2019-04-08-raspbian-stretch-lite.img1       8192   96042   87851 42.9M  c W95 
/media/xy/DataSoft/download/iso/2019-04-08-raspbian-stretch-lite.img2      98304 3522559 3424256  1.6G 83 Linu

这里需要用start的8192乘以单元大小512=4194304

[email protected]:~$ sudo mount -o loop,offset=4194304 /media/xy/DataSoft/download/iso/2019-04-08-raspbian-stretch-lite.img /mnt/tmp
[sudo] xy 的密码:           
[email protected]:~$ ls /mnt/tmp
bcm2708-rpi-0-w.dtb     bcm2710-rpi-3-b.dtb       config.txt     fixup_x.dat       LICENSE.oracle  start_x.elf
bcm2708-rpi-b.dtb       bcm2710-rpi-3-b-plus.dtb  COPYING.linux  issue.txt         overlays
bcm2708-rpi-b-plus.dtb  bcm2710-rpi-cm3.dtb       fixup_cd.dat   kernel7.img       start_cd.elf
bcm2708-rpi-cm.dtb      bootcode.bin              fixup.dat      kernel.img        start_db.elf
bcm2709-rpi-2-b.dtb     cmdline.txt               fixup_db.dat   LICENCE.broadcom  start.elf
[email protected]:~$ ls -l  /media/xy/boot/kernel7.img 
-rw-r--r-- 1 xy xy 493040 6月  11 22:18 /media/xy/boot/kernel7.img
[email protected]:~$ ls -l /mnt/tmp/kernel7.img 
-rwxr-xr-x 1 root root 4944992 2月  18 10:10 /mnt/tmp/kernel7.img
[email protected]:~$ cp /mnt/tmp/kernel7.img /media/xy/boot/
[email protected]:~$ ls -l  /media/xy/boot/kernel7.img
-rw-r--r-- 1 xy xy 4944992 6月  12 19:57 /media/xy/boot/kernel7.img
[email protected]:~$ sudo umount /mnt/tmp

在图形界面umount弹出SD卡的两个分区。
SD卡插入树莓派后启动正常。

题外话2:键盘混乱

sudo raspi-config
参考:设置树莓派键盘布局错乱
顺便开启ssh

题外话3:vnc安装

测试了一下xrdp,安装居然需要200多兆。

[email protected]:~ $ sudo apt-get install linuxvnc
Need to get 204 kB of archives.
After this operation, 419 kB of additional disk space will be used.

下载自动从cn下载,但是安装很慢,

[email protected]:~ $ linuxvnc 
12/06/2019 13:22:43 Couldn't open tty device /dev/tty2!
[email protected]:~ $ ls -l /dev/tty2
crw--w---- 1 root tty 4, 2 Jun 11 13:35 /dev/tty2
[email protected]:~ $ id|grep tty
[email protected]:~ $ sudo usermod -a -G tty pi

退出重新登录。
我都没有安装图形界面,连接上去后是一抹黑呀,这个vnc先放着吧。

这里藏2个网站备用
supermaker.tv
makerspace.cn

小结:

树莓派3采用的64位处理器,需要采用新的交叉编译工具aarch64-linux-gnu-
由于64位工具名称和32位的工具arm-linux-gnueabi-不同。
如果apt工具安装的话,应该也不会有问题,也可以在PATH中同时设置2个路径,方便后续使用。
由于串口连接困难,暂时无法验证u-boot。
顺便记录了一下多分区的img文件挂载方法。