您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: