作为一名嵌入式开发老兵,我深知新手在初次接触内核驱动编译时的迷茫。今天我就用最直白的语言,带大家走一遍RV1126内核驱动的完整编译与烧写流程。不同于官方文档的晦涩难懂,这里我会把每个步骤的底层逻辑和避坑要点都讲清楚,确保你一次成功。
RV1126作为瑞芯微旗下的明星芯片,在智能摄像头和边缘计算领域应用广泛。它的Linux内核采用与主流ARM芯片相似的编译体系,但又有自己独特的工具链和烧写方式。下面我们就从环境搭建开始,一步步完成整个流程。
工欲善其事,必先利其器。在开始前,请确保准备好以下硬件:
RV1126开发板:市面上常见的有友善之臂、野火等品牌,核心板+底板组合更灵活。注意检查板载资源是否完整,特别是调试串口和USB OTG接口。
调试工具:
主机配置:
特别注意:购买USB转TTL模块时,务必确认支持3.3V电平。RV1126的UART电平是3.3V,5V模块可能损坏芯片!
需要下载的软件包如下表所示:
| 软件名称 | 版本要求 | 获取渠道 | 用途说明 |
|---|---|---|---|
| Ubuntu | 20.04 LTS | 官网镜像 | 编译环境 |
| RV1126 SDK | 与板卡匹配 | 厂商提供 | 内核源码 |
| 交叉编译工具链 | gcc-linaro-6.3.1 | 随SDK提供 | 生成ARM可执行文件 |
| RKDevTool | v3.10+ | 瑞芯微官网 | 固件烧写 |
| SecureCRT | 8.5+ | 商业软件 | 串口调试 |
工具安装时的几个关键点:
对于Windows用户,推荐使用VMware Workstation Player(免费版)创建Ubuntu虚拟机。具体参数设置:
安装完成后,首先执行:
bash复制sudo apt update && sudo apt upgrade -y
更新系统软件包,避免后续编译时出现依赖问题。
在终端中依次执行以下命令:
bash复制sudo apt install -y git make gcc g++ flex bison libssl-dev \
libncurses-dev libc6-i386 lib32stdc++6 lib32z1 \
python2.7 python3-dev device-tree-compiler lzop
这些依赖包的作用:
libssl-dev:内核模块签名验证libncurses-dev:menuconfig配置界面支持device-tree-compiler:设备树编译工具python2.7:部分脚本依赖Python2环境经验之谈:Ubuntu 20.04默认没有python2,但RK的编译脚本仍依赖它。可以通过
sudo apt install python2单独安装,然后创建软链接:sudo ln -s /usr/bin/python2 /usr/bin/python
将获取的SDK包解压到Ubuntu家目录:
bash复制tar -xzvf rv1126-sdk.tar.gz -C ~/
cd ~/rv1126-sdk
典型SDK目录结构:
code复制.
├── build.sh # 顶层编译脚本
├── kernel/ # 内核源码
├── uboot/ # Bootloader
├── tools/ # 工具链
├── device/ # 设备树文件
└── out/ # 输出目录
编辑~/.bashrc文件,在末尾添加:
bash复制export PATH=$PATH:~/rv1126-sdk/tools/gcc-linaro-6.3.1/bin
export ARCH=arm
export CROSS_COMPILE=arm-rockchip-linux-gnueabihf-
然后执行:
bash复制source ~/.bashrc
arm-rockchip-linux-gnueabihf-gcc -v
如果显示gcc版本信息,说明工具链配置成功。
进入内核目录:
bash复制cd ~/rv1126-sdk/kernel
make ARCH=arm rv1126_defconfig
关键配置选项:
bash复制make ARCH=arm menuconfig
在这里可以:
编译内核:
bash复制make ARCH=arm -j$(nproc) zImage
-j$(nproc)表示使用所有CPU核心并行编译,大幅提升速度。
编译完成后,生成的镜像文件位于:
code复制arch/arm/boot/zImage
以最简单的hello world驱动为例:
c复制// hello.c
#include <linux/init.h>
#include <linux/module.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello RV1126!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye RV1126!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
对应的Makefile:
makefile复制obj-m := hello.o
KDIR := ~/rv1126-sdk/kernel
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
编译命令:
bash复制make
生成的.ko文件就是可加载的内核模块。
使用USB转TTL模块连接开发板调试串口(通常是板载的UART2)
在SecureCRT中配置:
关键步骤:
在Windows设备管理器中应看到"Rockchip USB Device"。
tools/windows/RKDevTool/Config.ini)zImage添加到kernel分区烧写过程提示:
将编译好的.ko文件通过串口或网络传输到开发板,然后执行:
bash复制insmod hello.ko
dmesg | tail # 查看内核日志
lsmod # 列出已加载模块
rmmod hello # 卸载模块
问题1:提示缺少头文件
KDIR路径是否正确问题2:模块版本不匹配
insmod报错"Invalid module format"问题1:设备无法识别
问题2:烧写中途失败
c复制printk(KERN_DEBUG "Debug info: val=%d\n", var);
通过dmesg查看输出
bash复制cat /proc/kallsyms
bash复制echo 1 > /proc/sys/vm/panic_on_oom
版本控制:使用git管理内核修改
bash复制git init
git add .
git commit -m "initial import"
自动化编译:编写shell脚本整合编译流程
bash复制#!/bin/bash
make clean
make defconfig
make -j8
性能优化:
make -j参数匹配CPU核心数ccache加速重复编译安全加固:
经过以上步骤,你应该已经完成了RV1126内核驱动的完整编译和烧写流程。在实际开发中,建议从简单驱动开始,逐步深入理解Linux内核的工作机制。记住,嵌入式开发最重要的是实践 - 多动手、多调试、多总结,很快你就能驾驭这个强大的平台。