基于linux-3.14.16
一、注册I2C总线
以上代码即完成了i2c总线的注册,并且添加了一个i2c驱动dummy_driver
二、注册适配器
1、平台总线匹配
设备树有i2c1设备
平台总线匹配后执行probe
2、执行probe
获取中断号
获取地址资源并映射
填充i2c_adapter,
获取时钟,并使能
请求中断
设置总线速率
注册i2c总线
总结:对于每款芯片而言,每个i2c控制器都将会抽象成一个适配器(i2c_adapter)注册成i2c总线设备。
3、注册适配器总线i2c_add_numbered_adapter
i2c_add_numbered_adapter是i2c core的接口,用于注册一个i2c适配器
最终调用i2c_register_adapter注册
看看i2c_register_adapter里面干了什么
设置适配名称,设置bus为之前注册的i2c总线
调device_register注册,可以看到,适配器是作为一个i2c设备
遍历该i2c下所有的设备,添加到总线(of_i2c_register_devices)
看有没有匹配的i2c总线驱动跟设备匹配
bus_for_each_drv????
4、看如何添加i2c设备of_i2c_register_devices
看i2c_new_device干了什么
将i2c_borad_info转成i2c_client后最终注册为一个i2c设备,可知i2c_borad_info只是一个临时过渡作用
至此完成了i2c控制器以及其下面所挂的设备的i2c设备添加,这里用到了很多接口,都是在i2c core中定义的。
三、i2c设备驱动
在设备树中,i2c3下面有一个ts设备
找到匹配的i2c设备驱动
1、注册i2c驱动i2c_register_driver
2、probe
博客园:I2C总线驱动框架详解