USB-HID 键盘描述符简介

USB-HID 键盘描述符简介

USB-HID键盘设备描述符

#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//0x007Cconst u8 DEVICEDESC_DUSB[18] = {DEVICE_DESCRIPTOR_SIZE,     // bLength0x01,						// bDescriptorType	= DEVICE0x10,0x01,					// bcdUSB(02.00 full-speed)0x00,						// bDeviceClass0x00,						// bDeviceSubClass0x00,//0x00					// bDeviceProtocolUSB_CTRL_TEST_SZIE,			     // bMaxPacketSize - 64bytes0x93,0x29,					// idVendOR      	= 00790x02,0x60,					// idProduct		= 181C0x00,0x01,					// bcdDevice		= 01.000x02,						// iManufacturer0x01,						// iProduct0x00,						// iSerialNumber0x01,
};

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

const u8 HIDCONFIGDESC_DUSB[]={// Configuration Descriptor0x09,						// 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,						// iConfiguration0x80,						// bmAttributes (bus powered)0xc8,						// MaxPower (400mA)// Configuration Descriptor End// Interface 0// InterfaceDescriptor0x09,						// bLength (9 bytes)0x04,						// bDescriptorType (INTERFACE)0x00,						// bInterfaceNumber (0)0x00,						// bAlternateSetting (0)0x02,//0X01						// bNumEndpoints (2)0x03,						// bInterfaceClass0x01,						// bInterfaceSubClass ()0x01,						// bInterfaceProtocol ()0x00,						// iInterface (not supported)// InterfaceDescriptor end// class descriptor0x09,						// bLength0x21,						// bDescritptorType0x10,0x01,					// bcdHID(01.11)0x00,						// bCountryCode0x01,						// bNumDescriptors0x22,						// bDescriptorTypeBYTE0(HID_REPORT_DESCRIPTOR_SIZE_DUSB),// wItemLength (tot. len. of report descriptor )BYTE1(HID_REPORT_DESCRIPTOR_SIZE_DUSB),// Endpoint1Descriptor0x07,						// 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 size0x0A,//0x0A,				// 10ms// Endpoint1Descriptor end// Endpoint2Descriptor0x07,						// bLength0x05,						// bDescriptorType0x82,						// 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键盘报告描述符

const u8 HIDREPORTDESC_DUSB[] =
{0x05,0x01,// Global Generic Desktop0x09,0x06,// Local KeyBoard0xA1,0x01,// Main app collection0x05,0x07,// Global KeyBoard//第1字节0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)0x15,0x00,// Global Logical Min0x25,0x01,// Global Logical Max0x95,0x08,// Global ReportCount0x75,0x01,// Global ReportSize0x81,0x02,// Main Input(Data,Var,Abs)//第2字节0x95,0x01,// Global ReportCount0x75,0x08,// Global ReportSize0x81,0x01,// Main Input(Cnst,Var,Abs)//第3-8字节0x95,0x03,// Global ReportCount0x75,0x01,// Global ReportSize0x05,0x08,// Global Logical Min0x19,0x01,0x29,0x03,// Local Usage Max0x91,0x02,// Main Output(Data,Ary,Abs)//1字节输出报告0x95,0x05,// Global Logical Min0x75,0x01,// Global Logical Max0x91,0x01,// Global ReportCount0x95,0x06,// Global ReportSize0x75,0x08,// Global LED0x15,0x00,// Local Usage Min0x26,0x0f,0x00,// Local Usage Max0x05,0x07,// Main Output(Data,Var,Abs)//补足上面变成1个字节0x19,0x00,// Global ReportCount0x2a,0xff,0x00,// Global ReportSize0x81,0x00,// Main Output(Cnst,Var,Abs)0xc0      // Main End collection
}

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

//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

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;             //设置FIFOsfr[TXCSR1] = BIT(0);                  //Kick TxRdydelay_us(2);                           //等待TxRdy同步USB_EXIT_CRITICAL();epcb->xptr += len;epcb->xlen -= len;epcb->xcnt += len;}bXUsbIntInput_sync=2;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人类交互3 皮肤感觉与运动系统

皮肤感觉概述 皮肤是人体最大的器官之一&#xff0c;具有多种感觉功能&#xff0c;包括&#xff1a; 触觉&#xff1a;通过触觉&#xff0c;我们能感知物体的形状、质地&#xff0c;帮助我们与外界环境进行互动和感知周围物体的特征。 热觉&#xff1a;热觉使我们能感知周围环…

ridge lightgbm catboost

本文从理论基础、代码实践、内容总结三个方面来展示预测的三大基础模型与手动调参自动调参内容细节。 一、理论基础 ridgeRegression 图片: https://uploader.shimo.im/f/uX43BitluzbQeqht.jpg!thumbnail?accessTokeneyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1Q…

哪款电脑桌面日历记事本软件好用?推荐优秀的电脑日历记事本

对于众多上班族而言&#xff0c;每天在电脑前忙碌已成为生活常态。若想提升工作效率&#xff0c;简化繁琐的工作流程&#xff0c;选择一款出色的电脑桌面日历与记事本软件就显得至关重要。 然而&#xff0c;在Windows操作系统上设定提醒显得相当繁琐&#xff0c;而系统自带的记…

机器学习之注意力机制

概念 注意力机制(Attention Mechanism)是机器学习,特别是深度学习中一种重要的技术,最初被用于自然语言处理(NLP)任务,如机器翻译。它的核心思想是,让模型在处理输入数据时,能够“关注”到数据中的重要部分,而不是一视同仁地处理所有部分。这种机制极大地提高了模型…

Python贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种常见的算法设计策略&#xff0c;它在每一步选择当前最优解&#xff0c;希望通过局部最优解最终得到全局最优解。贪心算法通常适用于满足一些特定条件的问题&#xff0c;例如货币找零、活动选择、任务调度等。贪心算法的…

Discourse 中可能使用的 HMAC 算法 Java 实现

在 DiscourseConnect 中&#xff0c;对数据的签名使用的是 HMAC 算法。 实际使用的算法为 HmacSHA256。 Java 生成签名的方法很简单。 String hmac new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897682511405307018226").hmacHex(ssoPayload);HmacUti…

lvm磁盘创建失败Couldn‘t create temporary archive name

问题情况: 在客户单位创建lvm时,执行vgextend提示异常信息: 挂载磁盘报如下错误: ]# vgextend centos /dev/xvdb Physical volume “/dev/xvdb” successfully created. Couldn’t create temporary archive name. 原因:存储使用100%,无法挂载,须预留部分空间出来。 解…

工程项目核算报价-项目CPQ报价系统控成本高效完成工程项目报价

首先了解一下CPQ报价如何解决工程项目报价难的? 目前市场上的工程项目报价方案制作效率低&#xff0c;易出错&#xff0c;反复修改&#xff0c;成本核算的过程不够严谨&#xff0c;凭以经验和数据大差不差的估算当下项目&#xff0c;报价过程中会忽略侧面因素&#xff0c;导致…

Elasticsearch 分析器的高级用法二(停用词,拼音搜索)

Elasticsearch 分析器的高级用法二&#xff08;停用词&#xff0c;拼音搜索&#xff09; 停用词简介停用词分词过滤器自定义停用词分词过滤器内置分析器的停用词过滤器注意&#xff0c;有一个细节 拼音搜索安装使用相关配置 停用词 简介 停用词是指&#xff0c;在被分词后的词…

uwsgi状态监控

使用 uWSGI 内置的状态服务器 uWSGI 提供了一个内置的状态服务器&#xff0c;你可以通过配置 uWSGI 来启用它&#xff0c;并使用 Web 浏览器或者通过 HTTP 请求来查看 uWSGI 的状态信息。 启用状态服务器 在 uWSGI 的配置文件中添加以下配置&#xff1a; [uwsgi] ... sta…

【MySQL精通之路】InnoDB(3)-MVCC多版本管理

InnoDB是一个多版本&#xff08;MVCC&#xff09;的存储引擎。 它保留有关更改行的旧版本的信息&#xff0c;以支持事务性功能&#xff0c;如并发和回滚。 这些信息存储在称为回滚段的数据结构中的Undo表空间中。 参见“Undo表空间”。 InnoDB使用回滚段&#xff08;rollback…

TTS相关

文章目录 VALL-E-X简介code vist论文解读代码解读模块loss代码 valle名词解释 VALL-E-X 简介 微软VALL-E-X&#xff1a;夸克在用 可以预训练模型 端到端 code code&#xff1a;https://github.com/Plachtaa/VALL-E-X/tree/master 报错1: File "/mnt/TTS/VALL-E-X/tes…

RabbitMQ有哪些优缺点

一&#xff0c;RabbitMQ有哪些优势 RabbitMQ 作为一款流行的消息队列服务&#xff0c;具有许多优势&#xff0c;这些优势使得它在各种应用场景中都能发挥出色的作用。以下是 RabbitMQ 的一些主要优势&#xff1a; 高可靠性&#xff1a; RabbitMQ 使用持久化功能&#xff0c;无…

路由导航守卫-全局前置守卫

路由导航守卫中的全局前置守卫&#xff08;Global Before Guards&#xff09;是Vue Router中的一个重要概念。当路由即将改变&#xff08;导航触发&#xff09;时&#xff0c;这些守卫会按照创建顺序调用。它们允许你在路由跳转之前执行一些操作或判断&#xff0c;例如检查用户…

epoch的数据不能随便截取,不是特征,要根据时间!!!

长个记性&#xff0c;这半个多月像个笑话&#xff0c;哈哈哈哈

pip如何快速install packet

1、在后面加-i https://mirrors.aliyun.com//pypi//simple或https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy -i https://mirrors.aliyun.com//pypi//simplepip install numpy1.21.0 -i https://pypi.tuna.tsinghua.edu.cn/simple2、需要注意的是&#xff0c;如果…

IDEA指南

IDEA简介 截止到2021.08.31&#xff0c;是全世界最流行的Java集成开发环境 tips 快捷键 ctrl alt v&#xff1a;快速生成方法返回值接收代码/** enter&#xff1a;生成javaDoc注释 IDEA常见error Error: java: System Java Compiler was not found in classpath Proj…

【Python设计模式04】策略模式

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互相替换。策略模式让算法的变化不会影响使用算法的客户端&#xff0c;使得算法可以独立于客户端的变化而变化。…

Langchain:数据连接封装、缓存封装和LCEL学习和探索

&#x1f335; 目录 &#x1f335; &#x1f60b; 数据连接封装 &#x1f354; 文档加载器&#xff1a;Document Loaders 文档处理器&#xff1a;TextSplitter 向量数据库与向量检索 总结 &#x1f349; 缓存封装&#xff1a;Memory &#x1f3d6;️ 对话上下文&#xf…

上位机图像处理和嵌入式模块部署(mcu之芯片选择)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前市面上的mcu很多&#xff0c;有国产的&#xff0c;有进口的&#xff0c;总之种类很多。以stm32为例&#xff0c;这里面又包括了stm32f1、stm32…