当前位置:首页 >> 信息与通信 >>

USBHID设备报告描述符详解


概述: 报告在这里意思是数据传输(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 in pipe)仅可以传送 input 报告;中断型输出管线(interrupt out pipe)仅可以传送 output 报告;但是控制型管线(control pipe)可以传送 input,out put 和 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),其中 gen eric desktop 为用途的大类别(称作用途类页)之一,x 和 y 轴的操作用途属于 此用途类页。文件 universal serial Bus HID Usage Table 完整列出所有的 usag

e pages(用途类页)和 usage ID(用途识别名),使用者必须遵照文件的规范来声明 操作的用途。该文件的附录 A 有十多个报告描述符的范例,值得研究下。

表 1、报告描述符的标签 主项目 标签 Input Output Feature 代码 X08? 0x9? 0x0b? 全域项目 标签 Usage Page Logical Minimum Logical Maximum Physical Minimum Collection 0xa1 Physical Maximum End Collection Unit Report Size Report ID Report Coumt Push Pop 0x6? 0x7? 0x8? 0x9? 0xA? 0xb? String Sreing Minimum String Maximum Delimiter 0x7? 0x8? 0x9? 0xa? 0xc0 Unit Exponent 0x5? Designator Maximum 0x5? 0x4? Designator Minimum 0x4? 0x3? Designator Minimum 0x3? 代码 0x0? 0x1? 0x2? 区域项目 标签 Usage Usage Minimum Usage Maximum 代码 0x0? 0x1? 0x2?

标签: 用途卷标只是报告描述符诸多标签的一个。表 1 列出所有的卷标,利用这些 卷标取可以清楚完整的描述符操作的用途。报告描述符的语法不同于 USB 标准 描述符,它是以项目(items)方式排列而成,无一定的长度;项目有一个前辍(p refix),然后跟着一个括号,内为该项目的数据:item = prefix(data)。

项目分成三种类别:主项目,全局项目,区域项目。主项目中的 input,oupu t,feature 三个卷标用来表示报告中数据的种类, 这些是报告描述符中最主要的项 目,其他项目都是用来修饰这三种项目。主要项目中其他二个卷标后面再作详细 的介绍。 Input 项:表示设备操作输入到主机的数据模式。这个数据格式就形成 一个输入报告,虽然输入报告可以用控制型管线以 get report(input)来传输, 但是通常用中断型输入管线来传输以确保在每一固定周期内都能将更新的输入 报告传给主机。 Output 项:表示由主机输出到装置操作的数据格式。这个数据格式就 形成一个输出报告。输出报告通常不适用轮询的方式来传送给设备,而是由应用 软件依实际需求以传令方式要求送出输出报告,所以大多用控制型管线以 set re port(output)指令来将报告送到设备。当然也可以选择用中断型输出管线来传送, 只是通常不建议这样用。 Feature 项:表示由主机送到设备的组态所需数据的数据格式。这个数 据模式就形成一个特征报告。特征报告只能用控制型管线以 get report(feature) 和 set report(feature)指令分别来取得和设定设备的特征值。 范例:考虑一个 2X16 字的显示装置,它的列数、行数、字宽、和字高 为固定值属于 feature 报告;显示状态例如“就绪”和“输入字错误”则属于 in put 报告;光标位置和显示的字需可读写,所以属于另一个 feature 报告;更新 显示的字则为 output 报告。为了区别两个 deatures,要用到全局项目中的 repor t ID,每个 feature 报告有一个不同的 report ID,因而主机请求指令要加上 repor t ID 的值:get report(feature,report ID)和 Set report(feature,report ID)。 主项目用来定义报告中数据的种类和格式,而说明主项目之意义与用途为全 局 项 目和区域项目。顾名思义,区域性项目只能适用于列于其下的第一个主 项目, 不适用于其他主项目, 若一个主项目之上有几个不同的卷标的区域性项目, 则这些区域 性项目皆适用于描述该主项目。相反,全局性项目适用于其下方的 所有主项目, 除非另一个相同卷标的全局性项目出现。 为了清楚说明报告描述符,

将使用“项目状 态表”(item state table)用来表示在某位址处适用的全局性 项目的组合。图 1 显示全局性项目和区域性项目与所描述的主项目之对应关系。

区域性项目卷标: 简单地说,区域性项目(见表 1)只是说明用途而已。Designator 是要搭配 实体描述符使用的,这里不对实体描述符进行介绍,所以略过这些 designator 标 签。 标签 Usage 实际上应该称作 Usage ID,它搭配全域项目的 Usage Page 卷 标才形成前文所定义的用途{usage}﹔但是报告描述符允许在区域项目的 Usage 卷标直接用 32 位的方式来指定用途, 这种方式称作扩充式用途指定法(extended usage)以示区别。例如:Usage(Generic Desktop:Mouse),Usage Minimum(Keyb oard:0),和 Usage Maximum(Keyboard:101)。很明显的,扩充式用途指定法会 取代『项目状态表』中的 Usage Page。还有,使用扩充式用途指定法时,数据 的高 16 个位为用途类页 Usage Page,低 16 个位则为用途识别名 Usage ID。 往往一个报告数据会对应到几个操作,因而会有几个用途,例如 101 按键的键 盘利用不同代码代表不同的键,每一个键是一个操作,有自己的用途,要将所有 Usage ID 列出不太现实,所以就需要 Usage Minimum 和 Usage Maximum 二 个标签。以键盘为例,主项目之上只要二个区域项目:Usage Minimum (0), Us age Maximum (101)。如此一来,则无键按下(Usage ID 为 0)和 101 键中任一 键被按下(Usage ID 为 1 至 101)的用途都被赋于到一个报告数据上,后面会有 一个范例进一步解说。 卷标 String Index 类似卷标 Usage,而卷标 String Minimum 和 String Ma ximum 则类似标签 Usage Minimum 和 Usage Maximum。 如果希望某个操作对 应到一个字串,则用 String Index 来描述该操控的报告数据,这个字符串在字 符串描述符中,StringIndex (data)项目中的 data 是这个字符串在字符串描述符 中的位置索引。如果需要用到几个字符串,则可以使用 String Minimum 来指向 字符串描述符中被用到字符串的最先位置索引,和 String Maximum 来指向最 后位置索引。

标签 Delimiter 很少用到, 请参考 Universal Serial Bus HID Usage Tables 文件中 Appendix B 的范例详细说明。

全局项目卷标 全局项目的卷标事实上只要 Usage Page,Logical Minimum,Logical Maxi mum, Report Size,Report ID,Report Count 就足够了。表 2 列了二个音量操作的 例子(音量增减键和音量旋钮)将用来辅助说明这些卷标,不过主项目括号内的 数据会在后文中再做说明。 表 2、音量操作举例 音量减键 Usage Page(consumer) Usage(Volume) Logical Minimum(-1) Logical Maximum(-1) Report Size(2) Report Count(1) Input(Data,Variable,Relative) 音量旋钮 Usage Page(Consumer) Usage(Volume) Logical Minimum(0) Logical Maximum(100) Report Size(7) Report Count(1) Input(Data,Variable,Absolute,No Wrap,Linear,No Relative)

查阅 Universal Serial Bus HID Usage 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 Mini mum (-1),Logical Maximum (1)表示只会出现-1, 0, 1 三种数值,所以用到二位 (即 ReportSize(2)),0b11 代表-1,0b00 代表 0,0b01 代表 1。在音量旋钮例 子中,虽然用 7 位作一字段,但是旋钮仅会产生 0 到 100 的数值,因为 Logica l Minimum (0)和 Logical Maximum (100)。 假如实体程序错误产生超出逻辑数值 的范围,则主机将会忽略该数值,这种数值称作 null value。 当要将同一种报告分成数个部分,则每一个部分要给予一个识别值,这时就 需用到卷标 Report ID,其数据值必须从 1 起算,不可使用 0。没有赋予 Report ID 标签的报告,主机有可能会将其 Report ID 视为 0,所以 Report ID (0)被要 求不能使用。这个标签对控制型管线才有意义,因为它可以在请求报告时指定 R eport ID 的值。对于中断型管线,其为周期性传输报告,所以每次都会将所属报 告传完,没有仅传输部分之必要,所以 Report ID 标签就无意义。 其它的全局项目卷标可分为辅助工具(Push 和 Pop)和物理量说明(Physic al Minimum,Physical Maximum,Unit Exponent,和 Unit)。Push 卷标将『项 目状态表』存放到缓存器(stack),而 Pop 卷标反过来将缓存器最顶层的『项目状 态表』取回来取代目前之状态表。这二个标签对很长的报告描述符才有用处,因 为其可以节省多列一些全局项目。读者当要使用到时,参考 Universal Serial Bu s HIDUsage Tables 文件的 Appendix A.7 节中范例则可获得正确使用方式。 不同厂家的鼠标有不同的分辨率,若要让主机知道鼠标的分辨率,就必须用到物 理量的标签。不使用也不会影响到鼠标的功能,只是使用者无法由主机的驱动程 式得知分辨率而已。但是量测装置(例如温度计)的应用程序必须知道物理量, 则这些标签就必备了。分辨率 r 的算法如下 r = ((lM-lm)/(PM-Pm))X10iUnit 其中 lm = Logical Minimum,M = Logical Maximum, pm = Physical Minimum, l pM = Physical Maximum, i = Unit Exponent。以 400-dpi 的鼠标为例如表 3。 表 3:解析度的范例

Logical Minimum(-127) Logical Minimum(127) Physical Minimum(-3175) Physical Minimum(3175) Unit Exponent(-4) Unit(inch)

R = ((127-(-127))/(3175-(-3175))X10 = 400counts per inch

-4

给定 Logical 值,计算出 physical 值: ((PM-Pm)/2) /10 =((127-(-127))/400)/2=0.3173 |PM|=|Pm|=3175,i=4
i

注意,若是 Unit Exponent 未定义,则视为 i = 0﹔若是 Physical Minimum 和 Physical Maximum 有一个以上未定义,则视为 PM=lM 和 pm=lm。所以标签 Ph ysical Minimum 和 Physical Maximum 一定要同时定义,否则无意义。这些卷标 的括号内数字为有符号的整数,可以是一个字节或二至四个字节,字节数目会在 卷标代码的最低二位定义, 详情后文会叙述。 卷标 Unit 的括号内数据比较复杂, 总共用了 7 个四位(nibbles)来描述,各个四位之意义如表 4,其中第 8 个四位 未被使用到。 表 4:标签 Unit 的信息格式 Nibbe 7 0 6 Luminous Intensity 5 4 3 2 Mass 1 0

Current Temperature Time

Length System

HID 共享了四种单位系统,最低的四位就是决定使用的单位系统(System), 不同的系统中当然物理量的单位也不一样。单位和系统间的对应关系如表 5。 表 5:物理量的单位之编码法 None System Length Mass Time Temperature 0x0 None None None None SI Linear 0x1 公分 公克 秒 凯氏(绝对 SI Rotation 0x2 径度 公克 秒 凯氏(绝对 English Linear 0x3 英寸 Slug 秒 华氏 English Rotation 0x4 角度 Slug 秒 华氏

温度) Current Luminous intensity None None 安培 Candela

温度) 安培 Candela 安培 Candela 安培 Candela

除了最低四位的值用来选择单位系统外,其余每个四位皆表示该单位的幂次 方,每个四位(nibble)都是有符号的整数,可表示的范围为-8 至+7: -8 08 h -7 09 h -6 0a h -5 0b h -4 0c h -3 0d h -2 0e h -1 0f h 0 00 h 1 01 h 2 02 h 3 03 h 4 04 h 5 05 h 6 06 h 7 07 h

因此长度的单位若为公分则 Unit (data)中 data 的码为 0x11, 若为英吋则为 0x13, 这二者中 Length 的四位值皆为 1 表示幕次方为 1,即 cm1 或 in1 。质量单位为 公克之码为 0x0101,加速度单位为公分除以平方秒之码为 0xE011,其中 E 代表 -2。所以力量单位为质量(公克)乘于加速度(公分/平方秒)的码为 0xE111。 能量单位焦尔为力量乘于长度之码为 0xE121,其等义于 s?2g cm2 和单位系统为 SI Linear。

主项目
主项目中产生报告数据格式的三个卷标(Input,Output,和 Feature)具有 共通的数据定义,这些数据和其代码列于表 6 中。目前用到 9 个位来表示这些数 据。如果第九位(bit 8)为 0,则仅需用一个字节来表示该数据,即忽略第九位。 如果第九位为 1,就需用到二个字节来表示该数据。
表 6:主项目的信息代码

Bi t

8

7

6 No Null Positi on Null State

5

4

3

2

1

0

0

Bit Field

Non Volati le

Prefer red State No Prefer

Line ar

No Wra p

Absolu te

Array

Data

1

Buffer Volati ed le

Non Line

Wra Relati Variab Consta p ve le nt

Bytes

red

ar

Data/Constant: 主项目之数据为可变值 (设为 Data) 或为固定不可变值 , (设 为 Constant)。Constant 都用于 Feature 的报告,或是用于填充位(padding),使报 告长度以字节为单位。 Array/Variable: 主项目之数据的每个字段可以表示几个不同的操作的其中一 个被触发(设为 Array),或是每个字段仅表示一个操作(设为 Variable)。如 果是 Variable,则 Report Count 的数据值等于报告数据的字段数。若是 Array, 则 Report Count 的数据值表示可以同时被触发的最多操作数目。后文中键盘之 例会解说 Array 的用法。 Absolute/Relative:主项目的数据是以相对于固定的基准点方式提供绝对数 值(设为 Absolute),或是提供相对于前次报告的相对值(设为 Relative)。 【范例说明】前文中的音量操控范例,因为都是 Data 和 Variable,二者的 操作值皆为变化值,且一个字段仅表示一个操作。但是音量增减键的例子为 Rel ative,所以若报告值由 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,L inear,Preferred State,但是没有标注即认定其属于默认值,所以等同于是这些 设定,只是这些设定对此例的操作无意义,所以不标出。音量旋钮的例子明确指

出其为 No Wrap, Linear, No Preferred,可见旋钮不是循环旋转,输出值与 旋转角呈线性关系,旋钮释放开时会停留在释放前位置(因为 No Preferred)。 No Null Position/Null State:主项目对应的操和有一个状态,其不会送出有 意义的数据,即数据将不在 Logical Minimum 和 Logical Maximum 之间,这种 操控要标注 Null State,否则为 No Null Position。例如几个按键,而无键被按下 的用途没有声明在 Usage 之列,则可以在主项目的数据中设 Null State,将无键 被按下的状态排除在 Logical Minimum 和 Logical Maximum 区间之外,进一步 请参看 Universal Serial Bus HID Usage Tables 文件的 Appendix A.3 节中范 例。 Non Volatile/Volatile:主项目 Feature 的数据不允许被主机改变(设为 Non Volatile),或是允许被主机改变(设为 Volatile)。注意主项目 Input 和 Outpu t,此标注设定无意义,所以 bit 7 的代码必须为 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。所有 Collectio n 的数据名称与代码如表 7: 表 7:报告集合的名称与代码
Named Physica l Applicatio n Logica l Repor Arrar t y r h 0x07-0x7 0x00 0x01 0x02 0x03 0x04 0x05 0x06 f 0x80-0xff Modifie Switc Reserved ed Usage Usage Vendor-defin

代 码 用 CP CA CL Nary US UM

途 Collection 的数据名称很难有一个准则来给定,Universal Serial Bus HID Usage Tables 文档中将各种用途的用途种类(usage type)列出,使用者必须依据 用途种类来指定 Collection 的数据名称,例如鼠标,键盘和游戏杆的用途种类为 CA,所以要用 Collection (Application),而指针为 CP,所以用 Collection (Physi cal)。

编码
报告描述符的项目编码有二种:短项目和长项目。长项目仅是保留给未来使 用,所以不作介绍。短项目的编码形式如下: Bits 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 2 1 0 [data] Bytes 2 1 [data] 0 bTag bType bSize 3

最低字节分别标注项目大小(bSize),项目类别(bType),和项目卷标(bTag) ﹔ 其中 bTag 占 4 个位,其余二者各占 2 个位。BSize 用来指出项目的数据所 需字节的数目,该数目仅可以为 0(当 bSize=0),1(当 bSize=1),2(当 bSi ze=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』,全局项目的可以改为『01n nB』,而区域项目的可以改为『10nnB』,其中 nn 代表 bSize。

实际范例
这里举一个 Device Class Definition for Human Interface Device 文件的附录 E 中的整合鼠标的键盘装置的范例。这个装置只有一个组态描述符,但是这个组态

具有二个接口,一个为键盘接口(接口编号为 0x00),另一个为鼠标接口(接 口编号为 0x01)。每一个接口都有一个自己的中断型输入端点,输出则都靠内 定的控制型端点 0。 这个整合鼠标的键盘装置的标准描述符, 请参考附件中的 U 『

SB 标准描述符之技巧』 文件。 在该文中所使用的范例即为整合鼠标的键盘装置,
只是仅列出一个接口描述符(即编号为 0x00 的键盘接口),另一个编号为 0x0 1 的鼠标接口在该文中没有列出, 读者可以自行参考本文所附的描述符程序代码 descriptor.asm(即在标记为 interface_descriptor01,hid_descriptor01,和 endpoint _descriptor01 处)。 表 8:范例的输入报告格式 键盘(输入报告) Byte 0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0 0 1 2 Byte 鼠标(输入报告) 7 6 Pad X displacement Y displacement 5 4 3 2 1 0

Modifier keys Reserved Keycode 1 Keycode 2 Keycode 3 Keycode 4 Keycode 5 Keycode 6

Buttons

表 9:范例的输出报告格式 键盘输出报告 Byte 0 7 6 Pad 5 4 3 2 LED’s 1 0

这个范例有输入报告和输出报告, 其中输入报告有二组, 一组属于键盘接口, 另一组属于鼠标接口。表 8 列出输入报告的数据格式。而输出报告只有键盘接 口需要,表 9 为输出报告的数据格式。因为有二个接口,所以有二个报告描述 符,分属于不同的界面,二个报告描述元都列于表 10 中。键盘的报告描述元中 整个报告集合的用途为(Generic Desktop: Keyboard), 由于键盘用途属于应用性,

所以标签 Collection 的资料名为 Application。 由于单独键本身的用途类页不再是 Generic Destop,而是 Keyboard(注意 Keyboard 也可为用途类页),所以在项 目 Collection(Application)下重新声明用途页 Usage Page (Keyboard)。根据 Unive rsal Serial Bus HID Usage Tables 文件,鼠标是指针的一种,只是应用为计算 机的鼠标,所以报告的内层集合的用途为(Generic Desktop: Pointer),外层的应 用性集合的用途为(Generic Desktop: Mouse)。注意鼠标的按钮和位移轴又分属 不同的用途类页,所以在内层集合中还要重新声明用途类页。按钮的用途类业为 Buttons,而二个位移轴所属的用途类业为 Generic Desktop。 10: 表 10:报告描述符范例 键 项 目 盘 编 码 0x0105 Desktop), Usage (Keyboard), Collection (Application), Usage Page (Keyboard), Usage Minimum (224), Usage Maximum (231), Logical Minimum (0), Logical Maximum (1), Report Size (1), Report Count (8), Input (Data, Variable, 0x0281 Absolute), Report Size (8), Report Count (1), Input (Constant), Usage Minimum (0), 0x0875 0x0195 bsolute), 0x0181 0x0019 Report Size (5), Report Count (1), 0x0575 0x0195 Report Count (3), Input (Data, Variable, 0x0281 0x0395 Report Size (1), 0x0175 0x0609 0x01A1 0x0705 0xE019 0xE729 0x0015 0x0125 0x0175 0x0895 Desktop), Usage (Mouse), Collection (Application), Usage (Pointer), Collection (Physical), Usage Page (Buttons), Usage Minimum (1), Usage Maximum (3), Logical Minimum (0), Logical Maximum (1), 0x0209 0x01A1 0x0109 0x00A1 0x0905 0x0119 0x0329 0x0015 0x0125 项 鼠 目 标 编 码 0x0105

Usage Page (Generic

Usage Page (Generic

Usage Maximum (101), Logical Minimum (0), Logical Maximum (101), Report Size (8), Report Count (6), Input (Data, Array), Usage Page (LEDs), Usage Minimum (1), Usage Maximum (5), Logical Minimum (0), Logical Maximum (1), Report Size (1), Report Count (5), Output (Data,

0x6529 0x0015

Input (Constant), Usage Page (Generic

0x0181 0x0105

Desktop), 0x6525 0x0875 0x0695 0x0081 0x0805 0x0119 0x0529 Relative), 0x0015 0x0125 0x0175 0x0595 0x0291 Variable,Absolute), Report Size (3), Report Count (1), Output (Constant), End Collection 0x0375 0x0195 0x0191 0xC0 End Collection, End Collection 0xC0 0xC0 Usage (X), Usage (Y), Logical Minimum (-127), Logical Maximum (127), Report Size (8), Report Count (2), Input (Data, Variable, 0x0681 0x3009 0x3109 0x8115 0x7F25 0x0875 0x0295

从表 8 看出,键盘的输入报告中最低的 8 位分别代表键盘上的 8 个修饰键 (亦即左和右边的 Control 键、Shift 键、Alt 键、和 Windows 键),平常每位 的值为 0,当对应的修饰键被压下时则位值为 1。键盘报告描述符中第一个 Inpu t 项目必须声明这 8 位的格式。这 8 个修饰键为用途类页 Key Codes 中的第 22 4 个键到第 231 键,所以用 Usage Minimum (224)和 Usage Maximum (231)来 声明。每一个按键的逻辑值不是 0 就是 1,所以用 Logical Minimum(0)和 Logic al Maximum (1)

来声明。很显然的,每一个键占用一个数据位,而共需 8 个位,因此 ReportSize ( 1),而 Report Count (8)。请特别注意,最低位对应到 Usage Minimum 的声 明,而最高位所对应的为 Usage Maximum 的数据内容。这 8 个位值是可变的 数据, 每一个位是独立的变量, 提供的值不须与前次的值有相对关系。 总结而言, 该 8 位的主项目必须为 Input (Data, Variable, Absolute)。 键盘的输入报告中次高的字节被保留,该字节的值无意义,也不需更新,所 以用 Input (Constant)来填充(padding)。而最高的 6 个字节则是最近同时被压下 的 6 个按键之代码。这个键盘装置有 101 个键,而报告格式的最高的 6 个位组 中任何一个字节都可以代表 101 个键之任一键,所以这 101 键再加上无键被压 下状态(代码为 0x00)构成一组操作数组,这个装置允许同时压下 6 个键。 键盘报告描述符中 Input (Data, Array)即在声明这 6 个字节的数据格式, 注意 这个数据格式的逻辑值声明和用途代码声明具有相同的数据值(即 0 和 101)。 键盘有一个输出报告,长度为 1 个字节,但是只用到最低 5 个位来代表五个 LED 的操控,所以最高的 3 个位需要用 Output (Constant)项目来填充。输出报 告的用途类页不再是 Key Codes,而是 Page of LEDs,所以要重新声明 Usage Page,而主项目为 Output (Data, Variable, Absolute)。这个项目的数据内容如同 输入报告的最低 8 位所声明的主项目之数据内容,不再作说明。因为键盘接口的 端点描述符只有声明一个中断型输入端点, 所以输出报告需要依赖内定控制型端 点 0 来传送。输入报告由声明的输入端点作中断型输入传输,当然也可以依需要 用内定控制型端点 0 来作控制型读入传输。 鼠标的报告描述符的输入数据格式中最低的一个字节只有最低 3 个位有意 义,其分别对应到鼠标上的三个按钮,用途类页为 Buttons。其它二个字节的用 途为(Generic Desktop: X)和(Generic Desktop: X),分别对应到鼠标 X 轴和 Y 轴的位移操控。 这二个位移值得逻辑范围为-127 到 127, 即一个字节可以表示最 大范围。位移的数值是相对值,所以主项目为 Input (Data, Variable, Relative)。

描述符编辑工具 HID 描述符编辑工具
USB 协会提供了一个 HID 描述符编辑工具称作 HID Descriptor Tool,其执 行程序为 DT.exe。这个工具软件可以在 USB 网站上取得。虽然称作 HID 描述

符工具,事实上,仅提供编撰报告描述符之用。执行 DT.exe 后会出现如图 2 之窗口,小内窗口 HID Items 列出所有报告描述符的标签。以前面所举的实际 范例中键盘的报告描述符为例,首先点选[USAGE_PAGE],后会出现一个次窗 口列出所有的 Usage Page 的选项,这个例子要选[Generic Desktop],按[OK]后 则次窗口消失,DT 的主窗口中的右边小内窗口 Report Descriptor 就出现 Usage Page(Generic Desktop)并跟随着该项目的编码 05 01(低字节在左边),也就是 这个工具可以帮助作自动编码的工作。程序员只要输入项目的卷标和内容,则可 以由这个工具软件提供报告描述符的程序代码。接着,当点选第二个项目[USA GE]时,DT 软件会根据前面的编签 Usage Page 的内容 Generic Desktop,而产 生一个次窗口列出 Generic Desktop 包含的所有 Usage 选项。同样道理,当选完 Usage Page (Keyboard),再要编撰 Usage Minimum 和 Usage Maximum 时,所出现的次窗 口则为 Usage Page (Keyboard)所包含的全部 Usage 选项,选第 224 个为 Left Control 键当用途范围的最小者,再选第 231 个为 Right GUI 键当用途范围的最 大者。其他项目的编撰以此类推。 在主窗口下,点选下拉选项[File]中的[Info],则会出现讯息窗口,告知编撰 的描述符中项目的个数和描述符长度所需字节的数目。编撰报告描述符完成后, 还要做语法检验,这时点选下拉选项[Parse Descriptor],则 DT 软件会告知检查 的结果,并提供错误原因与更改的建议。

总结
最后一个问题是如何将报告描述符加入微控器的汇编程序。 对于任何一种描 述符,都是以汇编语言中的一个标记来分辨,例如第一个接口的报告描述符的标 记就称作 hid_report_descriptor00;同样的,第二个界面的就称作 hid_report_desc riptor01。记得在报告描述符结束处也加上一个标记,如 end_hid_report_descripto r00 和 end_ hid_report_descriptor01。这个结束标记除了有助于阅读程序外,其 最主要的用处是可以用来计算描述符的长度(即字节数)。例如使用 dwl end_ hid_report_descriptor00 - hid_report_descriptor00 组译器就会自动算出第一个 报告描述符的长度,这个长度以二个字节来记载。“dwl”为汇编语言的指示,在 于储存二个字节的数据,储存的方式为 little Endian。所谓 little Endian 方法, 就是将低字节的值存于低地址值的内存空间,高字节之值存于高地址值处。

附件:USB 标准描述符之技巧.rar

descriptor.asm


相关文章:
HID设备报告描述符详解_划出重点
USB/ USB/HID 设备报告描述符详解概述: 概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输 的数据作用途(usage)上的说明。 USB 通讯...
USBHID设备报告描述符详解
USB/HID 设备报告描述符详解概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途 (usage)上的说明。 USB 通讯协议的规范是以 ...
HID类键盘的报告描述符的理解
HID类键盘的报告描述符的理解_电子/电路_工程科技_专业资料。USB 学习小记-HID...其它的描述符含义很明显,这里就不作详 细讲解报告描述符HID设备最...
USB描述符完全解析
USB描述符完全解析_计算机软件及应用_IT/计算机_专业资料。usbUSB 设备描述符完全...HID_ReportSize(1), // 报告大小 (1) HID_Output(HID_Data | HID_...
USB_HID报告及报告描述符_入门简介
USB_HID报告报告描述符_入门简介_信息与通信_工程科技_专业资料。USB_HID报告报告描述符_入门简介USB HID 报告及报告描述符简介 USB HID 设备是通过报告来给...
报告描述符
1.2 报告描述符 要解释报告描述符,首先得清楚什么是“报告”“报告”是主机和...详情可以参考另一文章《Windows 主机端与自定义 USB HID 设备 通信详解》 。 ...
获取USB——HID报告描述符的教程
获取USB——HID报告描述符的教程_计算机软件及应用_IT/计算机_专业资料。无图无...2.USB描述符详解 8页 5下载券 USB接口HID设备 48页 1下载券 多点触摸HID...
USB HID报告及报告描述符简介
USB HID报告及报告描述符简介_信息与通信_工程科技_专业资料。USB HID 报告及报告描述符简介 在 USB 中,USB HOST 是通过各种描述符来识别设备的,有设备描述符,...
HID报告描述符
图 1 HID 各种描述符之间的关系 从图 1 中可以看出,除了 USB 标准定义的一些描述符外, HID 设备还必须定义 HID 描 述符。另外设备和主机的通信是通过报告的...
USB的描述符详解总结
USB描述符详解总结_实习总结_总结/汇报_实用文档。USB描述符,开发USB驱动可以...USB_HID设备报告描述符详... 9页 免费 USB描述符介绍 3页 1下载券 USB各...
更多相关标签:
usb hid报告描述符 | usb hid描述符 | hid详解 | hid报告描述符 | hid描述符 | hid描述符生成工具 | 自定义hid报告描述符 | hid报告描述符工具 |