如题,在WINDOWS下一切正常,进到BIOS里,键盘那三颗LED的状态,BIOS无法传送给USB键盘。
如果再接个PS2键盘,观察,按PS2的NUM,usb键盘没反应,但是BIOS不会卡死,如果按USB键盘上的NUM键,BIOS会卡死,但是PS2键盘还能收到一次LED状态,然后BIOS就卡死了,没响应,但没有死机,要等个20多秒才能反应过来。
这是哪里的问题?
描述符我贴出来:
0x12, /*bLength */
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
0x10, /*bcdUSB */
0x01,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
0x00, /*bDeviceProtocol*/
0x40, /*bMaxPacketSize 64*/
0x83, /*idVendor (0x0483)*/
0x04,
0x50, /*idProduct = 0x5710*/
0x57,
0x00, /*bcdDevice rel. 2.00*/
0x02,
1, /*Index of string descriptor describing manufacturer */
2, /*Index of string descriptor describing product*/
3, /*Index of string descriptor describing the device serial number */
0x01 /*bNumConfigurations*/
/*配置描述符*/
0x09, /* bLength: 配置描述符的大小 */
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* 配置描述符类型 */
JOYSTICK_SIZ_CONFIG_DESC, /* wTotalLength:总共有多少个字节 */
0x00,
0x04, /* bNumInterfaces: 这个配置使用了几个接口 */
0x01, /* bConfigurationValue: Set_Configuration命令需要的参数值 */
0x00, /* iConfiguration:描述该配置的字符串的索引值 */
0xa0, /* bmAttributes: /供电模式的选择 */
0x96, /* MaxPower 300 mA:设备从总线提取的最大电流 */
//接口描述符1
0x09, /* bLength: 接口描述符的大小 */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: 接口类型描述符常量 */
0x00, /* bInterfaceNumber: 接口的编号 */
0x00, /* bAlternateSetting: /备用的接口描述符编号 */
0x02, /* bNumEndpoints: /该接口使用端点数,不包括端点0,键盘使用了2个端点,一个收一个发 */
0x03, /* bInterfaceClass: /接口类型0x03=hid */
0x01, /* bInterfaceSubClass: /接口子类型 1=BOOT,0=NONE*/
0x01, /* bInterfaceProtocol: /接口所遵循的协议0=NONE,1=KEYBOARD,2=MOUSE */
0x00, /* iInterface: 描述该接口的字符串索引值 */
//HID描述符
0x09, //bLength :描述符的长度
HID_DESCRIPTOR_TYPE, //bDescriptorType :HID类描述符
0x10, //bcdHID:HID规范版本号(BCD码)
0x01,
0x00, //bCountryCode:国家代码,0为任何国家
0x01, //bNumDescritors:支持的附属描述符数目
0x22, //bDescriptorType:HID相关描述符的类型,0x21=HID类描述符,0x22=报表类描述符,0x23=实体类描述符
JOYSTICK_SIZ_REPORT_DESC, //wItemLength:wDescriptorLength
0x00,
//输入端点1的描述符
0x07, //bLength:描述符的长度
USB_ENDPOINT_DESCRIPTOR_TYPE,//端点描述符类型
EP1_IN, //bEndpointAddress:端点地址:0~3位是端点号,第7位是方向(0-OUT,1-IN)1000 0001=0x81,表示是输入端点
0x03, //bmAttributes:Interrupt endpoint端点类型
0x08, //MaxPacketSize:这个端点的包最大数,键盘是8字节,鼠标是4字节
0x00,
0x0a, //Interval:主机轮询这个端点的间隔,0x20=32ms
//输出端点1的描述符
0x07, //bLength:描述符的长度
USB_ENDPOINT_DESCRIPTOR_TYPE,//端点描述符类型
EP1_OUT, //bEndpointAddress:端点地址:0~3位是端点号,第7位是方向(0-OUT,1-IN)0000 0001=0x01,表示是输入端点
0x03, //bmAttributes:Interrupt endpoint端点类型
0x01, //MaxPacketSize:这个端点的包最大数,键盘是8字节,鼠标是4字节
0x00,
0x0a, //Interval:主机轮询这个端点的间隔,0x20=32ms
报告描述符:
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x05, 0x07, // USAGE_PAGE (Keyboard)(Key Codes)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)(224)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)(231)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x81, 0x02, // INPUT (Data,Var,Abs) ; Modifier byte
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs) ; Reserved byte
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs) ; LED report
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs) ; LED report padding
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xff, // LOGICAL_MAXIMUM (101->0x65),
0x05, 0x07, // USAGE_PAGE (Keyboard)(Key Codes)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))(0)
0x29, 0xff, // USAGE_MAXIMUM (Keyboard Application)(101)231->0XE7
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION
高手们帮忙看看到底是哪里出问题了。。。
当设备支持boot时,会收到Set protocol请求,你要考慮支持BOOT的設計流程
補充說明:當可以支持BOOT的鍵盤時,BIOS並不會去讀你的描述符
一周热门 更多>