树莓派3交叉编译u-boot及第一次使用
树莓派3交叉编译u-boot及第一次使用
交叉编译
检查配置文件
[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文件挂载方法。
推荐阅读