Android i2c总线学习

本文详细介绍了I2C总线系统的架构及其组成部分,包括I2C核心、I2C总线驱动、I2C设备驱动等。阐述了各组件的作用及其实现原理,并解释了它们之间的相互关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天在学的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的链表

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值