[Linux 驱动] -- I2C子系统驱动框架及应用

I2C子系统驱动框架:

应用程序层(app层)


i2c driver 层:从设备驱动层(TS Sensor等)

  1. 需要和应用层交互(fops cdev);
  2. 封装数据,但是不知道数据如何写入到硬件,需要调用adapter层的相关函数去写

i2c core:维护i2c bus,包括i2c driver 和i2c client链表

  1. 实现i2c client 和 i2c driver的匹配;

这一层是Linux内核实现的。


i2c adapter层:i2c控制器层,初始化i2c控制器,实现i2c时序

  1. 将数据写入或读取从设备;
  2. 不知道具体数据(i2c driver提供的数据)是什么,但知道具体如何操作(读/写)从设备

这一层是具体的厂商实现的。


从i2c驱动架构图中可以看出,Linux内核对i2c架构抽象了一个叫核心层core的中间件,它分离了设备驱动device driver和硬件控制的实现细节(如操作i2c的寄存器),core层不但为上面的设备驱动提供封装后的内核注册函数,而且还为下面的硬件事件提供注册接口(也就是i2c总线注册接口i2c_add_register),可以说core层起到了承上启下的作用。

相关的重要结构体和函数:

  1. i2c_client:
    每一个i2c从设备都需要用一个i2c_client结构体来描述,i2c_client对应真实的i2c物理设备device,但是i2c_client不是我们自己写程序去创建的,而是通过以下常用的方式自动创建的:
    platform创建:
    1. 注册i2c_board_info;
    2. 获取对应的adapter,然后i2c_new_device;
    devicetree创建:
    3. 通过设备树的一个节点去描述一个从设备,设备数在解析的时候会自动创建client;
  2. i2c_driver
    driver 是指向从设备的驱动程序,由我们自己去实现并通过i2c_add_register注册到i2c的bus中,与i2c_client进行匹配,匹配成功则调用probe函数。
  3. i2c_adapter
    i2c总线适配器其实就是一个i2c总线控制器,本质上是一个物理设备,主要用来完成i2c总线控制器相关的数据通信,由芯片厂商去实现。
  4. i2c_algorithm
    i2c算法,适配器对应的驱动程序,每一个适配器对应一个驱动程序,用来描述适配器和设备之间的通信方法,由芯片厂商去实现。
  5. i2c_msg
    把要发送的数据封装成msg结构体(比如16个字节进行拆分)
  6. i2c_add_register
    注册一个i2c_driver结构体,通过name或者id_tables或者of_match_table去匹配一个i2c_client,如果匹配成功,则会调用i2c_driver结构体里面的probe函数,并将对应的i2c_client结构体传过来。
  7. i2c_transfer
    负责通过对应的i2c总线对依附于这个adapter的从设备(i2c_client)进行读写数据(双向的)。其中要读写的数据要封装成为一个i2c_msg结构体,根据msg的flags标志位是0还是1来决定是读还是写。其实i2c_transfer是对master_xfer的封装。

这几个重要结构体之间的关系:

  1. i2c_adapter与i2c_algorithm
    i2c_adapter对应于物理上的一个适配器,而i2c_algorithm对应于一套通信方法,一个i2c适配器需要i2c_algorithm中提供的(i2c_algorithm中的又是更下层与硬件相关的代码提供)通信函数来控制适配器上产生特定的访问周期。缺少i2c_algorithm的i2c_adapter什么也做不了,因此i2c_adapter中包含其使用i2c_algorithm的指针。i2c_algorithm中的关键函数master_xfer()用于产生i2c访问周期需要的start、stop、ack信号,以i2c_msg为单位发送和接收通信函数。i2c_msg也非常关键,调用驱动中的发送接收函数需要填充该结构体。
  2. i2c_driver和i2c_client
    i2c_driver对应一套驱动方法
    i2c_client对应真实的物理设备device,每个i2c设备都需要一个i2c_client来描述,i2c_driver与i2c_client的关系是一对多。一个i2c_driver上可以支持多个同等类型的i2c_client。
  3. i2c_adapter和i2c_client
    i2c_adapter和i2c_client的关系与i2c硬件体系结构中适配器和设备的关系一致,即i2c_client依附于i2c_adapter,由于一个适配器上可以连接多个i2c设备,所以i2c_adapter中包含依附于它的i2c_client的链表。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值