如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第十三章USB驱动程序通用串行总线(USB)是主机和外围设备之间的一种连接。USB最初是为了替代许多不同的低速总线(包括并行、串行和键盘连接)而设计的,它以单一类型的总线连接各种不同类型的设备(注1)。USB的发展已经超越了这些低速的连接方式,它现在可以支持几乎所有可以连接到PC上的设备。最新的USB规范修订增加了理论上高达480Mbps的高速连接。从拓扑上来看,一个USB子系统并不是以总线的方式来布置的;它是一棵由几个点对点的连接构建而成的树。这些连接是连接设备和集线器(hub)的四线电缆(地线、电源线和两根信号线),这和以太网双绞线类似。USB主控制器(hostcontroller)负责询问每一个USB设备是否有数据需要发送。因为这种拓扑布局的原因,一个USB设备在没有主控制器要求的情况下是不能发送数据的。这种配置便于搭建一个非常简易的即插即用类型的系统,藉此,设备可以由主机自动地配置。USB总线在技术层面上是非常简单的,因为它是一个单主方式的实现,在此方式下,主机轮询各种不同的外围设备。尽管存在这种内在的局限性,USB总线有一些吸引人的特性,例如设备具有要求一个固定的数据传输带宽的能力,以可靠地支持视频和音频I/O。USB另一个重要的特性是它只担当设备和主控制器之间通信通道的角色,对它所发送的数据没有任何特殊的内容和结构上的要求(注2)。USB协议规范定义了一套任何特定类型的设备都可以遵循的标准。如果一个设备遵循该标准,就不需要一个特殊的驱动程序。这些不同的特定类型称为类(class),包括存储注1:本章部分内容基于Linux内核USB代码的内核文档,这些文档由内核的USB开发者编写,并且按照GPL条款发布。注2:实际上,还是存在一些结构,但通常被降低为满足某几个预定义类之一的通信需求:例如,键盘不需要分配带宽,而某些摄像头需要。324USB驱动程序325设备、键盘、鼠标、游戏杆、网络设备和调制解调器。对于不符合这些类的其他类型的设备,需要针对特定的设备编写一个特定于供货商的驱动程序。视频设备和USB到串口转换设备是一个很好的例子,对于它们没有已定义的标准,来自不同制造商的每一种不同的设备都需要对应的驱动程序。这些特性,加上设计上与生俱来的热插拔能力,使得USB成为一个便利和低成本的机制,它可以连接多个设备到计算机,而不需要关闭系统、打开机箱、拧螺丝钉和插拔电线。Linux内核支持两种主要类型的USB驱动程序:宿主(host)系统上的驱动程序和设备(device)上的驱动程序。从宿主的观点来看(一个普通的USB宿主是一个桌面计算机),宿主系统的USB驱动程序控制插入其中的USB设备,而USB设备的驱动程序控制该设备如何作为一个USB设备和主机通信。由于术语“USB设备驱动程序”(USBdevicedrivers)非常易于混淆,USB开发者创建了术语“USB器件驱动程序”(USBgadgetdrivers)来描述控制连接到计算机(不要忘了Linux还运行于很多小型嵌入式设备上)的USB设备的驱动程序。本章将详细介绍运行于桌面计算机上的USB系统是如何运作的。USB器件驱动程序此刻还未列入本书的内容范围。如图13-1所示,USB驱动程序存在于不同的内核子系统(块设备、网络设备、字符设备等等)和USB硬件控制器之中。USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,而不必考虑系统当前存在的各种不同类型的USB硬件控制器。用户VFS块网络字符TTY...层设备层设备层设备层层内核USB设备驱动程序USB核心USB主控制器硬件图13-1:USB驱动程序概观326第十三章USB设备基础USB设备是一个非常复杂的东西,官方USB文档(可由http://www.usb.org获取)中有详细的描述。幸运的是,Linux内核提供了一个称为USB核心(USBcore)的子系统来处理大部分的复杂性。本章描述驱动程序和USB核心之间的接口。图13-2展示了USB设备的构成,包括配置、接口和端点,以及USB驱动程序如何绑定到USB接口上,而不是整个USB设备。DeviceInterfaceUSBdriverConfigEndpointEndpointEndpointInterfaceUSBdriverEndpointEndpointEndpoint图13-2:USB设备概观端点USB通信最基本的形式是通过一个名为端点(endpoint)的东西。USB端点只能往一个方向传送数据,从主机到设备(称为输出端点)或者从设备到主机(