下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux内核学习---总线,设备,驱动Linux设备模型中三个很重要的概念就是总线,设备,驱动.即bus,device,driver,而实际上内核中也定义了这么一些数据结构,他们是structbus_type,structdevice,structdevice_driver,这三个重要的数据结构都来自一个地方,include/linux/device.h.我们知道总线有很多种,pci总线,scsi总线,usb总线,所以我们会看到Linux内核代码中出现pci_bus_type,scsi_bus_type,usb_bus_type,他们都是structbus_type类型的变量.而structbus_type结构中两个非常重要的成员就是structksetdrivers和structksetdevices。kset和另一个叫做kobject正是LinuxKernel2.6中设备模型的基本元素。这里我们只需要知道,drivers和devices的存在,让structbus_type与两个链表联系了起来,一个是devices的链表,一个是drivers的链表,也就是说,知道一条总线所对应的数据结构,就可以找到这条总线所关联的设备有哪些,又有哪些支持这类设备的驱动程序.而要实现这些,就要求每次出现一个设备就要向总线汇报,或者说注册,每次出现一个驱动,也要向总线汇报,或者说注册.比如系统初始化的时候,会扫描连接了哪些设备,并为每一个设备建立起一个structdevice的变量,每一次有一个驱动程序,就要准备一个structdevice_driver结构的变量.把这些变量统统加入相应的链表,device插入devices链表,driver插入drivers链表.这样通过总线就能找到每一个设备,每一个驱动。structbus_type中为devices和drivers准备了两个链表,而代表device的结构体structdevice中又有两个成员,structbus_type*bus和structdevice_driver*driver。同样,代表driver的结构体structdevice_driver同样有两个成员,structbus_type*bus和structlist_headdevices。structdevice和structdevice_driver的定义和structbus_type一样,在include/linux/device.h中。凭一种男人的直觉,可以知晓,structdevice中的bus记录的是这个设备连在哪条总线上,driver记录的是这个设备用的是哪个驱动,反过来,structdevice_driver中的bus代表的也是这个驱动属于哪条总线,devices记录的是这个驱动支持的那些设备,没错,是devices(复数),而不是device(单数),因为一个驱动程序可以支持一个或多个设备,反过来一个设备则只会绑定给一个驱动程序。上面是理论知识,下面我们具体以展讯平台的I2C设备重力加速度传感器MC3XXX驱动为例进行实例分析:1.首先在Board-sp7715ga.c文件中通过sc8810_add_i2c_devices函数(其实是i2c_register_board_info函数)将指定的I2C设备(MC3XXX_ACC_I2C_NAME,MC3XXX_ACC_I2C_ADDR---包括设备名和设备地址)申请一个I2Cstructdevice结构,并且挂入I2C总线中的devices链表中来。注意:该device挂入devices链表的操作会先于I2C设备驱动加载的操作被执行。i2c_register_board_info函数对此进行了特别说明:/*SystemsusingtheLinuxI2Cdriverstackcandeclaretablesofboardinfowhiletheyinitialize.Thisshouldbedoneinboard-specificinitcodeneararch_initcall()time,orequivalent,beforeanyI2Cadapterdriverisregistered.Forexample,mainboardinitcodecoulddefineseveraldevices,ascouldtheinitcodeforeachdaughtercardinaboardstack.**TheI2Cdeviceswillbecreatedlater,aftertheadapterfortherelevantbushasbeenregistered.Afterthatmoment,standarddrivermodeltoolsareusedtobind"newstyle"I2Cdriverstothedevices.Thebusnumberforanydevicedeclaredusingthisroutineisnotavailablefordynamicallocation.*/2.具体的驱动程序在Mc3xxx.c文件中。module_init(mc3xxx_i2c_init)被称为驱动程序的初始化入口(driverinitializationentrypoint)。当我们使用insmod这个命令去安装的时候(内核配置该模块为M)或者程序启动运行到该模块的时候(内核配置为Y,该模块编译入内核),module_init()注册的函数mc3xxx_i2c_init将会被执行。3.mc3xxx_i2c_init函数调用了i2c_add_driver(&mc3xxx_driver)命令,开始注册其structdevice_driver结构,然后它去I2C总线的devices链表(注意:该链表在步骤1中已被更新入mc3xxx设备)中去寻找(遍历),去寻找每一个还没有绑定driver的设备,即structdevice中的structdevice_driver指针仍为空的设备,然后它会去观察这种设备的特征(mc3xxx_driver驱动中的id_table表,第4点对此进行专门的说明),看是否是他所支持的设备,如果是,那么调用一个叫做device_bind_driver的函数,将设备与驱动进行绑定.换句话说,把structdevice中的structdevice_driverdriver指向这个mc3xxx_driver,而structdevice_drivermc3xxx_driver把structdevice加入他的那张structlist_headdevices链表中来.就这样,bus,device,和driver,这三者之间或者说他们中的两两之间,就给联系上了.4.一个driver可以支持多个device,一个linux系统里也有不同的device和driver。那么当发现一个device的时候,如何知道哪个driver才是她的Mr.Right呢?这就是id_table的用处,让structmc3xxx_driver准备一张表,里边注明该driver支持哪些设备,这总可以了吧.如果你这个设备属于这张表里的,那么ok,绑定吧。实际上id_table这个结构体对每一个设备来说,就相当于是她的身份证,记录了她的一些基本信息,通常我们的身份证上会记录我们的姓名,性别,出生年月,户口地址等等,而linux各种设备她也有她需要记录的信息,以区分她和别的linux设备,比如Vendor-厂家,Product-产品,以及其他一些比如产品编号,产品的类别,遵循的协议等。于是我们知道,一个I2Cdriver会把它的这张id表去和每一个I2C设备的实际情况进行比较,如果该设备的实际情况和这张表里的某一个id相同,准确地说,只有这许多特征都吻合,才能够把一个I2Cdevice和这个I2Cdriver进行绑定,这些特征哪怕差一点也不行。附:mc3xxx驱动结构体staticstructi2c_drivermc3xxx_driver={.driver={.name=MC3XXX_DEV_NAME,.owner=THIS_MODULE,},.probe=mc3xxx_i2c_probe,.remove=mc3xxx_i2c_remove,.suspend=mc3xxx_i2c_sus
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年电商产品代销合同:品牌产品代销与渠道拓展协议4篇
- 2025年湖南省消防工程节能评估及认证合同
- 二零二五年度绿色环保大楼楼顶绿化租赁合同3篇
- 2025年度海洋货物运输保险合同理赔实务
- 2025年度旅游合同履行担保体系构建与实施
- 2025年度水泥管品牌授权销售合同
- 2025年度美容美发耗材一站式采购与配送合同
- 2025年度股权激励计划实施与变更合同
- 2025年广西城市绿化工程承包合同
- 2025年度电子商务合同内部控制与安全管理合同
- 新闻记者证600道考试题-附标准答案
- TSG ZF001-2006《安全阀安全技术监察规程》
- 中考语文二轮复习:记叙文阅读物象的作用(含练习题及答案)
- 老年外科患者围手术期营养支持中国专家共识(2024版)
- 子宫畸形的超声诊断
- 2024年1月高考适应性测试“九省联考”数学 试题(学生版+解析版)
- (正式版)JBT 11270-2024 立体仓库组合式钢结构货架技术规范
- DB11∕T 2035-2022 供暖民用建筑室温无线采集系统技术要求
- 《复旦大学》课件
- 针灸与按摩综合疗法
- T-GDWJ 013-2022 广东省健康医疗数据安全分类分级管理技术规范
评论
0/150
提交评论