跳到主要内容RK3568 嵌入式开发环境搭建:Linux 5.10 内核移植与驱动适配 | 极客日志C
RK3568 嵌入式开发环境搭建:Linux 5.10 内核移植与驱动适配
综述由AI生成详细记录了基于 RK3568 芯片的嵌入式 Linux 5.10 内核移植全过程。内容涵盖 Ubuntu 开发环境搭建、交叉编译工具链配置、U-Boot 编译与适配、内核设备树(DTS)修改以及根文件系统制作。重点实现了 V4L2 摄像头、I2C 温湿度传感器及 HDMI 显示驱动的适配与验证。最后提供烧录镜像步骤及常见启动失败、驱动加载问题的排查方案,适合安防等领域嵌入式开发参考。
Elasticer28 浏览 基于 RK3568 芯片实现 Linux 5.10 内核移植与驱动适配
核心流程是「环境搭建 → BSP 准备 → U-Boot 适配 → 内核移植(设备树为核心)→ 驱动开发 / 适配 → 根文件系统制作 → 烧录验证」。RK3568 作为 Rockchip 主流中低端嵌入式芯片,官方提供完善的 BSP 支持,无需从零开发,重点在于「设备树适配」和「驱动参数调优」。
一、前置知识与核心依赖
1. 核心工具与环境
| 类别 | 具体要求 |
|---|
| 主机系统 | Ubuntu 20.04/22.04(64 位,兼容性最佳,避免编译依赖冲突) |
| 交叉编译工具链 | aarch64-linux-gnu-gcc(Linaro 11.3 或 Rockchip 官方工具链,适配 ARMv8-A) |
| 依赖工具 | git make gcc flex bison dtc libssl-dev ncurses-dev parted dosfstools |
| 烧录工具 | RKDevTool(Windows/Linux)、SD Card Formatter(SD 卡烧录) |
| BSP 源码 | Rockchip 官方 Linux 5.10 内核(linux-rockchip)、U-Boot(u-boot-rockchip) |
| 根文件系统工具 | Buildroot 2022.02+(轻量快速,适合嵌入式)或 Yocto(复杂场景) |
2. RK3568 核心硬件特性(驱动适配关键)
- CPU 架构:ARM Cortex-A55(4 核,ARMv8-A)
- 存储接口:eMMC 5.1、SDHC、SPI NAND
- 视频接口:CSI-2(摄像头输入)、HDMI 2.0(输出,支持 4K@60Hz)
- 通信接口:I2C x6、SPI x4、UART x5、USB 3.0/2.0
- 驱动框架依赖:V4L2(摄像头)、I2C 子系统、DRM/KMS(HDMI 显示)
二、第一步:搭建开发环境
1. 安装主机依赖工具
sudo apt update && sudo apt install -y git make gcc flex bison dtc libssl-dev \
ncurses-dev parted dosfstools mkbootimg u-boot-tools device-tree-compiler \
python3-pip python3-setuptools
2. 安装交叉编译工具链
推荐使用 Rockchip 官方工具链(适配性更好):
wget https://releases.linaro.org/components/toolchain/binaries/11.3.1-1/aarch64-linux-gnu/aarch64-linux-gnu-gcc-11.3.1.tar.xz
sudo tar -xvf aarch64-linux-gnu-gcc-11.3.1.tar.xz -C /opt/
PATH=/opt/aarch64-linux-gnu-gcc-11.3.1/bin:
aarch64-linux-gnu-gcc -v
export
$PATH
3. 下载 BSP 源码(Rockchip 官方仓库)
RK3568 的 Linux 5.10 内核、U-Boot 源码已在官方仓库维护,直接克隆即可:
mkdir rk3568_project && cd rk3568_project
git clone -b linux-5.10-gen-rkr4 https://github.com/rockchip-linux/linux.git
git clone -b master https://github.com/rockchip-linux/u-boot.git
git clone https://github.com/rockchip-linux/rkbin.git
三、第二步:U-Boot 编译与适配(启动内核前提)
U-Boot 负责「初始化硬件 → 加载内核 → 引导根文件系统」,RK3568 官方 U-Boot 已适配核心硬件,只需简单配置编译:
1. 配置 U-Boot
cd u-boot
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rk3568-evb1-ddr4-1008mhz_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
关键配置项:Boot options → Default boot device(选择 SD 卡/eMMC)、Serial console(启用 UART0 作为调试串口)。
2. 编译 U-Boot
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
3. 生成 RK 专用启动镜像(必须步骤)
RK 芯片需要「idbloader + u-boot.itb」组合才能启动,使用官方工具生成:
cd ../rkbin
./tools/mkimage -n rk3568 -T rksd -d bin/rk3568_ddr4_1008MHz_v1.16.bin:bin/rk3568_miniloader_v1.28.bin ../u-boot/idbloader.img
四、第三步:Linux 5.10 内核移植(核心:设备树适配)
内核移植的核心是「设备树(DTS)配置」—— 告诉内核 RK3568 的硬件资源(GPIO、I2C 控制器、CSI 接口、HDMI 引脚等),驱动仅需基于设备树做少量适配(官方内核已包含 RK3568 大部分驱动框架)。
1. 内核配置
cd ../linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rockchip_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
| 驱动类型 | 配置路径与选项 |
|---|
| V4L2 摄像头 | Device Drivers → Multimedia support → V4L2 sub-device userspace API(勾选) → Camera sensors support(勾选对应摄像头型号,如 OV5640/IMX219) |
| I2C 子系统 | Device Drivers → I2C support → I2C bus support(勾选 RK3568 I2C 控制器,如 i2c-rockchip) |
| HDMI 显示 | Device Drivers → Graphics support → DRM (Direct Rendering Manager)(勾选) → Rockchip DRM support(勾选) → HDMI/DP support(勾选 DW HDMI 或 Rockchip HDMI) |
2. 设备树适配(最关键步骤)
RK3568 的设备树文件在 arch/arm64/boot/dts/rockchip/ 目录下,基础设备树为 rk3568.dtsi(公共配置),开发板级设备树为 rk3568-evb1-ddr4.dts(基于 EVB1 开发板,需根据实际硬件修改)。核心操作:修改开发板设备树(rk3568-evb1-ddr4.dts)。
需添加 / 修改「摄像头 CSI 节点、I2C 传感器节点、HDMI 输出节点」,以下是关键节点示例:
(1)HDMI 输出驱动适配(无需额外写驱动,仅配置设备树)
RK3568 集成 DW HDMI 控制器,官方内核已包含驱动,只需在设备树中启用 HDMI 引脚和分辨率:
// 在 rk3568-evb1-ddr4.dts 中添加/修改
&hdmi {
status = "okay"; // 启用 HDMI 控制器
rockchip,hdmi-output = <1>; // 启用 HDMI 输出
hdmi_phy: hdmi-phy {
status = "okay";
compatible = "rockchip,rk3568-hdmi-phy";
reg = <0xfb800000 0x10000>;
clocks = <&cru CLK_HDMI_PHY>, <&cru CLK_HDMI_PLL>;
clock-names = "phy", "pll";
#phy-cells = <0>;
};
};
// 配置 HDMI 引脚(参考 RK3568 datasheet,确认引脚复用)
&pinctrl {
hdmi {
hdmi_tx_pin: hdmi-tx-pin {
rockchip,pins = <
RK_PB0 1 &pcfg_pull_none_drv_level_3 // HDMI_TX_CLK+
RK_PB1 1 &pcfg_pull_none_drv_level_3 // HDMI_TX_CLK-
RK_PB2 1 &pcfg_pull_none_drv_level_3 // HDMI_TX0+
RK_PB3 1 &pcfg_pull_none_drv_level_3 // HDMI_TX0-
// … 其他 HDMI 数据引脚(参考 datasheet 补充)
>;
};
};
};
(2)I2C 传感器驱动适配(以 SHT30 温湿度传感器为例)
确认传感器连接的 I2C 总线(如 I2C1),在设备树中添加传感器节点:
// 在 &i2c1 节点下添加 SHT30 节点
&i2c1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2c1m0_xfer>; // 复用 I2C1 引脚(参考基础 DTS)
clock-frequency = <100000>; // I2C 速率 100KHz
sht30@44 { // SHT30 的 I2C 从地址是 0x44
compatible = "sensirion,sht30"; // 驱动匹配名(需与驱动代码一致)
reg = <0x44>; // I2C 地址
status = "okay"; // (可选)中断引脚配置(如果传感器支持中断)
interrupt-parent = <&gpio0>;
interrupts = <RK_PA0 IRQ_TYPE_EDGE_RISING>;
};
};
驱动适配:如果内核已包含 SHT30 驱动(drivers/i2c/busses/i2c-rockchip.c + drivers/hwmon/sht3x.c),无需额外开发,仅需确保 compatible 字段匹配;若未包含,需编写简单的 I2C 子系统驱动(实现 probe/read 函数)。
(3)V4L2 摄像头驱动适配(以 OV5640 为例)
RK3568 支持 CSI-2 接口,摄像头通常通过「CSI + I2C」连接(I2C 配置摄像头寄存器,CSI 传输图像数据):
// 启用 CSI 控制器
&csi2_dphy0 {
status = "okay";
};
&rkisp1 {
status = "okay";
ports {
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
csi2_rx0: endpoint@0 {
reg = <0>;
remote-endpoint = <&ov5640_ep>; // 关联摄像头端点
data-lanes = <1 2>; // CSI 数据 lanes(根据硬件连接配置)
};
};
};
};
// 添加 OV5640 摄像头节点(I2C 控制)
&i2c2 { // 摄像头连接的 I2C 总线
status = "okay";
ov5640: camera@3c { // OV5640 的 I2C 地址是 0x3C
compatible = "ovti,ov5640";
reg = <0x3c>;
status = "okay";
clocks = <&cru CLK_CAM0_OUT>;
clock-names = "xclk";
pinctrl-names = "default";
pinctrl-0 = <&cam0_clk>;
port {
ov5640_ep: endpoint {
remote-endpoint = <&csi2_rx0>;
data-lanes = <1 2>;
clock-lanes = <0>;
link-frequencies = /bits/ 64 <480000000>; // 链路频率(参考摄像头 datasheet)
};
};
};
};
驱动适配:内核已包含 OV5640 的 V4L2 驱动(drivers/media/i2c/ov5640.c),需确保驱动的 of_device_id 与设备树 compatible 匹配:
static const struct of_device_id ov5640_of_match[] = {
{ .compatible = "ovti,ov5640" },
{ }
};
MODULE_DEVICE_TABLE(of, ov5640_of_match);
3. 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules -j$(nproc)
- 内核镜像:
arch/arm64/boot/Image
- 设备树文件:
arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4.dtb
- 内核模块:
drivers/ 目录下的 .ko 文件(如 I2C 传感器模块、摄像头模块)
五、第四步:根文件系统制作(Buildroot 快速实现)
根文件系统是嵌入式 Linux 的运行环境,包含 shell、库文件、应用程序,用 Buildroot 可快速生成适配 RK3568 的根文件系统:
1. 下载并配置 Buildroot
cd ../
wget https://buildroot.org/downloads/buildroot-2022.02.12.tar.bz2
tar -xvf buildroot-2022.02.12.tar.bz2 && cd buildroot-2022.02.12
make menuconfig
- Target options → Target Architecture:AArch64 (little endian)
- Target options → Target Architecture Variant:cortex-A55(RK3568 核心)
- Toolchain → Toolchain type:External toolchain(使用之前安装的 aarch64-linux-gnu-gcc)
- Toolchain → Toolchain path:
/opt/aarch64-linux-gnu-gcc-11.3.1/bin
- Toolchain → Toolchain prefix:
aarch64-linux-gnu-
- Filesystem images → ext2/3/4 root filesystem(勾选,生成 ext4 格式根文件系统)
2. 编译根文件系统
3. 安装内核模块到根文件系统
将编译好的内核模块复制到根文件系统,确保驱动模块能被加载:
cd ../linux
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install \
DESTDIR=../buildroot-2022.02.12/output/target/
六、第五步:烧录镜像与验证
1. 准备烧录介质
选择 SD 卡(推荐 8GB+),用 SD Card Formatter 格式化为 FAT32。用 fdisk 工具将 SD 卡分区(可选,Buildroot 生成的根文件系统可直接烧录):
- 分区 1:FAT32(512MB,用于存放 U-Boot、内核、设备树)
- 分区 2:ext4(剩余空间,用于根文件系统)
2. 烧录镜像(Linux 主机用 dd 命令)
SD_DEVICE=/dev/sdb
sudo dd if=../u-boot/idbloader.img of=$SD_DEVICE seek=64 bs=512
sudo dd if=../u-boot/u-boot.itb of=$SD_DEVICE seek=16384 bs=512
sudo dd if=arch/arm64/boot/Image of=$SD_DEVICE seek=24576 bs=512
sudo dd if=arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4.dtb of=$SD_DEVICE seek=32768 bs=512
sudo dd if=../buildroot-2022.02.12/output/images/rootfs.ext4 of=${SD_DEVICE}2 bs=1M
3. 启动开发板并验证
将 SD 卡插入 RK3568 开发板,连接串口(调试用)、HDMI 显示器、摄像头、I2C 传感器。上电启动,通过串口工具(如 Minicom,波特率 115200)查看启动日志。
| 驱动类型 | 验证步骤与命令 |
|---|
| HDMI 输出 | 启动后观察显示器是否有画面;串口执行 drm-info 查看 DRM 显示节点是否正常 |
| I2C 传感器 | 1. 查看 I2C 总线:i2cdetect -l(确认 i2c1/i2c2 存在) 2. 扫描设备:i2cdetect -y 1(看到 0x44 即 SHT30 识别成功) 3. 读取数据:i2cget -y 1 0x44 0x2C 0x06(根据传感器协议读取) |
| V4L2 摄像头 | 1. 查看摄像头设备:v4l2-ctl --list-devices(看到 /dev/video0 即成功) 2. 采集图像:v4l2-ctl --stream-mmap --stream-count=1 --stream-to=test.jpg(生成 test.jpg 即采集正常) |
七、常见问题与排查
1. 内核启动失败(串口无日志)
- 排查:U-Boot 烧录偏移错误(需严格按照 64KB/16384KB 偏移)、设备树与硬件不匹配(确认开发板型号对应的 DTS)。
- 解决:重新烧录 U-Boot 和设备树,检查串口接线(TX/RX 交叉连接)。
2. 驱动加载失败(dmesg 报错)
- 排查:
dmesg | grep -i error 查看驱动加载日志,常见原因:设备树 compatible 与驱动不匹配、引脚复用冲突、硬件接线错误。
- 解决:修改设备树匹配名、重新配置引脚复用、检查传感器 / 摄像头接线(如 I2C SDA/SCL 引脚)。
3. HDMI 无输出
- 排查:内核未启用 DRM 驱动、设备树 HDMI 节点 status 未设为 okay、分辨率配置错误。
- 解决:重新配置内核 DRM 选项、检查设备树 HDMI 节点、通过 modetest 工具测试显示模式。
4. 摄像头无法采集
- 排查:CSI 接口数据 lanes 配置错误、摄像头时钟频率不匹配、V4L2 驱动未启用。
- 解决:根据摄像头 datasheet 修改 data-lanes 和 link-frequencies、重新配置内核 V4L2 选项。
总结
基于 RK3568 实现目标需求的核心是「依托官方 BSP 减少重复开发,聚焦设备树适配」:
- 环境搭建和 U-Boot / 内核编译是基础,官方源码已适配核心硬件,无需大幅修改;
- 驱动适配的关键是「设备树节点与硬件一致」,三大驱动中 HDMI 和 V4L2 可直接复用内核现有驱动,I2C 传感器仅需添加设备树节点(内核已包含多数传感器驱动);
- 验证环节需借助串口日志和专用工具(drm-info、v4l2-ctl、i2cdetect)快速定位问题。
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online