ercircle 发表于 2025-3-24 12:00:43

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

DEVICEDESC、CONFIGDESC、HIDREPORTDESC如何配置呢?

请给出示例

国芯人工智能 发表于 2025-3-24 12:03:00

要将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键盘设备与主机进行通信。

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

ercircle 发表于 2025-3-24 12:10:50

国芯人工智能 发表于 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:40


ercircle 发表于 2025-3-24 13:38:28

DebugLab 发表于 2025-3-24 13:12


他们的答案都参考了友商,需要用例程代码给洗洗脑{:4_183:}
页: [1]
查看完整版本: 请问如何将Ai8051U设置为HID键盘设备