这几天在学的i2c总线,总结的一些。第一次写博客,如果有错,欢迎指出

一、I2C系统总体架构

android i2c程序 安卓 i2c_android i2c程序

 

 

android i2c程序 安卓 i2c_物理设备_02

 

1、I2C系统架构由三个部分组成

I2C核心(i2c-core):I2C总线驱动(adapter)和设备驱动的注册、注销方法,i2c_client和i2c_adapter的匹配

I2C总线驱动(i2c_adapter,i2c_algorithm):i2c核心对硬件的交流。操作从设备(i2c外设)的读写,不知道设备干嘛用

I2C设备驱动(i2c_client,i2c_driver):i2c核心对应用层的交流。将数据封装给应用层,但是不知道从设备(i2c外设)如何读写

 

2、I2C驱动代码位于drivers/i2c目录下

i2c-core.c:实现I2C核心的功能

i2c-dev.c:通用的从设备驱动

Busses:I2C适配器的驱动

Algos:实现一些I2C总线适配器的algorithm

 

二、I2C总线驱动(i2c_adapter,i2c_algorithm)

1、主要的结构体

i2c_adapter:本质上是一个物理设备(i2c控制器),主要用来完成i2c相关的数据通信。由芯片厂完成

android i2c程序 安卓 i2c_设备驱动_03

 

class:允许匹配的设备类型

algo:指向i2c_algorithm(数据的算法)

dev:指向适配器的设备结构体

name[48]:适配器的名字

nr:该i2c bus的id,体现在sys/bus/i2c/devices/i2c-x中的x

 

i2c_algorithm:i2c的通信方法。用来描述适配器和设备之间的通信方法。由芯片厂完成

android i2c程序 安卓 i2c_设备驱动_04

master_xfer:用于完成adapter与底层硬件间的数据传输

 

i2c_msg:传输的基本单位

android i2c程序 安卓 i2c_android i2c程序_05

addr:地址

flags:1-读 0-写

len:要发送的数据长度

buf:要发送的数据

 

2、I2C总线驱动注册

2.1 bus_type注册

i2c总线驱动是注册在i2c bus上的,所以要现有i2c_bus,在/drivers/i2c/i2c-core.c

android i2c程序 安卓 i2c_设备驱动_06

 

 

对应sysfs中为sys/bus下的i2c目录

 

2.2 DTS文件编写

android i2c程序 安卓 i2c_android i2c程序_07

 

2.3 drivers/i2c/busses目录下,i2c-xxx.c文件(芯片厂会提供的)

android i2c程序 安卓 i2c_android i2c程序_08

 

2.4在i2c-xxx.c文件中的probe接口

① 创建i2c_adapter

android i2c程序 安卓 i2c_数据_09

(mt_i2c里面有i2c_adapter)

 

② 获取io资源,初始化硬件信息

android i2c程序 安卓 i2c_android i2c程序_10

 

③ 填写i2c_algorithm的信息(从i2c-xxx.c文件中),里面有master_xfer。然后将i2c_algorithm填写到i2c_adapter里面

android i2c程序 安卓 i2c_android i2c程序_11

 

填充i2c_adapter里面的algo_data信息。

 

④ 获取i2c总线的中断资源和注册中断函数

android i2c程序 安卓 i2c_数据_12

 

⑤ 调用i2c_add_numbered_adapter或者i2c_add_adapter,在i2c核心里注册i2c_adapter

 

⑥ 在注册adapter的时候,会自动添加client。(在I2C设备驱动层的时候,我们就只需要直接调用i2c_client就好了)具体路径如下

i2c_add_numbered_adapter/i2c_add_adapter ->i2c_register_adapter ->of_i2c_register_devices ->of_i2c_register_device ->i2c_new_device

 

三、I2C设备驱动

1、主要的结构体

i2c_client:device的一个抽象(i2c控制器控制的一个外设设备)

android i2c程序 安卓 i2c_物理设备_13

addr:设备的7位地址

adapter:该设备所在的i2c_adapter

irq:该设备的中断号

 

2、定义和注册i2c_client

如上所知

android i2c程序 安卓 i2c_数据_14

i2c_client对应的是一个真实的i2c物理设备,但是i2c_client不是我们自己写程序去创建的。而是通过以下方式自动创建的

platform创建:

1、注册i2c_board_info

2、获取对应的adapter,然后i2c_new_device

device tree创建:

通过设备树的一个节点去描述一个从设备,设备树在解析的时候会自动创建client

 

3、定义和注册i2c_driver

会调用i2c_add_register ,通过id_table去匹配i2c_client。如果匹配成功,就会调用i2c_driver结构体中的probe函数,并将对应的i2c_client结构体传过来

 

四、一些结构体之间的关系

1、i2c_adapter和i2c_algorithm

i2c_adapter对应的是一个i2c控制器,而i2c_algorithm对应的是一套通信方法。所以个i2c_adapter需要i2c_algorithm(i2c_algorithm中的通信函数是由更下层的与硬件相关的代码提供)提供通信函数来帮助i2c控制器实现控制功能。

缺少i2c_algorithm的i2c控制器什么也做不了,所以i2c_adapter中包含i2c_algorithm的指针

i2c_algorithm中的关键函数master_xfer()用于产生i2c访问周期需要的start、stop、ack、nack信号,以i2c_msg为单位发送和接收通信数据。

i2c_msg是一个数据传输的基本单位,调用驱动中的发送接收函数需要填充它。

 

2、i2c_driver和i2c_client

i2c_driver对应的是一个驱动方法,i2c_client对应的是真实的i2c物理设备。每个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设备,所以i2c_adapter中包含依附于它的i2c_client的链表