Linux 泰山派 RK3566 驱动开发
环境准备
本次板载 Ubuntu 系统,使用 WSL2 作为开发机(Ubuntu 18.04)。开发驱动需要完整的软硬件资料,立创官方提供了相关文档。
1. 内核源码获取及编译
1.0 源码获取
首先从官方 SDK 中获取内核源码 kernel。可在官方 SDK - Linux \tspi 那个无 repo 压缩包中找到 kernel 文件夹。
1.1 配置交叉编译环境
开发 arm64 架构,安装如下工具链即可。若是其他架构(如龙芯),需下载解压官方提供的工具链。
1.2 编译内核(至少编译一次)
此时需要 .config 文件 来确保编译出的内核放到板子上不会出问题甚至导致变砖。可从板子上查找该文件,获取我们需要的东西。
通过如下命令获取配置文件到编译板上运行的内核时所用到的配置文件。
然后需要配置一些编译所需的软件。官方教程在编译 SDK 时也提到了所需的包,也可以参考那个。如果忘了自己安装了什么,查看 apt 日志即可。
开始编译,接下来就是 export 创建临时环境,然后写入配置、开始编译。编译时间会长一些,需耐心等待。
最后检查编译结果。
2. 完成一个驱动
此处涉及的方面较多且复杂。建议首先学一些语言和工具。
首先是 git,每当进入新阶段时一定要保存好自己的代码,用于管理内核源码、自己的驱动代码、实验版本等。
然后是 TFTP,NFS,SSH 等等,网络传输能极大提高开发效率,不用反复烧写存储介质。
学一些 shell 脚本和 Makefile 基础,方便进行一些重复操作,更快捷有效,也方便借鉴学习内核中的 Makefile 等。
然后需要掌握 设备树语法和 C/C++ 语言,必须掌握。为使驱动与硬件匹配,需要在设备树中添加一个节点。至于 C/C++ 语言则是重中之重,编写驱动代码需要用到,要能熟练阅读内核中复杂的宏定义和链表操作。
2.0 第一个无硬件的驱动
尝试写一个驱动版本的 hello world,它本身不控制任何硬件,确保硬件安全,也不提供用户空间交互接口,但能通过内核日志让我们知道,这个模块代码被正确执行了。
一个驱动需要许多文件,总结如下:
- 内核模块源代码 (.c 文件):实现驱动的核心逻辑(初始化、退出、文件操作接口、中断处理、与硬件交互等)。定义驱动与设备树的匹配表(
of_device_id),声明驱动支持的设备兼容字符串。注册 platform 驱动或其他总线驱动(如 I2C、SPI)。 - Makefile 文件:利用内核构建系统将
.c文件编译成内核模块.ko。指定模块名称、源文件、依赖的内核源码路径等。 - 设备树源文件 (.dts 或 .dtsi):描述硬件在系统中的连接方式(寄存器地址、中断号、使用的 GPIO 引脚、时钟、电源等)。为驱动提供硬件配置信息,使驱动代码不依赖硬编码,提高可移植性。
- 设备树覆盖文件 (.dtbo):若不希望修改主设备树,创建设备树覆盖(overlay),动态加载设备节点。适用于模块化硬件或实验性开发,避免反复烧写整个设备树。
- Kconfig 文件:可选,用于内核配置菜单。如果希望将驱动集成到内核的配置系统中(例如可以通过
make menuconfig选择是否编译),需要编写 Kconfig 条目。 - 内核配置文件 (.config):内核编译时的全局配置文件,用于启用或禁用驱动、子系统等。如果你在 Kconfig 中添加了驱动,需要确保
.config中对应的CONFIG_MY_LED被设置为y(内置)或m(模块)。
2.1 部署到板卡
完成以上操作后,可以尝试将 文件通过 U 盘或者网络(ssh 等工具)传输到泰山派上,并在存放 文件的目录下加载卸载内核模块,通过内核日志来查看效果。注意这时需要管理员权限。


