找回密码
 立即注册
查看: 70|回复: 4

请问如何将Ai8051U设置为HID键盘设备

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-24 12:00:43 | 显示全部楼层 |阅读模式
DEVICEDESC、CONFIGDESC、HIDREPORTDESC如何配置呢?

请给出示例
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-24 12:03:00 | 显示全部楼层
要将Ai8051U微控制器配置为HID键盘设备,需要进行以下三个主要步骤:配置设备描述符(DEVICEDESC)、配置描述符(CONFIGDESC)以及HID报告描述符(HIDREPORTDESC)。以下是具体的配置示例和说明。

1. 设备描述符(DEVICEDESC)
设备描述符用于描述设备的基本信息,如设备类型、厂商ID、产品ID等。以下是一个示例:
  1. c
  2. const uint8t DEVICEDESC[] = {
  3.     0x12,       // bLength: 描述符长度
  4.     0x01,       // bDescriptorType: 设备描述符
  5.     0x00, 0x02, // bcdUSB: USB 2.0
  6.     0x00,       // bDeviceClass: 由接口描述符定义
  7.     0x00,       // bDeviceSubClass: 由接口描述符定义
  8.     0x00,       // bDeviceProtocol: 由接口描述符定义
  9.     0x40,       // bMaxPacketSize0: 最大包大小为64字节
  10.     0x83, 0x04, // idVendor: 厂商ID (示例)
  11.     0x25, 0x01, // idProduct: 产品ID (示例)
  12.     0x00, 0x01, // bcdDevice: 设备版本号
  13.     0x01,       // iManufacturer: 厂商字符串索引
  14.     0x02,       // iProduct: 产品字符串索引
  15.     0x03,       // iSerialNumber: 序列号字符串索引
  16.     0x01        // bNumConfigurations: 配置描述符数量
  17. };
复制代码

2. 配置描述符(CONFIGDESC)
配置描述符用于描述设备的配置信息,包括接口和端点描述符。以下是一个示例:
  1. c
  2. const uint8t CONFIGDESC[] = {
  3.     // 配置描述符
  4.     0x09,       // bLength: 描述符长度
  5.     0x02,       // bDescriptorType: 配置描述符
  6.     0x22, 0x00, // wTotalLength: 配置描述符总长度
  7.     0x01,       // bNumInterfaces: 接口数量
  8.     0x01,       // bConfigurationValue: 配置值
  9.     0x00,       // iConfiguration: 配置字符串索引
  10.     0x80,       // bmAttributes: 自供电,不支持远程唤醒
  11.     0x32,       // bMaxPower: 最大功耗 (100mA)
  12.     // 接口描述符
  13.     0x09,       // bLength: 描述符长度
  14.     0x04,       // bDescriptorType: 接口描述符
  15.     0x00,       // bInterfaceNumber: 接口编号
  16.     0x00,       // bAlternateSetting: 备用设置
  17.     0x01,       // bNumEndpoints: 端点数量
  18.     0x03,       // bInterfaceClass: HID类
  19.     0x01,       // bInterfaceSubClass: Boot Interface Subclass
  20.     0x01,       // bInterfaceProtocol: 键盘协议
  21.     0x00,       // iInterface: 接口字符串索引
  22.     // HID描述符
  23.     0x09,       // bLength: 描述符长度
  24.     0x21,       // bDescriptorType: HID描述符
  25.     0x11, 0x01, // bcdHID: HID版本1.11
  26.     0x00,       // bCountryCode: 国家代码 (无)
  27.     0x01,       // bNumDescriptors: 描述符数量
  28.     0x22,       // bDescriptorType: 报告描述符
  29.     0x2E, 0x00, // wDescriptorLength: 报告描述符长度
  30.     // 端点描述符
  31.     0x07,       // bLength: 描述符长度
  32.     0x05,       // bDescriptorType: 端点描述符
  33.     0x81,       // bEndpointAddress: 输入端点1
  34.     0x03,       // bmAttributes: 中断传输
  35.     0x08, 0x00, // wMaxPacketSize: 最大包大小为8字节
  36.     0x0A        // bInterval: 轮询间隔 (10ms)
  37. };
复制代码

3. HID报告描述符(HIDREPORTDESC)
HID报告描述符用于定义设备的功能和数据结构。以下是一个简单的键盘报告描述符示例:
  1. c
  2. const uint8t HIDREPORTDESC[] = {
  3.     0x05, 0x01, // Usage Page (Generic Desktop)
  4.     0x09, 0x06, // Usage (Keyboard)
  5.     0xA1, 0x01, // Collection (Application)
  6.     0x05, 0x07, // Usage Page (Key Codes)
  7.     0x19, 0xE0, // Usage Minimum (0xE0)
  8.     0x29, 0xE7, // Usage Maximum (0xE7)
  9.     0x15, 0x00, // Logical Minimum (0)
  10.     0x25, 0x01, // Logical Maximum (1)
  11.     0x75, 0x01, // Report Size (1)
  12.     0x95, 0x08, // Report Count (8)
  13.     0x81, 0x02, // Input (Data, Var, Abs)
  14.     0x95, 0x01, // Report Count (1)
  15.     0x75, 0x08, // Report Size (8)
  16.     0x81, 0x01, // Input (Const, Array, Abs)
  17.     0x95, 0x05, // Report Count (5)
  18.     0x75, 0x01, // Report Size (1)
  19.     0x05, 0x08, // Usage Page (LEDs)
  20.     0x19, 0x01, // Usage Minimum (Num Lock)
  21.     0x29, 0x05, // Usage Maximum (Kana)
  22.     0x91, 0x02, // Output (Data, Var, Abs)
  23.     0x95, 0x01, // Report Count (1)
  24.     0x75, 0x03, // Report Size (3)
  25.     0x91, 0x01, // Output (Const, Array, Abs)
  26.     0x95, 0x06, // Report Count (6)
  27.     0x75, 0x08, // Report Size (8)
  28.     0x15, 0x00, // Logical Minimum (0)
  29.     0x25, 0x65, // Logical Maximum (101)
  30.     0x05, 0x07, // Usage Page (Key Codes)
  31.     0x19, 0x00, // Usage Minimum (0)
  32.     0x29, 0x65, // Usage Maximum (101)
  33.     0x81, 0x00, // Input (Data, Array, Abs)
  34.     0xC0        // End Collection
  35. };
复制代码

总结
通过以上配置,Ai8051U微控制器可以被识别为HID键盘设备。DEVICEDESC定义了设备的基本信息,CONFIGDESC描述了设备的配置和接口,HIDREPORTDESC则定义了键盘的功能和数据结构。将这些描述符正确配置后,Ai8051U即可作为HID键盘设备与主机进行通信。

[本文内容由国芯人工智能辅助生成,仅供参考]

点评

vid不正确。 正确答案: 参考基于USB-HID协议的USB键盘范例:  详情 回复 发表于 2025-3-24 12:10
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-24 12:10:50 | 显示全部楼层
国芯人*** 发表于 2025-3-24 12:03
要将Ai8051U微控制器配置为HID键盘设备,需要进行以下三个主要步骤:配置设备描述符(DEVICEDESC)、配置描 ...

vid不正确。
正确答案:
参考基于USB-HID协议的USB键盘范例:
  1. /*---------------------------------------------------------------------*/
  2. /* --- Web: www.STCAI.com ---------------------------------------------*/
  3. /*---------------------------------------------------------------------*/
  4. #include "usb_desc.h"
  5. char code DEVICEDESC[18] =
  6. {
  7.     0x12,                   //bLength(18);
  8.     0x01,                   //bDescriptorType(Device);
  9.     0x00,0x02,              //bcdUSB(2.00);
  10.     0x00,                   //bDeviceClass(0);
  11.     0x00,                   //bDeviceSubClass0);
  12.     0x00,                   //bDeviceProtocol(0);
  13.     0x40,                   //bMaxPacketSize0(64);
  14.     0xbf,0x34,              //idVendor(34bf);
  15.     0x03,0xff,              //idProduct(ff03);
  16.     0x00,0x01,              //bcdDevice(1.00);
  17.     0x01,                   //iManufacturer(1);
  18.     0x02,                   //iProduct(2);
  19.     0x00,                   //iSerialNumber(0);
  20.     0x01,                   //bNumConfigurations(1);
  21. };
  22. char code CONFIGDESC[41] =
  23. {
  24.     0x09,                   //bLength(9);
  25.     0x02,                   //bDescriptorType(Configuration);
  26.     0x29,0x00,              //wTotalLength(41);
  27.     0x01,                   //bNumInterfaces(1);
  28.     0x01,                   //bConfigurationValue(1);
  29.     0x00,                   //iConfiguration(0);
  30.     0x80,                   //bmAttributes(BUSPower);
  31.     0x32,                   //MaxPower(100mA);
  32.     0x09,                   //bLength(9);
  33.     0x04,                   //bDescriptorType(Interface);
  34.     0x00,                   //bInterfaceNumber(0);
  35.     0x00,                   //bAlternateSetting(0);
  36.     0x02,                   //bNumEndpoints(2);
  37.     0x03,                   //bInterfaceClass(HID);
  38.     0x01,                   //bInterfaceSubClass(Boot);
  39.     0x01,                   //bInterfaceProtocol(Keyboard);
  40.     0x00,                   //iInterface(0);
  41.     0x09,                   //bLength(9);
  42.     0x21,                   //bDescriptorType(HID);
  43.     0x01,0x01,              //bcdHID(1.01);
  44.     0x00,                   //bCountryCode(0);
  45.     0x01,                   //bNumDescriptors(1);
  46.     0x22,                   //bDescriptorType(HID Report);
  47.     0x41,0x00,              //wDescriptorLength(65);
  48.     0x07,                   //bLength(7);
  49.     0x05,                   //bDescriptorType(Endpoint);
  50.     0x81,                   //bEndpointAddress(EndPoint1 as IN);
  51.     0x03,                   //bmAttributes(Interrupt);
  52.     0x08,0x00,              //wMaxPacketSize(8);
  53.     0x0a,                   //bInterval(10ms);
  54.     0x07,                   //bLength(7);
  55.     0x05,                   //bDescriptorType(Endpoint);
  56.     0x01,                   //bEndpointAddress(EndPoint1 as OUT);
  57.     0x03,                   //bmAttributes(Interrupt);
  58.     0x01,0x00,              //wMaxPacketSize(1);
  59.     0x0a,                   //bInterval(10ms);
  60. };
  61. /*
  62. Input Report:
  63. 0   Modifierkeys (D0:LCtrl D1:LShift D2:LAlt D3:LGui D4:RCtrl D5:RShift D6:RAlt D7:RGui)
  64. 1        Reserved
  65. 2        Keycode 1
  66. 3        Keycode 2
  67. 4        Keycode 3
  68. 5        Keycode 4
  69. 6        Keycode 5
  70. 7        Keycode 6
  71. Output Report:
  72. 0   LEDs (D0:NumLock D1:CapLock D2:ScrollLock)
  73. */
  74. char code HIDREPORTDESC[65] =
  75. {
  76.     0x05,0x01,              //USAGE_PAGE(Generic Desktop);
  77.     0x09,0x06,              //USAGE(Keyboard);
  78.     0xa1,0x01,              //COLLECTION(Application);
  79.     0x05,0x07,              //  USAGE_PAGE(Keyboard);
  80.     0x19,0xe0,              //  USAGE_MINIMUM(224);
  81.     0x29,0xe7,              //  USAGE_MAXIMUM(255);
  82.     0x15,0x00,              //  LOGICAL_MINIMUM(0);
  83.     0x25,0x01,              //  LOGICAL_MAXIMUM(1);
  84.     0x75,0x01,              //  REPORT_SIZE(1);
  85.     0x95,0x08,              //  REPORT_COUNT(8);
  86.     0x81,0x02,              //  INPUT(Data,Variable,Absolute);
  87.    
  88.     0x75,0x08,              //  REPORT_SIZE(8);
  89.     0x95,0x01,              //  REPORT_COUNT(1);
  90.     0x81,0x01,              //  INPUT(Constant);
  91.    
  92.     0x19,0x00,              //  USAGE_MINIMUM(0);
  93.     0x29,0x65,              //  USAGE_MAXIMUM(101);
  94.     0x15,0x00,              //  LOGICAL_MINIMUM(0);
  95.     0x25,0x65,              //  LOGICAL_MAXIMUM(101);
  96.     0x75,0x08,              //  REPORT_SIZE(8);
  97.     0x95,0x06,              //  REPORT_COUNT(6);
  98.     0x81,0x00,              //  INPUT(Data,Array);
  99.    
  100.     0x05,0x08,              //  USAGE_PAGE(LEDs);
  101.     0x19,0x01,              //  USAGE_MINIMUM(1);
  102.     0x29,0x03,              //  USAGE_MAXIMUM(3);
  103.     0x15,0x00,              //  LOGICAL_MINIMUM(0);
  104.     0x25,0x01,              //  LOGICAL_MAXIMUM(1);
  105.     0x75,0x01,              //  REPORT_SIZE(1);
  106.     0x95,0x03,              //  REPORT_COUNT(3);
  107.     0x91,0x02,              //  OUTPUT(Data,Variable,Absolute);
  108.    
  109.     0x75,0x05,              //  REPORT_SIZE(5);
  110.     0x95,0x01,              //  REPORT_COUNT(1);
  111.     0x91,0x01,              //  OUTPUT(Constant);
  112.    
  113.     0xc0,                   //END_COLLECTION;
  114. };
  115. char code LANGIDDESC[4] =
  116. {
  117.     0x04,0x03,
  118.     0x09,0x04,
  119. };
  120. char code MANUFACTDESC[8] =
  121. {
  122.     0x08,0x03,
  123.     'A',0,
  124.     'I',0,
  125.     'C',0,
  126. };
  127. char code PRODUCTDESC[34] =
  128. {
  129.     0x22,0x03,
  130.     'A',0,
  131.     'I',0,
  132.     'C',0,
  133.     ' ',0,
  134.     'U',0,
  135.     'S',0,
  136.     'B',0,
  137.     ' ',0,
  138.     'K',0,
  139.     'e',0,
  140.     'y',0,
  141.     'b',0,
  142.     'o',0,
  143.     'a',0,
  144.     'r',0,
  145.     'd',0,
  146. };
  147. char code PACKET0[2] =
  148. {
  149.     0, 0,
  150. };
  151. char code PACKET1[2] =
  152. {
  153.     1, 0,
  154. };
复制代码


三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-24 13:12:40 | 显示全部楼层
截图202503241312346350.jpg

点评

他们的答案都参考了友商,需要用例程代码给洗洗脑  详情 回复 发表于 2025-3-24 13:38
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-24 13:38:28 | 显示全部楼层

他们的答案都参考了友商,需要用例程代码给洗洗脑
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:33 , Processed in 0.182350 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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