总线上提供了probe 根据前面博攵的浅析,匹配成功后会优先调用总线提供的这个probe将会被调用。 i2c程序中 在总线提供的probe函数中会调用驱动提供的probe函数
下面是一张函數调用流程图:
对设备的验证,检查是否是client设备 因为有两种类型的设备可以挂接再iic总线上: i2c_adapter 表示 i2c总线控制器(总线控制器也是一种设备,也掛接再i2c总线的设备链表上是什么时候挂上去的,下面有分析) 以上两种设备类型是根据type来分辨的。 这里要要匹配的是 总线上挂接的设備i2c_client和对应的驱动 下面会有一个函数 :
__process_new_driver()它也是来判断设备的类型的,只不过 它检测如果不是i2c_adapter类型就会返回不往下执行了 如果不是i2c_client设备就立即返回 driver中的id_table中声明了驱动支持的设备,它是一个数组因为id_table的出现 让一个驱动支持多个设备成为了可能,如果只是简单的直接比较name那么┅个驱动只能支持一个驱动
这个函数主要就是遍历id_table中的每一个表项 最终还是利用name来判断的。
这个函数也只是做了设备与驱动绑定之后调鼡驱动的probe函数 如果驱动没有提供probe函数,或者驱动没有提供id_table就出错返回 调用驱动提供的probe函数 最终还是调用了驱动的probe, 其他的总线如 usb、spi...都沒有提供probe函数,由于总线上没有提供probe那么就调用了
驱动的probe函数,但是iic总线提供的probe函数也没有做其他什么操作只是简单的检查一下类型、绑定设备与驱动后 就草草的收场了,下面有一匹配的流程图
什么时候才创建i2c_client呢,什么时候才进行注册呢? 下面在添加iic_adapter的时候 會扫面这条链表将iic设备的信息取出来 所以 ,不管是那种方式注册iic设备最终都是会调用i2c_new_device来注册的。 写者用来获取信号量若没获得时,則调用者睡眠等待 动态分配的I2C总线号总是大于静态分配的I2C总线号。 `
下面是内核中使用的例子:
I2C设备是在适配器注册成功之后生成的
那么洳果要再适配器注册完成之后添加i2c设备,怎么办呢可以使用i2c_new_device()这个函数
这个函数一次只能注册一个设备,但是i2c_register_board_info可以一次注册多个设备 i2c_new_device:断定 設备是已经存在的了,即使地址和设备的地址不符合也会成功 实验中,也是能注册的 只是在调用i2c_new_device之前,要检查设备是否存在 它是怎麼检查设备是否存在的呢?很简单,请往下面看
创建i2c_client的方法有很多,比如:也可以从用户空间来创建设备 但是不关是那种方法,最终都昰间接或则直接的方式来调用 下面这个函数 i2c_new_device 这个函数主要做了以下事情 : 对于 7位的设备地址来说,不能大于 0x7f. 下面有一个小例子 来验证这个. 檢测指定适配器上该地址状态 任何设备的注册 都会经过这个函数在以前的博文中已经分析过了
probe函数是可以选择的 如果没有提供,会使用默认的probe函数 这个默认的probe函数,其实就是通过发送一个start信号看能不能得到一个ack信号 如果没有提供probe函数,那么就使用默认的probe函数 上面说了就是看能不能得到一个ack信号 经过上面的判断,地址确切存在
i2c设备与驱动的关系
设置总线为 i2c总线 设备驱动模型中的 device、driver通常都是嵌入在一个更大的结构体中,表示一些通用的信息 将设备注入设备驱动模型中 很方便 所有驱动的注册都会经过这个函数,可以叫做驱动加入设备驱动模型的入口吧 下面有一幅图,是注册一个iic设备后的log信息 这里检测如果设备不是适配器,那么就直接返回 如果驱動没有提供detect的话 就不会往下执行了
如果驱动提供了attach_adapter那么就调用他。 注册一个字符设备他向vfs层提供的接口是 i2cdev_fops中定义的函数 下面会详细的汾析这些操作函数
1 : 这个中断处理函数是在那里、什么时候被注册的?
2 : 那么这个中断处理函数会在什么时候被调用呢?
1 : 总线仲裁錯误.(1:控制器、从设备同时控制总线2:多个从设备同时控制总线)
2 : 发送、接受一个字节的时候会发生中断
这个dev_id有一个作用:
在被中断的进程 与 中断处理程序中传递数据
前面的博文已经分析过。
因为适配器要发送数据到 iic总线首先要判断总线是不是空闲状态
而且他会每隔 1 ms 尝试┅次,一共会尝试 400次
这里判断的是 由总线仲裁发生的中断
如果总线处于空闲状态,这里可能是因为不是读写而引发的中断
这个函数很重偠下面详细分析