预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共11页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux系统下USB驱动程序的设计与开发 Linux系统下USB驱动程序的设计与开发论文导读::操作系统是一个源码公开、结构清晰、功能强大。总线具有低成本、使用简单、支持即插即用、易于扩展等特点。本文首先介绍linux驱动程序的架构。关键词:Linux,USB,驱动程序0引言Linux操作系统是一个源码公开、结构清晰、功能强大,且已成为一个稳定可靠功能完善的系统。其开发群体的有效组织和高效工作,使得linux系统稳定发展并得到良好维护。USB总线是Intel、DEC、MicroSoft、IBM等公司联合提出的一种新的串行总线标准,主要用于PC机与外围设备的互联。USB总线具有低成本、使用简单、支持即插即用、易于扩展等特点,已被广泛地用在PC机及嵌入式系统上。在已经研制的家庭网关中,CPU通过自带的USB接口控制USB设备。本文首先介绍linux驱动程序的架构发表论文,然后介绍USB总线,重点说明USB驱动程序的实现。1.Linux驱动程序基础设备驱动程序是操作系统内核和机器硬件之间的接口,为应用程序屏蔽了硬件的细节。应用程序看待硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它主要完成以下功能:对设备进行初始化,使设备投入运行和退出服务;把数据从内核传送到设备和从设备接受数据;以及检测和处理设备出现的错误等。Linux系统的设备一般分为字符设备、块设备和网络设备三种。字符设备是指存取时没有缓存的设备。块设备的读写都有缓存来支持,并且块设备必须能够随机存取,字符设备则没有这个要求。一个文件系统要安装进入操作系统必须在块设备上。网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSDunix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk—buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。2.USB系统总线介绍每一个USB设备会有一个或者多个的逻辑连接点,每个连接点叫端口。每个端口有4种数据传送方式:控制方式;等时方式;中断方式和大量方式。但是所有的端口0都是被用来传送配置和控制信息。在主机和设备的端口之间的连接叫作管道,与端口0连接的一般称作为缺省管道。对于同样性质的一组端口的组合叫做接口发表论文,如果一个设备包含不止一个的接口就可以称之为复合设备。同理,对于同样的类型的接口的组合可以称之为配置。但是每次只能有一个配置是可用的,而一旦该配置激活,里面的接口和端口就都同时可以使用。主机从设备发过来的描述符中来判断用的是哪个配置,哪个接口等等,而这些的描述字通常是在端口0中传送。3.USB子系统USB是一种分层的总线结构,并且是由一个主机(host)来控制。主机用主/副协议来和外部USB设备通讯。USB上的通讯主要是两个方向进行的,一个是主机到设备的下行方向,一个是设备到主机的上行方向,不支持设备间的直接通讯。依靠不同的设备类型,主要有4种的传输方式::控制(control)、中断(interrupt)、同步(isochronous)、数据块(bulk);如果是从硬件开始来设计整个的系统,还要正确选择传输的方式。而作为一个驱动程序的书写者就只需要弄清楚他是采用的什么工作方式就行了。通常所有的传输方式下的主动权都在host边。在Linux系统中编写主机部分的USB驱动发表论文,我们不必了解太多的硬件知识,因为Linux内核模块中提供了一块USB内核(USBcore),它给出专门的API来支持USB设备和主控制器。通过定义一系列数据结构,宏命令和函数对所有的硬件和设备支持部分进行抽象。USB内核包含了所有USB设备驱动和主控制器驱动的共同的USB程序。这些函数主要集中在上层和底层API。如图1所示,有一个USB设备的驱动的API和一个主控制器的.驱动。图1USB内核API层4.USB设备驱动框架USB设备驱动在内核模块中需要注册和注销。因此一个驱动必须注册2个入口点和一个设备节点。对于特别的USB设备(他们不适合在子系统中注册)一个驱动可以注册一对文件操作符和一个次设备号。一般一个驱动可以服务16个相似的USB设备。几乎所有的USB设备主设备号都是180。4.1框架数据结构所有的USB相关的函数和数据结构的名字都是以USB_开头的。下面给出在子系统中注册一个USB驱动程序的数据结构。structusb_driver{constchar*name;//模块的名字void*(*probe)(structusb_device*,unsignedint);//函数的进入指针void(*disconnect)(structusb_device*,void*);//撤销连接的函数进入指针structlis