请问如何将Ai8051U设置为HID键盘设备
DEVICEDESC、CONFIGDESC、HIDREPORTDESC如何配置呢?请给出示例
要将Ai8051U微控制器配置为HID键盘设备,需要进行以下三个主要步骤:配置设备描述符(DEVICEDESC)、配置描述符(CONFIGDESC)以及HID报告描述符(HIDREPORTDESC)。以下是具体的配置示例和说明。
1. 设备描述符(DEVICEDESC)
设备描述符用于描述设备的基本信息,如设备类型、厂商ID、产品ID等。以下是一个示例:
c
const uint8t DEVICEDESC[] = {
0x12, // bLength: 描述符长度
0x01, // bDescriptorType: 设备描述符
0x00, 0x02, // bcdUSB: USB 2.0
0x00, // bDeviceClass: 由接口描述符定义
0x00, // bDeviceSubClass: 由接口描述符定义
0x00, // bDeviceProtocol: 由接口描述符定义
0x40, // bMaxPacketSize0: 最大包大小为64字节
0x83, 0x04, // idVendor: 厂商ID (示例)
0x25, 0x01, // idProduct: 产品ID (示例)
0x00, 0x01, // bcdDevice: 设备版本号
0x01, // iManufacturer: 厂商字符串索引
0x02, // iProduct: 产品字符串索引
0x03, // iSerialNumber: 序列号字符串索引
0x01 // bNumConfigurations: 配置描述符数量
};
2. 配置描述符(CONFIGDESC)
配置描述符用于描述设备的配置信息,包括接口和端点描述符。以下是一个示例:
c
const uint8t CONFIGDESC[] = {
// 配置描述符
0x09, // bLength: 描述符长度
0x02, // bDescriptorType: 配置描述符
0x22, 0x00, // wTotalLength: 配置描述符总长度
0x01, // bNumInterfaces: 接口数量
0x01, // bConfigurationValue: 配置值
0x00, // iConfiguration: 配置字符串索引
0x80, // bmAttributes: 自供电,不支持远程唤醒
0x32, // bMaxPower: 最大功耗 (100mA)
// 接口描述符
0x09, // bLength: 描述符长度
0x04, // bDescriptorType: 接口描述符
0x00, // bInterfaceNumber: 接口编号
0x00, // bAlternateSetting: 备用设置
0x01, // bNumEndpoints: 端点数量
0x03, // bInterfaceClass: HID类
0x01, // bInterfaceSubClass: Boot Interface Subclass
0x01, // bInterfaceProtocol: 键盘协议
0x00, // iInterface: 接口字符串索引
// HID描述符
0x09, // bLength: 描述符长度
0x21, // bDescriptorType: HID描述符
0x11, 0x01, // bcdHID: HID版本1.11
0x00, // bCountryCode: 国家代码 (无)
0x01, // bNumDescriptors: 描述符数量
0x22, // bDescriptorType: 报告描述符
0x2E, 0x00, // wDescriptorLength: 报告描述符长度
// 端点描述符
0x07, // bLength: 描述符长度
0x05, // bDescriptorType: 端点描述符
0x81, // bEndpointAddress: 输入端点1
0x03, // bmAttributes: 中断传输
0x08, 0x00, // wMaxPacketSize: 最大包大小为8字节
0x0A // bInterval: 轮询间隔 (10ms)
};
3. HID报告描述符(HIDREPORTDESC)
HID报告描述符用于定义设备的功能和数据结构。以下是一个简单的键盘报告描述符示例:
c
const uint8t HIDREPORTDESC[] = {
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x05, 0x07, // Usage Page (Key Codes)
0x19, 0xE0, // Usage Minimum (0xE0)
0x29, 0xE7, // Usage Maximum (0xE7)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input (Data, Var, Abs)
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x01, // Input (Const, Array, Abs)
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)
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x01, // Output (Const, Array, Abs)
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x65, // Logical Maximum (101)
0x05, 0x07, // Usage Page (Key Codes)
0x19, 0x00, // Usage Minimum (0)
0x29, 0x65, // Usage Maximum (101)
0x81, 0x00, // Input (Data, Array, Abs)
0xC0 // End Collection
};
总结
通过以上配置,Ai8051U微控制器可以被识别为HID键盘设备。DEVICEDESC定义了设备的基本信息,CONFIGDESC描述了设备的配置和接口,HIDREPORTDESC则定义了键盘的功能和数据结构。将这些描述符正确配置后,Ai8051U即可作为HID键盘设备与主机进行通信。
[本文内容由国芯人工智能辅助生成,仅供参考] 国芯人工智能 发表于 2025-3-24 12:03
要将Ai8051U微控制器配置为HID键盘设备,需要进行以下三个主要步骤:配置设备描述符(DEVICEDESC)、配置描 ...
vid不正确。
正确答案:
参考基于USB-HID协议的USB键盘范例:
/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/*---------------------------------------------------------------------*/
#include "usb_desc.h"
char code DEVICEDESC =
{
0x12, //bLength(18);
0x01, //bDescriptorType(Device);
0x00,0x02, //bcdUSB(2.00);
0x00, //bDeviceClass(0);
0x00, //bDeviceSubClass0);
0x00, //bDeviceProtocol(0);
0x40, //bMaxPacketSize0(64);
0xbf,0x34, //idVendor(34bf);
0x03,0xff, //idProduct(ff03);
0x00,0x01, //bcdDevice(1.00);
0x01, //iManufacturer(1);
0x02, //iProduct(2);
0x00, //iSerialNumber(0);
0x01, //bNumConfigurations(1);
};
char code CONFIGDESC =
{
0x09, //bLength(9);
0x02, //bDescriptorType(Configuration);
0x29,0x00, //wTotalLength(41);
0x01, //bNumInterfaces(1);
0x01, //bConfigurationValue(1);
0x00, //iConfiguration(0);
0x80, //bmAttributes(BUSPower);
0x32, //MaxPower(100mA);
0x09, //bLength(9);
0x04, //bDescriptorType(Interface);
0x00, //bInterfaceNumber(0);
0x00, //bAlternateSetting(0);
0x02, //bNumEndpoints(2);
0x03, //bInterfaceClass(HID);
0x01, //bInterfaceSubClass(Boot);
0x01, //bInterfaceProtocol(Keyboard);
0x00, //iInterface(0);
0x09, //bLength(9);
0x21, //bDescriptorType(HID);
0x01,0x01, //bcdHID(1.01);
0x00, //bCountryCode(0);
0x01, //bNumDescriptors(1);
0x22, //bDescriptorType(HID Report);
0x41,0x00, //wDescriptorLength(65);
0x07, //bLength(7);
0x05, //bDescriptorType(Endpoint);
0x81, //bEndpointAddress(EndPoint1 as IN);
0x03, //bmAttributes(Interrupt);
0x08,0x00, //wMaxPacketSize(8);
0x0a, //bInterval(10ms);
0x07, //bLength(7);
0x05, //bDescriptorType(Endpoint);
0x01, //bEndpointAddress(EndPoint1 as OUT);
0x03, //bmAttributes(Interrupt);
0x01,0x00, //wMaxPacketSize(1);
0x0a, //bInterval(10ms);
};
/*
Input Report:
0 Modifierkeys (D0:LCtrl D1:LShift D2:LAlt D3:LGui D4:RCtrl D5:RShift D6:RAlt D7:RGui)
1 Reserved
2 Keycode 1
3 Keycode 2
4 Keycode 3
5 Keycode 4
6 Keycode 5
7 Keycode 6
Output Report:
0 LEDs (D0:NumLock D1:CapLock D2:ScrollLock)
*/
char code HIDREPORTDESC =
{
0x05,0x01, //USAGE_PAGE(Generic Desktop);
0x09,0x06, //USAGE(Keyboard);
0xa1,0x01, //COLLECTION(Application);
0x05,0x07, //USAGE_PAGE(Keyboard);
0x19,0xe0, //USAGE_MINIMUM(224);
0x29,0xe7, //USAGE_MAXIMUM(255);
0x15,0x00, //LOGICAL_MINIMUM(0);
0x25,0x01, //LOGICAL_MAXIMUM(1);
0x75,0x01, //REPORT_SIZE(1);
0x95,0x08, //REPORT_COUNT(8);
0x81,0x02, //INPUT(Data,Variable,Absolute);
0x75,0x08, //REPORT_SIZE(8);
0x95,0x01, //REPORT_COUNT(1);
0x81,0x01, //INPUT(Constant);
0x19,0x00, //USAGE_MINIMUM(0);
0x29,0x65, //USAGE_MAXIMUM(101);
0x15,0x00, //LOGICAL_MINIMUM(0);
0x25,0x65, //LOGICAL_MAXIMUM(101);
0x75,0x08, //REPORT_SIZE(8);
0x95,0x06, //REPORT_COUNT(6);
0x81,0x00, //INPUT(Data,Array);
0x05,0x08, //USAGE_PAGE(LEDs);
0x19,0x01, //USAGE_MINIMUM(1);
0x29,0x03, //USAGE_MAXIMUM(3);
0x15,0x00, //LOGICAL_MINIMUM(0);
0x25,0x01, //LOGICAL_MAXIMUM(1);
0x75,0x01, //REPORT_SIZE(1);
0x95,0x03, //REPORT_COUNT(3);
0x91,0x02, //OUTPUT(Data,Variable,Absolute);
0x75,0x05, //REPORT_SIZE(5);
0x95,0x01, //REPORT_COUNT(1);
0x91,0x01, //OUTPUT(Constant);
0xc0, //END_COLLECTION;
};
char code LANGIDDESC =
{
0x04,0x03,
0x09,0x04,
};
char code MANUFACTDESC =
{
0x08,0x03,
'A',0,
'I',0,
'C',0,
};
char code PRODUCTDESC =
{
0x22,0x03,
'A',0,
'I',0,
'C',0,
' ',0,
'U',0,
'S',0,
'B',0,
' ',0,
'K',0,
'e',0,
'y',0,
'b',0,
'o',0,
'a',0,
'r',0,
'd',0,
};
char code PACKET0 =
{
0, 0,
};
char code PACKET1 =
{
1, 0,
};
DebugLab 发表于 2025-3-24 13:12
他们的答案都参考了友商,需要用例程代码给洗洗脑{:4_183:}
页:
[1]