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

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

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

  关于 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)只是说明用途而已。Designator 是要搭配实体描述元使用的,本文不拟介绍实体描述元,所以忽略这些Designator 标籤。标籤Usage 实际上应该称作Usage ID,它搭配全域项目的Usage Page标籤才形成前文所定义的用途{usage}﹔但是报告描述元允许在区域项目的 Usage 标籤直接用 32位元的方式来指定用途,这种方式称作扩充式用途指定法(extended usage)以示区别。例如:Usage(Generic Desktop:Mouse),Usage Minimum(Keyboard:0),和 Usage
Maximum(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 科技杂志中将会陆续刊出下二篇文章, 其中第二篇将介绍全域性项目和主项目。而第三篇为讲解报告描述元的使用方法,将提供一个实际的范例:整合滑鼠的键盘装置。 
 

 

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