本文共 2587 字,大约阅读时间需要 8 分钟。
一个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寄存器然后创建了一个adapteradapter里面有个algo,algo里面有个xfer,xfer里面实现了读写.
相当于创建了一个挂载platform上的设备和驱动,并且已经匹配了.相当于做好了i2c的驱动.那为什么还要创建一个adapter.而且接口在哪里? 接口应该在i2c-core.ci2c_master_sendi2c_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://dvigi.baihongyu.com/