第3章-总线设备驱动模型课件.ppt

上传人(卖家):晟晟文业 文档编号:5177021 上传时间:2023-02-16 格式:PPT 页数:79 大小:1.85MB
下载 相关 举报
第3章-总线设备驱动模型课件.ppt_第1页
第1页 / 共79页
第3章-总线设备驱动模型课件.ppt_第2页
第2页 / 共79页
第3章-总线设备驱动模型课件.ppt_第3页
第3页 / 共79页
第3章-总线设备驱动模型课件.ppt_第4页
第4页 / 共79页
第3章-总线设备驱动模型课件.ppt_第5页
第5页 / 共79页
点击查看更多>>
资源描述

1、教材:嵌入式Linux系统工程师实训教程庄严 王光宇 杨海峰编著授课教师:潘 峰BTTC2020/5/12嵌入式操作系统嵌入式操作系统2第3章 总线设备驱动模型一、KObject&KSet二、设备驱动模型提纲三、Platform 驱动模型四、Platform 总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统3一、Kobject&Kset?1、Sysfs文件系统BTTC2020/5/12嵌入式操作系统嵌入式操作系统4一、Kobject&Kset?1、Sysfs文件系统BTTC2020/5/12嵌入式操作系统嵌入式操作系统5一、Kobject&Kset?1、Sysfs文件系

2、统BTTC2020/5/12嵌入式操作系统嵌入式操作系统6一、Kobject&KsetBTTC2020/5/12嵌入式操作系统嵌入式操作系统7分层分离思想在LINUX中有着不可替代的地位,它包括两个思想:分层和分离?分层:核心层和设备相关层分开。这种思想的优点就是能把很多文件共用的代码抽离集中起来成为一个或者多个核心文件供设备相关层调用,每一层专注于自己的功能?分离:把硬件相关的代码(固定的,如板子的网卡、中断地址)和驱动(会根据程序作变动,如点哪一个灯)分离开来,即要编写两个文件:dev.c和drv.c一、Kobject&KsetBTTC2020/5/12嵌入式操作系统嵌入式操作系统8?例如

3、一、Kobject&KsetBTTC2020/5/12嵌入式操作系统嵌入式操作系统9一、Kobject&Kset?1、Sysfs文件系统BTTC2020/5/12嵌入式操作系统嵌入式操作系统10一、Kobject&Kset?1、Sysfs文件系统BTTC2020/5/12嵌入式操作系统嵌入式操作系统11一、Kobject&Kset?1、Sysfs文件系统BTTC2020/5/12嵌入式操作系统嵌入式操作系统12一、Kobject&Kset?2、KobjectBTTC2020/5/12嵌入式操作系统嵌入式操作系统13一、Kobject&Kset?2、KobjectBTTC2020/5/12嵌入式

4、操作系统嵌入式操作系统14一、Kobject&Kset?2、KobjectBTTC2020/5/12嵌入式操作系统嵌入式操作系统15一、Kobject&Kset?Kobject操作BTTC2020/5/12嵌入式操作系统嵌入式操作系统16一、Kobject&Kset?Kobject操作BTTC2020/5/12嵌入式操作系统嵌入式操作系统17一、Kobject&Kset?Struct kobj_typeBTTC2020/5/12嵌入式操作系统嵌入式操作系统18一、Kobject&Kset?Struct attributeBTTC2020/5/12嵌入式操作系统嵌入式操作系统19一、Kobjec

5、t&KsetBTTC2020/5/12嵌入式操作系统嵌入式操作系统20?3、Kset一、Kobject&KsetBTTC2020/5/12嵌入式操作系统嵌入式操作系统21?3、KsetKset、Kobject的关系一、Kobject&KsetBTTC2020/5/12嵌入式操作系统嵌入式操作系统22?Kset操作一、Kobject&KsetBTTC2020/5/12嵌入式操作系统嵌入式操作系统23?4、热插拔事件一、Kobject&KsetBTTC2020/5/12嵌入式操作系统嵌入式操作系统24第3章 总线设备驱动模型一、KObject&KSet二、设备驱动模型提纲三、Platform 驱动

6、模型四、Platform 总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统25?1、设备模型二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统26?总线设备驱动模型最初只是为了让电源管理变得更加容易,但是随着技术的发展不仅让电源管理变得容易而且让设备管理任务变得更加集中。也可以说是无心插柳柳成荫吧,就像当年 UNIX之父为了让UNIX系统具有更好的移植性而把整个系统(最初是用汇编写的)重新用一种新的语言改写,这种语言就是你我现在正在使用的-C语言。既是UNIX之父,又是C语言之父。总线设备驱动模型是驱动的精髓,深入理解了这个模型的涵义你就会感叹写这部

7、分内核代码的人有多牛了。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统27?2、设备模型元素二、设备驱动模型bus driverdeviceBTTC2020/5/12嵌入式操作系统嵌入式操作系统28?几个重要问题二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统29(1)总线二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统30?从分类的角度来说所有这些设备按总线方式可以分为USB总线设备、PCI总线设备等等。每一类设备都有自己的总线,pci_bus_type、scsi_bus_type、usb_bus_type等等。这些不同类的

8、设备相差甚远,那么它们的 match方式也就不一样了,即不同类的设备会有不同的 match方式。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统31?总线描述二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统32?struct bus_type 中我们需要关注:struct kset devices 和 struct kset drivers;bus_type中的这两个成员分别表示这个总线的两条链表:设备链表、驱动链表。通过两个链表可以分别找到该总线下所有的设备和驱动。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统33?总线注册

9、/删除二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统34?总线方法二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统35?总线属性二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统36?总线属性二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统37(2)设备?设备描述二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统38?struct device 中我们需要关注:struct bus_type*bus 和struct device_driver*driverdevice 中的这两个成员分别

10、表示 该设备属于哪个总线以及这个设备的驱动是什么。一个设备绑定一个驱动。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统39?设备注册二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统40?设备属性二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统41?设备属性二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统42(3)驱动?驱动描述二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统43?struct device_driver 中我们需要关注:struct bus_type*bus 和 st

11、ruct klist klist_devicesdevice_driver中的这两个成员分别表示该 驱动属于哪个总线以及这个驱动支持哪些设备。驱动支持的这些设备被加入到驱动自己的链表中。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统44?驱动注册/注销二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统45?驱动属性二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统46?3、总线设备驱动模型匹配规则总线中的两条链表如何形成?系统初始化的时候,会扫描连接了哪些设备,并为每一个设备建立起一个 struct device 的变量,每一次有

12、一个驱动程序,就要准备一个 struct device_driver 结构的变量。把这些变量统统加入相应的链表,device 插入devices 链表,driver 插入drivers 链表。这样通过总线就能找到每一个设备,每一个驱动。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统47二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统48?当设备和驱动分别向内核注册以后,设备出现在总线的设备链表中,驱动出现在总线的驱动链表中。设备和驱动如果只是单独出现是没有任何意义的,也就是说如果只有设备没有相应的驱动,这个设备对我们来说没有意义;如果只有驱动没有设

13、备,这个驱动也起不了任何作用。那么驱动和设备的关系又是怎么样的呢,驱动和设备怎么产生联系呢?二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统49?在热插拔这个名词出现之前,是先有设备后有驱动的。每一个设备在系统上电启动之前就得插在它应该在的位置,然后才能上电启动系统。然后系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个 struct device 结构,并且挂入总线中的devices 链表中来。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统50?然后每一个驱动程序开始初始化,开始注册其struct device_driver 结构,

14、然后它去总线的devices 链表中去寻找(遍历),去寻找每一个还没有绑定driver 的设备,即struct device 中的struct device_driver 指针仍为空的设备,然后它会去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做 device_bind_driver 的函数,然后设备就有了驱动。于是设备把自己的device_driver成员指向那个驱动,而驱动则把这个设备加入到自己的链表。所谓你中有我,我中有你。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统51?在热插拔出现之后,就无所谓谁先谁后了。因为设备可以在任何时刻出现,驱

15、动可以在任何时刻被加载。一旦设备出现,这个设备就会去总线的驱动列表中寻找属于自己的驱动;一旦驱动被加载,它就会去总线的设备列表中寻找被它支持的设备。?无法想象没有热插拔的日子广大男同胞们该怎么活。难道你拿着U盘去同学那儿拷贝电影(什么电影自己想象)还得让他把电脑先关掉让你插上U盘再启动?万一你拷的电影不是你想看的你还得另外拷一部,你同学没被你烦死你自己都想把电脑砸了。二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统52如右图,由linux_dirincludelinuxdevice.h和中可知bus有dev和drv链表,driver有probe成员调用device_add

16、时:.会将device结构体放入bus的device链表.从bus的drv链表取出每一个drv,用bus的match函数判断驱动能否支持这个dev .若支持就调用驱动的probe二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统53BTTC2020/5/12嵌入式操作系统嵌入式操作系统54继续上页的图:调用driver_register时:.会将driver结构体放入bus的driver链表.从bus的dev链表取出每一个dev,用bus的match函数判断dev能否支持这个drv.若支持就调用驱动的probe 问:bus的match如何判断dev支持drv呢?答:在lin

17、ux_dirdriversbasebus.c的driver_helper函数:if(strcmp(name,dev-bus_id)=0)return 1;分析代码知match函数是根据device的bus_id和driver的name是否一致来 匹配的 device_add和driver_register都会两两比较两者的bus_id或name,如果一样就调用driver的probe二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统55BTTC2020/5/12嵌入式操作系统嵌入式操作系统56衍生出的几大总线在LINUX中由BUS衍生出很多总线如,i2c_bus_type,

18、platform_bus_type等,它们的设备和驱动结构都内嵌了device和driver结构体,物理总线上除platform_bus_type是虚构的,其他几个总线都是真实存在的另外几大总线的匹配规则:二、设备驱动模型BTTC2020/5/12嵌入式操作系统嵌入式操作系统57第3章 总线设备驱动模型一、KObject&KSet二、设备驱动模型提纲三、Platform 驱动模型四、Platform 总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统58三、Platform驱动程序?1、Platform总线BTTC2020/5/12嵌入式操作系统嵌入式操作系统59三、Pl

19、atform驱动程序BTTC2020/5/12嵌入式操作系统嵌入式操作系统60三、Platform驱动程序?2、工作流程BTTC2020/5/12嵌入式操作系统嵌入式操作系统61三、Platform驱动程序?3、平台设备(1)平台设备描述BTTC2020/5/12嵌入式操作系统嵌入式操作系统62三、Platform驱动程序BTTC2020/5/12嵌入式操作系统嵌入式操作系统63三、Platform驱动程序?3、平台设备(2)平台设备注册BTTC2020/5/12嵌入式操作系统嵌入式操作系统64三、Platform驱动程序?3、平台设备(3)设备资源BTTC2020/5/12嵌入式操作系统嵌入

20、式操作系统65三、Platform驱动程序?设备资源例BTTC2020/5/12嵌入式操作系统嵌入式操作系统66三、Platform驱动程序?4、平台驱动(1)平台驱动描述BTTC2020/5/12嵌入式操作系统嵌入式操作系统67三、Platform驱动程序?4、平台驱动(1)平台驱动注册BTTC2020/5/12嵌入式操作系统嵌入式操作系统68三、Platform驱动程序?4、平台驱动(2)获取资源BTTC2020/5/12嵌入式操作系统嵌入式操作系统69?总线设备驱动模型的意义不是一两句话就能够概括的。首先,总线设备模型是电源管理的基础,这里牵涉到suspend的一些概念不做深入;其次,总

21、线设备模型将硬件与软件分离开来,因此硬件的差异性对上层来说是看不到的,我们需要做的就是告诉内核我的设备跟别人的有什么不同。很多具体的模型甚至提供了完整的读写等一些与设备交互的函数。这些工作的完成大大的减少了我们的工作量,驱动工作人员要完成的工作越来越少,更多的人可以专注于应用,这也就意味着开发周期的缩短,对于厂商来说周期的缩短意味着产品的更快上市也就意味着迅速抢占市场。因此我们要充分利用好内核源码。三、Platform驱动程序BTTC2020/5/12嵌入式操作系统嵌入式操作系统70?我所讲的内容绝大部分来自于韦东山的视频及配套教材,我只讲了一些我认为重要的细节,还有很多内容由于篇幅和水平的原

22、因没有讲,比如说设备具体是如何添加到总线的设备链表、驱动又是如何添加到总线的驱动链表、设备和驱动具体是如何match的等等。想把这个模型完全搞懂非一日之功,需要长期的积累。三、Platform驱动程序BTTC2020/5/12嵌入式操作系统嵌入式操作系统71第3章 总线设备驱动模型一、KObject&KSet二、设备驱动模型提纲三、Platform 驱动模型四、Platform 总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统72?1、大概思路:本例是点亮板上任意一个led,根据总线设备模型,这需要两个文件 led_dev.c和led_drv.c,led_dev.c 主

23、要负责硬件相关代码,如提供管脚接LED的GPIO地址,而led_drv.c主要负责获得设备文件提供的资源来构造文件操作集合fops 四、Platform总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统73?2、为platform_device 提供资源四、Platform总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统74?3、分配/设置platform_device四、Platform总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统75?在led_drv.c里:分配/设置platform_driver咋眼一看,很简单,重

24、点是led_probe和led_remove,可以在probe函数做任何事情,基于此例,我们在probe函数中:获取设备资源ioremap;注册字符设备,提供读写函数;四、Platform总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统76?细说led_probe:四、Platform总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统77?接着细说led_probe:如听众所想,注册字符设备很简单,这个时候应该都会了,-_-若还不会,那你对不起我 我也对不起你了,关键是设置led_fops四、Platform总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统78?设置led_fops四、Platform总线设备驱动之点灯BTTC2020/5/12嵌入式操作系统嵌入式操作系统79?细说被应用程序write调用的led_write:四、Platform总线设备驱动之点灯

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第3章-总线设备驱动模型课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|