1. RK平台传感器驱动开发概述
大家好,我是老周。做嵌入式Linux驱动开发十几年了,RK平台是我用得最多的SoC之一。今天咱们聊聊RK平台传感器驱动开发的整体面貌。说白了,这一章就是给整个课程打个地基——你搞清楚了硬件架构、接口标准、内核框架和SDK环境,后面调试和排坑才能顺手。
1.1 RK平台硬件架构简介
瑞芯微的RK系列,从早期的RK3288、RK3399,到现在的RK3568、RK3588,核心架构其实一脉相承。我习惯把它的硬件结构分成三层来看:
- 应用处理器层:Cortex-A系列CPU核心,跑Linux或Android,负责上层逻辑和数据处理。
- 外设总线层:I2C、SPI、UART、GPIO等,传感器就是挂在这上面的。
- 电源管理域:PMIC、LDO、IO电压域,很多传感器驱动出问题,根源其实是供电没配好。
举个例子,RK3588有5路I2C控制器、3路SPI控制器,还有几十个GPIO。你想想看,一个加速度计挂I2C,一个气压计挂SPI,再加一个中断脚接GPIO——这三层架构你都得照顾到。
核心要点:RK平台的硬件架构,本质上就是“CPU + 总线矩阵 + 外设IP”。传感器驱动开发,90%的时间是在跟总线层和GPIO打交道。
1.2 传感器分类与接口标准
传感器种类很多,但从驱动开发的角度,我一般按接口来分:
| 接口类型 | 常见传感器 | 速率 | 驱动复杂度 |
|---|---|---|---|
| I2C | 加速度计、陀螺仪、磁力计、温湿度 | 100kHz~400kHz | 中等 |
| SPI | 气压计、TOF测距、高速IMU | 几MHz~几十MHz | 较高 |
| GPIO | 中断输入、简单开关、霍尔效应 | 取决于CPU | 低 |
| 组合型 | I2C+GPIO中断、SPI+GPIO片选 | 混合 | 高 |
我在项目中遇到过最坑的一次——一个I2C接口的陀螺仪,死活读不到数据。折腾了两天,最后发现是I2C地址搞错了。嗯,传感器厂商的datasheet里写的地址,有时候是7位,有时候是8位,你得自己换算。这个后面我会专门讲。
我的习惯:拿到一个新传感器,先看接口类型,再看供电电压和IO电平。RK平台的IO电压通常是1.8V或3.3V,不匹配的话要加电平转换。
1.3 Linux内核驱动框架概览
Linux内核的驱动框架,说白了就是一套“注册-匹配-操作”的机制。传感器驱动在RK平台上,通常走的是这几种路径:
- IIO子系统(Industrial I/O):加速度计、陀螺仪、ADC类传感器首选。有统一的sysfs接口和trigger机制。
- Input子系统:触摸屏、按键、某些手势传感器。上报事件用input_event。
- Hwmon子系统:温度、电压、电流监测。传感器读数直接映射到sysfs。
- Misc/Char设备:一些特殊传感器,或者你懒得折腾子系统,直接注册一个字符设备。
我个人建议,能用IIO就用IIO。为什么?因为RK的SDK里对IIO的支持已经很完善了,你只需要实现probe、read_raw、write_raw这几个回调,剩下的中断、buffer、trigger框架都帮你搭好了。
避坑指南:我曾经在一个项目里,为了省事把加速度计驱动写成了misc设备。结果后面要加FIFO和硬件中断,改得我头皮发麻。所以一开始就选对子系统,后面能省很多事。
1.4 RK SDK环境搭建与编译
RK的SDK,我指的是官方发布的Linux SDK,里面包含了内核源码、U-Boot、buildroot或yocto构建系统。搭建环境其实不复杂,但有几个关键点:
- 获取SDK:从瑞芯微官方或合作伙伴获取。通常是git仓库,或者压缩包。
- 安装依赖:gcc、make、flex、bison、libncurses-dev等。Ubuntu 20.04/22.04是主流选择。
- 配置交叉编译链:RK平台用aarch64-linux-gnu-或arm-linux-gnueabihf-。我习惯把工具链路径加到~/.bashrc里。
- 编译内核:
make ARCH=arm64 rockchip_linux_defconfig,然后make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8。 - 编译设备树:传感器驱动依赖设备树配置,编译后生成.dtb文件。
关键命令示例:
# 设置环境变量
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
# 配置内核
make rockchip_linux_defconfig
# 编译内核和设备树
make -j8
make dtbs
你想想看,SDK环境搭好了,后面写驱动、调试、烧录才能跑起来。我见过不少新手,SDK没配好就开始写代码,结果编译报错一堆,最后发现是交叉编译链版本不对。
我的建议:第一次搭建环境时,先编译一个不带任何修改的原版内核,确保能生成zImage和dtb。这一步通了,后面加传感器驱动才有基础。
本章知识结构图
下面这张图,是我自己画的一个知识结构,帮你把本章内容串起来:
这张图把本章四个核心模块串起来了。你看,从硬件架构出发,到传感器分类和接口标准,再到内核驱动框架的选择,最后落到SDK环境搭建——这是一个完整的链路。后面每一章,都会沿着这个链路深入下去。
总结一下:RK平台传感器驱动开发,说白了就是“硬件理解 + 接口操作 + 内核框架 + 环境工具”四件事。这一章把基础打牢了,后面写驱动、调bug才能心里有数。