前言
拿到泰山派(RK3566)开发板后,正式进入驱动开发阶段是提升嵌入式能力的必经之路。本文将基于 Ubuntu 系统配合 WSL2 作为开发机,梳理从环境配置、内核编译到编写第一个驱动模块的完整流程。
环境搭建与内核编译
1. 获取源码与工具链
驱动开发离不开完整的软硬件资料。建议从官方 SDK 中获取内核源码(kernel),通常在 Linux 相关的无 repo 压缩包内即可找到 kernel 文件夹。
针对 arm64 架构的开发板,需安装对应的交叉编译工具链。若涉及其他架构(如龙芯),则需下载解压官方提供的特定工具链。在开始之前,务必确认开发机的基础依赖包已安装齐全,可参考官方 SDK 编译说明或查看 apt 日志确认。
2. 编译内核
编译内核前,必须准备好 .config 文件。这是确保编译产物能正常运行于目标板卡的关键,避免变砖风险。通常可以从板卡上提取当前运行的配置文件,或根据硬件规格手动配置。
编译步骤:
- 导出临时环境:设置必要的环境变量。
- 写入配置:加载
.config文件。 - 执行编译:使用
make命令开始构建。此过程耗时较长,请耐心等待。
# 示例命令结构(具体视工具链路径而定)
export CROSS_COMPILE=aarch64-linux-gnu-
make ARCH=arm64 CROSS_COMPILE=$CROSS_COMPILE menuconfig
make ARCH=arm64 CROSS_COMPILE=$CROSS_COMPILE -j$(nproc)
编译完成后,检查生成的镜像文件(如 Image 或 uImage)是否位于预期目录。
驱动开发入门
驱动开发涉及面较广,建议先熟悉 Git 版本管理、Shell 脚本及 Makefile 基础。网络传输工具(TFTP、NFS、SSH)能显著提升调试效率,避免反复烧写存储介质。
1. 核心文件组成
一个标准的内核模块通常包含以下文件:
- 源代码 (.c):实现驱动的核心逻辑,包括初始化、退出、文件操作接口(open/read/write)、中断处理等。需定义设备树匹配表(
of_device_id)并注册平台驱动。 - Makefile:利用内核构建系统将
.c文件编译成.ko模块。需指定模块名称、源文件及内核源码路径。 - 设备树 (DTS/DTSI):描述硬件连接方式(寄存器地址、中断号、GPIO 等)。若无需修改主设备树,可创建设备树覆盖文件(
.dtbo)动态加载。 - Kconfig(可选):用于集成到内核配置菜单(
make menuconfig),定义驱动名称与依赖。
2. Hello World 驱动示例
对于初学者,编写一个不控制硬件的'Hello World'驱动是最安全的起点。它不直接操作硬件,仅通过内核日志验证代码是否被正确加载和执行。
关键代码片段:
#include <linux/module.h>
#include
__init
{
pr_info();
;
}
__exit
{
pr_info();
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE();


