linux i2c adapter 增加设备_Linux驱动之I2C驱动架构

一、Linux的I2C体系结构

主要由三部分组成:

(1) I2C核心

提供I2C控制器和设备驱动的注册和注销方法,I2C通信方法,与适配器无关的代码以及探测设备等。

(2) I2C控制器驱动(适配器)

(3) I2C设备驱动

62b487886ecf0105df71f3ed8420876d.png

二、重要的结构体

  • i2c_adapter
//i2c控制器(适配器)
  • i2c_algorithm
//I2C传输方法

SMBus是基于I2C总线规范的,所以上面的传输函数要根据自己的总线来选择,选择其一就可以。

  • i2c_driver
//I2C驱动,和platform_driver,spi_driver类似
  • i2c_client
//I2C设备
  • i2c_msg
//I2C传输数据结构体,代表一个消息数据

总结上面结构体关系:

1. i2c_adapter和i2c_algorithm

i2c_adapter对应物理上的一个适配器,而i2c_algorithm对应一套通信方法,适配器需要通过i2c_algorithm提供的通信函数来产生对应的访问时序。所以i2c_adapter中包含i2c_algorithm的指针。

i2c_algorithm使用master_xfer()来产生I2C时序,以i2c_msg为单位,i2c_msg代表一次传输的数据。

2. i2c_driver和i2c_client

i2c_driver对应一套驱动方法,包含probe,remove等方法。i2c_clent对应真实的物理设备,每个i2c设备都需要一个i2c_client来描述。i2c_driver与i2c_client是一对多的关系,一个i2c_driver上可以支持多个同类型的i2c_client。

3. i2c_adapter和i2c_client

i2c_adapter与i2c_client的关系和硬件上适配器与设备的关系一致,即i2c_client依附于i2c_adapter。一个适配器可以连接多个设备,所以i2c_adapter中包含i2c_client的链表。

三、API函数

//增加/删除i2c_adapter

i2c_transfer()函数本身不具备驱动适配器物理硬件以完成消息交互的能力,它只是寻找到与i2c_adapter对应的i2c_algorithm, 并使用i2c_algorithm的master_xfer()函数真正驱动硬件流程。

追踪i2c_transfer()的源码会发现下面的代码

for 

四、适配器(控制器)驱动

由于I2C控制器通常是在内存上的,所以它本身也连接在platform总线上的,通过platform_driver和platform_device的匹配还执行。

(1) probe()完成如下工作:

  • 初始化I2C控制器所使用的硬件资源,如申请IO地址,中断号,时钟等。
  • 为特定I2C控制器实现通信方法,主要是实现i2c_algorithm的master_xfer()和functionality()函数。
  • 通过i2c_add_adapter()添加i2c_adapter的数据结构(i2c_adapter成员已被初始化)。

模板代码:

static 

xxx_adapter_hw_init实现和具体的CPU和I2C控制器硬件相关的初始化。

functionality() 函数比较简单,返回支持的通信协议。

master_xfer() 函数在适配器上完成i2c_msg的数据传输。

五、设备(外设)驱动

i2c_dirver就是i2c标准总线设备驱动模型中的驱动部分,i2c_client可理解为i2c总线上挂的外设。

模板代码:

static 

ef2271ee25a301a4a8f64bf99bebb53d.png
欢迎大家关注微信公众号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值