usb知识总结范文.doc_第1页
usb知识总结范文.doc_第2页
usb知识总结范文.doc_第3页
usb知识总结范文.doc_第4页
usb知识总结范文.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

usb知识总结范文 、设备描述符设备描述符给出了USB设备的一般信息,包括对设备及在设备配置中起全程作用的信息,包括制造商标识号ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描述符的个数等。 一个USB设备必须有且仅有一个设备描述符。 设备描述符是设备连接到总线上时设备描述符是设备连接到总线上时USB主机所读取的第一个描述符,它包含了14个字段,结构如下表表 4、USB设备描述符的结构偏移量域大小值描述0bLength1数字此描述表的字节数1bDecriptorType1常量描述符的类型(此处应为0x01,即设备描述符)2bcdUSB2BCD码此设备与描述表兼容的USB设备说明版本号(BCD码)4bDeviceClass1类设备类码如果此域的值为0则一个设置下每个接口指出它自己的类,各个接口各自独立工作。 如果此域的值处于1FEH之间,则设备在不同的接口上支持不同的类。 并这些接口可能不能独立工作。 此值指出了这些接口集体的类定义。 如果此域设为FFH,则此设备的类由厂商定义。 5bDeviceSubClass1子类子类挖码这些码值的具体含义根据bDeviceClass域来看。 如bDeviceClass域为零,此域也须为零如bDeviceClass域为FFH,此域的所有值保留。 6bDevicePortocol1协议协议码这些码的值视bDeviceClass和bDeviceSubClass的值而定。 如果设备支持设备类相关的协议,此码标志了设备类的值。 如果此域的值为零,则此设备不支持设备类相关的协议,然而,可能它的接口支持设备类相关的协议。 如果此域的值为FFH,此设备使用厂商定义的协议。 7bMaxPacketSize01数字端点0的最大包大小(仅8,16,32,64为合法值)8idVendor2ID厂商标志(由USB-IF组织赋值)10idProduct2ID产品标志(由厂商赋值)12bcdDevice2BCD码设备发行号(BCD码)14iManufacturer1索引描述厂商信息的字符串描述符的索引值。 15iProduct1索引描述产品信息的字串描述符的索引值。 16iSerialNumber1索引描述设备序列号信息的字串描述符的索引值。 17bNumConfigurations1数字可能的配置描述符数目其中bDescriptorType为描述符的类型,其含义可查下表(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义)表表 5、USB描述符的类型值类型描述符描述符值标准描述符设备描述符(Device Descriptor)0x01配置描述符(Configuration Descriptor)0x02字符串描述符(String Descriptor)0x03接口描述符(Interface Descriptor)0x04端点描述符(EndPont Descriptor)0x05类描述符集线器类描述符(Hub Descriptor)0x29人机接口类描述符(HID)0x21厂商定义的描述符0xFF设备类代码bDeviceClass可查下表表表 6、设备的类别(bDeviceClass)值(十进制)值(十六进制)说明00x00接口描述符中提供类的值20x02通信类90x09集线器类2200xDC用于诊断用途的设备类2240xE0无线通信设备类2550xFF厂商定义的设备类下表列出了一个USB鼠标的设备描述符的例子,供大家分析一下表表 7、一种鼠标的设备描述符示例字段描述符值(十六制)bLength0x12bDecriptorType0x01bcdUSB x0110bDeviceClass0x00bDeviceSubClass0x00bDevicePortocol0x00bMaxPacketSize00x08idVendor0x045E(Microsoft Corporation)idProduct0x0047bcdDevice0x300iManufacturer0x01iProduct0x03iSerialNumber0x00bNumConfigurations0x 012、配置描述符配置描述符中包括了描述符的长度(属于此描述符的所有接口描述符和端点描述符的长度的和)、供电方式(自供电/总线供电)、最大耗电量等。 主果主机发出USB标准命令Get_Descriptor要求得到设备的某个配置描述符,那么除了此配置描述符以外,此配置包含的所有接口描述符与端点描述符都将提供给USB主机。 表表 8、USB配置描述符的结构偏移量域大小值描述0bLength1数字此描述表的字节数长度。 1bDescriptorType1常量配置描述表类型(此处为0x02)2wTotalLength2数字此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述符)4bNumInterfaces1数字此配置所支持的接口个数5bCongfigurationValue1数字在SetConfiguration()请求中用作参数来选定此配置。 6iConfiguration1索引描述此配置的字串描述表索引7bmAttributes1位图配置特性D7保留(设为一)D6自给电源D5远程唤醒D4.0保留(设为一)一个既用总线电源又有自给电源的设备会在MaxPower域指出需要从总线取的电量。 并设置D6为一。 运行时期的实际电源模式可由GetStatus(DEVICE)请求得到。 8MaxPower1mA在此配置下的总线电源耗费量。 以2mA为一个单位。 下面是一种硬盘的配置描述符示例表表 9、一种硬盘的配置描述符示例字段描述符值(十六进制)bLength0x09bDescriptorType0x02wTotalLength0x01F bNumInterfaces0x01bCongfigurationValue0x01iConfiguration0x00bmAttributes0x0C MaxPower0x 323、接口描述符配置描述符中包含了一个或多个接口描述符,这里的“接口”并不是指物理存在的接口,在这里把它称之为“功能”更易理解些,例如一个设备既有录音的功能又有扬声器的功能,则这个设备至少就有两个“接口”。 如果一个配置描述符不止支持一个接口描述符,并且每个接口描述符都有一个或多个端点描述符,那么在响应USB主机的配置描述符命令时,USB设备的端点描述符总是紧跟着相关的接口描述符后面,作为配置描述符的一部分被返回。 接口描述符不可直接用Set_Descriptor和Get_Descriptor来存取。 如果一个接口仅使用端点0,则接口描述符以后就不再返回端点描述符,并且此接口表现的是一个控制接口的特性,它使用与端点0相关联的默认管道进行数据传输。 在这种情况下bNumberEndpoints域应被设置成0。 接口描述符在说明端点个数并不把端点0计算在内。 表表 10、USB接口描述符的结构偏移量域域大小值值说明0bLength1数字此表的字节数1bDescriptorType1常量接口描述表类(此处应为0x04)2bInterfaceNumber1数字接口号,当前配置支持的接口数组索引(从零开始)。 3bAlternateSetting1数字可选设置的索引值。 4bNumEndpoints1数字此接口用的端点数量,如果是零则说明此接口只用缺省控制管道。 5bInterfaceClass1类接口所属的类值零值为将来的标准保留。 如果此域的值设为FFH,则此接口类由厂商说明。 所有其它的值由USB说明保留。 6bInterfaceSubClass1子类子类码这些值的定义视bInterfaceClass域而定。 如果bInterfaceClass域的值为零则此域的值必须为零。 bInterfaceClass域不为FFH则所有值由USB所保留。 7bInterfaceProtocol1协议协议码bInterfaceClass和bInterfaceSubClass域的值而定.如果一个接口支持设备类相关的请求此域的值指出了设备类说明中所定义的协议.8iInterface1索引描述此接口的字串描述表的索引值。 对于bInterfaceClass字段,表示接口所属的类别,USB协议根据功能将不同的接口划分成不的类,其具体含义如下表所示表表 11、USB协议定义的接口类别(bInterfaceClass)值(十六进制)类别0x01音频类0x02CDC控制类0x03人机接口类(HID)0x05物理类0x06图像类0x07打印机类0x08大数据存储类0x09集线器类0x0A CDC数据类0x0B智能卡类0x0D安全类0xDC诊断设备类0xE0无线控制器类0xFE特定应用类(包括红外的桥接器等)0xFF厂商定义的设备 4、端点描述符端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点0(控制端点,一般一个设备只有一个控制端点)为双向端口外,其它均为单向。 端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。 除了描述符中描述的端点外,每个设备必须要有一个默认的控制型端点,地址为0,它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大包长度。 主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它来配置设备。 表表 12、USB端点描述符的结构偏移量域大小值说明0bLength1数字此描述表的字节数长度1bDescriptorType1常量端点描述表类(此处应为0x05)2bEndpointAddress1端点此描述表所描述的端点的地址、方向Bit3.0:端点号.Bit6.4:保留,为零Bit7:方向,如果控制端点则略。 0输出端点(主机到设备)1输入端点(设备到主机)3bmAttributes1位图此域的值描述的是在bConfigurationValue域所指的配置下端点的特性。 Bit1.0:传送类型00=控制传送01=同步传送10=批传送11=中断传送所有其它的位都保留。 4wMaxPacketSize2数字当前配置下此端点能够接收或发送的最大数据包的大小。 对于实进传输,此值用于为每帧的数据净负荷预留时间。 在实际运行时,管道可能不完全需要预留的带宽,实际带宽可由设备通过一种非USB定义的机制汇报给主机。 对于中断传输,批量传输和控制传输,端点可能发送比之短的数据包6bInterval1数字周期数据传输端点的时间间隙。 此域的值对于批传送的端点及控制传送的端点无意义。 对于同步传送的端点此域必需为1,表示周期为1ms。 对于中断传送的端点此域值的范围为1ms到255ms。 下表是一种鼠标的端点描述符的示例,该端点是一个中断端点表表 13、一种鼠标的端点描述符示例域值(十六进制)bLength0x07bDescriptorType0x05bEndpointAddress0x81bmAttributes0x03wMaxPacketSize0x04bInterval0x0A 5、字符串描述符字符串描述符是一种可选的USB标准描述符,描述了如制商、设备名称或序列号等信息。 如果一个设备无字符串描述符,则其它描述符中与字符串有关的索引值都必须为0。 字符串使用的是Unicode编码。 主机请示得到某个字符串描述符时一般分成两步首先主机向设备发出USB标准命令Get_Descriptor,其中所使用的字符串的索引值为0,设备返回一个字符串描述符,此描述符的结构如下表表 14、USB字符串描述符(响应主机请求时返回的表示语言ID的字符串描述符)偏移量域域大小值值描述0bLength1N+2此描述表的字节数1bDescriptorType1常量字串描述表类型(此处应为0x03)2wLANGID02数字语言标识(LANGID)码0N wLANGIDx2数字语言标识(LANGID)码X该字符串描述符双字节的语言ID的数组,wLANGID0wLANGIDx指明了设备支持的语言,具体含义可查看USB_LANGIDs.pdf。 主机根据自己需要的语言,再次向设备发出USB标准命令Get_Descriptor,指明所要求得到的字符串的索引值和语言。 这次设备所返回的是Unicode编号的字符串描述符,其结构如下表表 15、Unicode字符串描述符(响应主机请求时真正表示字符串编码的字符串描述符)偏移量域域大小值值描述0bLength1数字此描述表的字节数(bString域的数值N2)1bDescriptorType1常量字串描述表类型(此处应为0x03)2bString N数字UNICODE编码的字串bString域为设备实际返回的以UNICODE编码的字符串流,我们在编写设备端硬件驱动的时候需要将字符串转换为UNICODE编码,您可以通过一些UNICODE转换工具进行转换。 这里推荐由百合电子工作室开发的一款USB描述符生成工具“USB Unicode字符串描述符生成器”,它专门为编写设备端驱动程序的需要而定制,可以非常方便将您需要的字符串转换成UNICODE格式,进而导入您的C或汇编程序代码中,以下是它的界面USB Unicode字符串描述符生成器生成C语言格式2报告描述符:报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。 USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。 交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。 在这里,传输和报告的意思相类似。 传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。 控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。 中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(stream-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。 报告有三种input,output,和Feature.后面将作进一步介绍。 中断型输入管线(interrupt inpipe)仅可以传送input报告;中断型输出管线(interrupt outpipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,output和feature报告。 端点描述符有声明所使用的端点为何种管线。 数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。 为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。 所以“传输的数据”和“操作”只是一事件的两种描述方式。 用途是以一个32位卷标(称作usage tag)来表示,高16位称作usage page(用途类页),低16位称为usage DI(用途识别名)Usage=(usage page:usage ID)举例说明二个字节分别为x和y轴的位移数据,因此第一个字节的usage=(generic desktop:X),而第二个字节的usage=(generic desktop:Y),其中generic desktop为用途的大类别(称作用途类页)之一,x和y轴的操作用途属于此用途类页。 文件universal serialBus HIDUsage Table完整列出所有的usage pages(用途类页)和usage ID(用途识别名),使用者必须遵照文件的规范来声明操作的用途。 该文件的附录A有十多个报告描述符的范例,值得研究下。 表 1、报告描述符的标签主项目全域项目区域项目标签代码标签代码标签代码Input X08?Usage Page0x0?Usage0x0?Output0x9?Logical Minimum0x1?Usage Minimum0x1?Feature0x0b?Logical Maximum0x2?Usage Maximum0x2?Physical Minimum0x3?Designator Minimum0x3?Collection0xa1Physical Maximum0x4?Designator Minimum0x4?End Collection0xc0Unit Exponent0x5?Designator Maximum0x5?Unit0x6?String0x7?Report Size0x7?Sreing Minimum0x8?Report ID0x8?String Maximum0x9?Report Coumt0x9?Delimiter0xa?Push0xA?Pop0xb?标签用途卷标只是报告描述符诸多标签的一个。 表1列出所有的卷标,利用这些卷标取可以清楚完整的描述符操作的用途。 报告描述符的语法不同于USB标准描述符,它是以项目(items)方式排列而成,无一定的长度;项目有一个前辍(prefix),然后跟着一个括号,内为该项目的数据item=prefix(data)。 项目分成三种类别主项目,全局项目,区域项目。 主项目中的input,ouput,feature三个卷标用来表示报告中数据的种类,这些是报告描述符中最主要的项目,其他项目都是用来修饰这三种项目。 主要项目中其他二个卷标后面再作详细的介绍。 ?Input项表示设备操作输入到主机的数据模式。 这个数据格式就形成一个输入报告,虽然输入报告可以用控制型管线以get report(input)来传输,但是通常用中断型输入管线来传输以确保在每一固定周期内都能将更新的输入报告传给主机。 ?Output项表示由主机输出到装置操作的数据格式。 这个数据格式就形成一个输出报告。 输出报告通常不适用轮询的方式来传送给设备,而是由应用软件依实际需求以传令方式要求送出输出报告,所以大多用控制型管线以set report(output)指令来将报告送到设备。 当然也可以选择用中断型输出管线来传送,只是通常不建议这样用。 ?Feature项表示由主机送到设备的组态所需数据的数据格式。 这个数据模式就形成一个特征报告。 特征报告只能用控制型管线以get report(feature)和set report(feature)指令分别来取得和设定设备的特征值。 ?范例考虑一个2X16字的显示装置,它的列数、行数、字宽、和字高为固定值属于feature报告;显示状态例如“就绪”和“输入字错误”则属于input报告;光标位置和显示的字需可读写,所以属于另一个feature报告;更新显示的字则为output报告。 为了区别两个features,要用到全局项目中的report ID,每个feature报告有一个不同的report ID,因而主机请求指令要加上report ID的值get report(feature,report ID)和Set report(feature,report ID)。 主项目用来定义报告中数据的种类和格式,而说明主项目之意义与用途为全局项目和区域项目。 顾名思义,区域性项目只能适用于列于其下的第一个主项目,不适用于其他主项目,若一个主项目之上有几个不同的卷标的区域性项目,则这些区域性项目皆适用于描述该主项目。 相反,全局性项目适用于其下方的所有主项目,除非另一个相同卷标的全局性项目出现。 为了清楚说明报告描述符,将使用“项目状态表”(item statetable)用来表示在某位址处适用的全局性项目的组合。 图1显示全局性项目和区域性项目与所描述的主项目之对应关系。 区域性项目卷标简单地说,区域性项目(见表1)只是说明用途而已。 Designator是要搭配实体描述符使用的,这里不对实体描述符进行介绍,所以略过这些designator标签。 标签Usage实际上应该称作Usage ID,它搭配全域项目的Usage Page卷标才形成前文所定义的用途usage但是报告描述符允许在区域项目的Usage卷标直接用32位的方式来指定用途,这种方式称作扩充式用途指定法(extended usage)以示区别。 例如Usage(Generic Desktop:Mouse),Usage Minimum(Keyboard:0),和Usage Maximum(Keyboard:101)。 很明显的,扩充式用途指定法会取代项目状态表中的Usage Page。 还有,使用扩充式用途指定法时,数据的高16个位为用途类页Usage Page,低16个位则为用途识别名Usage ID。 往往一个报告数据会对应到几个操作,因而会有几个用途,例如101按键的键盘利用不同代码代表不同的键,每一个键是一个操作,有自己的用途,要将所有Usage ID列出不太现实,所以就需要Usage Minimum和Usage Maximum二个标签。 以键盘为例,主项目之上只要二个区域项目Usage Minimum (0),Usage Maximum (101)。 如此一来,则无键按下(Usage ID为0)和101键中任一键被按下(Usage ID为1至101)的用途都被赋于到一个报告数据上,后面会有一个范例进一步解说。 卷标String Index类似卷标Usage,而卷标String Minimum和String Maximum则类似标签Usage Minimum和Usage Maximum。 如果希望某个操作对应到一个字串,则用String Index来描述该操控的报告数据,这个字符串在字符串描述符中,StringIndex(data)项目中的data是这个字符串在字符串描述符中的位置索引。 如果需要用到几个字符串,则可以使用String Minimum来指向字符串描述符中被用到字符串的最先位置索引,和String Maximum来指向最后位置索引。 标签Delimiter很少用到,请参考Universal SerialBus HIDUsage Tables文件中Appendix B的范例详细说明。 全局项目卷标全局项目的卷标事实上只要Usage Page,Logical Minimum,Logical Maximum,Report Size,Report ID,Report Count就足够了。 表2列了二个音量操作的例子(音量增减键和音量旋钮)将用来辅助说明这些卷标,不过主项目括号内的数据会在后文中再做说明。 表 2、音量操作举例音量减键音量旋钮Usage Page(consumer)Usage Page(Consumer)Usage(Volume)Usage(Volume)Logical Minimum(-1)Logical Minimum (0)Logical Maximum(-1)Logical Maximum (100)Report Size (2)Report Size (7)Report Count (1)Report Count (1)Input(Data,Variable,Relative)Input(Data,Variable,Absolute,No Wrap,Linear,No Relative)查阅Universal SerialBus HIDUsage Tables文档,这两个例子的用途需要令为(Consumer:Volume)。 Usage Page前面已经介绍过了。 Report Size用来设定主项目(Input,Output,Feature)的报告字段大小,它的单位是位。 主项目会对每个操作产生一个报告字段,字段大小则由Report Size决定。 而Report Count用来设定主项目之报告字段的数目,其等于操作的数目。 音量增减键的例子中ReportCount (1)表示主项目Input只产生一个字段,所以可知只有一个音量增减键而Report Size (2)表示这个字段为2位。 另一个音量旋钮例子也是只有一个旋钮,所以用Report Count (1)但是因为Report Size (7),所以该旋钮的数据字段为7位,可以表示0到127之数值。 再举一例,如果是鼠标的三个按键,每个按键占用一个一位的字段,则Report Size (1),Report Count (3)那么这个报告长度为三个位,可以同时呈现出三个按键的状态(原状或被按下)。 Logical Minimum和Logical Maximum在说明每个报告字段的数值范围,这是纯数值所以称为逻辑数值(logical value)。 音量增减键的例子中Logical Minimum(-1),Logical Maximum (1)表示只会出现-1,0,1三种数值,所以用到二位(即ReportSize (2)),0b11代表-1,0b00代表0,0b01代表1。 在音量旋钮例子中,虽然用7位作一字段,但是旋钮仅会产生0到100的数值,因为Logical Minimum (0)和Logical Maximum (100)。 假如实体程序错误产生超出逻辑数值的范围,则主机将会忽略该数值,这种数值称作null value。 当要将同一种报告分成数个部分,则每一个部分要给予一个识别值,这时就需用到卷标Report ID,其数据值必须从1起算,不可使用0。 没有赋予Report ID标签的报告,主机有可能会将其Report ID视为0,所以Report ID (0)被要求不能使用。 这个标签对控制型管线才有意义,因为它可以在请求报告时指定Report ID的值。 对于中断型管线,其为周期性传输报告,所以每次都会将所属报告传完,没有仅传输部分之必要,所以Report ID标签就无意义。 其它的全局项目卷标可分为辅助工具(Push和Pop)和物理量说明(Physical Minimum,Physical Maximum,Unit Exponent,和Unit)。 Push卷标将项目状态表存放到缓存器(stack),而Pop卷标反过来将缓存器最顶层的项目状态表取回来取代目前之状态表。 这二个标签对很长的报告描述符才有用处,因为其可以节省多列一些全局项目。 读者当要使用到时,参考Universal SerialBus HIDUsage Tables文件的Appendix A.7节中范例则可获得正确使用方式。 不同厂家的鼠标有不同的分辨率,若要让主机知道鼠标的分辨率,就必须用到物理量的标签。 不使用也不会影响到鼠标的功能,只是使用者无法由主机的驱动程式得知分辨率而已。 但是量测装置(例如温度计)的应用程序必须知道物理量,则这些标签就必备了。 分辨率r的算法如下r=(lM-lm)/(PM-Pm)X10iUnit其中lm=Logical Minimum,lM=Logical Maximum,pm=Physical Minimum,pM=Physical Maximum,i=Unit Exponent。 以400-dpi的鼠标为例如表3。 表3解析度的范例Logical Minimum(-127)R=(127-(-127)/(3175-(-3175)X10-4=400counts perinch Logical Minimum (127)Physical Minimum(-3175)Physical Minimum (3175)给定Logical值,计算出physical值(PM-Pm)/2)/10i=(127-(-127)/400)/2=0.3173?|PM|=|Pm|=3175,i=4Unit Exponent(-4)Unit(inch)注意,若是Unit Exponent未定义,则视为i=0若是Physical Minimum和Physical Maximum有一个以上未定义,则视为PM=lM和pm=lm。 所以标签Physical Minimum和Physical Maximum一定要同时定义,否则无意义。 这些卷标的括号内数字为有符号的整数,可以是一个字节或二至四个字节,字节数目会在卷标代码的最低二位定义,详情后文会叙述。 卷标Unit的括号内数据比较复杂,总共用了7个四位(nibbles)来描述,各个四位之意义如表4,其中第8个四位未被使用到。 表4标签Unit的信息格式Nibbe765432100Luminous IntensityCurrent TemperatureTime MassLength SystemHID共享了四种单位系统,最低的四位就是决定使用的单位系统(System),不同的系统中当然物理量的单位也不一样。 单位和系统间的对应关系如表5。 表5物理量的单位之编码法None SI Linear SIRotationEnglish LinearEnglish RotationSystem0x00x10x20x30x4Length None公分径度英寸角度Mass None公克公克Slug SlugTime None秒秒秒秒Temperature None凯氏(绝对温度)凯氏(绝对温度)华氏华氏Current None安培安培安培安培Luminous intensityNone Candela CandelaCandelaCandela除了最低四位的值用来选择单位系统外,其余每个四位皆表示该单位的幂次方,每个四位(nibble)都是有符号的整数,可表示的范围为-8至+7-8-7-6-5-4-3-2-10123456708h09h0ah0bh0ch0dh0eh0fh00h01h02h03h04h05h06h07h因此长度的单位若为公分则Unit(data)中data的码为0x11,若为英吋则为0x13,这二者中Length的四位值皆为1表示幕次方为1,即cm1或in1。 质量单位为公克之码为0x0101,加速度单位为公分除以平方秒之码为0xE011,其中E代表-2。 所以力量单位为质量(公克)乘于加速度(公分/平方秒)的码为0xE111。 能量单位焦尔为力量乘于长度之码为0xE121,其等义于s?2g cm2和单位系统为SILinear。 主项目主项目中产生报告数据格式的三个卷标(Input,Output,和Feature)具有共通的数据定义,这些数据和其代码列于表6中。 目前用到9个位来表示这些数据。 如果第九位(bit8)为0,则仅需用一个字节来表示该数据,即忽略第九位。 如果第九位为1,就需用到二个字节来表示该数据。 表6主项目的信息代码Bit8765432100Bit FieldNon VolatileNo NullPosition Preferred State LinearNo WrapAbsolute ArrayData1Buffered BytesVolatile Null State No Preferred NonLinear WrapRelative VariableConstant Data/Constant主项目之数据为可变值(设为Data),或为固定不可变值(设为Constant)。 Constant都用于Feature的报告,或是用于填充位(padding),使报告长度以字节为单位。 Array/Variable主项目之数据的每个字段可以表示几个不同的操作的其中一个被触发(设为Array),或是每个字段仅表示一个操作(设为Variable)。 如果是Variable,则Report Count的数据值等于报告数据的字段数。 若是Array,则Report Count的数据值表示可以同时被触发的最多操作数目。 后文中键盘之例会解说Array的用法。 Absolute/Relative主项目的数据是以相对于固定的基准点方式提供绝对数值(设为Absolute),或是提供相对于前次报告的相对值(设为Relative)。 【范例说明】前文中的音量操控范例,因为都是Data和Variable,二者的操作值皆为变化值,且一个字段仅表示一个操作。 但是音量增减键的例子为Relative,所以若报告值由0变成+1,则音量增大一个刻度,反之由0变作-1则音量减小一个刻度,因而音量大小因输入值而作相对的变化。 然而音量旋钮的例子为Absolute,当输入值为最小值0时,为静音,而输入值为最大值100时,为最大音量,其余值作百分比的音量调整,输入值和音量成绝对关系。 No Wrap/Wrap主项目的数据值达到极值后会转为极低值,反之亦同,称作卷绕(设为Wrap)。 例如一个转钮可以做360旋转,输出值从0至10,若设定为Wrap,则值达10后,在同方向旋转则值变为0,反之若达到0,再转就得到10。 Linear/Nonlinear主项目的数据与操作刻度为线性关系(设为Linear),或为非线性(设为Nonlinear)。 Preferred State/No Preferred主项目对应的操作再不被触发时会自动恢复到初始状态(设为Preferred State),或是不会恢复原状(设为No Preferred)。 例如键盘的按键和会自动置中(self-centering)的游戏杆,皆为Preferred State。 【范例说明】再以音量操作为例,音量增减键的例子都没标注No Wrap,Linear,PreferredState,但是没有标注即认定其属于默认值,所以等同于是这些设定,只是这些设定对此例的操作无意义,所以不标出。 音量旋钮的例子明确指出其为No Wrap,Linear,No Preferred,可见旋钮不是循环旋转,输出值与旋转角呈线性关系,旋钮释放开时会停留在释放前位置(因为NoPreferred)。 No NullPosition/Null State主项目对应的操和有一个状态,其不会送出有意义的数据,即数据将不在Logical Minimum和Logical Maximum之间,这种操控要标注Null State,否则为No NullPosition。 例如几个按键,而无键被按下的用途没有声明在Usage之列,则可以在主项目的数据中设NullState,将无键被按下的状态排除在Logical Minimum和Logical Maximum区间之外,进一步请参看Universal SerialBus HIDUsage Tables文件的Appendix A.3节中范例。 Non Volatile/Volatile主项目Feature的数据不允许被主机改变(设为Non Volatile),或是允许被主机改变(设为Volatile)。 注意主项目Input和Output,此标注设定无意义,所以bit7的代码必须为0。 Bit Field/Buffered Bytes主项目的数据格式要以字节为单位,不足构成字节时自动填充成字节则设Buffered Bytes。 最后来谈谈主项目的其它二个卷标Collection和End Collection。 以鼠标而言,在实体上是一个指针(pointer),只是应用为计算机鼠标而这个指针含有三个按键和二个平移轴X和Y。 所以指针的报告是由不同格式的数据所构成,因而需要用到Collection和End Collection将几个Input项目集结成一组,其用途为指针,再用Collection和End Collection将指针括起来说明其应用为鼠标。 卷标End Collection没有跟随任何资料。 但是卷标Collection跟随一个字节的数据,例如指针的数据名为Physical,而鼠标的为Application。 所有Collection的数据名称与代码如表7表7报告集合的名称与代码Physical ApplicationLogical ReportNamed ArraryUsage ModifierUsage SwitchReserved Vendor-defined代码0x000x010x020x030x040x050x060x07-0x7f0x80-0xff用CP CACL NaryUS UM途Collection的数据名称很难有一个准则来给定,Universal SerialBus HIDUsage Tables文档中将各种用途的用途种类(usage type)列出,使用者必须依据用途种类来指定Collection的数据名称,例如鼠标,键盘和游戏杆的用途种类为CA,所以要用Collection(Application),而指针为CP,所以用Collection(Physical)。 编码报告描述符的项目编码有二种短项目和长项目。 长项目仅是保留给未来使用,所以不作介绍。 短项目的编码形式如下Bits23222120191817161514131211109876543210datadatabTag bTypebSize Bytes210最低字节分别标注项目大小(bSize),项目类别(bType),和项目卷标(bTag)其中bTag占4个位,其余二者各占2个位。 BSize用来指出项目的数据所需字节的数目,该数目仅可以为0(当bSize=0),1(当bSize=1),2(当bSize=2),和4(当bSize=3)注意不可以为3个字节。 大部分的卷标仅需一个字节的数据全局项目的卷标Unit比较特殊有可能最多用到4个字节来表示其资料。 标签代码bTag已经于前章的表1中描述,例如Input的标签代码0x8?中8即为bTag之值再如标签Feature之bTag=11,而Unit之bTag=6。 主项目之bType=0,全局项目之bType=1,而区域项目之bType=2。 所以在前章的表1中的主项目卷标代码中的?可以改为00nnB,全局项目的可以改为01nnB,而区域项目的可以改为10nnB,其中nn代表bSize。 实际范例这里举一个Device ClassDefinition forHuman InterfaceDevice文件的附录E中的整合鼠标的键盘装置的范例。 这个装置只有一个组态描述符,但是这个组态具有二个接口,一个为键盘接口(接口编号为0x00),另一个为鼠标接口(接口编号为0x01)。 每一个接口都有一个自己的中断型输入端点,输出则都靠内定的控制型端点0。 这个整合鼠标的键盘装置的标准描述符,请参考附件中的USB标准描述符之技巧文件。 在该文中所使用的范例即为整合鼠标的键盘装置,只是仅列出一个接口描述符(即编号为0x00的键盘接口),另一个编号为0x01的鼠标接口在该文中没有列出,读者可以自行参考本文所附的描述符程序代码descriptor.asm(即在标记为interface_descriptor01,hid_descriptor01,和endpoint_descriptor01处)。 表8范例的输入报告格式键盘(输入报告)鼠标(输入报告)Byte76543210Byte765432100Modifier keys0Pad Buttons1Reserved1X displacement2Keycode12Y displacement3Keycode24Keycode35Keycode46Keycode57Keycode6表9范例的输出报告格式键盘输出报告Byte765432100Pad LEDs这个范例有输入报告和输出报告,其中输入报告有二组,一组属于键盘接口,另一组属于鼠标接口。 表8列出输入报告的数据格式。 而输出报告只有键盘接口需要,表9为输出报告的数据格式。 因为有二个接口,所以有二个报告描述符,分属于不同的界面,二个报告描述元都列于表10中。 键盘的报告描述元中整个报告集合的用途为(Generic Desktop:Keyboard),由于键盘用途属于应用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论