关闭

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

759人阅读 评论(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平台上目前的主流。

0
0
查看评论

总线设备驱动模型

总线驱动设备模型: 1. 总线设备驱动模型概述         随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的要求也越来越高,2.4内核已经难以满足这些需求,为适应这宗形势的需求,从linux2.6内核开始提供了全新的设备模型 ...
  • coding__madman
  • coding__madman
  • 2016-05-17 21:52
  • 4163

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

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

设备、驱动、总线的关系

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

高通平台学习 转 Device Tree常用方法解析

  • 2015-04-14 10:40
  • 718KB
  • 下载

基于qualcomm平台的camera 驱动详解

前言: 一、Android camera架构 在framework中,camera主要是通过以下库来协同工作的: libandroid_runtime.so、libui.so、libcameraservice.so这几个库对应的文件目录主要是: Libandroid_runt...
  • weijory
  • weijory
  • 2017-01-19 13:47
  • 2102

linux驱动:设备-总线-驱动(以TI+DM8127中GPIO为例)

一:说明:这次学习设备-总线-驱动是以TI+DM8127的GPIO为例 1、GPIO资源注册到omap_hwmod链表中 2、初始化GPIO 3、将GPIO注册到plarform层 4、将GPIO注册到device层 二、流程图 1、GPIO资源注册到omap_hwmod链表中 2、初始化G...
  • u010168781
  • u010168781
  • 2017-01-08 13:33
  • 396

linux设备驱动之总线、设备、驱动

文章转载至多个地方,网上拼凑的一篇文章,说的好听一些的话那就叫自己总结的文章,只是多次引用啊,哈哈,哎,不管了,反正这个有利用学习进步就好,这是重要的,文章转载过来要经过一篇大脑才能成为自己的,以后千万要注意这点,不要把大好的文章转载放在博客里面不管了,等到那一天遇到同样的问题了
  • yimu13
  • yimu13
  • 2011-09-09 11:00
  • 4191

总线+设备+驱动 (国嵌笔记)

设备模型 1.设备模型元素 总线、驱动、设备 总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,设置是内部的虚拟“platform”总线。 在LINUX设备模型中,总线由bus_type结构表示,定义在中 总线也是一个设备,也要对应一个struct device 注册 注销...
  • G1036583997
  • G1036583997
  • 2015-03-10 20:54
  • 372

总线、设备和驱动的关系

linux设备驱动归纳总结(八):2.总线、设备和驱动的关系 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 上一节介绍了总线、设备和驱动函数的注册,...
  • win2domain
  • win2domain
  • 2014-07-21 13:20
  • 463

Linux平台总线驱动设备模型

platform总线是一种虚拟的总线,相应的设备成为platform_device,而驱动则为platform_driver。Linux 2.6的设备驱动模型中,把I2C、RTC、LCD等都归纳为platform_device。
  • lwj103862095
  • lwj103862095
  • 2014-01-07 21:09
  • 11044
    个人资料
    • 访问:35562次
    • 积分:1161
    • 等级:
    • 排名:千里之外
    • 原创:83篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    最新评论