LINUX 设备驱动概述.ppt

上传人:b****2 文档编号:2638505 上传时间:2022-11-04 格式:PPT 页数:41 大小:644KB
下载 相关 举报
LINUX 设备驱动概述.ppt_第1页
第1页 / 共41页
LINUX 设备驱动概述.ppt_第2页
第2页 / 共41页
LINUX 设备驱动概述.ppt_第3页
第3页 / 共41页
LINUX 设备驱动概述.ppt_第4页
第4页 / 共41页
LINUX 设备驱动概述.ppt_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

LINUX 设备驱动概述.ppt

《LINUX 设备驱动概述.ppt》由会员分享,可在线阅读,更多相关《LINUX 设备驱动概述.ppt(41页珍藏版)》请在冰豆网上搜索。

LINUX 设备驱动概述.ppt

1LINUXLINUX设备驱动设备驱动概述概述2博创科技博创科技嵌入互动嵌入互动内容摘要设备驱动程序概述设备驱动程序的一般接口添加设备驱动程序的一般方法设备驱动程序的加载与使用3博创科技博创科技嵌入互动嵌入互动设备驱动程序基本概念-软件系统流程设备驱动程序概述4博创科技博创科技嵌入互动嵌入互动设备驱动程序基本概念-驱动程序作用l设备驱动程序将复杂的硬件抽象成一个结构良好的设备,并通过提供统一的程序接口为系统的其它部分提供使用设备的能力和方法。

l设备驱动程序(应该只是)为系统的其它部分提供各种使用设备的能力,使用设备的方法应该由应用程序决定。

设备驱动程序概述5博创科技博创科技嵌入互动嵌入互动lLinux下对外设的访问只能通过驱动程序lLinux对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序:

Open、Release、read、write、ioctll驱动程序是内核的一部分,可以使用中断、DMA等操作l驱动程序需要在用户态和内核态之间传递数据设备驱动程序基本概念设备驱动程序概述6博创科技博创科技嵌入互动嵌入互动设备驱动程序基本概念l驱动程序与应用程序的区别1、应用程序以main函数开始,驱动程序则没用main函数。

它以特殊的模块初始化函数为入口。

2、应用程序从头至尾执行一个任务,驱动程序在完成初始化后,等待系统调用。

3、应用程序可以使用GLIBC等标准C函数库,驱动程序不能使用标准C函数库。

设备驱动程序概述7博创科技博创科技嵌入互动嵌入互动设备驱动程序的分类l字符设备驱动程序l各种串行接口,并行接口等。

l块设备驱动程序l磁盘设备等l网络设备驱动程序l网卡等。

l杂项设备驱动程序l不属于上述三种设备之外的一些设备,如SCSI,时钟等。

设备驱动程序概述8博创科技博创科技嵌入互动嵌入互动驱动程序在操作系统中的位置l设备驱动程序是内核代码的一部分。

l驱动程序的地址空间是内核的地址空间。

l驱动程序的代码直接对设备硬件(实际是设备的各种寄存器)进行控制(实际就是读写操作)。

l应用程序通过操作系统的系统调用执行相应的驱动程序函数。

中断则直接执行相应的中断程序代码。

l设备驱动程序的file_operations结构体的地址被注册到内核中的设备链表中。

l块设备和字符设备以设备文件的方式建立在文件系统中的/dev目录下,而且每个设备都有一个主设备号和一个次设备号。

设备驱动程序概述9博创科技博创科技嵌入互动嵌入互动驱动程序在操作系统中的位置设备驱动程序概述10博创科技博创科技嵌入互动嵌入互动主设备号和次设备号l主设备号标识设备对应的驱动程序l一个驱动程序可以控制若干个设备,次设备号提供了一种区分它们的方法l系统增加一个驱动程序就要赋予它一个主设备号。

这一赋值过程在驱动程序的初始化过程中intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name);设备驱动程序概述11博创科技博创科技嵌入互动嵌入互动主设备号和次设备号在/dev目录下使用ll命令(ls-l)可以查看各个设备的设备类型、主从设备号等设备驱动程序概述12博创科技博创科技嵌入互动嵌入互动创建设备节点l设备已经注册到内核表中,对于设备的访问通过设备文件(设备文件与设备驱动程序的主设备号匹配),内核会调用驱动程序中的正确函数l给程序一个它们可以请求设备驱动程序的名字。

这个名字必须插入到/dev目录中,并与驱动程序的主设备号和次设备号相连l使用mknod在文件系统上创建一个设备节点mknoddev_namedriver_typemajorminor设备驱动程序概述13博创科技博创科技嵌入互动嵌入互动创建设备节点设备驱动程序概述14博创科技博创科技嵌入互动嵌入互动动态分配设备号l在Documentation/device.txt文件中可以找到已经静态分配给大部分设备的列表l由于许多数字已经分配了,为新设备选择一个唯一的号码是很困难的.如果调用alloc_chrdev_region函数,内核会动态为设备分配一个可用的设备编号lintalloc_chrdev_region(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*name);设备驱动程序概述15博创科技博创科技嵌入互动嵌入互动动态分配的问题动态分配的主设备号不能保证总是一样的,无法事先创建设备节点l可以从/proc/devices读取cat/proc/devicesl利用脚本动态创建设备文件节点设备驱动程序概述16博创科技博创科技嵌入互动嵌入互动设备管理的问题如今,Linux支持很多不同种类的硬件。

这意味着/dev中都有数百个特殊文件来表示所有这些设备。

而且,这些特殊文件中大多数甚至不会映射到系统中存在的设备上设备驱动程序概述17博创科技博创科技嵌入互动嵌入互动使用devfsl在Linux2.4的内核里引入了devfs来解决linux下设备文件管理的问题l在驱动程序中通过devfs_register()函数创建设备文件系统的节点l系统启动的时候mount设备文件系统l所有需要的设备节点都由内核自动管理。

/dev目录下只有挂载的设备设备驱动程序概述18博创科技博创科技嵌入互动嵌入互动Linux2.6内核与udevlLinux2.6内核引入了sysfs文件系统为每个系统的硬件树进行分级处理lDevfs在Linux2.6中被标记为舍弃的特性(在Linux2.6.15及以后的版本则取消了对它的支持),而使用udev。

l维护动态设备l从sysfs获得的信息,可以提供对特定设备的固定设备名。

对于热插拔的设备,这尤其重要ludev是在用户空间的脚本文件,这很容易被编辑和修改l可以和hotplug脚本配合使用l为了保证旧应用程序的兼容性,在嵌入式系统中,是用devfs还是一个好方法。

即使在Linux2.6.15内核以后,也可以通过ndevfs(nanodevfs)补丁提供对devfs特性的兼容。

设备驱动程序概述19博创科技博创科技嵌入互动嵌入互动在Linux2.6内核中使用udevl建议,在2.6.15以后的版本中使用udevl使用ramfs作为udev的载体mounttramfsnone/devludev使用的规则集位于/etc/udev/*ludev的官方地址:

http:

/www.kernel.org/pub/linux/utils/kernel/hotplug/udev.htmll参考文章:

Writingudevrules设备驱动程序概述20博创科技博创科技嵌入互动嵌入互动设备的注册lLinux内核针对不同类型的设备提供了不同的设备注册方法和相关函数。

只有向内核注册成功的设备,才可以使用内核资源正确驱动硬件设备。

lLinux内核使用区分的设备链表来维护不同的设备驱动程序。

l字符设备的注册内核在内部使用类型structcdev的结构来代表字符设备,使用cdev_alloc()函数来为该结构分配空间。

structcdev*my_cdev=cdev_alloc();设备驱动程序概述21博创科技博创科技嵌入互动嵌入互动设备的注册l初始化cdev结构设备voidcdev_init(structcdev*cdev,structfile_operations*fops);l向内核添加cdev结构设备intcdev_add(structcdev*dev,dev_tnum,unsignedintcount);l从内核去除cdev结构设备voidcdev_del(structcdev*dev);设备驱动程序概述22博创科技博创科技嵌入互动嵌入互动设备驱动程序的接口通常所说的设备驱动程序接口是指结构file_operations,它定义在include/linux/fs.h中。

structfile_operationsstructmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatasync);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lock*);ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);unsignedlong(*get_unmapped_area)(structfile*,unsignedlong,unsignedlong,unsignedlong,unsignedlong);设备驱动程序的一般接口23博创科技博创科技嵌入互动嵌入互动file_operations结构体l主要包括:

open,close(或者release),read,write,ioctl,poll,mmap等l结构体file_operations定义的结构体变量将作为一个参数在注册一个设备驱动程序时传递给内核。

l内核使用设备链表维护各种注册的设备。

不同类型的设备使用不同的链表。

设备驱动程序的一般接口24博创科技博创科技嵌入互动嵌入互动file_operations结构体structfile_operationsdemo_fops=完成了将驱动函数映射为标准接口。

例如:

staticstructfile_operationsdemo_fops=owner:

THIS_MODULE,write:

demo_write,read:

demo_read,ioctl:

demo_ioctl,open:

demo_open,release:

demo_release,;l上面的这种特殊表示方法不是标准C的语法,这是GNU编译器的一种特殊扩展,它使用名字对进行结构字段的初始化,它的好处体现在结构清晰,易于理解,并且避免了结构发生变化带来的许多问题。

设备驱动程序的一般接口25博创科技博创科技嵌入互动嵌入互动设备驱动程序的接口lOpen接口:

int(*open)(structinode*inode,structfile*filp);open方法提供给驱动来做任何的初始化来准备后续的操作.在大部分驱动中,open应当进行下面的工作:

l检查特定设备错误。

l如果设备是首次打开,则对其进行初始化。

l识别次设备号,如有必要修改f_

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

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1