树莓派更换内核、串口连接
设备:树莓派 3b+、sdcard、读卡器、usb 转串口线
环境:Ubuntu 20.04.6 LTS
树莓派镜像
我选择最新的 arm64 镜像,可以从 https://downloads.raspberrypi.org/raspios_arm64/images/ 查找下载,写这篇文章时最新的是 https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2023-05-03/2023-05-03-raspios-bullseye-arm64.img.xz,下载之后得到 2023-05-03-raspios-bullseye-arm64.img.xz 文件:
-
使用
xz
命令解压:xz -d 2023-05-03-raspios-bullseye-arm64.img.xz
得到2023-05-03-raspios-bullseye-arm64.img
镜像文件 -
将 sdcard 插入读卡器,如果 ubuntu 主动挂载了 sdcard,则将其 umount 掉。通过
lsblk
命令查询 sdcard 对应的设备文件,如 /dev/sdb,这一步一定要确认准确,以防将电脑操作系统破坏。将镜像文件写入 sdcard:sudo dd if=2023-05-03-raspios-bullseye-arm64.img of=/dev/sdb bs=4M
,这里需要等待一段时间 -
执行
sync
确保镜像文件落盘。 -
使能串口连接,修改 config.txt,在最后加上
dtoverlay=miniuart-bt
-
重新挂载 sdcard,会有两个分区:bootfs 和 rootfs,如我的挂载在
/media/ql/bootfs/
和/media/ql/rootfs/
。在/media/ql/bootfs/
新建userconf.txt
文件,其内容为:pi:$6$c70VpvPsVNCG0YR5$l5vWWLsLko9Kj65gcQ8qvMkuOoRkEagI90qi3F/Y7rm8eNYZHW8CY6BOIKwMH7a3YYzZYL90zf304cAHLFaZE0
,表示pi
用户密码为raspberry
。密码设置:用户名:加密密码
加密密码:
echo '密码' | openssl passwd -6 -stdin
,每次输出不一样 -
串口打印 kernel log:修改 cmdline.txt,在
console=serial0
后加上enable_uart=1
,并将quiet
注释掉(参考https://github.com/raspberrypi/documentation/blob/develop/documentation/asciidoc/computers/config_txt/boot.adoc) -
打印start*.elf调试log:修改 config.txt,在最后加上
uart_2ndstage=1
-
安装串口工具:
minicom
:sudo apt install minicom
(串口怎么连接树莓派网上查询教程) -
配置
minicom
:sudo minicom -s
:
选择“Serial port setup”,修改成以下:
其中 A 条如果不确定可以通过 cutecom
软件确认,这个软件会自动识别可用串口设备。
ESC 键退出上面的界面:
保存设置。
-
sudo minicom
打开串口就可以看到类似信息:
内核编译安装
-
工具:
1
2$ sudo apt install crossbuild-essential-arm64
$ sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev -
下载树莓派内核:
git clone https://github.com/raspberrypi/linux.git
-
树莓派 arm64 默认加载名为 kernel8 的内核镜像,编译:
1
2
3
4$ cd linux
$ KERNEL=kernel8
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig -j8
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j8 -
挂载 sdcard,安装:
1
2
3
4
5
6
7$ sudo cp /media/ql/bootfs/$KERNEL.img /media/ql/bootfs/$KERNEL-backup.img
$ sudo cp arch/arm64/boot/Image /media/ql/bootfs/$KERNEL.img
$ sudo cp arch/arm64/boot/dts/broadcom/*.dtb /media/ql/bootfs/
$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* /media/ql/bootfs/overlays
$ sudo cp arch/arm64/boot/dts/overlays/README /media/ql/bootfs/overlays
$ su
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/media/ql/rootfs modules_install (切换到 root) -
卸载 sdcard,安装回树莓派,登录之后可看到内核版本变了: