Lxn-Chan!

(~ ̄▽ ̄)→))* ̄▽ ̄*)o

手动编译 Rockchip BSP 内核以支持 Mainline 不支持的功能,本文以 RK3566 为例对内核进行重新编译。

Intro

这里先介绍一个概念,BSP。

BSP(Board Support Package),即“Rockchip 官方维护的 Linux 内核”;与之相对的是Mainline Kernel(主线内核),即 Linux 官方内核(kernel.org),驱动由 Linux 社区维护。

BSP本质上是芯片厂商为了让硬件尽快能投入市场使用,自己维护的一套 Linux 内核修订;目标是整板能够先跑起来。例如Rockchip芯片中的VPU、NPU、GPU等等都由Rockchip自行开发或修改,只要AOSP(Android)能用、Linux 能用,他们就完成任务了。这些在代码层面上很多是不符合Linux风格也不易于Linux社区维护的,因此由厂商自行维护,没有合入主线。

至于其他厂商,诸如 Intel 的策略就是在硬件发布之前,就把驱动提交到 Linux 主线,等其CPU上市时 Linux 主线可能已经把相关代码合入主线了。另外还有比如 nvidia 的开发板 Jetson,也是自己有维护一套BSP内核。

硬件

仍然是 Panther X2,RK3566,4GB内存,无EMMC存储(拆掉了),64G闪迪金卡。

系统是Armbian Linux v26.02.0 for RK.Panther-X2,原来内核版本是6.12-ophub后面忘了。

编译机

为了确保编译稳定和资源获取方便,本文环境均在阿里云-日本-东京三区ECS完成,16核心,16G内存,50G ESSD,100Mbps CDT,ubuntu 24.04。

目标

能够引出/dev/mpp_service

内核编译

1. 安装依赖

1
2
3
4
5
6
7
8
apt update 
apt install -y \
git bc bison flex build-essential \
libssl-dev libncurses-dev libelf-dev \
dwarves device-tree-compiler \
fakeroot dpkg-dev \
gcc-aarch64-linux-gnu \
rsync cpio kmod

2. 下载源码

  1. 下载BSP内核源码
    1
    2
    mkdir ~/src && cd ~/src
    git clone --depth=1 --branch linux-6.1-stan-rkr6.1 https://github.com/ArmSoM/rockchip-kernel.git linux-bsp61
    我这里编译了6.1版本的内核,主要考虑到本身在使用Debian 12。相关的BSP内核版本还有5.10和4.9等,例如我另外一块Orange Pi 3b(3566)就是5.10的内核,不过底层也是Debian 12。
  2. 下载armbian ophub这个仓库所使用的内核源码用于提取文件
    1
    2
    cd ~/src
    git clone --depth=1 https://github.com/unifreq/linux-6.1.y.git linux-mainline61

3. 准备Panther X2的板级支持

  1. 复制设备树
    1
    2
    3
    cd ~/src/linux-bsp61
    cp ../linux-mainline61/arch/arm64/boot/dts/rockchip/rk3566-panther-x2.dts \
    arch/arm64/boot/dts/rockchip/
  2. 编辑Makefile使得编译时支持Panther X2
    1
    nano arch/arm64/boot/dts/rockchip/Makefile
    添加:
    1
    dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-panther-x2.dtb
    到上述文件末尾

4. 编译

  1. 编译配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cd ~/src/linux-bsp61

    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu-
    export OUT=$PWD/out

    make O="$OUT" \
    ARCH=arm64 \
    CROSS_COMPILE=aarch64-linux-gnu- \
    rockchip_linux_defconfig
  2. 设置版本号,随便写点什么和mainline区分开就行
    1
    2
    3
    scripts/config \
    --file "$OUT/.config" \
    --set-str CONFIG_LOCALVERSION "-panther-bsp61"
    应用
    1
    2
    3
    4
    make O="$OUT" \
    ARCH=arm64 \
    CROSS_COMPILE=aarch64-linux-gnu- \
    olddefconfig
  3. 确认一下MPP相关的配置项有没有勾选
    1
    2
    3
    grep -E \
    '^CONFIG_ROCKCHIP_MPP|^CONFIG_ROCKCHIP_IOMMU' \
    "$OUT/.config"
    至少应该能够看到:
    1
    2
    3
    4
    CONFIG_ROCKCHIP_MPP_SERVICE=y
    CONFIG_ROCKCHIP_MPP_RKVDEC=y
    CONFIG_ROCKCHIP_MPP_RKVENC=y
    CONFIG_ROCKCHIP_IOMMU=y
  4. (坑)Panther X2其实是没有USB3.0口的,唯一的USB是2.0,不知道为什么mainline的dtsi中有usb_host0_xhci配置,总之先删掉。
    编辑arch/arm64/boot/dts/rockchip/rk3566-panther-x2.dts文件,找到并删除如下内容(看准了再删!!!
    1
    2
    3
    4
    &usb_host0_xhci {
    dr_mode = "host";
    status = "okay";
    };
  5. (坑)启用mpp_service,编辑~/src/linux-bsp61/arch/arm64/boot/dts/rockchip/rk3566-panther-x2.dts文件,添加如下节点
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    &mpp_srv {
    status = "okay";
    };

    &rkvdec {
    status = "okay";
    };

    &rkvdec_mmu {
    status = "okay";
    };

    &rkvenc {
    status = "okay";
    };

    &rkvenc_mmu {
    status = "okay";
    };
  6. 编译内核和模块
    1
    2
    3
    4
    make O="$OUT" \
    ARCH=arm64 \
    CROSS_COMPILE=aarch64-linux-gnu- \
    -j$(nproc) Image modules
  7. 编译dtb
    1
    2
    3
    4
    make O="$OUT" \
    ARCH=arm64 \
    CROSS_COMPILE=aarch64-linux-gnu- \
    rockchip/rk3566-panther-x2.dtb
    验证:
    1
    2
    3
    4
    5
    6
    dtc -I dtb -O dts \
    -o /tmp/panther-bsp61.dts \
    "$OUT/arch/arm64/boot/dts/rockchip/rk3566-panther-x2.dtb"

    grep -n -A4 -B2 "rockchip,mpp-service" \
    /tmp/panther-bsp61.dts
    应该能够看到:
    1
    2
    3
    4
    5
    6
    7
    701-
    702- mpp-srv {
    703: compatible = "rockchip,mpp-service";
    704- rockchip,taskqueue-count = <0x06>;
    705- rockchip,resetgroup-count = <0x06>;
    706- status = "okay";
    707- phandle = <0x63>;

部署

至此已经完成一大半了,部署这部分基本上就是最简单的了。

1. 在编译机上准备artifacts

  1. 完善一下参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cd ~/src/linux-bsp61

    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu-
    export OUT=$PWD/out

    export KREL=$(make -s O="$OUT" \
    ARCH=arm64 \
    CROSS_COMPILE=aarch64-linux-gnu- \
    kernelrelease)

    echo "$KREL"
  2. 确认一下配置
    1
    grep -E '^CONFIG_ROCKCHIP_MPP|^CONFIG_ROCKCHIP_IOMMU' "$OUT/.config"
    至少需要有:
    1
    2
    CONFIG_ROCKCHIP_MPP_SERVICE=y
    CONFIG_ROCKCHIP_IOMMU=y
  3. 准备一下模块
    1
    2
    3
    4
    5
    6
    7
    rm -rf stage

    make O="$OUT" \
    ARCH=arm64 \
    CROSS_COMPILE=aarch64-linux-gnu- \
    modules_install \
    INSTALL_MOD_PATH="$PWD/stage"

2. Panther X2 备份

1
2
3
4
5
6
mkdir -p /root/panther-backup/
cp -a /boot/Image /root/panther-backup/
cp -a /boot/uInitrd /root/panther-backup/
cp -a /boot/armbianEnv.txt /root/panther-backup/
cp -a /boot/boot.scr /root/panther-backup/
cp -a /boot/dtb/rockchip/rk3566-panther-x2.dtb /root/panther-backup/

3. artifact 从编译机复制到 PantherX2

我这里因为PantherX2在内网,编译机在公网,因此下面的命令都在PantherX2上运行。

1
2
3
4
scp -C root@<runnerIP>:/root/src/linux-bsp61/out/arch/arm64/boot/Image /root/Image-bsp61
scp -C root@<runnerIP>:/root/src/linux-bsp61/out/arch/arm64/boot/dts/rockchip/rk3566-panther-x2.dtb /root/rk3566-panther-x2-bsp61.dtb
scp -C root@<runnerIP>:/root/src/linux-bsp61/out/.config /root/config-6.1.118-panther-bsp61
rsync -a "root@<runnerIP>:/root/src/linux-bsp61/stage/lib/modules/6.1.118-panther-bsp61/" "/root/modules/6.1.118-panther-bsp61/"

注意修改一下最后两行命令末尾及下文命令中的版本号,如果你的版本号跟我的不一样记得改。

4. 安装模块

  1. 复制文件
    1
    2
    3
    mkdir -p "/lib/modules/6.1.118-panther-bsp61"
    cp -a "/root/modules/6.1.118-panther-bsp61/." "/lib/modules/6.1.118-panther-bsp61/"
    install -m 0644 "/root/config-6.1.118-panther-bsp61" "/boot/config-6.1.118-panther-bsp61"
  2. 设置压缩格式采用gzip
    1
    printf '%s\n' 'COMPRESS=gzip' > /etc/initramfs-tools/conf.d/panther-bsp61
  3. 更新模块
    1
    depmod -a 6.1.118-panther-bsp61
  4. 确认一下模块存在
    1
    ls -ld "/lib/modules/6.1.118-panther-bsp61"

5. 生成initramfs

1
update-initramfs -c -k 6.1.118-panther-bsp61

6. 生成uInitrd

1
2
3
4
5
6
7
8
mkimage \
-A arm64 \
-O linux \
-T ramdisk \
-C gzip \
-n "uInitrd $KREL" \
-d "/boot/initrd.img-$KREL" \
/boot/uInitrd-bsp61

验证:

1
2
3
4
root@armbian:/boot# ls -lh /boot/uInitrd-bsp61
-rw-r--r-- 1 root root 13M Jul 15 17:18 /boot/uInitrd-bsp61
root@armbian:/boot# file /boot/uInitrd-bsp61
/boot/uInitrd-bsp61: u-boot legacy uImage, uInitrd 6.1.118-panther-bsp61, Linux/ARM 64-bit, RAMDisk Image (gzip), 12967250 bytes, Wed Jul 15 09:18:14 2026, Load Address: 00000000, Entry Point: 00000000, Header CRC: 0XD2786CA, Data CRC: 0X73E47CA9

验收

基本信息和目标测试

1
2
3
4
root@armbian:~# uname -a
Linux armbian 6.1.118-panther-bsp61 #1 SMP Wed Jul 15 14:33:52 CST 2026 aarch64 GNU/Linux
root@armbian:~# ls -l /dev/mpp_service
crw------- 1 root root 240, 0 Jul 15 17:37 /dev/mpp_service

 简单说两句



联系站长 | 服务状态 | 友情链接

备案号:辽ICP备19013963号

津公网安备12011602300394号

中国互联网违法和不良信息举报中心

架构版本号:8.2.2 | 本站已全面支持IPv6

正在载入运行数据(1/2)请稍后...
正在载入运行数据(2/2)请稍后...

O to die advancing on!

Copyright 2024 LingXuanNing, All rights reserved.