上次谈了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相连接。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐