文档详情

hid的报告描述符.doc

发布:2017-05-10约1.18万字共25页下载文档
文本预览下载声明
hid的报告描述符 USB_HID报告及报告描述符_入门简介 USB HID报告及报告描述符简介 USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。 而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。通过它,USB HOST可以分析出报告里面的数据所表示的意思。它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。更详细的说明请参看USB HID协议。USB报告描述符可以通过使用HID Descriptor tool来生成,这个工具可以网上下载。 下面通过由HID Descriptor tool生成的USB鼠标和USB键盘来说明一下报告描述符和报告。 code char KeyBoardReportDescriptor[63] = { //表示用途页为通用桌面设备 0x05, 0x01, // USAGE_PAGE (Generic Desktop) //表示用途为键盘 0x09, 0x06, // USAGE (Keyboard) //表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION 0xa1, 0x01, // COLLECTION (Application) //表示用途页为按键 0x05, 0x07, //USAGE_PAGE (Keyboard) //用途最小值,这里为左ctrl键 0x19, 0xe0, //USAGE_MINIMUM (Keyboard LeftControl) //用途最大值,这里为右GUI键,即window键 0x29, 0xe7, //USAGE_MAXIMUM (Keyboard Right GUI) //逻辑最小值为0 0x15, 0x00, //LOGICAL_MINIMUM (0) //逻辑最大值为1 0x25, 0x01, //LOGICAL_MAXIMUM (1) //报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1 0x75, 0x01, //REPORT_SIZE (1) //报告的个数为8,即总共有8个bits 0x95, 0x08, //REPORT_COUNT (8) //输入用,变量,值,绝对值。像键盘这类一般报告绝对值, //而鼠标移动这样的则报告相对值,表示鼠标移动多少 0x81, 0x02, //INPUT (Data,Var,Abs) //上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键 //分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。 //它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下, //否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位, //需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示 //特殊键,例如ctrl,shift,del键等 //这样的数据段个数为1 0x95, 0x01, //REPORT_COUNT (1) //每个段长度为8bits 0x75, 0x08, //REPORT_SIZE (8) //输入用,常量,值,绝对值 0x81, 0x03, //INPUT (Cnst,Var,Abs) //上面这8个bit是常量,设备必须返回0 //这样的数据段个数为5 0x95, 0x05, //REPORT_COUNT (5) //每个段大小为1bit 0x75, 0x01, //REPORT_SIZE (1) //用途是LED,即用来控制键盘上的LED用的0x02, //OUTPUT (Data,Var,Abs) //这样的数据段个数为1 0x95, 0x01, //REPORT_COUNT (1) //每个段大小为3bits 0x75, 0x03,
显示全部
相似文档