
usb,报告描述符.docx
26页为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划usb,报告描述符 USBHID报告及报告描述符简介 USBHID设备是通过报告来给传送数据的,报告有输入报告和输出报告输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等报告是一个数据包,里面包含的是所要传送的数据输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出 而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的通过它,USBHOST可以分析出报告里面的数据所表示的意思它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。
更详细的说明请参看USBHID协议USB报告描述符可以通过使用HIDDescriptortool来生成,这个工具可以网上下载 下面通过由HIDDescriptortool生成的USB鼠标和USB键盘来说明一下报告描述符和报告 codecharKeyBoardReportDescriptor[63]={//表示用途页为通用桌面设备 0x05,0x01,//USAGE_PAGE(GenericDesktop)//表示用途为键盘 0x09,0x06,//USAGE(Keyboard) //表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION0xa1,0x01,//COLLECTION(Application) //表示用途页为按键 0x05,0x07,//USAGE_PAGE(Keyboard)//用途最小值,这里为左ctrl键 0x19,0xe0,//USAGE_MINIMUM(KeyboardLeftControl)//用途最大值,这里为右GUI键,即window键 0x29,0xe7,//USAGE_MAXIMUM(KeyboardRightGUI)//逻辑最小值为0 0x15,0x00,//LOGICAL_MINIMUM(0)//逻辑最大值为1 0x25,0x01,//LOGICAL_MAXIMUM(1) //报告大小为1bit,所以前面的逻辑最小值为0,逻辑最大值为10x75,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协议中规定的用途页表来确定这里通常用来表示//特殊键,例如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用的,因此下面会说明它是输出用0x05,0x08,//USAGE_PAGE(LEDs)//用途最小值是NumLock,即数字键锁定灯 0x19,0x01,//USAGE_MINIMUM(NumLock)//用途最大值是Kana,这个是什么灯我也不清楚^_^0x29,0x05,//USAGE_MAXIMUM(Kana) //如前面所说,这个字段是输出用的,用来控制LED。
变量,值,绝对值//1表示灯亮,0表示灯灭 0x91,0x02,//OUTPUT(Data,Var,Abs)//这样的数据段个数为1 0x95,0x01,//REPORT_COUNT(1)//每个段大小为3bits 0x75,0x03,//REPORT_SIZE(3)//输出用,常量,值,绝对 0x91,0x03,//OUTPUT(Cnst,Var,Abs) //由于要按字节对齐,而前面控制LED的只用了5个bit,//所以后面需要附加3个不用bit,设置为常量 //报告个数为6 0x95,0x06,//REPORT_COUNT(6)//每个段大小为8bits 0x75,0x08,//REPORT_SIZE(8)//逻辑最小值0 0x15,0x00,//LOGICAL_MINIMUM(0) //逻辑最大值255 0x25,0xFF,//LOGICAL_MAXIMUM(255)//用途页为按键 0x05,0x07,//USAGE_PAGE(Keyboard)//使用最小值为0 0x19,0x00,//USAGE_MINIMUM(Reserved(noeventindicated))//使用最大值为0x65 0x29,0x65,//USAGE_MAXIMUM(KeyboardApplication)//输入用,变量,数组,绝对值 0x81,0x00,//INPUT(Data,Ary,Abs) //以上定义了6个8bit宽的数组,每个8bit用来表示一个按键,所以可以同时 //有6个按键按下。
没有按键按下时,全部返回0如果按下的键太多,导致键盘扫描系统 //无法区分按键时,则全部返回0x01,即6个0x01如果有一个键按下,则这6个字节中的第一 //个字节为相应的键值,如果两个键按下,则第1、2两个 //字节分别为相应的键值,以次类推 //关集合,跟上面的对应 0xc0//END_COLLECTION}; 通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告ID,因此返回的都是实际使用的数据总共有8字节输入,1字节输出其中输入的第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键如果只有左ctrl键按下,则返回00000,如果只有数字键1按下,则返回00000,如果数字键1和2同时按下,则返回A,如果再按下左shift键,则返回0XX95A,然后再释放1键,则返回0XXA,然后全部按键释放,则返回00000这些数据都是通过中断端点返回的当按下NumLock键时,PC会发送输出报告,从报告描述符中我们知道,NumLock的LED对应着输出报告的最低位,当数字小键盘打开时,输出xxxxxxx1;当数字小键盘关闭时,输出xxxxxxx0取出最低位就可以控制数字键锁定LED了。
下面这个报告描述符是USB鼠标报告描述符,比起键盘的来说要简单些它描述了4个字节,第一个字节表示按键,第二个字节表示x轴,第三个字节表示y轴,第四个字节表示鼠标滚轮 codecharMouseReportDescriptor[52]={//通用桌面设备 0x05,0x01,//USAGE_PAGE(GenericDesktop)//鼠标 0x09,0x02,//USAGE(Mouse) //集合 0xa1,0x01,//COLLECTION(Application)//指针设备 0x09,0x01,//USAGE(Pointer)//集合 0xa1,0x00,//COLLECTION(Physical)//按键 0x05,0x09,//USAGE_PAGE(Button)//使用最小值1 0x19,0x01,//USAGE_MINIMUM(Button1)//使用最大值31表示左键,2表示右键,3表示中键0x29,0x03,//USAGE_MAXIMUM(Button3)//逻辑最小值0 0x15,0x00,//LOGICAL_MINIMUM(0)//逻辑最大值1 0x25,0x01,//LOGICAL_MAXIMUM(1)//数量为3 0x95,0x03,//REPORT_COUNT(3)//大小为1bit 0x75,0x01,//REPORT_SIZE(1)//输入,变量,数值,绝对值 //以上3个bit分别表示鼠标的三个按键情况,最低位为左键 //bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为00x81,0x02,//INPUT(Data,Var,Abs)//填充5个bit,补足一个字节 0x95,0x01,//REPORT_COUNT(1)0x75,0x05,//REPORT_SIZE(5)0x81,0x03,//INPUT(Cnst,Var,Abs)//用途页为通用桌面 0x05,0x01,//USAGE_PAGE(GenericDesktop)//用途为X 0x09,0x30,//USAGE(X)//用途为Y 0x09,0x31,//USAGE(Y)//用途为滚轮 0x09,0x38,//USAGE(Wheel)//逻辑最小值为-127 0x15,0x81,//LOGICAL_MINIMUM(-127)//逻辑最大值为+127 0x25,0x7f,//LOGICAL_MAXIMUM(127)//大小为8个bits 0x75,0x08,//REPORT_SIZE(8)//数量为3个,即分别代表x,y,滚轮 0x95,0x03,//REPORT_COUNT(3) //输入,变量,值,相对值 0x81,0x06,//INPUT(Data,Var,Rel)//关集合 0xc0,//END_COLLECTION0xc0//END_COLLECTION}; 通过对上面的报告分析,我们知道报告返回4个字节,没有报告ID。
如果鼠标左键按下,则返回,如果右键按下,则返回0XX000,如果中键按下,则返回,如果三个键同时按下,则返回如果鼠标往右移动则第二字节返回正值,值越大移动速度越快其它的类推 根据这个实际设计的USB键盘和USB鼠标:USB键盘: USB鼠标: 实际范例 报告描述符范例 转载自:// USB/HID设备报告描述符详解 USB描述符即USB设备的信息,系统设备列举所要执行的工作之一,即是取得这些有关于设各的相关信息,之后设备才能被系统识别使用 在图的描述符中,设备描述符、配置描述符、接口描述符以及端点描述符是必须具有的而其他的描述符,如字符串描述符、数种不同的群组描述符以及报告描述符则可以根据不同的设备加以添加或删减 报告描述符是HID用来。












