I2C总线相关_3
2017-03-27 21:44
423 查看
一个i2c架构 struct platform_device hi_i2c0_device = { .name = HI_I2C, .id = 0, .resource = hi_i2c0_resources, .num_resources = ARRAY_SIZE(hi_i2c0_resources), .dev = { .platform_data = &hi_i2c0_platform_data, } }; platform_device_register(&hi_i2c0_device); static struct platform_driver hi_i2c_driver = { .probe = hi_i2c_probe, .remove = hi_i2c_remove, .suspend = hi_i2c_suspend, .resume = hi_i2c_resume, .driver = { .owner = THIS_MODULE, .name = HI_I2C, }, }; platform_driver_register(&hi_i2c_driver);
然后在probe里面做了这件事 建立了一个hi_i2c结构体 然后初始化了i2c寄存器 然后创建了一个adapter adapter里面有个algo,algo里面有个xfer,xfer里面实现了读写.
相当于创建了一个挂载platform上的设备和驱动,并且已经匹配了. 相当于做好了i2c的驱动. 那为什么还要创建一个adapter. 而且接口在哪里? 接口应该在 i2c-core.c i2c_master_send i2c_master_recv 我明白了 上层有多个设备,如果下层多个i2c驱动. 那么中间就有一个适配 上层往下调用的时候已经填充了中间所需要的信息,通过 i2c_transfer -> __i2c_transfer -> adap->algo->master_xfer 最后一个函数已经是具体的i2c驱动了,实现了读写 在上述这个过程中就已经实现了对设备信息的解析,并与总线上的adapter进行适配. 每个i2c驱动实现的时候,可以用platform框架搭建. 然后在probe函数中实现对i2c的初始化,并实现一个adapter,用来标识一个驱动. 上层掉的时候.通过一个i2c_master_send函数和一个参数来实现了对指定i2c驱动的操作. 匹配说的是谁和谁的匹配 我猜应该是具体i2c设备与i2c驱动的匹配. i2c设备指的是具体的设备,像nvp6114走的是i2c,则那么这个硬件的驱动就要调i2c驱动. i2c驱动指的是具体的驱动,举个例子,一个soc有两个i2c驱动.也就是两个i2c口.你要驱动哪个,就需要对应哪个驱动. i2c驱动针对的是一个soc. 建立在i2c驱动上的驱动针对的是一个设备与soc的交互. 虽然你在i2c总线上建立了一个设备,但不是说这个设备就可以一定可以找到这个总线对应的驱动的. 上层掉的时候.通过一个i2c_master_send函数和一个参数来实现了对指定i2c驱动的操作. 总线上这么多驱动 这么多 设备 . 所以需要一个匹配. 每个驱动在总线driver端有一个 id_table , 你的设备的name 必须在这个 id_table 里面才可以与这个总线匹配. //匹配一般在注册设备的时候进行. i2c_adap = i2c_get_adapter(0); nvp6124_client = i2c_new_device(i2c_adap, &hi_info); i2c_put_adapter(i2c_adap); 例如上面三句话的注册设备. 应该在i2c_new_device中注册了一个device_register,然后系统自动执行了匹配. /** * i2c_new_device - instantiate an i2c device * @adap: the adapter managing the device * @info: describes one I2C device; bus_num is ignored * Context: can sleep * * Create an i2c device. Binding is handled through driver model * probe()/remove() methods. A driver may be bound to this device when we * return from this function, or any later moment (e.g. maybe hotplugging will * load the driver module). This call is not appropriate for use by mainboard * initialization logic, which usually runs during an arch_initcall() long * before any i2c_adapter could exist. * * This returns the new i2c client, which may be saved for later use with * i2c_unregister_device(); or NULL to indicate an error. */ 可见,绑定是在i2c_new_device函数执行完之后进行的.自动绑定,那么,是根据什么绑定的呢? 绑定的是什么东西呢? 调用 总线 适配器 接口 一个总线上挂了很多适配器,一个适配器上挂了很多接口. 而你一个设备只能挂在一个接口上. 所以需要匹配这些接口. 创建设备的时候已经定死了在某个适配器上创建设备. 下面匹配的话,只需要匹配接口,匹配接口用的是设备的name和一个接口的name.
http://blog.sina.com.cn/s/blog_96a11ddf0102v05f.html
http://www.wowotech.net/comm/i2c_overview.html
相关文章推荐
- I2C总线相关_5
- I2C总线相关_6
- BeagleBone Black I2C总线相关操作
- I2C总线相关_1
- I2C总线的相关程序
- I2C总线相关_2
- I2C总线相关_4
- i2c适配器驱动源码分析(i2c总线驱动)
- I2C和SPI总线
- s5pv210 i2c总线驱动s3c2410.c 完全解析2
- I2C总线驱动程序的实现
- 乾坤合一:Linux设备驱动之I2C核心、总线以及设备驱动
- I2C总线的连续读和连续写
- i2c总线 2
- I2C的总线电容
- USB、UART、SPI、I2C、Ethernet、SD、SATA、PCI、 XGMII/XLGMII/CGMII总线的传输速度
- I2C总线-嵌入式
- I2C总线
- 总线相关问题介绍
- Linux下使用I2C总线读写 EEPROM(读写i2c从设备通用程序)