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

USB 之人性化介面裝置的報告描述元(3)

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

   在先前二期的第一篇和第二篇文章已经对报告描述元的主项目,全域项目,区域项目作了完整的介绍。本篇文章的目的在于使用一个实际范例来解说报告描述元的使用方法。

实际范例 

  这裡举一个DeviceClassDefinitionforHumanInterfaceDevice文件的附录E中的整合滑鼠的键盘装置的范例。这个装置只有一个组态描述元,但是这个组态具有二个介面,一个为键盘介面(介面编号为0x00),另一个为滑鼠介面(介面编号为0x01)。每一个介面都有一个自己的中断型输入端点,输出则都靠内定的控制型端点0。这个整合滑鼠的键盘装置的标准描述元,请参考e科技杂志的第24和25期中的『USB标准描述元之技巧』文章中。在该文中所使用的范例即为整合滑鼠的键盘装置,只是仅列出一个介面描述元(即编号为0x00的键盘介面),另一个编号为0x01的滑鼠介面在该文中没有列出,读者可以自行参考本文所附的描述元韧体程式码descriptor.asm(即在标记为interface_descriptor01,hid_descriptor01,和endpoint_descriptor01处)。 

  这个范例有输入报告和输出报告,其中输入报告有二组,一组属于键盘介面,另一组属于滑鼠介面。表8列出输入报告的数据格式。而输出报告只有键盘介面需要,表9为输出报告的数据格式。因为有二个介面,所以有二个报告描述元,分属于不同的介面,二个报告描述元都列于表10中。键盘的报告描述元中整个报告集合的用途为(GenericDesktop:Keyboard),由于键盘用途属于应用性,所以标籤Collection的资料名为Application。由于单独键本身的用途类页不再是GenericDestop,而是Keyboard(注意Keyboard也可为用途类页),所以在项目Collection(Application)下重新宣告用途页UsagePage(Keyboard)。根据UniversalSerialBusHIDUsageTables文件,滑鼠是指向器的一种,只是应用为电脑的滑鼠,所以报告的内层集合之用途为(GenericDesktop:Pointer),外层的应用性集合之用途为(GenericDesktop:Mouse)。注意滑鼠的按钮和位移轴又分属不同的用途类页,所以在内层集合中还要重新宣告用途类页。按钮的用途类业为Buttons,而二个位移轴所属的用途类业为GenericDesktop。

 

  从表8看出,键盘的输入报告中最低的8位元分别代表键盘上的8个修饰键(亦即左和右边的Control键、Shift键、Alt键、和Windows键),平常每位元的值为0,当对应的修饰键被压下时则位元值为1。键盘报告描述元中第一个Input项目必须宣告这8位元的格式。这8个修饰键为用途类页KeyCodes中的第224个键到第231键,所以用UsageMinimum(224)和UsageMaximum(231)来宣告。每一个按键的逻辑值不是0就是1,所以用LogicalMinimum(0)和LogicalMaximum(1)来宣告。很显然的,每一个键佔用一个数据位元,而共需8个位元,因此ReportSize(1),而ReportCount(8)。请特别注意,最低位元对应到UsageMinimum的宣告,而最高位元所对应的为UsageMaximum的资料内容。这8个位元值是可变的数据,每一个位元是独立的变数,提供的值不须与前次的值有相对关係。总结而言,该8位元的主项目必须为Input(Data,Variable,Absolute)。

  键盘的输入报告中次高的位元组被保留,该位元组的值无意义,也不需更新,所以用Input(Constant)来填充(padding)。而最高的6个位元组则是最近同时被压下的6个按键之代码。这个键盘装置有101个键,而报告格式的最高的6个位元组中任何一个位元组都可以代表101个键之任一键,所以这101键再加上无键被压下状态(代码为0x00)构成一组操控阵列,这个装置允许同时压下6个键。键盘报告描述元中Input(Data,Array)即在宣告这6个位元组的数据格式,注意这个数据格式的逻辑值宣告和用途代码宣告具有相同的资料值(即0和101)。

  键盘有一个输出报告,长度为1个位元组,但是只用到最低5个位元来代表五个LED的操控,所以最高的3个位元需要用Output(Constant)项目来填充。输出报告的用途类页不再是KeyCodes,而是PageofLEDs,所以要重新宣告UsagePage,而主项目为Output(Data,Variable,Absolute)。这个项目的资料内容如同输入报告的最低8位元所宣告的主项目之资料内容,不再作说明。因为键盘介面的端点描述元只有宣告一个中断型输入端点,所以输出报告需要依赖内定控制型端点0来传送。输入报告由宣告的输入端点作中断型输入传输,当然也可以依需要用内定控制型端点0来作控制型读入传输。关于传输的讨论,请参考第四章。

  滑鼠的报告描述元的输入数据格式中最低的一个位元组只有最低3个位元有意义,其分别对应到滑鼠上的三个按钮,用途类页为Buttons。其他二个位元组的用途为(GenericDesktop:X)和(GenericDesktop:X),分别对应到滑鼠X轴和Y轴的位移操控。这二个位移值得逻辑范围为-127到127,即一个位元组可以表示最大范围。位移的数值是相对值,所以主项目为Input(Data,Variable,Relative)。

HID描述元编辑工具 

  USB协会提供了一个HID描述元编辑工具称作HIDDescriptorTool,其执行程式为DT.exe。这个工具软体可以在USB网站上取得。虽然称作HID描述元工具,事实上,仅提供编撰报告描述元之用。执行DT.exe后会出现如图2之视窗,小内视窗HIDItems列出所有报告描述元的标籤。以前面所举的实际范例中键盘的报告描述元为例,首先点选[USAGE_PAGE],后会出现一个次视窗列出所有的UsagePage的选项,这个例子要选[GenericDesktop],按[OK]后则次视窗消失,DT的主视窗中的右边小内视窗ReportDescriptor就出现UsagePage(GenericDesktop)并跟随著该项目的编码0501(低位元组在左边),也就是这个工具可以帮助作自动编码的工作。程式师只要输入项目的标籤和内容,则可以由这个工具软体提供报告描述元的程式码。接著,当点选第二个项目[USAGE]时,DT软体会根据前面的编籤UsagePage的内容GenericDesktop,而产生一个次视窗列出GenericDesktop包含的所有Usage选项。同样道理,当选完UsagePage(Keyboard),再要编撰UsageMinimum和UsageMaximum时,所出现的次视窗则为UsagePage(Keyboard)所包含的全部Usage选项,选第224个为LeftControl键当用途范围的最小者,再选第231个为RightGUI键当用途范围的最大者。其他项目的编撰以此类推。

  在主视窗下,点选下拉选项[File]中的[Info],则会出现讯息视窗,告知编撰的描述元中项目的个数和描述元长度所需位元组的数目。编撰报告描述元完成后,还要做语法检验,这时点选下拉选项[ParseDescriptor],则DT软体会告知检查的结果,并提供错误原因与更改的建议。

总结 

  最后一个问题是如何将报告描述元加入微控器的组合语言程式。对于任何一种描述元,都是以组合语言中的一个标记来分辨,例如第一个介面的报告描述元的标记就称作hid_report_descriptor00;同样的,第二个介面的就称作hid_report_descriptor01。记得在报告描述元结束处也加上一个标记,如end_hid_report_descriptor00和end_hid_report_descriptor01。这个结束标记除了有助于阅读程式外,其最主要的用处是可以用来计算描述元的长度(即位元组数)。例如使用

dwl   end_hid_report_descriptor00 - hid_report_descriptor00 

  组译器就会自动算出第一个报告描述元的长度,这个长度以二个位元组来记载。“dwl”为组合语言的指示,在于储存二个位元组的资料,储存的方式为littleEndian。所谓littleEndian方法,就是将低位元组的值存于低位址值的记忆体空间,高位元组之值存于高位址值处。

  读者可以到作者的网站http://www.cn.nctu.edu.tw/faculty/sklin/index.htm中下载适用本文范例的描述元韧体程式码descriptor.asm。该程式码是以Cypress公司的CY7C6300系列USB微控器的组合语言来撰写。

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