收藏 分享(赏)

USB开发基础.doc

上传人:hskm5268 文档编号:6854508 上传时间:2019-04-24 格式:DOC 页数:77 大小:1.84MB
下载 相关 举报
USB开发基础.doc_第1页
第1页 / 共77页
USB开发基础.doc_第2页
第2页 / 共77页
USB开发基础.doc_第3页
第3页 / 共77页
USB开发基础.doc_第4页
第4页 / 共77页
USB开发基础.doc_第5页
第5页 / 共77页
点击查看更多>>
资源描述

1、USB 开发基础USB 命令(请求)和 USB 描述符 一、USB 命令在 USB 规范里,对命令一词提供的单词为“Request”,但这里为了更好的理解主机与设备之间的主从关系,将它定义成“命令”。所有的 USB 设备都要求对主机发给自己的控制命令作出响应,USB 规范定义了 11 个标准命令,它们分别是:Clear_Feature、Get_Configuration、Get_Descriptor、 Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、 Set_Interface、 Set_Feature

2、、Synch_Frame。所有 USB 设备都必须支持这些命令(个别命令除外,如Set_Descriptor、Synch_Frame)。不同的命令虽然有不同的数据和使用目的,但所有的 USB 命令结构是一样的。下表所示为 USB命令的结构: 表 1、USB 命令的结构偏移量 域 长度(字节) 值 描述0 bmRequestType 1 位图请求特征:D7:传输方向 0=主机至设备 1=设备至主机 D65:种类 0=标准 1=类 2=厂商 3=保留 D40:接受者 0=设备 1=接口 2=端点 3=其他 431 保留1 bRequest 1 值 命令类型编码值(见表 3)2 wValue 2 值

3、 根据不同的命令,含义 也不同4 wIndex 2索引或偏移根据不同的命令,含义也不同,主要用于传送索引或偏 移6 wLength 2 如有数据传送阶段,此 为数据字节数。下表列出了 USB 的 11 种标准命令表 2、 USB 的 11 种标准命令命令bmRequestTypebRequest wValuewIndexwLengthDataClear_Feature00000000B00000001B00000010BCLEAR_FEATURE 特性选择符零 接口号端点号零 无Get_Configuration 10000000B GET_CONFIGURATION零 零 一 配置值Get_

4、Descriptor 10000000B GET_DESCRIPTOR描述表种类 (高字节,见表5)和索引(低字节)零或语言标志描述表长描述表Get_Interface10000001B GET_INTERFACE 零 接口号 一 可选设置Get_Status10000000B10000001B10000010BGET_STATUS 零 零(返回设备状态)接口号(对像时接口时)端点号(对象是端点时)二 设备,接口 ,或 端点状态Set_Address00000000B SET_ADDRESS 设备地址零 零 无Set_Configuration 00000000B SET_CONFIGURAT

5、ION配置值(高字节为 0,低字节表示要零 零 无设置的配置值)Set_Descriptor 00000000B SET_DESCRIPTOR描述表种类(高字节,见表5)和索引(低字节)零或语言标志描述表长描述表Set_Feature00000000B00000001B00000010BSET_FEATURE 特性选择符(1表示设备,0 表示端点)零 接口号端点号零 无Set_Interface00000001B SET_INTERFACE 可选设置接口号 零 无Synch_Frame100000010B SYNCH_FRAME 零 端点号 二 帧号其中 bRequest 为命令编码值,含意见

6、表 3:表 3、USB 标准命令的编码值bRequest ValueGET_STATUS 0CLEAR_FEATURE 1为将来保留 2SET_FEATURE 3为将来保留 4SET_ADDRESS 5GET_DESCRIPTOR 6SET_DESCRIPTOR 7GET_CONFIGURATION 8SET_CONFIGURATION 9GET_INTERFACE 10SET_INTERFACE 11SYNCH_FRAME 12二、USB 描述符USB 协议为 USB 设备定义了一套描述设备功能和属性的有固定结构的描述符,包括标准的描述符即设备描述符、配置描述符、接口描述符、端点描述符和字符

7、串描述符,还有百标准描述符,如类描述符。USB 设备通过这些描述符向 USB 主机汇报设备的各种各样属性,主机通过对这些描述符的访问对设备进行类型识别、配置并为其提供相应的客户端驱动程序。USB 设备通过描述符反映自己的设备特性。USB 描述符是由特定格式排列的一组数据结构组成。在 USB 设备枚举过程中,主机端的协义软件需要解析从 USB 设备读取的所有描述符信息。在USB 主向设备发送读取描述符的请求后,USB 设备将所有的描述符以连续的数据流方式传输给USB 主机。主机从第一个读到的字符开始,根据双方规定好的数据格式,顺序地解析读到的数据流。USB 描述符包含标准描述符、类描述符和厂商特

8、定描述种形式。任何一种设备必须 USB 标准描述符(队字符串描述符可选外)。在 USB1.X 中,规定了 5 种标准描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。每个 USB 设备只有一个设备描述符,而一个设备中可包含一个或多个配置描述符,即 USB 设备可以有多种配置。设备的每一个配置中又可以包含一个或多个接口描述符,即 USB 设备可以支持多种功能(接口)

9、,接口的特性通过描述符提供。在 USB 主机访问 USB 设备的描述符时,USB 设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。一设备至少要包含设备描述符、配置描述符和接口描述符,如果 USB 设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。、设备描述符设备描述符给出了 USB 设备的一般信息,包括对设备及在设备配置中起全程作用的信息,包括制造商标识号 ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描述符的个数等。一个 USB 设备必须有且仅有一个设备描述符。设备描述符是设备连接到总线上时 USB 主机所读取的第一个描述符,

10、它包含了 14 个字段,结构如下:表 4、USB 设备描述符的结构偏移量 域 大小值 描述0 bLength 1 数字 此描述表的字节数1 bDecriptorType 1 常量 描述符的类型(此处应为 0x01,即设备描述符)2 bcdUSB 2 BCD码此设备与描述表兼容的 USB 设备说明版本号(BCD 码)4 bDeviceClass 1 类 设备类码:如果此域的值为 0 则一个设置下每个接口指出它自己的类,各个接口各自独立工作。 如果此域的值处于 1FEH 之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了这些接口集体的类定义。如果此域设为 FFH,则此设

11、备的类由厂商定义。5 bDeviceSubClass 1 子类 子类挖码 这些码值的具体含义根据bDeviceClass 域来看。 如 bDeviceClass 域为零,此域也须为零 如 bDeviceClass 域为 FFH,此域的所有值保留。6 bDevicePortocol 1 协议 协议码 这些码的值视 bDeviceClass 和 bDeviceSubClass 的值而定。 如果设备支持设备类相关的协议,此码标志了设备类的值。如果此域的值为零,则此设备不支持设备类相关的协议,然而,可能它的接口支持设备类相关的协议。如果此域的值为 FFH,此设备使用厂商定义的协议。7 bMaxPack

12、etSize0 1 数字 端点 0 的最大包大小(仅8,16,32,64为合法值)8 idVendor 2 ID 厂商标志(由 USB-IF 组织赋值)10 idProduct 2 ID 产品标志(由厂商赋值)12 bcdDevice 2 BCD 码设备发行号(BCD 码)14 iManufacturer 1 索引 描述厂商信息的字符串描述符的索引值。15 iProduct 1 索引 描述产品信息的字串描述符的索引值。16 iSerialNumber1索引 描述设备序列号信息的字串描述符的索引值。17 bNumConfigurations 1 数字 可能的配置描述符数目其中 bDescript

13、orType 为描述符的类型,其含义可查下表(此表也适用于标准命令Get_Descriptor 中 wValue 域高字节的取值含义):表 5、USB 描述符的类型值类型 描述符 描述符值设备描述符(Device Descriptor) 0x01配置描述符(Configuration Descriptor) 0x02字符串描述符(String Descriptor) 0x03接口描述符(Interface Descriptor) 0x04标准描述符端点描述符(EndPont Descriptor) 0x05集线器类描述符( Hub Descriptor) 0x29类描述符人机接口类描述符(HI

14、D) 0x21厂商定义的描述符 0xFF设备类代码 bDeviceClass 可查下表:表 6、设备的类别(bDeviceClass)值(十进制) 值(十六进制) 说明0 0x00 接口描述符中提供类的值2 0x02 通信类9 0x09 集线器类220 0xDC 用于诊断用途的设备类224 0xE0 无线通信设备类255 0xFF 厂商定义的设备类下表列出了一个 USB 鼠标的设备描述符的例子,供大家分析一下:表 7、一种鼠标的设备描述符示例字段 描述符值(十六制)bLength 0x12bDecriptorType 0x01bcdUSB x0110bDeviceClass 0x00bDevi

15、ceSubClass 0x00bDevicePortocol 0x00bMaxPacketSize0 0x08idVendor 0x045E(Microsoft Corporation)idProduct 0x0047bcdDevice 0x300iManufacturer 0x01iProduct 0x03iSerialNumber 0x00bNumConfigurations 0x012、配置描述符配置描述符中包括了描述符的长度(属于此描述符的所有接口描述符和端点描述符的长度的和)、供电方式(自供电/总线供电)、最大耗电量等。主果主机发出 USB 标准命令 Get_Descriptor 要

16、求得到设备的某个配置描述符,那么除了此配置描述符以外,此配置包含的所有接口描述符与端点描述符都将提供给 USB 主机。表 8、USB 配置描述符的结构偏移量 域 大小 值 描述0 bLength 1 数字 此描述表的字节数长度。1 bDescriptorType 1 常量 配置描述表类型(此处为0x02)2 wTotalLength 2 数字 此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述符)4 bNumInterfaces 1 数字 此配置所支持的接口个数5 bCongfigurationValue 1 数字 在 SetConfiguration()请求中用作参数来选定此配置

17、。6 iConfiguration 1 索引 描述此配置的字串描述表索引7 bmAttributes 1 位图 配置特性: D7: 保留(设为一) D6: 自给电源 D5: 远程唤醒 D40:保留(设为一) 一个既用总线电源又有自给电源的设备会在 MaxPower 域指出需要从总线取的电量。并设置 D6 为一。运行时期的实际电源模式可由GetStatus(DEVICE) 请求得到。8 MaxPower 1 mA 在此配置下的总线电源耗费量。以 2mA 为一个单位。下面是一种硬盘的配置描述符示例:表 9、一种硬盘的配置描述符示例字段 描述符值(十六进制)bLength 0x09bDescript

18、orType 0x02wTotalLength 0x01FbNumInterfaces 0x01bCongfigurationValue 0x01iConfiguration 0x00bmAttributes 0x0CMaxPower 0x323、接口描述符配置描述符中包含了一个或多个接口描述符,这里的“接口”并不是指物理存在的接口,在这里把它称之为“功能”更易理解些,例如一个设备既有录音的功能又有扬声器的功能,则这个设备至少就有两个 “接口”。如果一个配置描述符不止支持一个接口描述符,并且每个接口描述符都有一个或多个端点描述符,那么在响应 USB 主机的配置描述符命令时,USB设备的端点描述

19、符总是紧跟着相关的接口描述符后面,作为配置描述符的一部分被返回。接口描述符不可直接用 Set_Descriptor 和 Get_Descriptor来存取。如果一个接口仅使用端点 0,则接口描述符以后就不再返回端点描述符,并且此接口表现的是一个控制接口的特性,它使用与端点 0 相关联的默认管道进行数据传输。在这种情况下bNumberEndpoints 域应被设置成 0。接口描述符在说明端点个数并不把端点 0 计算在内。表 10、USB 接口描述符的结构偏移量 域 大小 值 说明0 bLength 1 数字 此表的字节数1 bDescriptorType 1 常量 接口描述表类(此处应为 0x0

20、4)2 bInterfaceNumber 1 数字 接口号,当前配置支持的接口数组索引(从零开始)。3 bAlternateSetting 1 数字 可选设置的索引值。4 bNumEndpoints 1 数字 此接口用的端点数量,如果是零则说明此接口只用缺省控制管道。5 bInterfaceClass 1 类 接口所属的类值: 零值为将来的标准保留。如果此域的值设为FFH,则此接口类由厂商说明。 所有其它的值由 USB 说明保留。6 bInterfaceSubClass 1 子类 子类码 这些值的定义视bInterfaceClass 域而定。如果 bInterfaceClass域的值为零则此域

21、的值必须为零。 bInterfaceClass 域不为 FFH 则所有值由USB 所保留。7 bInterfaceProtocol 1 协议 协议码:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一个接口支持设备类相关的请求此域的值指出了设备类说明中所定义的协议.8 iInterface 1 索引 描述此接口的字串描述表的索引值。对于 bInterfaceClass 字段,表示接口所属的类别,USB 协议根据功能将不同的接口划分成不的类,其具体含义如下表所示:表 11、USB 协议定义的接口类别(bInterfaceClass )值(十六进制) 类别0

22、x01 音频类0x02 CDC 控制类0x03 人机接口类(HID )0x05 物理类0x06 图像类0x07 打印机类0x08 大数据存储类0x09 集线器类0x0A CDC 数据类0x0B 智能卡类0x0D 安全类0xDC 诊断设备类0xE0 无线控制器类0xFE 特定应用类(包括红外的桥接器等)0xFF 厂商定义的设备4、端点描述符端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点 0(控制端点,一般一个设备只有一个控制端点)为双向端口外,其它均为单向。端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。除了描述符中描述的端点外,每个设备必须要有

23、一个默认的控制型端点,地址为 0,它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它来配置设备。表 12、USB 端点描述符的结构偏移量 域 大小 值 说明0 bLength 1 数字 此描述表的字节数长度1 bDescriptorType 1 常量 端点描述表类(此处应为 0x05)2 bEndpointAddress 1 端点此描述表所描述的端点的地址、方向: Bit 30 : 端点号.Bit 64 : 保留, 为零 Bit 7: 方向,如果控制端点则略。0:输出端点(主机到设备) 1:输入端

24、点(设备到主机)3 bmAttributes 1 位图此域的值描述的是在bConfigurationValue 域所指的配置下端点的特性。 Bit 10 :传送类型 00=控制传送 01=同步传送 10=批传送 11=中断传送 所有其它的位都保留。4 wMaxPacketSize 2 数字当前配置下此端点能够接收或发送的最大数据包的大小。 对于实进传输,此值用于为每帧的数据净负荷预留时间。在实际运行时,管道可能不完全需要预留的带宽,实际带宽可由设备通过一种非 USB 定义的机制汇报给主机。对于中断传输,批量传输和控制传输,端点可能发送比之短的数据包6 bInterval 1 数字周期数据传输端

25、点的时间间隙。 此域的值对于批传送的端点及控制传送的端点无意义。对于同步传送的端点此域必需为 1,表示周期为 1ms。对于中断传送的端点此域值的范围为 1ms 到255ms。下表是一种鼠标的端点描述符的示例,该端点是一个中断端点:表 13、一种鼠标的端点描述符示例域 值(十六进制)bLength 0x07bDescriptorType 0x05bEndpointAddress 0x81bmAttributes 0x03wMaxPacketSize 0x04bInterval 0x0A5、字符串描述符字符串描述符是一种可选的 USB 标准描述符,描述了如制商、设备名称或序列号等信息。如果一个设备

26、无字符串描述符,则其它描述符中与字符串有关的索引值都必须为 0。字符串使用的是Unicode 编码。主机请示得到某个字符串描述符时一般分成两步:首先主机向设备发出 USB 标准命令Get_Descriptor,其中所使用的字符串的索引值为 0,设备返回一个字符串描述符,此描述符的结构如下:表 14、USB 字符串描述符(响应主机请求时返回的表示语言 ID 的字符串描述符)偏移量 域 大小 值 描述0 bLength 1 N+2 此描述表的字节数1 bDescriptorType 1 常量 字串描述表类型(此处应为 0x03)2 wLANGID0 2 数字 语言标识(LANGID) 码 0 N

27、wLANGIDx 2 数字 语言标识(LANGID) 码 X该字符串描述符双字节的语言 ID 的数组,wLANGID0wLANGIDx指明了设备支持的语言,具体含义可查看 USB_LANGIDs.pdf。主机根据自己需要的语言,再次向设备发出USB 标准命令 Get_Descriptor,指明所要求得到的字符串的索引值和语言。这次设备所返回的是Unicode 编号的字符串描述符,其结构如下:表 15、Unicode 字符串描述符(响应主机请求时真正表示字符串编码的字符串描述符)偏移量 域 大小 值 描述0 bLength 1 数字 此描述表的字节数(bString 域的数值 N2 )1 bDe

28、scriptorType 1 常量 字串描述表类型(此处应为0x03)2 bString N 数字 UNICODE 编码的字串bString 域为设备实际返回的以 UNICODE 编码的字符串流,我们在编写设备端硬件驱动的时候需要将字符串转换为 UNICODE 编码,您可以通过一些 UNICODE 转换工具进行转换。这里推荐由百合电子工作室开发的一款 USB 描述符生成工具“USB Unicode 字符串描述符生成器” ,它专门为编写设备端驱动程序的需要而定制,可以非常方便将您需要的字符串转换成 UNICODE 格式,进而导入您的 C 或汇编程序代码中,以下是它的界面:USB Unicode

29、字符串描述符生成器生成 C 语言格式USB Unicode 字符串描述符生成器生成汇编格式温馨提示:百合电子工作室有一个关于 USB 开发方面的开源项目 Easy USB 51 Programer,整个开发过程写得非常详细,不防参考一下,您还可以进入她的论坛参与此项目的讨论。注:本篇文章部分内容摘自USB 协议和USB 技术及应用设计 USB 系列之一:列出你的 USB 设备 USB 现在已经成为 PC 机必不可少的接口之一,几乎所有的设备都可以接在 USB 设备上,USB 键盘、鼠标、打印机、摄像头,还有常用的 U 盘等等,从本篇文章开始,将集中篇幅介绍一下在 DOS 中使用 USB 设备的

30、方法,具体会有几篇暂不好定,写到哪里算哪里吧,三、四篇总是少不了的。本文介绍如何使用我以前文章中介绍过的知识在你的机器中找到 USB 设备,并判定设备类型。一个 USB 系统一般由一个 USB 主机(HOST ) 、一个或多个 USB 集线器(HUB,但不是局域网里的集线器)和一个或多个 USB 设备节点(NODE)组成,一个系统中只有一个 HOST,我们 PC 机里的 USB 实际上就是 HOST 和 HUB 两部分,你的 PC 机可能会有 4 个 USB 口,其实是一个 HOST,一个 HUB,HUB 为你提供了 4 个端口,我们插在 USB 口上的器件,一般是USB 设备,比如 U 盘,

31、USB 打印机等,当然我们也可以插一个集线器上去,使你的一个 USB口扩展成多个。实际上我们说在 DOS 下使用 USB,就是对 USB 系统中的 HOST 进行编程管理,根据 USB的规范,HOST 将对连接在上面的 HUB 和 USB 设备进行管理,不用我们操心。 HOST 器件目前有三个规范,OHCI(Open Host Controller Interface)、UHCI(Universal Host Controller Interface)支持 USB1.1,EHCI(Enhanced Host Controller Interface)支持 USB2.0,以后的文章中,我们将侧重

32、介绍 OHCI 和 EHCI。学习 USB 编程,读规范是少不了的,以下是一些应该阅读的规范下载:OHCI 规范:http:/ 规范:http:/ 规范 1.1:http:/ 规范 2.0:http:/ USB 设备,USB 的 HOST 是挂接在 PCI 总线上的,所以通过 PCI设备的遍历就可以找到你的机器上的所有 USB 设备,在以前介绍 PCI 的配置空间时,曾经介绍过在配置空间中有一个占三个字节的分类代码字段(如果不知道,请参阅我以前的博文 遍历PCI 设备 ) ,在偏移为 0x0B 的字节叫基本分类代码,在偏移为 0x0A 的字节叫子分类代码,在偏移为 0x09 的字节叫编程接口代

33、码,对于 USB 设备类说,基本分类代码为 0x0C,子分类代码为 0x03,对于符合不同规范的 HOST 器件而言,编程接口代码是不同的,UHCI 的编程接口代码是 0x00,OHCI 的编程接口代码是 0x10,EHCI 的编程接口代码是 0x20,我想了解这些就足够了。下面列出 USB 设备的源程序。#include #include #include typedef unsigned long UDWORD;typedef short int WORD;typedef unsigned short int UWORD;typedef unsigned char UBYTE;typede

34、f union struct UDWORD edi;UDWORD esi;UDWORD ebp;UDWORD res;UDWORD ebx;UDWORD edx;UDWORD ecx;UDWORD eax; d;struct UWORD di, di_hi;UWORD si, si_hi;UWORD bp, bp_hi;UWORD res, res_hi;UWORD bx, bx_hi;UWORD dx, dx_hi;UWORD cx, cx_hi;UWORD ax, ax_hi;UWORD flags;UWORD es;UWORD ds;UWORD fs;UWORD gs;UWORD ip;

35、UWORD cs;UWORD sp;UWORD ss; x;struct UBYTE edi4;UBYTE esi4;UBYTE ebp4;UBYTE res4;UBYTE bl, bh, ebx_b2, ebx_b3;UBYTE dl, dh, edx_b2, edx_b3;UBYTE cl, ch, ecx_b2, ecx_b3;UBYTE al, ah, eax_b2, eax_b3; h; X86_REGS;/* Excute soft interrupt in real mode*/int x86_int(int int_num, X86_REGS *x86_reg) _dpmi_r

36、egs d_regs;int return_value;d_regs.d.edi = x86_reg-d.edi;d_regs.d.esi = x86_reg-d.esi;d_regs.d.ebp = x86_reg-d.ebp;d_regs.d.res = x86_reg-d.res;d_regs.d.ebx = x86_reg-d.ebx;d_regs.d.ecx = x86_reg-d.ecx;d_regs.d.edx = x86_reg-d.edx;d_regs.d.eax = x86_reg-d.eax;d_regs.x.flags = x86_reg-x.flags;d_regs.

37、x.es = x86_reg-x.es;d_regs.x.ds = x86_reg-x.ds;d_regs.x.fs = x86_reg-x.fs;d_regs.x.gs = x86_reg-x.gs;d_regs.x.ip = x86_reg-x.ip;d_regs.x.cs = x86_reg-x.cs;d_regs.x.sp = x86_reg-x.sp;d_regs.x.ss = x86_reg-x.ss;return_value = _dpmi_int(int_num, x86_reg-d.edi = d_regs.d.edi;x86_reg-d.esi = d_regs.d.esi

38、;x86_reg-d.ebp = d_regs.d.ebp;x86_reg-d.res = d_regs.d.res;x86_reg-d.ebx = d_regs.d.ebx;x86_reg-d.ecx = d_regs.d.ecx;x86_reg-d.edx = d_regs.d.edx;x86_reg-d.eax = d_regs.d.eax;x86_reg-x.flags = d_regs.x.flags;x86_reg-x.es = d_regs.x.es;x86_reg-x.ds = d_regs.x.ds;x86_reg-x.fs = d_regs.x.fs;x86_reg-x.g

39、s = d_regs.x.gs;x86_reg-x.ip = d_regs.x.ip;x86_reg-x.cs = d_regs.x.cs;x86_reg-x.sp = d_regs.x.sp;x86_reg-x.ss = d_regs.x.ss;return return_value;/* Read Configuration WORD if PCI*/UWORD ReadConfigWORD(WORD pciAddr, int reg) X86_REGS inregs;inregs.x.ax = 0xB109; / Read Configuration wordinregs.x.bx =

40、pciAddr;inregs.x.di = reg; / Register numberx86_int(0x1A, return inregs.d.ecx; / the value/ main programint main(void) UWORD pciAddr;UWORD subClass;int ehciCount = 0, ohciCount = 0, uhciCount = 0;for (pciAddr = 0; pciAddr 0xffff; pciAddr+) if (ReadConfigWORD(pciAddr, 0) != 0xFFFF) / Read Class Codei

41、f (ReadConfigWORD(pciAddr, 0x000a ) = 0x0c03) / Usb Host Controller/ Read SubClass CodesubClass = ReadConfigWORD(pciAddr, 0x0008);if (subClass else if (subClass else if (subClass printf(“There are %d ohci device(s).n“, ohciCount);printf(“There are %d ehci device(s).n“, ehciCount);printf(“There are %

42、d uhci device(s).n“, uhciCount);程序非常简单,所有概念在以前的博文中均有过介绍,其中的子程序大多是以前程序范例中使用过的,所以在这里就不做更多的解释了,程序中,我们仅仅列出了设备的数量,但很显然,用这种方法,我们可以从配置空间里读出基地址等信息,这些在以后的文章中会用到。 USB 系列之三:从你的 U 盘里读出更多的内容 U 盘是我们最常使用的一种 USB 设备,本文继续使用 DOSUSB 做驱动,试图以读取扇区的方式读取你的 U盘。本文可能涉及的协议可能会比较多。一、了解你的 U 盘首先我们用上一篇文章介绍的程序 usbview.exe 去看一下你的 U 盘,

43、我在本文中用于测试的 U 盘情况如下:Device Descriptor: (设备描述符)USB Address: 1Length: 18Descriptor Type: 1USB Specification nr.: 0x0110Calss Code: Class code specified by interfaceSubclass Code: 0x00Protocol Code: 0x00MAX Packet Size: 0x08Vendor ID: 0x058fProduct ID: 0x9321Device Code: 0x0100Manufacture Index: 1Produc

44、t Index: 2Serial Number Index: 0Number of Configuration: 1String Descriptor: (字符串描述符)Manufacturer: Alcor MicroProduct: Mass Storage DeviceConfiguration Descriptor: (配置描述符)Length: 9Descriptor Type: 2Total Length: 32Number of Interfaces: 1Configuration Value: 1Configuration Index: 0Attributes: Bus Pow

45、eredMax Power: 50mAInterface Descriptor: (接口描述符)Length: 9Descriptor Type: 4Interface Number: 0Alternate Setting: 0Number of Endpoints: 2Interface Class: Mass Storage DeviceInterface Sub Class: 6Interface Protocol: 80Interface Index: 0Endpoint Descriptor: (端点描述符)Length: 7Descriptor Type: 5Endpoint Ad

46、dress: 1 OUT endpointAttributes: BulkMax Packet Size: 64Interval: 0Endpoint Descriptor: (端点描述符)Length: 7Descriptor Type: 5Endpoint Address: 2 IN endpointAttributes: BulkMax Packet Size: 64Interval: 0各种描述符的含义在以前的文章中介绍过了,或者去翻阅 USB 的 specification,这里就不多说了,我们从接口描述符开始就一些关键点进行一下说明。首先看接口描述符,Interface Class

47、 = 8,表明是 Mass Storage Device;Sub Class = 6,表明执行 SCSI 命令;Interface Protocol = 0x80,表明支持 Bulk 传输;另外,Number of Endpoints = 2,表明有两个端点。两个端点描述符要注意的是,Endpoint Address = 1 的是 OUT 端点,Endpoint Address = 2 的是 IN端点,有些可能会不一样;有些 U 盘可能还会有第三个端点,比如支持中断传输的 U 盘还会有一个Interrupt 端点,不过这都没有关系。我大概看了我手头有的 5 个 U 盘,都支持批量传输,且支持 SCSI 命令,所以,这可能是一个比较典型的例子,我们就以它为例。二、CBW(Command Block Wrapper)和 CSW(Command Status Wrapper)在USB 系列之一中,我们安装了一个 DOSUSB,在USB 系列之二中,我们利用 USBDOS 读取了所有的描述表,掌握这些内容需要了解 USB 协议 1.1(USB Specification Revision 1.1)即

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报