求助:STM32F103做的USB键盘,BIOS卡死

2019-12-27 18:35发布

如题,在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               


高手们帮忙看看到底是哪里出问题了。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。