Linux2.6.37 I2C驱动框架(四)

来源:互联网 发布:淘宝卖家怎么进入 编辑:程序博客网 时间:2024/06/06 04:31

前面说了一大堆,估计早就看晕了,还是用图来说明下问题。

  首先,系统为I2C构造了一条I2C总线--i2c_bus_type。注意这里说的总线是软件层面上的,不是硬件上存在的SCL和SDA组成的I2C总线。一条总线有链表:bus.p.kilist_device和bus.p.klist_driver。这对任何总线都是成立的,这也是Linux2.6的设备--总线--驱动模型。当我们调用i2c_register_adapter是会调用device_register(adap.dev)就是将内嵌i2c_adapter的struct dev注册到系统,本质就是将i2c_adapter.dev连入了总线的bus.p.klist_device链表了。同时dev.bus也会指向i2c_bus_type。因此,当我们注册多个i2c_adapter到系统中时就会出现下面左边所示,最终会通过一条双链表连接起来。同理,我们调用i2c_register_driver将i2c_driver注册到系统时会调用driver_register将i2c_driver.driver连入bus.p.klist_driver链表中,注册多个i2c_driver时形成了一条含多个i2c_driver的双链表,同时每个i2c_driver.driver.bus会指向i2c_bus_type。在调用driver_register时还会做一件事,就是将i2c_driver.id_table中所支持的i2c设备的名字与系统中存在的i2c_client.name进行匹配,如果名字相同就说明该驱动支持该i2c设备,然后i2c_driver.probe函数就会被调用。而probe中就可以字符设备那一套东西来注册字符设备驱动,创建设备文件等等。。。

当我们调用i2c_new_device创建i2c设备时也会调用device_register,说明i2c_client.dev最终也会连接到总线设备这边这条链表上来。而且i2c_client.adap会指向其物理上连接的那个i2c_adapter。对于新版的驱动有多种实现方法:第一种是在bsp文件中静态定义关于i2c设备的i2c_board_info结构信息(我们很清楚这个设备的名字及该设备在总线的地址),这样在调用i2c_register_adapter时会调用i2c_scan_board_info时会创建i2c_client并将其连接到总线的设备链表上。因此当有i2c设备驱动注册到系统中来时调用driver_register时会用驱动的id_table中的设备名与总线设备链表中每个i2c_client.name进行匹配,成功后调用驱动的probe方法。

 

 

 

0 0
原创粉丝点击