树莓派更换内核、串口连接

设备:树莓派 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 文件:

  1. 使用 xz 命令解压:xz -d 2023-05-03-raspios-bullseye-arm64.img.xz 得到 2023-05-03-raspios-bullseye-arm64.img 镜像文件

  2. 将 sdcard 插入读卡器,如果 ubuntu 主动挂载了 sdcard,则将其 umount 掉。通过 lsblk 命令查询 sdcard 对应的设备文件,如 /dev/sdb,这一步一定要确认准确,以防将电脑操作系统破坏。将镜像文件写入 sdcard:sudo dd if=2023-05-03-raspios-bullseye-arm64.img of=/dev/sdb bs=4M,这里需要等待一段时间

  3. 执行sync 确保镜像文件落盘。

  4. 使能串口连接,修改 config.txt,在最后加上 dtoverlay=miniuart-bt

  5. 重新挂载 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,每次输出不一样

  6. 串口打印 kernel log:修改 cmdline.txt,在 console=serial0后加上 enable_uart=1,并将 quiet 注释掉(参考https://github.com/raspberrypi/documentation/blob/develop/documentation/asciidoc/computers/config_txt/boot.adoc)

  7. 打印start*.elf调试log:修改 config.txt,在最后加上 uart_2ndstage=1

  8. 安装串口工具:minicomsudo apt install minicom(串口怎么连接树莓派网上查询教程)

  9. 配置 minicomsudo minicom -s:

    image-20230818010927335

选择“Serial port setup”,修改成以下:

image-20230818011151335

其中 A 条如果不确定可以通过 cutecom 软件确认,这个软件会自动识别可用串口设备。

ESC 键退出上面的界面:

image-20230818011809096

保存设置。

  1. sudo minicom 打开串口就可以看到类似信息:

    image-20230818014912977

内核编译安装

  1. 工具:

    1
    2
    $ sudo apt install crossbuild-essential-arm64
    $ sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
  2. 下载树莓派内核:git clone https://github.com/raspberrypi/linux.git

  3. 树莓派 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
  4. 挂载 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)
  5. 卸载 sdcard,安装回树莓派,登录之后可看到内核版本变了:

    image-20230818015741929