Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

Linux系统IIC驱动程序  I2C设备驱动

$
0
0

作者: Sam (甄峰)  sam_code@hotmail.com

 

上次谈了Linux 下I2C的框架,这次专门以MPU9250驱动为例,学习I2C设备驱动。

 

之前谈过, I2C设备驱动有两种模式:Adapter模式和Probe模式。前者在新kernel版本中已经不支持了,后者则是推荐方式。这次我们就以MPU9250 IIC Driver 为例,分析Probe模式的I2C driver.

 

因为具体分析的是Nvidia Tegra平台,所以板目录在kernel/arch/arm/mach-tegra/ 

具体文件为:board-ardbeg-sensors.c

 

1. 从头开始:

ardbeg_sensors_init()中,调用了mpuirq_init(). 这里面做了一个准备工作A。之后调用了:i2c_register_board_info()

 

1.0: i2c_register_board_info()分析

int __init i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len)

静态的声明I2C Device。

busnum: Bus标识符,device将要挂载的Bus标识符。

info: i2c device 描述符vector。

len: vector中描述符的数量。

 

1.0.1: 内容填充:

对于vector中的每个描述符,创建一个i2c_devinfo. 并将其加入链表:__i2c_board_list

 

1.0.2:链表中内容分析:

 

1.0.3:  什么时候用到链表:

static void i2c_scan_static_board_info(struct i2c_adapter *adapter)中,

如果__i2c_board_list 中的某一项所标识的BUS id 与参数给定的adapter所代表的bus是同一个,则调用:i2c_new_device(adapter, &devinfo->board_info)来真正的创建Device--(struct i2c_client, 正如我们所说,I2C设备对应的概念是:i2c_client)

 

而i2c_scan_static_board_info()被谁调用呢?正是:i2c_register_adapter(struct i2c_adapter *adap),其实最终由:i2c_add_adapter()调用。

也就是说,当增加一个新的I2C BUS 时,它会从__i2c_board_list链表中把所有内容查看一遍,看哪些是挂载在自己身上的,如果有,就给它创建Device (i2c_client). 这个i2c_client,再通过id_table. 与i2c_driver相连接。

 

 


 

Viewing all articles
Browse latest Browse all 158

Trending Articles