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构建系统。搭建环境其实不复杂,但有几个关键点:

  1. 获取SDK:从瑞芯微官方或合作伙伴获取。通常是git仓库,或者压缩包。
  2. 安装依赖:gcc、make、flex、bison、libncurses-dev等。Ubuntu 20.04/22.04是主流选择。
  3. 配置交叉编译链:RK平台用aarch64-linux-gnu-或arm-linux-gnueabihf-。我习惯把工具链路径加到~/.bashrc里。
  4. 编译内核:make ARCH=arm64 rockchip_linux_defconfig,然后make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8。
  5. 编译设备树:传感器驱动依赖设备树配置,编译后生成.dtb文件。

关键命令示例:

# 设置环境变量
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

# 配置内核
make rockchip_linux_defconfig

# 编译内核和设备树
make -j8
make dtbs

你想想看,SDK环境搭好了,后面写驱动、调试、烧录才能跑起来。我见过不少新手,SDK没配好就开始写代码,结果编译报错一堆,最后发现是交叉编译链版本不对。

我的建议:第一次搭建环境时,先编译一个不带任何修改的原版内核,确保能生成zImage和dtb。这一步通了,后面加传感器驱动才有基础。

本章知识结构图

下面这张图,是我自己画的一个知识结构,帮你把本章内容串起来:

RK平台传感器驱动开发知识结构 RK平台传感器驱动开发知识结构 传感器驱动开发 RK硬件架构 传感器分类与接口 Linux内核驱动框架 SDK环境搭建与编译 CPU核心 总线矩阵 电源管理 外设IP I2C传感器 SPI传感器 GPIO传感器 组合接口 IIO子系统 Input子系统 Hwmon子系统 Misc/Char 获取SDK 安装依赖 配置工具链 编译内核/DTB 核心思路:先理解硬件,再选对接口和子系统,最后搭好环境 每一步都踩过坑,后面章节会逐一展开

这张图把本章四个核心模块串起来了。你看,从硬件架构出发,到传感器分类和接口标准,再到内核驱动框架的选择,最后落到SDK环境搭建——这是一个完整的链路。后面每一章,都会沿着这个链路深入下去。

总结一下:RK平台传感器驱动开发,说白了就是“硬件理解 + 接口操作 + 内核框架 + 环境工具”四件事。这一章把基础打牢了,后面写驱动、调bug才能心里有数。