当前位置:文档之家› USB HID报告描述符详解

USB HID报告描述符详解

USB 之人性化接口装置的报告描述元(1)作者: 林锡宽e-mail: sklin@.tw(原文刊于e 科技杂志vol. 30,2003 年6 月号)关于USB 的标准描述元已经在 e 科技杂志的第24 和25 期中作了完整的介绍。

有些读者来函希望能早日刊出报告描述元的介绍。

人性化接口装置HID 的类别特定描述元有三种,其中HID 描述元因为需要连接在接口描述元(标准描述元之一)之后,所以也已经在前文介绍了。

其他二个HID 类别特定描述元为报告描述元和实体描述元。

实体描述元几乎很少使用到,所以不拟介绍,虽然它不会很复杂。

本文仅专注介绍报告描述元。

相对来说,报告描述元最复杂,也不容易理解,可是却最重要,因为HID 装置与主机间的经常性数据传输都由报告描述元来规范。

因为报告描述元的复杂和难理解,使得此文的编撰花了不少时间,因此无法在上次刊完USB 标准描述元后,接着刊出。

由于内容篇幅颇长,所以仅能分为三篇陆续刊出。

本期的第一篇中仅介绍到区域性项目,下期的第二篇再继续介绍全局性项目和主项目。

这三类项目构成一个报告描述元。

最后仍需要以一个实际的范例来解说使用方法,所以第三篇文章将提供一个实际的范例:整合鼠标的键盘装置。

此外,也会将该范例的韧体程序代码提供给有兴趣的读者。

这个韧体程序代码不只是该范例的报告描述元,也含括了它的标准描述元。

概述报告(report)在这里意指数据传输(data transfer),而报告描述元则是对这些传输的数据作用途(usage)的说明。

USB 通讯协议的规范是以1 毫秒产生一个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,Output,和Feature 报告。

端点描述元有宣告所使用的端点为何种管线。

数据本身无意义,要赋于用途才知其为何种操控(control)﹔例如装置上的按钮、指示灯和x 与y 轴的位移等都通称操控,数据则为按钮和指示灯的开关状态或x 与y 轴的位移量。

为了这个目的应运而生报告描述元,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操控。

所以『传输的数据』和『操控』可谓一体的两面。

用途是以一个32 位的卷标(称作Usage tag)来表示,较高的16 位称作UsagePage(用途类页),较低的16 位称为Usage ID(用途识别名):Usage = (Usage Page: Usage ID)举例而言,二个字节分别为x 和y 轴的位移数据,因此第一个字节的Usage=(Generic Desktop: X),而第二个字节的Usage =(Generic Desktop: Y),其中Generic Desktop 为用途的大类别(称作用途类页)之一,x 和y 轴的操控用途属于此用途类页。

文件Universal Serial Bus HID Usage Tables完整列出所有的Usage Pages(用途类页)和Usage ID’s(用途识别名),使用者必须遵照该文件的规范来宣告操控的用途。

该文件的附录 A 有十多个报告描述元的范例,值得读者进一步参考。

标签用途卷标只是报告描述元诸多标签之一。

表 1 列出所有的卷标,利用这些卷标即可以清楚完整的描述操控的用途。

报告描述元的语法不同于USB 标准描述元者,它是以项目(items)方式排列而成,无一定的长度﹔项目有一个前称(prefix),然后跟着一个括号,内为该项目的数据(data):item = prefix (data)。

项目又分三种型别:主项目,全局项目,区域项目。

主项目中的Input,Output,Feature 三个卷标用来表示报告中数据的种类,这些是报告描述元中最主要的项目,其他项目都是用来修饰这三种项目。

主项目中其他二个卷标容后再介绍,在此略过。

Input项:表示由装置操控输入到主机的数据格式。

这个数据格式就形成一个输入报告,虽然输入报告可以用控制型管线以Get_Report(Input)来传输,但是通常用中断型输入管线来传输,以确保在每一固定周期内都能将更新的输入报告传给主机。

Output项:表示由主机输出到装置操控的数据格式。

这个数据格式就形成一个输出报告。

输出报告通常不适用轮询方式来传给装置,而是由应用软件依实际需求以指令方式要求送出输出报告,所以大多是用控制型管线以Set_Report(Output)指令来将报告送到装置。

当然也可以选择用中断型输出管线来传送,只是通常不建议。

Feature项:表示由主机送到装置的组态所需数据的数据格式。

这个个数据格式就形成一个特征报告。

特征报告只能用控制型管线以Get_Report(Feature)和Set_Report(Feature)指令分别来取得和设定装置的特征值。

范例:考虑一个2×16 字的显示设备,它的列数、行数、字宽、和字高为固定值属于Feature 报告﹔显示状态例如『就绪』和『输入字错误』则属于Input 报告﹔光标位置和显示的字需可读可写,所以属于另一个Feature 报告﹔更新显示的字则为Output 报告。

为了区别二个Features,要用到全局项目中的Report ID,每个Feature 报告有一个不同的Report ID,因而主机的请求指令要加上Report ID 的值:Get_Report(Feature, Report ID)和Set_Report(Feature,Report ID)。

主项目用来定义报告中数据的种类和格式,而说明主项目之意义与用途为全局性项目和区域性项目。

顾名思义,区域性项目只能适用于列于其下面的第一个主项目,不能扩及其他主项目,若一个主项目之上方有数个不同卷标的区域性项目,则这些区域性项目皆适用于描述该主项目。

相反的,全局性项目适用于其下方所列的所有主项目,除非另一个相同卷标的全局性项目出现在其下方来取代它。

为求清楚说明报告描述元,将使用『项目状态表』(item state table)用来表示在某位址处适用的全局性项目的组合。

图 1 显示全局性项目和区域性项目与所描述的主项目之对应关系。

图1报告描述元之架构图区域项目卷标简单的说,区域项目(见表1)只是说明用途而已。

Designator 是要搭配实体描述元使用的,本文不拟介绍实体描述元,所以忽略这些Designator 标签。

标签Usage 实际上应该称作Usage ID,它搭配全局项目的Usage Page 卷标才形成前文所定义的用途{usage}﹔但是报告描述元允许在区域项目的Usage 卷标直接用32位的方式来指定用途,这种方式称作扩充式用途指定法(extended usage)以示区别。

例如:Usage(Generic Desktop:Mouse),Usage Minimum(Keyboard:0),和UsageMaximum(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 来描述该操控的报告数据,这个字符串在字符串描述元中,String Index (data)项目中的data 是这个字符串在字符串描述元中的位置索引。

如果需要用到数个字符串,则可以使用String Minimum 来指向字符串描述元中被用到字符串的最先位置索引,和String Maximum 来指向最后位置索引。

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

小结在下二期的e 科技杂志中将会陆续刊出下二篇文章,其中第二篇将介绍全局性项目和主项目。

而第三篇为讲解报告描述元的使用方法,将提供一个实际的范例:整合鼠标的键盘装置。

USB 之人性化接口装置的报告描述元(2)作者: 林锡宽e-mail: sklin@.tw(原文刊于e 科技杂志vol. 31,2003 年7 月号)上期的第一篇文章提到报告描述元的语法是以项目方式排列而成,无一定的长度﹔项目有一个前称,然后跟着一个括号,内为该项目的数据,即item = prefix (data)。

项目又分三种型别:主项目,全局项目,区域项目。

第一篇已经介绍了区域项目,本篇将继续介绍主项目和全局项目。

下期的第三篇文章将以一个实际例子来介绍使用方法。

阅读本篇时,请随时参考第一篇的表1。

相关主题