作者: 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相连接。