搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2017-7-24 21:00:02 | 显示全部楼层 |阅读模式
如题,在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               


高手们帮忙看看到底是哪里出问题了。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-7-26 00:37:07 | 显示全部楼层
本帖最后由 hyper320 于 2017-7-26 00:39 编辑

当设备支持boot时,会收到Set protocol请求,你要考慮支持BOOT的設計流程
補充說明:當可以支持BOOT的鍵盤時,BIOS並不會去讀你的描述符

出0入0汤圆

发表于 2017-7-26 00:48:57 | 显示全部楼层
https://www.amobbs.com/thread-4789378-1-4.html
剛好看到這個帖,可以去參考下

出0入0汤圆

 楼主| 发表于 2017-7-26 17:43:55 | 显示全部楼层
感谢楼上的回复,现在的问题是进BIOS里,可以使用,但是不能收到LED状态的数据,并且一按NUM等三个切换LED状态的按键,BIOS就会卡死,要过个半分钟左右才会有反应。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 07:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表