基于高通平台进行的总线、设备、驱动三者的关系简析

821人阅读 评论(0) 收藏 举报

     在计算机中,总线是计算机中各个部件之间进行数据通信的通道。在Linux内核的设备驱动模型中,总线的概念有所不同,不仅有物理上真实存在的总线,如I2C总线和USB总线等,还有并不存在物理器件的虚拟总线,例如最具代表性的platform总线。操作系统通过设备驱动程序来管理设备(主要包括设备的初始化,设备电源管理,设备与系统其他部分的通信等)。在Linux内核代码中,各个总线(总线本身也是一种设备)用于管理挂载各自总线上的设备以及各个设备对应的驱动,例如USB总线系统驱动管理所有USB设备和USB设备驱动;这里所说的“管理”的主要工作是当有新设备接入系统时,为这个设备找到合适的驱动并绑定,或者当新驱动注册到系统时,为该驱动找到它能管理的所有设备(一个驱动可能对应多个设备)并绑定。现在的许多芯片除了包含CPU之外,还集成了各种功能模块,俗称有SoC(System on Chip)。这类的芯片内部的一些外设与CPU的物理连接并没有经过总线,因而这类设备和驱动并没有总线来管理;为了解决统一管理,出现了platform总线,这个总线在物理上并不存在,是虚拟的,仅仅是为了统一管理那些物理连接没有经过总线的设备和它们的驱动。

        下图为总线、设备和驱动三者的关联在代码上的体现。总线的结构体类型的bus_type,它包含一个subsys_private的结构体成员。通过subsys_private这个结构体成员,总线维护两个链表:一个是klist_devices,记录所有挂载在该总线上的设备,另一个是klist_drivers,记录所有挂载在该总线上的驱动。同时,设备驱动程序自身还维护一个链表klist_devices,记录它所管理的所有设备。


 


         总线驱动为新添加的设备绑定一个匹配的驱动的主要过程大致分为三个步骤:(1)将设备添加到总线维护的klist_devices链表中;(2)遍历总线维护的klist_drivers链表直到找到匹配的驱动;(3)如果找到匹配的驱动则执行probe函数。总线为新注册的驱动寻找对应的设备时,操作过程一致,只是在执行代码上有些许差别,详见下图:

 
 
 
         上文讲了总线驱动会为设备或驱动寻找与他们匹配的“另一半”,那总线驱动又是如何判断设备和驱动是否匹配的呢?这个过程由一个match函数实现,不同的总线驱动定义不同的match函数,因而可以有不同的匹配方式,但在Linux内核的现有代码中基本是以下三种方式:
        (1) 各类设备定义的xxx_device和device_driver结构体个有一个char *name成员来代表设备和驱动的名字,总线定义的match函数比较驱动和设备的名字(字符串比较),当一致时,则认为设备和驱动是匹配的,这是最基本的方法;
        (2) 驱动程序中定义一个id表"id_table"(数组),在这个id表中保存该驱动程序所负责的说有设备的id,总线的match函数用这个id表中的每个元素与来自设备的某种属性做比较(不同总线比较不同属性,例如i2c设备比较client设备的name属性而USB比较设备的idVendor和idProduct),符合要求时则认为设备和驱动匹配;
        (3) 第三种方法是使用设备树的情况,驱动程序会填充device_driver->of_match_table成员,然后match函数of_match_table与设备的of_node进行对比,符合要求的则认为设备与驱动匹配。这种方法是arm平台上目前的主流。

查看评论

关于qualcomm平台i2c和spi配置学习

这次完成的任务是要使能高通平台的i2c和spi,主要做的工作就是在设备树文件中添加节点信息。主要的工作在于对设备树文件的修改,主要修改了msm8953-pinctrl.dtsi和sm8953.dtsi...
  • weijory
  • weijory
  • 2017-03-23 11:21:04
  • 1985

平台总线、设备、驱动的学习

设备和驱动的绑定是通过总线实现的。总线通过查找总线下的设备列表和驱动列表,名字相同的进行匹配。 总线代码的实现: struct bus_type {        constchar      ...
  • g360250466
  • g360250466
  • 2016-08-17 21:39:18
  • 752

设备、驱动、总线的关系

Kobject,kset是设备模型的基本结构体,设备模型使用这两个结构体来完成设备的层次关系,但在实际的设备驱动编写中,我们基本上用不到kobject,kset这些结构体,是因为这些结构体又被嵌入到更...
  • tangtang_yue
  • tangtang_yue
  • 2016-04-01 14:21:38
  • 1862

linux设备驱动模型之总线、设备、驱动三者的关系

总线、设备、驱动,也就是bus、device、driver,在内核里都有对应的结构体,在include/linux/device.h 里定义。 Device.h (linux-3.4.2\inclu...
  • fengyuwuzu0519
  • fengyuwuzu0519
  • 2017-07-05 22:46:36
  • 751

总线、设备和驱动的关系

linux设备驱动归纳总结(八):2.总线、设备和驱动的关系 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
  • win2domain
  • win2domain
  • 2014-07-21 13:20:04
  • 502

Linux平台总线驱动设备模型

platform总线是一种虚拟的总线,相应的设备成为platform_device,而驱动则为platform_driver。Linux 2.6的设备驱动模型中,把I2C、RTC、LCD等都归纳为pl...
  • lwj103862095
  • lwj103862095
  • 2014-01-07 21:09:07
  • 11198

平台总线设备驱动详解

平台总线是内核实现的一条虚拟总线,Linux设备模型包含三个重要的元素,总线、设备和驱动,那看看平台总线又是怎样去实现的。 首先看平台总线的定义: [cpp] view plainco...
  • hanmengaidudu
  • hanmengaidudu
  • 2013-10-08 11:33:19
  • 2007

基于platform总线的驱动分析

在设备驱动模型中,总线负责将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。...
  • qq_28992301
  • qq_28992301
  • 2016-08-31 15:23:03
  • 1365

从需求的角度去理解Linux系列:总线、设备和驱动

这是一篇有关如何学习嵌入式Linux系统的方法论文章,也是从需求的角度去理解Linux系统软件的开篇,期待此系列文章日后会是学习嵌入式Linux的标杆!...
  • yueqian_scut
  • yueqian_scut
  • 2015-09-23 21:08:52
  • 5952

字符设备注册platform平台驱动机制

怎么利用平台设备驱动机制来写驱动: ------------------------------------------------------------------------- 1.先实现设...
  • chenliang0224
  • chenliang0224
  • 2016-04-14 23:13:52
  • 1248
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 1215
    排名: 4万+
    文章分类
    最新评论