这几天在学的i2c总线,总结的一些。第一次写博客,如果有错,欢迎指出
一、I2C系统总体架构
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相关的数据通信。由芯片厂完成
class:允许匹配的设备类型
algo:指向i2c_algorithm(数据的算法)
dev:指向适配器的设备结构体
name[48]:适配器的名字
nr:该i2c bus的id,体现在sys/bus/i2c/devices/i2c-x中的x
i2c_algorithm:i2c的通信方法。用来描述适配器和设备之间的通信方法。由芯片厂完成
master_xfer:用于完成adapter与底层硬件间的数据传输
i2c_msg:传输的基本单位
addr:地址
flags:1-读 0-写
len:要发送的数据长度
buf:要发送的数据
2、I2C总线驱动注册
2.1 bus_type注册
i2c总线驱动是注册在i2c bus上的,所以要现有i2c_bus,在/drivers/i2c/i2c-core.c
对应sysfs中为sys/bus下的i2c目录
2.2 DTS文件编写
2.3 drivers/i2c/busses目录下,i2c-xxx.c文件(芯片厂会提供的)
2.4在i2c-xxx.c文件中的probe接口
① 创建i2c_adapter
(mt_i2c里面有i2c_adapter)
② 获取io资源,初始化硬件信息
③ 填写i2c_algorithm的信息(从i2c-xxx.c文件中),里面有master_xfer。然后将i2c_algorithm填写到i2c_adapter里面
填充i2c_adapter里面的algo_data信息。
④ 获取i2c总线的中断资源和注册中断函数
⑤ 调用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控制器控制的一个外设设备)
addr:设备的7位地址
adapter:该设备所在的i2c_adapter
irq:该设备的中断号
2、定义和注册i2c_client
如上所知
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的链表