博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
I2C总线相关_3
阅读量:4285 次
发布时间:2019-05-27

本文共 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/

你可能感兴趣的文章
map的详细用法
查看>>
C++初始化函数列表
查看>>
STL各种排序
查看>>
#include<map>
查看>>
z字形扫描
查看>>
相邻数对
查看>>
C++中的字符串
查看>>
c++字符串详解
查看>>
C++ string 字符串匹配
查看>>
C语言字符串函数大全
查看>>
C++ o matching function for call to 'transform...错误
查看>>
c++find函数用法
查看>>
社团划分——Fast Unfolding算法
查看>>
三元闭包与强弱联系
查看>>
基本Kmeans算法介绍及其实现
查看>>
图的幂律度分布 power-law degree distributios
查看>>
SNS背后的科学(1)从六度分隔到无尺度网络
查看>>
邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
查看>>
复杂网络入门读物
查看>>
《复杂网络理论及应用》
查看>>