您现在的位置: USB开发网 > USB技术文档 > USB HID设备类
- USB HID设备类

USB 之人性化介面装置的报告描述元(2)

------分隔线----------------------------

  期的第一篇文章提到报告描述元的语法是以项目方式排列而成,无一定的长度﹔项目有一个前称,然后跟著一个括号,内为该项目的资料,即 item = prefix (data)。项目又分三种型别:主项目,全域项目,区域项目。第一篇已经介绍了区域项目,本篇将继续介绍主项目和全域项目。下期的第三篇文章将以一个实际例子来介绍使用方法。阅读本篇时,请随时参考第一篇的表 1。 

 
全域项目标籤 
 
  全域项目的标籤事实上只要 Usage Page,Logical Minimum,Logical Maximum,Report Size,Report ID,Report Count 就足够了。表 2 列了二个音量操控例(音量增减键和音量旋钮)将用来辅助说明这些标籤,不过主项目括号内的资料会在后文中再做说明。 
 

  查阅UniversalSerialBusHIDUsageTables文件,这两个例子的用途需要令为(Consumer:Volume)。UsagePage已经介绍过了。ReportSize用来设定主项目(Input,Output,Feature)的报告栏位大小,它的单位是位元。主项目会对每个操控产生一个报告栏位,栏位大小则由ReportSize决定。而ReportCount用来设定主项目之报告栏位的数目,其等于操控的数目。音量增减键的例子中ReportCount(1)表示主项目Input只产生一个栏位,所以可知只有一个音量增减键﹔而ReportSize(2)表示这个栏位为2位元。另一个音量旋钮例子也是只有一个旋钮,所以用ReportCount(1)﹔但是因为ReportSize(7),所以该旋钮的数据栏位为7位元,可以表示0到127之数值。再举一例,如果是滑鼠的三个按键,每个按键佔用一个一位元的栏位,则ReportSize(1),ReportCount(3)﹔那麽这个报告长度为三个位元,可以同时呈现出三个按键的状态(原状或被按下)。

  LogicalMinimum和LogicalMaximum在说明每个报告栏位的数值范围,这是纯数值所以称为逻辑数值(logicalvalue)。音量增减键的例子中LogicalMinimum(-1),LogicalMaximum(1)表示只会出现-1,0,1三种数值,所以用到二位元(即ReportSize(2)),0b11代表-1,0b00代表0,0b01代表1。在音量旋钮例子中,虽然用7位元作一栏位,但是旋钮仅会产生0到100的数值,因为LogicalMinimum(0)和LogicalMaximum(100)。假如韧体程式错误产生超出逻辑数值的范围,则主机将会忽略该数值,这种数值称作nullvalue。

  当要将同一种报告分成数个部分,则每一个部分要给予一个识别值,这时就需用到标籤ReportID,其资料值必须从1起算,不可使用0。没有赋予ReportID标籤的报告,主机有可能会将其ReportID视为0,所以ReportID(0)被要求不能使用。这个标籤对控制型管线才有意义,因为它可以在请求报告时指定ReportID的值。对于中断型管线,其为週期性传输报告,所以每次都会将所属报告传完,没有仅传输部分之必要,所以ReportID标籤就无意义。

  其他的全域项目标籤可分为辅助工具(Push和Pop)和物理量说明(PhysicalMinimum,PhysicalMaximum,UnitExponent,和Unit)。Push标籤将『项目状态表』存放到暂存器(stack),而Pop标籤反过来将暂存器最顶层的『项目状态表』取回来取代目前之状态表。这二个标籤对很长的报告描述元才有用处,因为其可以节省多列一些全域项目。读者当要使用到时,再去参考UniversalSerialBusHIDUsageTables文件的AppendixA.7节中范例则可获得正确使用方式。

  不同厂牌的滑鼠有不同的解析度,若要让主机知道滑鼠的解析度,就必须用到物理量的标籤。不使用也不会影响到滑鼠的功能,只是使用者无法由主机的驱动程式得知解析度而已。但是量测装置(例如温度计)的应用程式必须知道物理量,则这些标籤就必备了。解析度r的算法如下


 
  其中lm=LogicalMinimum,lM=LogicalMaximum,Pm=PhysicalMinimum,PM=PhysicalMaximum,i=UnitExponent。以400-dpi的滑鼠为例如表3。

 


 

  注意,若是UnitExponent未定义,则视为i=0﹔若是PhysicalMinimum和PhysicalMaximum有一个以上未定义,则视为PM=lM和pm=lm。所以标籤PhysicalMinimum和PhysicalMaximum一定要同时定义,否则无意义。这些标籤的括号内数字为有符号的整数,可以是一个位元组或二至四个位元组,位元组数目会在标籤代码的最低二位元定义,详情后文会叙述。标籤Unit的括号内资料比较複杂,总共用了7个四位元(nibbles)来描述,各个四位元之意义如表4,其中第8个四位元未被使用到。

 

 

  HID共用了四种单位系统,最低的四位元就是决定使用的单位系统(System),不同的系统中当然物理量的单位也不一样。单位和系统间的对应关係如表5。

  除了最低四位元的值用来选择单位系统外,其馀每个四位元皆表示该单位的幂次方,每个四位元(nibble)都是有符号的整数,可表示的范围为-8至+7:

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

主项目 

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

 

  • Data/Constant:主项目之数据为可变之值(设为Data),或为固定不可变之值(设为Constant)。Constant都用于Feature的报告,或是用于填充位元(padding),使报告长度以位元组为单位。
  • Array/Variable:主项目之数据的每个栏位可以表示数个不同的操控的其中一个被触动(设为Array),或是每个栏位仅表示一个操控(设为Variable)。如果是Variable,则ReportCount之资料值等于报告数据的栏位数。若是Array,则ReportCount之资料值表示可以同时被触动的最多操控数目。后文中键盘之例会解说Array的用法。
  • Absolute/Relative:主项目之数据是以相对于固定的基准点方式提供绝对数值(设为Absolute),或是提供相对于前次报告的相对值(设为Relative)。

  【范例说明】前文中的音量操控范例,因为都是Data和Variable,二者的操控值皆为变化值,且一个栏位仅表示一个操控。但是音量增减键之例为Relative,所以若报告值由0变成+1,则音量增大一个刻度,反之由0变作-1则音量减小一个刻度,因而音量大小因输入值而作相对的变化。然而音量旋钮之例为Absolute,当输入值为最小值0时,为静音,而输入值为最大值100时,为最大音量,其馀值作百分比的音量调整,输入值和音量成绝对关係。

  • NoWrap/Wrap:主项目之数据之值达到极值后会转为极低值,反之亦同,称作捲绕(设为Wrap)。例如一个转钮可以做360°旋转,输出值从0至10,若设定为Wrap,则值达10后,在同方向旋转则值变为0,反之若达到0,再转就得到10。
  • Linear/Nonlinear:主项目之数据与操控刻度为线性关係(设为Linear),或为非线性(设为Nonlinear)。
  • PreferredState/NoPreferred:主项目对应之操控再不被触动时会自动恢复到初始状态(设为PreferredState),或是不会恢复原状(设为NoPreferred)。例如键盘的按键和会自动置中(self-centering)的摇杆,皆为PreferredState。

  【范例说明】再以音量操控为例,音量增减键之例都没标注NoWrap,Linear,PreferredState,但是没有标注即认定其属于预设值,所以等同于是这些设定,只是这些设定对此例之操控无意义,所以不标出。音量旋钮之例明确指出其为NoWrap,Linear,NoPreferred,可见旋钮不是循环旋转,输出值与旋转角呈线性关係,旋钮释放开时会停留在释放前位置(因为NoPreferred)。

  • NoNullPosition/NullState:主项目对应之操控有一个状态,其不会送出有意义的数据,即数据将不在LogicalMinimum和LogicalMaximum之间,这种操控要标注NullState,否则为NoNullPosition。例如数个按键,而无键被按下之用途没有宣告在Usage之列,则可以在主项目的资料中设NullState,将无键被按下的状态排除在LogicalMinimum和LogicalMaximum区间之外,请进一步参看UniversalSerialBusHIDUsageTables文件的AppendixA.3节中范例。
  • NonVolatile/Volatile:主项目Feature的数据不予许被主机改变(设为NonVolatile),或是予许被主机改变(设为Volatile)。注意主项目Input和Output,此标注设定无意义,所以bit7的代码必须为0。
  • BitField/BufferedBytes:主项目之数据格式要以位元组为单位,不足构成位元组时自动填充成位元组则设BufferedBytes。

  最后来谈主项目的其他二个标籤:Collection和EndCollection。以滑鼠而言,在实体上是一个指向器(pointer),只是应用为电脑滑鼠﹔而这个指向器含有三个按键和二个平移轴X和Y。所以指向器的报告是由不同格式的数据所构成,因而需要用到Collection和EndCollection将数个Input项目集结成一组,其用途为指向器,再用Collection和EndCollection将指向器括起来说明其应用为滑鼠。

  标籤 End Collection没有跟随任何资料。但是标籤Collection跟随一个位元组的资料,例如指向器的资料名为 Physical,而滑鼠的为 Application。所有 Collection的资料名称与代码如表 7: 

  
编码 
  Collection的资料名称很难有一个准则来给定,UniversalSerialBusHIDUsageTables文件中将各种用途的用途种类(usagetype)列出,使用者必须依据用途种类来指定Collection的资料名称,例如滑鼠,键盘和摇杆的用途种类为CA,所以要用Collection(Application),而指向器为CP,所以用Collection(Physical)。
  报告描述元的项目编码有二种:短项目和长项目。长项目仅是保留给未来使用,所以没有介绍之必要。短项目的编码形式如下:
 
 

  

   最低位元组分别标注项目大小(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。

小结

  在第一篇文章中已经介绍区域性项目,而本篇介绍完全域性项目和主项目。虽然已经将报告描述元作了完整的介绍,但是仍需要一个实际的范例来解说使用方法。下期的第三篇文章将提供一个实际的范例:整合滑鼠的键盘装置。

------分隔线----------------------------
联系我们
  • Q Q: 1148374829 点击这里给我发消息
  • 旺旺:jhoneqhsieh 点击这里给我发消息
  • 电话:(0)15923141204
  • 淘宝网店
USB开源项目