期的第一篇文章提到报告描述元的语法是以项目方式排列而成,无一定的长度﹔项目有一个前称,然后跟著一个括号,内为该项目的资料,即 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和Variable,二者的操控值皆为变化值,且一个栏位仅表示一个操控。但是音量增减键之例为Relative,所以若报告值由0变成+1,则音量增大一个刻度,反之由0变作-1则音量减小一个刻度,因而音量大小因输入值而作相对的变化。然而音量旋钮之例为Absolute,当输入值为最小值0时,为静音,而输入值为最大值100时,为最大音量,其馀值作百分比的音量调整,输入值和音量成绝对关係。
【范例说明】再以音量操控为例,音量增减键之例都没标注NoWrap,Linear,PreferredState,但是没有标注即认定其属于预设值,所以等同于是这些设定,只是这些设定对此例之操控无意义,所以不标出。音量旋钮之例明确指出其为NoWrap,Linear,NoPreferred,可见旋钮不是循环旋转,输出值与旋转角呈线性关係,旋钮释放开时会停留在释放前位置(因为NoPreferred)。
最后来谈主项目的其他二个标籤: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。 小结 在第一篇文章中已经介绍区域性项目,而本篇介绍完全域性项目和主项目。虽然已经将报告描述元作了完整的介绍,但是仍需要一个实际的范例来解说使用方法。下期的第三篇文章将提供一个实际的范例:整合滑鼠的键盘装置。 |