linux下i2c设备驱动程序,Linux系统IIC驱动程序 <二> I2C设备驱动
上次谈了Linux 下I2C的框架,这次专门以MPU9250驱动为例,学习I2C设备驱动。之前谈过,I2C设备驱动有两种模式:Adapter模式和Probe模式。前者在新kernel版本中已经不支持了,后者则是推荐方式。这次我们就以MPU9250IIC Driver 为例,分析Probe模式的I2C driver.因为具体分析的是NvidiaTegra平台,所以板目录在kernel/arch/ar
上次谈了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相连接。
更多推荐
所有评论(0)