专栏中心

EEPW首页 > 专栏 > Linux I2C驱动竟然如此简单?手把手教你写i2c驱动

Linux I2C驱动竟然如此简单?手把手教你写i2c驱动

发布人:嵌入式Linux 时间:2023-01-08 来源:工程师 发布文章
Linux中I2C驱动框架分析

I2C核心(i2c_core)

I2C核心维护了i2c_bus结构体,提供了I2C总线驱动和设备驱动的注册、注销方法,维护了I2C总线的驱动、设备链表,实现了设备、驱动的匹配探测。此部分代码由Linux内核提供。

I2C总线驱动

I2C总线驱动维护了I2C适配器数据结构(i2c_adapter)和适配器的通信方法数据结构(i2c_algorithm)。所以I2C总线驱动可控制I2C适配器产生start、stop、ACK等。此部分代码由具体的芯片厂商提供,比如Samsung、高通。

I2C设备驱动

I2C设备驱动主要维护两个结构体:i2c_driver和i2c_client,实现和用户交互的文件操作集合fops、cdev等。此部分代码就是驱动开发者需要完成的。

Linux内核中描述I2C的四个核心结构体

1)i2c_client—挂在I2C总线上的I2C从设备

每一个i2c从设备都需要用一个i2c_client结构体来描述,i2c_client对应真实的i2c物理设备device。

但是i2c_client不是我们自己写程序去创建的,而是通过以下常用的方式自动创建的:

方法一: 分配、设置、注册i2c_board_info

方法二: 获取adapter调用i2c_new_device

方法三: 通过设备树(devicetree)创建

方法1和方法2通过platform创建,这两种方法在内核3.0版本以前使用所以在这不详细介绍;方法3是最新的方法,3.0版本之后的内核都是通过这种方式创建的,文章后面的案例就按方法3。

2)i2c_adapter

I2C总线适配器,即soc中的I2C总线控制器,硬件上每一对I2C总线都对应一个适配器来控制它。在Linux内核代码中,每一个adapter提供了一个描述它的结构(struct i2c_adapter),再通过i2c core层将i2c设备与i2c adapter关联起来。主要用来完成i2c总线控制器相关的数据通信,此结构体在芯片厂商提供的代码中维护。


3)i2c_algorithm

I2C总线数据通信算法,通过管理I2C总线控制器,实现对I2C总线上数据的发送和接收等操作。亦可以理解为I2C总线控制器(适配器adapter)对应的驱动程序,每一个适配器对应一个驱动程序,用来描述适配器和设备之间的通信方法,由芯片厂商去实现的。


4)i2c_driver

用于管理I2C的驱动程序和i2c设备(client)的匹配探测,实现与应用层交互的文件操作集合fops、cdev等。


应用实例,实现mpu6050驱动,读取温度

在设备树中描述I2C设备信息


最终内核会将这个设备树的节点解析为一个i2c_client结构体与i2c_driver结构体进行匹配。

编写驱动代码

分配、设置、注册i2c_driver结构体


i2c总线驱动模型属于设备模型中的一类,同样struct i2c_driver结构体继承于struct driver,匹配方法和设备模型中讲的一样,这里要去匹配设备树,所以必须实现i2c_driver结构体中的driver成员中的of_match_table成员:


如果和设备树匹配成功,那么就好调用probe函数

实现文件操作集合


如何实现对i2c从设备的读写操作?


在实现读写操作的时候,使用了一个重要的函数i2c_transfer(),这个函数是i2c核心提供给设备驱动的,通过它发送的数据需要被打包成i2c_msg结构,这个函数最终会回调相应i2c_adapter->i2c_algorithm->master_xfer()接口将i2c_msg对象发送到i2c物理控制器。


以上是我对Linux中I2C驱动框架的分析及实际案例分析,如有不足欢迎指出,如对Linux驱动感兴趣欢迎收藏关注!


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词: I2C

相关推荐

用示波器对单片机I2C时序进行图形波形分析的试验小结

嵌入式系统 2024-01-17

LED驱动器中I2C的LED控制方式

光电显示 2023-06-08

I2C规格

在Linux环境下I2C总线EEPROM驱动程序应该如何设计

嵌入式系统 2018-07-30

I2C通讯不了?是不是硬件有问题?

2024-03-28

低速串行总线调试-I2C译码

视频 2010-01-13

集成电路(I2C)总线市场趋势、需求和创新2025-2035

I2C Manual AN10216-01

I2C Logic Selection Guide

看时序图写I2C驱动,教你如何自己手撸非标I2C驱动函数

嵌入式系统 2025-08-18

Microchip温度传感器系列产品

Nexperia推出先进的I2C GPIO扩展器产品组合

学前班第1课第2.2节_怎么看原理图之协议类接口之I2C

视频 2013-10-14

STM32视频-Inter Integrated Circuit(I2C)

视频 2013-03-06

嵌入式系统中的I2C总线时序

I2C总线协议V2.1

MSP430与液晶显示器的串行接口方案

浅析嵌入式总线技术的原理、分类及技术指标

嵌入式系统 2018-07-31
更多 培训课堂
更多 焦点
更多 视频

技术专区