USB/HID设备报告描述符详解
概述:
报告在这里意思是数据传输(datatransfer),而报告描述符是对这些传输的数据作用途
(usage)上的说明。
USB通讯协议的规范是以
接收一个交换(transaction
来完成传送一口中有效的数据。
1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和
)。交换是由几个封包(Packet)组成,而传输是由一个或几个交换
在这里,传输和报告的意思相类似。传输方式有四种,初始学一
transfer)即可。控制型传
般的传输方式,组态、命令和状态的通讯都可以使用控制
;message-typedata)。中断型传输目的在做重复的
)传输,精确一点而言,即是在每个有限周期内(boundedperiod)
stream-typedata),注意这里所
input、output和n
仅可以传送input报告;仅可以传送output报告;但是控制型
管线(controlpip
e)
般只要了解控制型传输(controltransfer)和中断型传输(interrupt
输是当需要时才执行传输要求,是最一;
型传输;控制型传输主要用于消息型数据(
数据更新(recurringdata
作至少一次的小量数据发送或接收;所以适用于流动型数据(
谓的周期时间就是在端点描述符中的轮询间隔时间。报告有三种:
后面将作进一步介绍。中断型输入管线(interruptinpipe)
岀管线(interruptoutpipe)
送input、output和feature报告。端点描述符有声明所使用的端点为何种管线。
数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按
钮指示灯和X与丫轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或
量。为了这个目的应运而生报告描述符,报告后就可以知道每个数据作何种操作。方式。用途是以一个
32位卷标(称作低16位称为usageID(用途识别名):举例说明:二个字节分别为x和y轴的位移数
据,因此第一个字节的
desktop:X),而第二个字节的usage=(genericdesktop:Y),其中
大类别(称作用途类页)之一,x和y轴的操作用途属于此用途类页。
HIDUsageTable完整列岀所有的usagepages(用途类页)和usageID(用途识别名须遵照文件的规范来声
明操作的用途。该文件的附录A有十多个报告描述符的范例,
Feature。
中断型输
可以传
X与Y轴的位移其将数据的操控与它的用途作一对一的对应,
所以解读
所以“传输的数据”和“操作”只是一事件的两种描述
usagetag)来表示,高16位称作usagepage(用途类页),Usage
=(usagepage:usageID)
usage=(generic
genericdesktop
文件universal
为用途的
rialBus
),使用者必
值得研究下。
表1、报告描述符的标签
主项目MainItem
全域项目GlobalItem区域项目LocalItem
标签代码标签代码标签代码
nput0x8?UsagePage0x0?Usage0x0?
Output0x9?LogicalMinimum0x1?UsageMinimum0x1?
Feature0xB?LogicalMaximum0x2?UsageMaximum0x2?
PhysicalMinimum0x3?DesignatorMinimum0x3?
Collection0xA1PhysicalMaximum0x4?DesignatorMinimum0x4?
EndCollection0xc0UnitExponent0x5?DesignatorMaximum0x5?
Unit0x6?String0x7?
ReportSize0x7?SreingMinimum0x8?
ReportID0x8?StringMaximum0x9?
ReportCoumt0x9?Delimiter0xA?
Push0xA4
Pop0xB4
精品文库
欢迎下载2
标签:
用途卷标只是报告描述符诸多标签的一个。表1列岀所有的卷标,利用这些卷标可以清楚
完整的描述符操作的用途。报告描述符的语法不同于USB标准描述符,它是以项目(items)方
式排列而成,无一定的长度;项目有一个前辍(Prefix),然后跟着一个括号,内为该项目的数
据:item=Prefix(data)。
项目分成三种类别:主项目,全局项目,区域项目。主项目中的input,ouput,feature
三个卷标用来表示报告中数据的种类,这些是报告描述符中最主要的项目,其他项目都是用来修
饰这三种项目。主要项目中其他二个卷标后面再作详细的介绍。
>>Input项:表示设备操作输入到主机的数据模式。这个数据格式就形成一个输入报告,虽然输入报告可以用控制型管线
以getreport(input)来传输,但是通常用中断型输入管线来传输
以确保在每一固定周期内都能将更新的输入报告传给主机。
>>Output项:表示由主机输岀到装置操作的数据格式。这个数据格式就形成一个输岀报告。输岀报告通常不适用轮询的
方式来传送给设备,而是由应用软件依实际需求以传令方式要求送岀输
岀报告,所以大多用控制型管线以treport(output)指令来将报告送到设备。当然也可以选
择用中断型输岀管线来传送,只是通常不建议这样用。
>>Feature项:表示由主机送到设备的组态所需数据的数据格式。这个数据模式就形成一个特征报告。特征报告只能用控
制型管线以getreport(feature)和treport(feature)指令分别
来取得和设定设备的特征值。
>>范例:考虑一个2X16字的显示装置,它的列数、行数、字宽、和字高为固定值属于feature
报告;显示状态例如“就绪”和“输入字错误”则属于input报告;光标位置和显示的字需可
读写,所以属于另一个feature报告;更新显示的字则为output报告。为了区别两个features,
要用到全局项目中的reportID,每个feature报告有一个不同的reportID,因而主机请求指令
要加上reportID的值:getreport(feature,reportID)和Setreport(feature,reportID)
主项目用来定义报告中数据的种类和格式,而说明主项目之意义与用途为全局项目和区
域项目。顾名思义,区域性项目只能适用于列于其下的第一个主项目,不适用于其他主项
目,个主项目之上有几个不同的卷标的区域性项目,则这些区域性项目皆适用于描述该主
项目。
全局性项目适用于其下方的所有主项目,除非另一个相同卷标的全局性项目岀现。
报告描述符,将使用“项目状态表”(itemstatetable)用来表示在某位址处适用的全局性
项目的组合。图1显示全局性项目和区域性项目与所描述的主项目之对应关系。
区域性项目卷标:
简单地说,区域性项目(见表1)只是说明用途而已。Designator是要搭配实体描述符使
用的,这里不对实体描述符进行介绍,所以略过这些designator标签。
标签Usage实际上应该称作UsageID,它搭配全域项目的UsagePage卷标才形成前文所定义的用途{usage};但是报告描
述符允许在区域项目的Usage卷标直接用32位的方式来指定用途,
这种方式称作扩充式用途指定法(extendedusage)
以示区别。例如:
DesktoP:Mou),UsageMinimum(Keyboard:O)
扩充式用途指定法会取代『项目状态表』中的数据
的高16个位为用途类页UsagePage,低数据会对应
到几个操作,因而会有几个用途,例如每一个键是
一个操作,有自己的用途,要将所有
Minimum和UsageMaximum二个标签。以键盘为例,主
若一
相反,为了清
楚说明
Usage(Generic
,和UsageMaximum(Keyboard:101)。很明显的,
UsagePage。还有,使用扩充式用途指定法时,
16个位则为用途识别名UsageID。往往一个报告
101按键的键盘利用不同代码代表不同的键,
UsageID列岀不太现实,所以就需要Usage
Usage
精品文库
欢迎下载3
项目之上只要二个区域项目:
Minimum(0),UsageMaximum(101)。如此一来,则无键按下
(UsageID为0)和101键中任一
精品文库
欢迎下载4
键被按下(UsageID为1至101)的用途都被赋于到一个报告数据上,后面会有一个范例进一步解说。
卷标StringIndex类似卷标Usage,而卷标StringMinimum和StringMaximum则类似
标签UsageMinimum和UsageMaximum如果希望某个操作对应到一个字串,则用StringIndex
来描述该操控的报告数据,这个字符串在字符串描述符中,Stringlndex(data)项目中的data是
这个字符串在字符串描述符中的位置索引。如果需要用到几个字符串,则可以使用String
Minimum来指向字符串描述符中被用到字符串的最先位置索引,和StringMaximum来指向最后
位置索引。
标签Delimiter很少用
到,
AppendixB的范例详细说明。
全局项目卷标
全局项目的卷标事实上只要
ReportSize,ReportID,ReportCount就足够了。表2列了二个音量操作的例子(音量增减
键和音量旋钮)将用来辅助说明这些卷标,不过主项目括号内的数据会在后文中再做说明。
表2、音量操作举例
音量减键音量旋钮
UsagePage(consumer)UsagePage(Consumer)
LJsage(Volume)Usage(Volume)
_ogicalMinimum(-1)LogicalMinimum(0)
_ogicalMaximum(1)LogicalMaximum(100)
ReportSize(2)ReportSize(7)
1
ReportCount(1)
ReportCount(1)
nput(Data,Variable,Relative)
Input(Data,Variable,Absolute,NoWrap,Linear,No
Relative)
查阅UniversalSerialBusHIDUsageTables文档,这两个例子的用途需要令为(Consumer:
Volume)oUsagePage前面已经介绍过了。ReportSize用来设定主项目(Input,Output,Feature)
的报告字段大小,它的单位是位。主项目会对每个操作产生一个报告字段,字段大小则由Report
Size决定。而ReportCount用来设定主项目之报告字段的数目其等于操作的数目。音量增减键的例子中ReportCount(1)
表示主项目Input只产生一个字段,所以可知只有一个音量增减键;而ReportSize(2)表示这个字段为2位。另一个音量
旋钮例子也是只有一个旋钮,所以用ReportCount(1);但是因为ReportSize(7),所以该旋钮的数据字段为7位,可
以表示
127之数值。再举一例,
(1),ReportCount(3)
或被按下)。
LogicalMinimum
请参考UniversalSerialBusHIDUsageTables文件中
UsagePage,LogicalMinimum,LogicalMaximum,
0到
Size
,所以该旋钮的数据字段为
如果是鼠标的三个按键,每个按键占用一个一位的字段,则Report
;那么这个报告长度为三个位,可以同时呈现岀三个按键的状态(原状
和LogicalMaximum在说明每个报告字段的数值范围,这是纯数值所以
。音量增减键的例子中LogicalMinimum(-1),LogicalMaximum
(1)表示只会岀现-1,0,1三种数值,所以用到二位(即ReportSize(2)),0b11代表-1,
代表0,0b01代表1。在音量旋钮例子中,虽然用7位作一字段,但是旋钮仅会产生
精品文库
欢迎下载5
称为逻辑数值(logicalvalue)
数值,因为LogicalMinimum(0)和LogicalMaximum(100)。假如实体程序错误产生超岀逻辑数值的范围,则主机将会忽略
该数值,这种数值称作nullvalue。
0b00
0到100的
精品文库
欢迎下载6
当要将同一种报告分成数个部分,则每一个部分要给予一个识别值,这时就需用到卷标
ReportID,其数据值必须从1起算,不可使用0。没有赋予ReportID标签的报告,主机有可
能会将其ReportID视为0,所以ReportID(0)被要求不能使用。这个标签对控制型管线才有
意义,因为它可以在请求报告时指定ReportID的值。对于中断型管线,其为周期性传输报告,
所以每次都会将所属报告传完,没有仅传输部分之必要,所以ReportID标签就无意义。
其它的全局项目卷标可分为辅助工具(Push和Pop)和物理量说明(PhysicalMinimum,
PhysicalMaximum,UnitExponent,和Unit)°Push卷标将『项目状态表』存放到缓存器(stack),而Pop卷标反过来将缓
存器最顶层的『项目状态表』取回来取代目前之状态表。这二个标签对很长的报告描述符才有用处,因为其可以节省多
列一些全局项目。读者当要使用到时,参考
UniversalSerialBusHIDUsageTables文件AppendixA.7节中范例则可获得正确使用方式。
不同厂家的鼠标有不同的分辨率,若要让主机知道鼠标的分辨率,就必须用到物理量的标签。不使用也不会影响到
鼠标的功能,只是使用者无法由主机的驱动程式得知分辨率而已。但是
量测装置(例如温度计)的应用程序必须知道物理量,则这些标签就必备了。分辨率r的算法
如下
r=((lM-lm)/(PM-Pm))X10‘Unit
其中Im=LogicalMinimum,lM=LogicalMaximum,pm=PhysicalMinimum,pM=PhysicalMaximum,i=UnitExponent。以
400-dpi的鼠标为例如表3。
表3:解析度的范例
_ogicalMinimum(-127)
R=((127-(-127))/(3175-(-3175))X10-4
=400countsperinch
ogicalMinimum(127)
PhysicalMinimum(-3175)
PhysicalMinimum(3175)
给定Logical值,计算岀physical值:
((PM-Pm/2)/10i=((127-(-127))/400)/2=0.3173
a|PM=|Pm|=3175,i=4
UnitExponent(-4)
Unit(inch)
注意,若是UnitExponent未定义,则视为i=0;若是PhysicalMinimum和PhysicalMaximum有一个以上未定义,则视为
PM=IM和pm=lm所以标签PhysicalMinimum和PhysicalMaximum一定要同时定义,否则无意义。这些卷标的括号内数字为有
符号的整数,个字节,字节数目会在卷标代码的最低二位定义,详情后文会
叙述。卷标较复杂,总共用了7个四位(nibbles)来描述,各个四位之意义
如表
未被使用到。
表4:标签Unit的信息格式
Nibbe7
6
543
210
0
Luminous
Intensity
CurrentTemperatureTimeMassLengthSystem
HID共享了四种单位系统,最低的四位就是决定使用的单位系统当然物
理量的单位也不一样。单位和系统间的对应关系如表
可以是一个字节或二至四
Unit的括号内数据比
4,其中第8个四位
(System),不同的系统中
精品文库
欢迎下载7
表5:物理量的单位之编码法
NoneSILinearSIRotation
English
Linear
English
Rotation
System0x00x110x20x30x4
LengthNone公分径度英寸角度
MassNone
公克公克
SlugSlug
TimeNone秒秒秒秒
TemperatureNone凯氏(绝对温度)凯氏(绝对温度)华氏华氏
CurrentNone
安培安培安培安培
Luminous
intensity
NoneCandelaCandelaCandelaCandela
除了最低四位的值用来选择单位系统外,其余每个四位皆表示该单位的幕次方,每个四位(nibble)都是有符号的
整数,可表示的范围为-8至+7:
-8-7-6-5-4-31-2-1
10
121
I3
145617
08h09h0ah0bh0ch0dh0eh0fh100h01h02h1103h04h05h06h07h
因此长度的单位若为公分则Unit(data)中data的码为0x11,若为英吋则为0x13,这二
者中Length的四位值皆为1表示幕次方为1,即cm1或in1。质量单位为公克之码为0x0101,
加速度单位为公分除以平方秒之码为0XE011,其中E代表-2。所以力量单位为质量(公克)乘
于加速度(公分/平方秒)的码为0xE111。能量单位焦尔为力量乘于长度之码为0XE121,其等义
于s?2gcm2和单位系统为SILinear。
主项目
主项目中产生报告数据格式的三个卷标(Input,Output,和Feature)具有共通的数据定
义,这些数据和其代码列于表6中。目前用到9个位来表示这些数据。如果第九位(bit8)为0,
则仅需用一个字节来表示该数据,即忽略第九位。如果第九位为1,就需用到二个字节来表示该
数据。
表6:主项目的信息代码
Bit"8
7
6
543
210
0BitField
Non
Volatile
NoNull
Position
Preferred
State
Linear
No
Wrap
AbsoluteArrayData
Buffered
1
Bytes
Volatile
Null
State
No
Preferred
Non
Linear
Wrap
Relative
VJfriableCo
n|fant
Data/Constant:主项目之数据为可变值(设为Data),或为固定不可变值(设为
Constant都用于Feature的报告,或是用于填充位(padding),使报告长度以字
节为单位。
Constant)。
精品文库
欢迎下载8
Array/Variable:主项目之数据的每个字段可以表示几个不同的操作的其中一个被触发(设为Array),或是每个字段仅表
示一个操作的数据值等于报告数据的字
段数。若是的最多操作数目。后文中键
盘之例会解说
(设为Variable)。如果是Variable,贝UReportCount
Array,贝UReportCount的数据值表示可以同时被触发
Array的用法。
精品文库
欢迎下载9
Absolute/Relative:主项目的数据是以相对于固定的基准点方式提供绝对数值(设为
Absolute),或是提供相对于前次报告的相对值(设为Relative)。
【范例说明】前文中的音量操控范例,因为都是Data和Variable,二者的操作值皆为变化值,
且一个字段仅表示一个操作。但是音量增减键的例子为Relative,所以若报告值由0变成+1,
则音量增大一个刻度,反之由0变作-1则音量减小一个刻度,因而音量大小因输入值而作相对
的变化。然而音量旋钮的例子为Absolute,当输入值为最小值0时,为静音,而输入值为最大
值100时,为最大音量,其余值作百分比的音量调整,输入值和音量成绝对关系。
NoWrap/Wrap:主项目的数据值达到极值后会转为极低值,例如一个转钮可以做360°旋转,输岀值从0至
10,旋转则值变为0,反之若达到0,再转就得到10。
Linear/Nonlinear:主项目的数据与操作刻度为线性关系
Nonlinear)。
PreferredState/NoPreferred:主项目对应的操作再不被触发时会自动恢复到初始状态(设为
)。例如键盘的按键和会自动置中
反之亦同,
若设定为
(设
为
PreferredState),或是不会恢复原状(设为NoPreferred
(lf-centering)的游戏杆,皆为PreferredState。
【范例说明】再以音量操作为例,音量增减键的例子都没标注
但是没有标注即认定其属于默认值,所以等同于是这些设定,
称作卷绕(设为Wrap)。
Wrap,则值达10后,在同方向
Linear),或为非线性(设为
NoWrap,Linear,PreferredState,
只是这些设定对此例的操作无意义,
,可见旋钮不是
所以不标岀。音量旋钮的例子明确指岀其为NoWrap,Linear,NoPreferred
循环旋转,输岀值与旋转角呈线性关系,旋钮释放开时会停留在释放前位置
:主项目对应的操和有一个状态,其不会送岀有意义的数据,即
和LogicalMaximum之间,这种操控要标注NullState,否则为
。例如几个按键,而无键被按下的用途没有声明在
Logical
UniversalSerialBusHIDUsageTables
NoNullPosition/NullState
数据将不在LogicalMinimum
NoNullPosition
项目的数据中设NullState,将无键被按下的状态排除在区
间之外,进一步请参看中范例。
(因为No
Preferred)。
NullState
Usage之列,则可以在主
Minimum和口LogicalMaximum
文件的AppendixA.3节
NonVolatile/Volatile
是允许被主机改变(设为bit7的代码必须为0。
BitField/BufferedBytes:主项目的数据格式要以字节为单位,不足构成字节时自动填充成字节则
设BufferedBytes。
最后来谈谈主项目的其它二个卷标:Collection和EndCollection
:主项目Feature的数据不允许被主机改变
Volatile)。注意主项目Input和Output,此标注设定无意义,所以
(设为NonVolatile),或
。以鼠标而言,在实体
X和
将
上是一个指针(pointer),只是应用为计算机鼠标;而这个指针含有三个按键和二个平移轴丫。所以指
针的报告是由不同格式的数据所构成,因而需要用到Collection和EndCollection
几个Input项目集结成一组,其用途为指针,再用来说明其应用为鼠标。
卷标EndCollection没有跟随任何资料。但是卷标
针的数据名为Physical,而鼠标的为Application表7:报告集合的名称与代码
因而需要用到Collection
Collection和EndCollection将指针括起
Collection跟随一个字节的数据,例如指
。所有Collection的数据名称与代码如表
7:
1ApplicationLogicalReport
Named
Arrary
Usage
Modifier
Usage
Switch
RervedVendor-defined
Physical
代
码
0x000x010x020x030x040x050x060x07-0x7f0x80-0xff
用
途
CPCACLNaryUSUM
精品文库
欢迎下载10
Collection的数据名称很难有一个准则来给定,文
档中将各种用途的用途种类(usagetype)列岀,的数据
名称,例如鼠标,键盘和游戏杆的用途种类为而指针
为CP,所以用Collection(Physical)。
UniversalSerialBusHIDUsageTables
使用者必须依据用途种类来指定Collection
CA所以要用Collection(Application)
编码
报告描述符的项目编码有二种:短项目和长项目。长项目仅是保留给未来使用,所以不作介绍。
短项目的编码形式如下:
最低字节分别标注项目大小(bSize),项目类别(bType),和项目卷标(bTag);
其中bTag占4个位,其余二者各占2个位。BSize用来指岀项目的数据所需字节的数目该数
目仅可以为0(当bSize=0),1(当bSize=1),2(当bSize=2),和不可以为3
个字节。大部分的卷标仅需一个字节的数据;全局项目的卷标最多用到4个字节
来表示其资料。
标签代码bTag已经于前章的表1中描述,例如Input的标签代码
实际范例
这里举一个DeviceClassDefinitionforHumanInterfaceDevice
整合鼠标的键盘装置的范例。这个装置只有一个组态描述符,但是这个组态
具有二个接口,
为键盘接口(接口编号为0x00),另一个为鼠标接口(接口编号为0x01)。每一个接口都有一个自己的中断型
输入端点,输岀则都靠内定的控制型端点0。这个整合鼠标的键盘装置的标准描
述符,请参考附件中的『USB标准描述符之技巧』文件。在该文中所使用的范例即为整合鼠标的
键盘装置,只是仅列岀一个接口描述符(即编号为0x00的键盘接口),另一个编号为0x01的
鼠标接口在该文中没有列岀,读者可以自行参考本文所附的描述符程序代码(即
在标记为interface_descriptor01,hid_descriptor01,和口endpoint_descriptor01处)。
表8:范例的输入报告格式
键盘(输入报告)鼠标(输入报告)
Byte7654
3|2|1
0Byte6543211°
0ModifierkeysPadButtons
1RervedXdisplacement
2Keycode1Ydisplacement
3Keycode2
4Keycode3
5Keycode4
6
Keycode5
7Keycode6
[data][data]bTag
IbType|bSize
(当bSize=3);注意
Unit比较特殊有可能
之值;再如标签Feature之bTag=11,而Unit之bTag=6。主项目之bType=0,全局项目之bType=1,而区域项
目之bType=2。所以在前章的表1中的主项目卷标代码中的『?』可以改为
『00nnB』,全局项目的可以改为『01nnB』,而区域项目的可以改为『
bSize。
1中的主项目卷标代码中的『
10nnB』,其中nn代表
0x8?』中8即为bTag
文件的附录
中的
一个
精品文库
欢迎下载11
表9:范例的输岀报告格式
键盘输岀报告
Byte
7
6I54
P21
1。
0
Pad
LEDs
这个范例有输入报告和输岀报告,其中输入报告有二组,一组属于键盘接口,另一组属于鼠标接口。
表8列岀输入报告的数据格式。而输岀报告只有键盘接口需要,表9为输岀报告的
数据格式。因为有二个接口,所以有二个报告描述符,分属于不同的界面,二个报告描述元都列于表10中。
键盘的报告描述元中整个报告集合的用途为(GenericDesktop:Keyboard),由于
键盘用途属于应用性,所以标签Collection的资料名为Application。由于单独键本身的用途
类页不再是GenericDestop,而是Keyboard(注意Keyboard也可为用途类页),所以在项目
Collection(Application)下重新声明用途页UsagePage(Keyboard)。根据UniversalSerial
BusHIDUsageTables文件,鼠标是指针的一种,只是应用为计算机的鼠标,所以报告的内层集合的用
途为(GenericDesktop:Pointer),外层的应用性集合的用途为(GenericDesktop:
Mou)o注意鼠标的按钮和位移轴又分属不同的用途类页,所以在内层集合中还要重新声明用途
类页。按钮的用途类业为Buttons,而二个位移轴所属的用途类业为
表10:报告描述符范例
键盘
1鼠标
项目
编码
项目
编码
UsagePage(GenericDesktop).0x0105
UsagePage(Generic
Desktop),
0x0105
Usage(Keyboard),
0x0609
Usage(Mou),
0x0209
Collection(Application),
0x01A1
Collection(Application),
0x01A1
UsagePage(Keyboard),0x0705Usage(Pointer),0x0109
UsageMinimum(224),0xE019Collection(Physical),0x00A1
UsageMaximum(231),
0xE729UsagePage(Buttons),0x0905
LogicalMinimum(0),
0x0015UsageMinimum(1),0x0119
_ogicalMaximum(1),0x0125UsageMaximum(3),0x0329
ReportSize(1),
0x0175LogicalMinimum(0),0x0015
ReportCount(8),0x0895LogicalMaximum(1),0x0125
nput(Data,Variable,Absolute),
0x0281ReportSize(1),0x0175
ReportSize(8),
0x0875ReportCount(3),0x0395
ReportCount(1),
0x0195
Input(Data,Variable,bsolute),
0x0281
jnput(Constant),
0x0181ReportSize(5),0x0575
UsageMinimum(0),0x0019ReportCount(1),0x0195
UsageMaximum(101),0x6529Input(Constant),0x0181
[ogicalMinimum(0),
0x0015
UsagePage(Generic
Desktop),
0x0105
GenericDesktop。
精品文库
欢迎下载12
_ogicalMaximum(101),0x6525
[Usage(X),
0x3009
ReportSize(8),0x0875
Usage(Y),
0x3109
ReportCount(6),0x0695LogicalMinimum(-127),0x8115
nput(Data,Array),0x0081
LogicalMaximum(127),
0x7F25
UsagePage(LEDs),0x0805ReportSize(8),0x0875
UsageMinimum(1),0x0119
ReportCount(2),
0x0295
UsageMaximum(5),0x0529
Input(Data,Variable,
Relative),
0x0681
_ogicalMinimum(0),0x0015EndCollection,0xC0
_ogicalMaximum(1),0x0125EndCollection0xC0
ReportSize(1),0x0175
ReportCount(5),0x0595
Output(Data,
Variable,Absolute),
0x0291
ReportSize(3),0x0375
ReportCount(1),0x0195
Output(Constant),0x0191
EndCollection
0xC0
从表8看岀,键盘的输入报告中最低的8位分别代表键盘上的8个修饰键(亦即左和右边
的Control键、Shift键、Alt键、和Windows键),平常每位的值为0,当对应的修饰键被
压下时则位值为1。键盘报告描述符中第一个Input项目必须声明这8位的格式。这8个修饰键
为用途类页KeyCodes中的第224个键到第231键,所以用UsageMinimum(224)和UsageMaximum(231)来声明。
每一个按键的逻辑值不是0就是1,所以用LogicalMinimum(0)和Logical
Maximum(1)来声明。很显然的,每一个键占用一个数据位,而共需8个位,因此ReportSize(1),
而ReportCount(8)。请特别注意,最低位对应到UsageMinimum的声明,而最高位所对应的
为UsageMaximum的数据内容。这8个位值是可变的数据,每一个位是独立的变量,提供的值不须与前次的值
有相对关系。总结而言,该8位的主项目必须为Input(Data,Variable,
Absolute)。
键盘的输入报告中次高的字节被保留,该
字节的值无意义,也不需更新,所以用
(Constant)来填充(padding)。而最高的6键盘装
置有101个键,而报告格式的最高的一键,所
以这101键再加上无键被压下状态同时压下6
个键。
键盘报告描述符中Input(Data,Array)即在声明这6个字节的数据格式,注意这个数据格式的逻辑值声
明和用途代码声明具有相同的数据值(即0和101)。
键盘有一个输岀报告,长度为1个字节,但是只用到最低5个位来代表五个LED的操控,所以
最高的3个位需要用Output(Constant)项目来填充。输岀报告的用途类页不再是KeyCodes,
而是PageofLEDs,所以要重新声明UsagePage,而主项目为Output(Data,Variable,
Absolute)。这个项目的数据内容如同输入报告的最低8位所声明的主项目之数据内容,不再作
说明。因为键盘接口的端点描述符只有声明一个中断型输入端点,制型
端点0来传送。输入报告由声明的输入端点作中断型输入传输,制型端
Input
个字节则是最近同时被压下的6个按键之代码。这个
6个位组中任何一个字节都可以代表101个键之任
(代码为0x00)构成一组操作数组,这个装置允许
所以输岀报告需要依赖内定控
当然也可以依需要用内定控
精品文库
欢迎下载13
点0来作控制型读入传输。
鼠标的报告描述符的输入数据格式中最低的一个字节只有最低3个位有意义,其分别对应
到鼠标上的三个按钮,用途类页为Buttons。其它二个字节的用途为(GenericDesktop:X)和
(GenericDesktop:X),分别对应到鼠标X轴和Y轴的位移操控。这二个位移值得逻辑范围为
-127到127,即一个字节可以表示最大范围。位移的数值是相对值,所以主项目为Input(Data,
Variable,Relative)。
总结
最后一个问题是如何将报告描述符加入微控器的汇编程序。对于任何一种描述符,都是以汇编语言中
的一个标记来分辨,例如第一个接口的报告描述符的标记就称作
hid_report_descriptorOO;同样的,第二个界面的就称作hid_report_descriptor01<
报告描述符结束处也加上一个标记,如end_hid_report_descriptor00和end_
hid_report_descriptor01。这个结束标记除了有助于阅读程序外,其最主要的用处是可以用来
计算描述符的长度(即字节数)。例如使用dwlend_hid_report_descriptor00-
hid_report_descriptor00组译器就会自动算岀第一个报告描述符的长度,这个长度以二个字节
来记载。“dwl”为汇编语言的指示,在于储存二个字节的数据,储存的方式为littleEndian。
所谓littleEndian方法,就是将低字节的值存于低地址值的内存空间,高字节之值存于高地
址值处。
。记得在
本文发布于:2022-12-09 15:24:19,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/73302.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |