1. RK平台I2C设备驱动开发概述
在嵌入式Linux开发中,I2C总线因其简单的两线制结构和适中的传输速率,成为连接各类外设传感器的首选方案。RK平台作为国产芯片中的佼佼者,其I2C控制器驱动已经由原厂完善实现,开发者需要关注的是具体设备的驱动开发。本文将以0.96寸OLED屏为例,详细讲解从设备树配置到驱动实现的完整流程。
OLED屏作为典型的I2C设备,其驱动开发涉及硬件接口定义、数据传输协议实现、显示缓冲管理等多个技术环节。与SPI接口的OLED不同,I2C版本在引脚占用和传输效率上各有优劣——I2C只需两根信号线(SCL和SDA),但刷新率相对较低,适合小尺寸、低更新频率的场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件准备与电路连接
2.1 OLED模块硬件参数
以常见的SSD1306驱动芯片为例,其I2C版本典型参数如下:
- 工作电压:3.3V/5V兼容
- 分辨率:128x64像素
- 显存布局:8页(Page),每页8行,共64行
- I2C地址:通常为0x3C或0x3D(由SA0引脚决定)
2.2 RK平台接口定义
以RK3568开发板为例,其40pin扩展接口中包含多组I2C通道。推荐使用I2C1(引脚3-SDA, 引脚5-SCL),连接方式如下:
| OLED引脚 | RK3568引脚 | 备注 |
|---|---|---|
| VCC | 3.3V | 电源 |
| GND | GND | 地线 |
| SCL | GPIO0_B7 | I2C1_SCL |
| SDA | GPIO0_B6 | I2C1_SDA |
注意:实际连接前务必确认开发板原理图,不同型号的GPIO复用功能可能不同。我曾遇到过某型号RK板I2C1被默认配置为其他功能的情况,导致驱动无法正常初始化。
3. 设备树(DTS)配置
3.1 I2C控制器基础配置
RK平台的I2C控制器驱动位于drivers/i2c/busses/i2c-rk3x.c,设备树中需要声明控制器节点:
dts复制&i2c1 {
status = "okay";
clock-frequency = <400000>; // 标准模式400kHz
pinctrl-names = "default";
pinctrl-0 = <&i2c1_xfer>; // 引脚复用配置
};
3.2 OLED设备节点添加
在I2C控制器节点下添加子节点描述OLED设备:
dts复制&i2c1 {
oled: oled@3c {
compatible = "solomon,ssd1306";
reg = <0x3c>; // I2C地址
width = <128>; // 屏幕宽度
height = <64>; // 屏幕高度
page-offset = <0>; // 页偏移
prechargep1 = <0xF1>; // 充电周期配置
prechargep2 = <0x01>;
};
};
关键点说明:
compatible属性必须与驱动中的of_match_table匹配reg地址需与实际硬件跳线一致- 时序参数如prechargep1/2需要参考SSD1306数据手册
4. 驱动框架实现
4.1 驱动模块基础结构
Linux的I2C设备驱动通常包含以
