USB-HID 键盘描述符简介

USB-HID 键盘描述符简介

USB-HID键盘设备描述符

c 复制代码
#define DEVICE_DESCRIPTOR_SIZE	                0x12
#define USB_CTRL_TEST_SZIE      8
#define CONFIG_DESCRIPTOR_SIZE_DUSB				0x0029 //0x0022//0x0029
#define HID_REPORT_DESCRIPTOR_SIZE_DUSB		 	0x0041 //0x0041//0x007C

const u8 DEVICEDESC_DUSB[18] = {
    DEVICE_DESCRIPTOR_SIZE,     // bLength
	0x01,						// bDescriptorType	= DEVICE
	0x10,0x01,					// bcdUSB(02.00 full-speed)
	0x00,						// bDeviceClass
	0x00,						// bDeviceSubClass
	0x00,//0x00					// bDeviceProtocol
	USB_CTRL_TEST_SZIE,			     // bMaxPacketSize - 64bytes
	0x93,0x29,					// idVendOR      	= 0079
	0x02,0x60,					// idProduct		= 181C
	0x00,0x01,					// bcdDevice		= 01.00
	0x02,						// iManufacturer
	0x01,						// iProduct
	0x00,						// iSerialNumber
	0x01,
};

USB-HID键盘配置和其他描述符

c 复制代码
const u8 HIDCONFIGDESC_DUSB[]={
 // Configuration Descriptor
    0x09,						// length of descriptor (9 bytes)
    0x02,						// descriptor type (CONFIGURATION)
    BYTE0(CONFIG_DESCRIPTOR_SIZE_DUSB),// Total length bytes (9 + 9 + 9 + 7 + 7)
    BYTE1(CONFIG_DESCRIPTOR_SIZE_DUSB),

    0x01,						// bNumInterfaces (1)
    0x01,						// bConfigurationValue (1)
    0x00,						// iConfiguration
    0x80,						// bmAttributes (bus powered)
    0xc8,						// MaxPower (400mA)
    // Configuration Descriptor End

    // Interface 0
    // InterfaceDescriptor
    0x09,						// bLength (9 bytes)
    0x04,						// bDescriptorType (INTERFACE)
    0x00,						// bInterfaceNumber (0)
    0x00,						// bAlternateSetting (0)
    0x02,//0X01						// bNumEndpoints (2)
    0x03,						// bInterfaceClass
    0x01,						// bInterfaceSubClass ()
    0x01,						// bInterfaceProtocol ()
    0x00,						// iInterface (not supported)
    // InterfaceDescriptor end

    // class descriptor
    0x09,						// bLength
    0x21,						// bDescritptorType
    0x10,0x01,					// bcdHID(01.11)
    0x00,						// bCountryCode
    0x01,						// bNumDescriptors
    0x22,						// bDescriptorType
    BYTE0(HID_REPORT_DESCRIPTOR_SIZE_DUSB),// wItemLength (tot. len. of report descriptor )
    BYTE1(HID_REPORT_DESCRIPTOR_SIZE_DUSB),


    // Endpoint1Descriptor
    0x07,						// descriptor length (7 bytes)
    0x05,						// descriptor type (ENDPOINT)
    0x81,						// endpoint address (IN endpoint, endpoint 1)
    0x03,						// endpoint attributes (interrupt)
    USB_CTRL_TEST_SZIE,0x00,                  //EP1_PACKET_SIZE_LE,			// maximum packet size
    0x0A,//0x0A,				// 10ms
    // Endpoint1Descriptor end

    // Endpoint2Descriptor
    0x07,						// bLength
    0x05,						// bDescriptorType
    0x82,						// bEndpointAddress (ep1, OUT)
    0x03,						// bmAttributes (INT)
    USB_CTRL_TEST_SZIE,0x00,  //EP2_PACKET_SIZE_LE,			// wMaxPacketSize (lsb first)
    0x0A,						// bInterval - 10ms
    // Endpoint2Descriptor End
}

USB-HID键盘报告描述符

c 复制代码
const u8 HIDREPORTDESC_DUSB[] =
{
    0x05,0x01,// Global Generic Desktop
    0x09,0x06,// Local KeyBoard
    0xA1,0x01,// Main app collection
    0x05,0x07,// Global KeyBoard
    //第1字节
    0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)
    0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)
    0x15,0x00,// Global Logical Min
    0x25,0x01,// Global Logical Max
    0x95,0x08,// Global ReportCount
    0x75,0x01,// Global ReportSize
    0x81,0x02,// Main Input(Data,Var,Abs)
    //第2字节
    0x95,0x01,// Global ReportCount
    0x75,0x08,// Global ReportSize
    0x81,0x01,// Main Input(Cnst,Var,Abs)
    //第3-8字节
    0x95,0x03,// Global ReportCount
    0x75,0x01,// Global ReportSize
    0x05,0x08,// Global Logical Min
    0x19,0x01,
    0x29,0x03,// Local Usage Max
    0x91,0x02,// Main Output(Data,Ary,Abs)
    //1字节输出报告
    0x95,0x05,// Global Logical Min
    0x75,0x01,// Global Logical Max
    0x91,0x01,// Global ReportCount
    0x95,0x06,// Global ReportSize
    0x75,0x08,// Global LED
    0x15,0x00,// Local Usage Min
    0x26,0x0f,0x00,// Local Usage Max
    0x05,0x07,// Main Output(Data,Var,Abs)
    //补足上面变成1个字节
    0x19,0x00,// Global ReportCount
    0x2a,0xff,0x00,// Global ReportSize
    0x81,0x00,// Main Output(Cnst,Var,Abs)
    0xc0      // Main End collection
}

在设置地址的时候,也需要将数据长度改了

c 复制代码
//Set Address
AT(.usbdev.com)
static bool do_set_address(ude_t *ude)
{
//    printf("%s\n", __func__);

    spb_wrap_t *spb = &ude->spb;

    if(Read_USB_Mode==USB_Xbox_Mode)
    {
        ude->ep.epsize = USB_CTRL_SIZE;             //默认为8,收到SetAddress后,将MAXEPSIZE改为64。
    }
    else
    {
         ude->ep.epsize = USB_CTRL_TEST_SZIE;//这个是键盘的
    }



    if (ude->cfgval) {
        return false;                           //已经进行配置,不支持设置地址
    }

    ude->devaddr = BYTE0(spb->val);
    ude->set_faddr = 1;
    return true;
}

在发送数据的时候,同时需要将len改成8

c 复制代码
void ude_hid_tx_process(void)
{
    //USB - HID 发送数据
    u8 len=9;
    epcb_t *epcb=udp_1.int_in;

    if(bXUsbIntInput_sync==1)
    {
        if(USB_SendData_Cnt<200) USB_SendData_Cnt++;

        if(Read_USB_Mode==USB_Switch_Mode)
        {
            len=64;
            memcpy(epcb->buf, &PS3InBuffer[1], len);
        }
        else
        {

            len = 8;//USB_CTRL_TEST_SZIE
            //printf("ude_hid_tx_process.. send:%d\r\n",len);
            memcpy(epcb->buf, Send_USB_DataBuf, len);
        }


        epcb->xptr=epcb->buf;
        epcb->xlen = len;
        epcb->xcnt = 0;
        epcb->first_pkt=1;
    }

    psfr_t sfr =  epcb->sfr;
    usb_set_cur_ep(epcb);

    if (0 == (sfr[TXCSR1] & BIT(0)))     //TX OK
    {
        if (epcb->first_pkt == 0 && epcb->xlen == 0)
        {
//            if(Read_USB_Mode==USB_Switch_Mode)
                Send_Switch_ct=5;
            bXUsbIntInput_sync=0;
            work_cheak_ct=0;
            return;     //ok
        }

        epcb->first_pkt = 0;
        len = (epcb->xlen >= epcb->epsize) ? epcb->epsize : epcb->xlen;

        USB_ENTER_CRITICAL();
        USBEP1TXADR=DMA_ADR(epcb->xptr);
        USBCON2 = BIT(16+1) | len;             //设置FIFO
        sfr[TXCSR1] = BIT(0);                  //Kick TxRdy

        delay_us(2);                           //等待TxRdy同步
        USB_EXIT_CRITICAL();

        epcb->xptr += len;
        epcb->xlen -= len;
        epcb->xcnt += len;
    }

    bXUsbIntInput_sync=2;
}

最后根据键盘键值发送数据即可

相关推荐
热爱跑步的恒川2 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面3 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
音徽编程6 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
幺零九零零7 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
23zhgjx-NanKon7 小时前
华为eNSP:QinQ
网络·安全·华为
23zhgjx-NanKon7 小时前
华为eNSP:mux-vlan
网络·安全·华为
点点滴滴的记录7 小时前
RPC核心实现原理
网络·网络协议·rpc
Lionhacker8 小时前
网络工程师这个行业可以一直干到退休吗?
网络·数据库·网络安全·黑客·黑客技术
程思扬9 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
ZachOn1y9 小时前
计算机网络:运输层 —— 运输层概述
网络·tcp/ip·计算机网络·运输层