1. 项目概述
RV1126作为一款面向AIoT和边缘计算场景的高性能处理器,其内核驱动开发是嵌入式工程师必须掌握的硬核技能。第一次接触这块开发板时,我也曾被复杂的交叉编译环境和烧写流程搞得焦头烂额。本文将用最直白的方式,带你从零完成RV1126内核驱动的完整开发闭环。
这个教程特别适合以下人群:
- 刚接触Rockchip平台的嵌入式开发者
- 需要定制化RV1126外设驱动的硬件工程师
- 希望理解Linux内核驱动开发全流程的爱好者
2. 环境准备与工具链配置
2.1 硬件准备清单
- RV1126开发板(建议使用官方EVB版本)
- Type-C数据线(用于ADB调试和烧录)
- 12V/2A电源适配器
- 至少16GB的MicroSD卡(用于制作启动卡)
- USB转串口模块(推荐CH340芯片版本)
2.2 软件环境搭建
开发主机推荐使用Ubuntu 20.04 LTS,以下是具体配置步骤:
bash复制# 安装基础依赖
sudo apt update
sudo apt install -y git make gcc bison flex libssl-dev libncurses-dev
# 获取官方工具链
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
export PATH=$PATH:$(pwd)/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
# 验证工具链
aarch64-linux-gnu-gcc --version
注意:RV1126采用Cortex-A7+A53大小核架构,必须使用aarch64架构的工具链。常见的arm-linux-gnueabihf工具链不兼容。
3. 内核源码获取与配置
3.1 源码获取方式
官方提供两种源码获取途径:
- 通过Git仓库获取最新代码(适合长期开发者):
bash复制git clone https://github.com/rockchip-linux/kernel -b stable-5.10-rk35xx
- 下载SDK完整包(推荐新手使用):
从Rockchip官网下载RV1126_RV1109_Linux_SDK_Vx.x.x.tar.gz
3.2 内核配置详解
进入kernel目录后执行:
bash复制make ARCH=arm64 rv1126_defconfig
make ARCH=arm64 menuconfig
关键配置项说明:
- CONFIG_MODULES=y # 启用模块加载
- CONFIG_MODVERSIONS=y # 模块版本控制
- CONFIG_DEBUG_INFO=y # 调试符号信息
- CONFIG_GPIO_SYSFS=y # GPIO sysfs接口
实操技巧:使用
scripts/diffconfig .config.old .config可对比配置变更
4. 驱动开发实战示例
4.1 最简单的字符设备驱动
创建drivers/misc/rv1126_demo.c:
c复制#include <linux/module.h>
#include <linux/fs.h>
#define DEVICE_NAME "rv1126_demo"
static int major;
static int dev_open(struct inode *inodep, struct file *filep) {
printk(KERN_INFO "RV1126 demo device opened\n");
return 0;
}
static struct file_operations fops = {
.open = dev_open,
};
static int __init demo_init(void) {
major = register_chrdev(0, DEVICE_NAME, &fops);
printk(KERN_INFO "RV1126 demo driver loaded, major=%d\n", major);
return 0;
}
static void __exit demo_exit(void) {
unregister_chrdev(major, DEVICE_NAME);
printk(KERN_INFO "RV1126 demo driver unloaded\n");
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
修改同级目录下的Makefile:
makefile复制obj-$(CONFIG_RV1126_DEMO) += rv1126_demo.o
4.2 内核编译与模块生成
执行编译命令:
bash复制make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=./output
关键文件输出位置:
- 内核镜像:arch/arm64/boot/Image
- 设备树:arch/arm64/boot/dts/rockchip/rv1126-evb.dtb
- 驱动模块:output/lib/modules/*/kernel/drivers/misc/rv1126_demo.ko
5. 烧写与调试全流程
5.1 烧录工具准备
推荐使用Rockchip官方工具:
- 下载RKDevTool:https://www.rockchip.fr/RKDevTool/
- 安装驱动DriverAssitant_v5.1.1
5.2 烧写步骤图解
- 开发板进入Loader模式:
- 按住Recovery键上电
- 通过Type-C连接电脑
- RKDevTool识别到MaskROM设备
- 加载编译生成的:
- Image到kernel分区
- rv1126-evb.dtb到resource分区
- 点击"执行"开始烧写
5.3 驱动加载验证
通过串口终端登录开发板:
bash复制# 加载模块
insmod /lib/modules/$(uname -r)/kernel/drivers/misc/rv1126_demo.ko
# 查看设备号
cat /proc/devices | grep rv1126_demo
# 创建设备节点
mknod /dev/rv1126_demo c 250 0
# 测试设备访问
echo 1 > /dev/rv1126_demo
6. 常见问题排坑指南
6.1 编译问题排查表
| 错误现象 | 解决方案 |
|---|---|
| 找不到交叉编译工具链 | 检查PATH环境变量,确认aarch64-linux-gnu-gcc在路径中 |
| 内核配置报错 | 执行make mrproper清除旧配置 |
| 模块版本不匹配 | 确保CONFIG_MODVERSIONS=y,重新编译所有模块 |
6.2 烧写问题速查
-
设备无法进入Loader模式:
- 检查USB线连接质量
- 尝试不同USB端口
- 更新主板USB驱动
-
烧写失败报错:
bash复制# 查看内核日志获取详细错误 dmesg | grep rockchip
6.3 驱动调试技巧
- 开启内核调试日志:
bash复制echo 8 > /proc/sys/kernel/printk - 使用kgdb进行内核调试:
bash复制# 目标板 echo g > /proc/sysrq-trigger # 主机端 aarch64-linux-gnu-gdb vmlinux target remote /dev/ttyUSB0
7. 进阶开发建议
-
设备树覆盖技术:
bash复制# 在uboot中加载覆盖dtb load mmc 0:1 0x02000000 overlay.dtb fdt apply 0x02000000 -
利用Rockchip特有的IO-Domain配置:
dts复制&io_domains { status = "okay"; vccio1-supply = <&vcc_3v3>; vccio2-supply = <&vcc_3v3>; }; -
性能优化技巧:
- 启用NEON指令集加速:在Makefile中添加
-mfpu=neon - 使用DMA缓冲区:
dma_alloc_coherent() - 合理设置中断亲和性:
irq_set_affinity()
- 启用NEON指令集加速:在Makefile中添加
在实际项目中,我发现RV1126的VPU编解码驱动需要特别注意内存对齐问题。建议在申请DMA缓冲区时使用ARCH_DMA_MINALIGN宏确保对齐,否则会出现花屏现象。另外,开发板上的PMIC电源管理芯片需要正确配置休眠唤醒参数,否则可能导致系统无法正常休眠。