I2C总线相关_3

时间:2022-05-08 19:14:02
一个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