搜索
bottom↓
回复: 33

用STM32的USB接口做的HID键盘,在BIOS里不识别,在WINDOWS下可识别。有没人碰过这种情况

[复制链接]

出0入0汤圆

发表于 2011-6-7 13:55:53 | 显示全部楼层 |阅读模式
最近想用STM32搞个HID键盘。参考了圈圈的代码。各种描述符基本上用的是电脑圈圈的。现在出现个问题:在进系统以后键盘使用正常。在开机的时候按DELETE键不能进入BIOS。请路过的朋友分析是什么问题,TKS。
附上描述符代码:

const u8 CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =
  {
    0x12,                       /*bLength */
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    0x01,                       /*bcdUSB */
    0x10,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    0x40,                       /*bMaxPacketSize40*/
    0xf3,                       /*idVendor (0x0483)*/
    0x04,
    0x04,                       /*idProduct = 0x5750*/
    0x01,
    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*/
  }
  ; /* CustomHID_DeviceDescriptor */


/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
  {
    0x09, /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
    CUSTOMHID_SIZ_CONFIG_DESC,
    /* wTotalLength: Bytes returned */
    0x00,
    0x01,         /* bNumInterfaces: 1 interface */
    0x01,         /* bConfigurationValue: Configuration value */
    0x00,         /* iConfiguration: Index of string descriptor describing
                                 the configuration*/
    0xC0,         /* bmAttributes: Bus powered */
    0x32,         /* MaxPower 100 mA: this current is used for detecting Vbus */

    /************** Descriptor of Custom HID interface ****************/
    /* 09 */
    0x09,         /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */
    0x00,         /* bInterfaceNumber: Number of Interface */
    0x00,         /* bAlternateSetting: Alternate setting */
    0x02,         /* bNumEndpoints */
    0x03,         /* bInterfaceClass: HID */
    0x01,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
    0x01,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
    0,            /* iInterface: Index of string descriptor */
    /******************** Descriptor of Custom HID HID ********************/
    /* 18 */
    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x00,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */
    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,
    /******************** Descriptor of Custom HID endpoints ******************/
    /* 27 */
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

    0x81,          /* bEndpointAddress: Endpoint Address (IN) */
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x08,          /* wMaxPacketSize: 16 Bytes max */
    0x00,
    0x20,          /* bInterval: Polling Interval (32 ms) */
    /* 34 */
           
    0x07,        /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,        /* bDescriptorType: */
                        /*        Endpoint descriptor type */
    0x01,        /* bEndpointAddress: */
                        /*        Endpoint Address (OUT) */
    0x03,        /* bmAttributes: Interrupt endpoint */
    0x08,        /* wMaxPacketSize: 16 Bytes max  */
    0x00,
    0x20,        /* bInterval: Polling Interval (20 ms) */
    /* 41 */
  }
  ; /* CustomHID_ConfigDescriptor */
const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
  {   
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, //     USAGE_PAGE (Keyboard/Keypad)
0x19, 0xe0, //     USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, //     USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, //     LOGICAL_MINIMUM (0)
0x25, 0x01, //     LOGICAL_MAXIMUM (1)
0x95, 0x08, //     REPORT_COUNT (8)
0x75, 0x01, //     REPORT_SIZE (1)
0x81, 0x02, //     INPUT (Data,Var,Abs)
0x95, 0x01, //     REPORT_COUNT (1)
0x75, 0x08, //     REPORT_SIZE (8)
0x81, 0x03, //     INPUT (Cnst,Var,Abs)
0x95, 0x06, //   REPORT_COUNT (6)
0x75, 0x08, //   REPORT_SIZE (8)
0x25, 0xFF, //   LOGICAL_MAXIMUM (255)
0x19, 0x00, //   USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, //   USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, //     INPUT (Data,Ary,Abs)
0x25, 0x01, //     LOGICAL_MAXIMUM (1)
0x95, 0x02, //   REPORT_COUNT (2)
0x75, 0x01, //   REPORT_SIZE (1)
0x05, 0x08, //   USAGE_PAGE (LEDs)
0x19, 0x01, //   USAGE_MINIMUM (Num Lock)
0x29, 0x02, //   USAGE_MAXIMUM (Caps Lock)
0x91, 0x02, //   OUTPUT (Data,Var,Abs)
0x95, 0x01, //   REPORT_COUNT (1)
0x75, 0x06, //   REPORT_SIZE (6)
0x91, 0x03, //   OUTPUT (Cnst,Var,Abs)
0xc0        // END_COLLECTION

  }; /* CustomHID_ReportDescriptor */

/* USB String Descriptors (optional) */
const u8 CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] =
  {
    CUSTOMHID_SIZ_STRING_LANGID,
    USB_STRING_DESCRIPTOR_TYPE,
    0x09,
    0x04
  }
  ; /* LangID = 0x0409: U.S. English */

const u8 CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =
  {
    CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */
    USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*/
    /* Manufacturer: "STMicroelectronics" */
    'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
    'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
    'c', 0, 's', 0
  };

const u8 CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] =
  {
    CUSTOMHID_SIZ_STRING_PRODUCT,          /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'C', 0,
    'u', 0, 's', 0, 't', 0, 'm', 0, ' ', 0, 'H', 0, 'I', 0,
    'D', 0
  };
u8 CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] =
  {
    CUSTOMHID_SIZ_STRING_SERIAL,           /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'S', 0, 'T', 0, 'M', 0,'3', 0,'2', 0, '1', 0, '0', 0
  };

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-6-8 10:24:44 | 显示全部楼层
顶一下,看有没有知道的~

出0入0汤圆

发表于 2011-6-8 10:41:49 | 显示全部楼层
主板BIOS是否支持其它USB的键盘?

出0入0汤圆

发表于 2011-6-8 10:44:18 | 显示全部楼层
0x01,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */

应经设置成BOOT模式了。看看其他的问题吧,换台电脑试试!

出0入0汤圆

 楼主| 发表于 2011-6-8 12:34:28 | 显示全部楼层
主板BIOS支持USB键盘的,用其他键盘可以。
我拿Custom_HID例程来改的,不知哪出问题了。现在在看HID协议,想找出哪个描述符不对。

出0入0汤圆

发表于 2011-6-8 13:21:19 | 显示全部楼层
把报告描述符改成下面的

Usage Page (Generic Desktop),
Usage (Keyboard),
Collection (Application),
Report Size (1),
Report Count (8),
Usage Page (Key Codes),
Usage Minimum (224),
Usage Maximum (231),
Logical Minimum (0),
Logical Maximum (1),
Input (Data, Variable, Absolute), ;Modifier byte
Report Count (1),
Report Size (8),
Input (Constant), ;Reserved byte
Report Count (5),
Report Size (1),
Usage Page (LEDs),
Usage Minimum (1),
Usage Maximum (5),
Output (Data, Variable, Absolute), ;LED report
Report Count (1),
Report Size (3),
Output (Constant), ;LED report padding
Report Count (6),
Report Size (8),
Logical Minimum (0),
Logical Maximum(255),
Usage Page (Key Codes),
Usage Minimum (0),
Usage Maximum (255),
Input (Data, Array),
End Collection

出0入0汤圆

发表于 2011-6-8 13:23:09 | 显示全部楼层
描述符不要求一模一样,但是要保证数据格式一样
然后还需要响应
Set Protocol这个命令

出0入0汤圆

发表于 2011-6-8 13:25:34 | 显示全部楼层
你主板开USB键盘鼠标支持没?
我的主板默认不是开的。

出0入0汤圆

 楼主| 发表于 2011-6-8 15:51:54 | 显示全部楼层
回复【6楼】xrr1017
-----------------------------------------------------------------------

多谢帮助,对HID协议不很了解,不能完全理解。我再自己想想。
-----------------------------------------------------------------------



回复【7楼】90999 张耀扬
-----------------------------------------------------------------------

主板是支持USB键盘的,我现在用的键盘就是USB的,在BIOS里也能识别到。就是我自己做的键盘有问题,只能在Windows下识别。应该是描述符没搞对。

出0入0汤圆

发表于 2011-6-9 20:29:44 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2011-8-6 11:03:44 | 显示全部楼层
LZ搞好了吗,我也遇到了同样问题,怀疑是否为BIOS不支持全速的设备?

出0入0汤圆

发表于 2011-8-6 11:27:56 | 显示全部楼层
好象还是描述符的问题

出0入0汤圆

发表于 2011-8-6 11:40:15 | 显示全部楼层
USB的设备描述符够一智力较好的人学个把月的....

出0入0汤圆

 楼主| 发表于 2011-8-8 13:45:27 | 显示全部楼层
回复【10楼】lhb358
lz搞好了吗,我也遇到了同样问题,怀疑是否为bios不支持全速的设备?
-----------------------------------------------------------------------

搞定了,要响应主机的SET_IDLE命令。例程里面没有响应。注意以下函数与你的有什么不同。

RESULT CustomHID_NoData_Setup(u8 RequestNo)
{
  if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
      && (RequestNo == SET_PROTOCOL))
  {
    return CustomHID_SetProtocol();
  }
  else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
      && (RequestNo == SET_IDLE))//响应主机SET_IDLE命令
  {
    return CustomHID_SetProtocol();//没仔细研究,此处返回SET_PROTOCOL响应数据即可
  }
  else
  {
    return USB_UNSUPPORT;
  }
}

出0入0汤圆

发表于 2011-8-8 15:04:32 | 显示全部楼层
就是描述符的问题,不要偷懒,认真阅读USB规范文档!

BIOS很挑剔的。

出0入0汤圆

 楼主| 发表于 2011-8-8 16:33:20 | 显示全部楼层
回复【14楼】gzxyt
-----------------------------------------------------------------------

不是描述符问题,BIOS阶段枚举需要响应主机SET_PROTOCOL和SET_IDLE等几个命令。我用的官方例程里没响应SET_IDLE命令。所以不能成功枚举,识别不到键盘。

出0入0汤圆

发表于 2011-8-9 10:49:21 | 显示全部楼层
我的是描述符的问题,配置时执行到返回配置描述符后,再不响应了,后修改了描述符,

出0入0汤圆

发表于 2012-6-22 22:33:51 | 显示全部楼层
usb hid keys 备用

出0入0汤圆

发表于 2013-6-9 08:49:47 | 显示全部楼层
我也想玩玩这个,能否把你的完整功能贴出来

出0入0汤圆

发表于 2013-6-9 11:53:59 | 显示全部楼层
学习了,刚好在弄这个

出0入0汤圆

发表于 2014-4-29 10:15:36 | 显示全部楼层
很激动 看到希望了  最近在调试USB鼠标  遇到了很多问题,确实是执行到SET_PROTOCOL之后USB就不能正常进行枚举了,正在找解决方案

出0入0汤圆

发表于 2014-4-29 10:27:24 | 显示全部楼层
学习一下,MARK

出0入0汤圆

发表于 2014-5-15 14:55:01 | 显示全部楼层
MARK USB HID

出0入0汤圆

发表于 2014-5-17 17:49:21 | 显示全部楼层
以前搞双设备描述符的时候对这玩意滚瓜烂熟,
现在又全忘了

出0入0汤圆

发表于 2014-12-8 15:18:39 | 显示全部楼层
楼住反映的问题对我很有帮助!谢谢楼主共享!

出0入0汤圆

发表于 2014-12-9 09:04:13 | 显示全部楼层
我是刚接触USB,看来还是要再学习。。。。

出0入0汤圆

发表于 2015-1-20 09:00:35 | 显示全部楼层
遇到到类似问题。我的自定HID设备在baytrail。BIOS启动到进入系统要40多秒。不知道是不是这个原因。试一下

出0入0汤圆

发表于 2015-1-20 10:29:37 | 显示全部楼层
fjh120 发表于 2011-8-8 13:45
回复【10楼】lhb358
lz搞好了吗,我也遇到了同样问题,怀疑是否为bios不支持全速的设备?
--------------- ...

请问SetProtocol返回给主机的数据格式是怎么样的。我查了大量资料,都是一笔带过,没说怎样返回。还请各位大侠不吝赐教

出0入0汤圆

发表于 2015-1-20 12:41:11 | 显示全部楼层
usb hid keys 备用

出0入0汤圆

发表于 2015-1-20 12:44:45 | 显示全部楼层
收藏备用

出0入0汤圆

发表于 2015-1-20 15:09:46 | 显示全部楼层
usb键盘,mark

出0入0汤圆

发表于 2015-4-29 12:38:05 | 显示全部楼层
正好遇到这个问题,多谢大家

出0入0汤圆

发表于 2015-5-8 16:14:09 | 显示全部楼层
我也在做,先mark把
遇到问题再请假

出0入0汤圆

发表于 2017-7-21 15:14:33 | 显示全部楼层
我也碰到这个问题了,按照您的方法修改了SET_IDLE的响应,但是BIOS仍然无法识别,别的USB键盘都能识别,这是什么鬼?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 03:22

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

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