项目:USB键盘和鼠标的复合设备

 

      我们的复合设备使用一个物理设备就可以完成多个功能。

      使用复合设备同时完成USB键盘和鼠标功能,它的主要实现方式有两种,

第一个就是我们将多个设备描述符合并成一个,这个相对比较简单,我们只要根据相应的报告描述符处理数据就可以。

第二个就是使用多个接口来实现复合设备,每一个接口实现一个功能,这个做法比较复杂,能让我们更加深入的了解USB,所以这次我们使用这种做法来实现复合设备。

       我们的代码就使用STM32的官方例程,如下图:

02b4a430f6f44e6d83ddf3cacf2df578.png

我们会在这个官方例程游戏操作杆上进行修改,所有和USB键盘有关的项目都会使用“_KB”字符加以区分,没有的话就是鼠标的。Joystick_ReportDescriptor 这个报告描述符就是鼠标,Joystick_KB_ReportDescriptor这个报告描述符就是键盘。

第一步,我们将鼠标和键盘的报告描述符添加进去。

原来的如下图:

3a3d2231b33c495ba12a5f9007f4632d.png

现在增加鼠标和报告描述符:

aeaf11c94c2d40568a044e455af89111.png8a60e465f4964b70bea5fb437be64061.png

然后我们报告描述符的长度也要改一下

c9b3522e5aa14dc4a617a2e6572c6439.png

还要记得extern声明一下

42b4f70d32ee4e379e3dc3e15d2e9048.png

第二步,我们修改完报告描述符以后就是修改配置描述符,

首先就是 接口增加到两个,bNumInterfaces 的接口值修改成0x02,然后配置描述符的总长度从34增加到66 JOYSTICK_SIZ_CONFIG_DESC

a1a73d8818c84a5bb9a4ea5f4b5e5e35.png

然后还要增加一个接口描述符(HID描述符和端点描述符)端点1用给鼠标  端点2用给键盘

0cf02a818aaa455393f48fd9c21d3c63.png

第三步就是复合设备需要相应总线枚举,我们的主机首先要对设备进行复位,所以会进入Joystick_Reset函数中,加上键盘的端点2的初始化

1abca41d0803452fb94f3e942ca0e48c.png

第四步,我们的复合设备是两个接口,每个接口就是对应一个HID设备类,因此我们的主机必须对每个接口获取相应的HID描述符与报告描述符,那么怎么样提交这些描述符的数据呢?根据之前对控制传输的分析,设备必须在usb_prop.c源文件中预先定义ONE_DESCRIPTOR结构体变量对“需要提交的描述符数据数组”定位的那些变量,如下图:

c15ea53f19124256ad431e306ee06799.png

第五步就是把发送数据的一些应用层函数还有回调函数加上去。如下图都是要改的地方,我都截图框出来。

1b9977d8aa7e455aaa6d97bc1aaa33fa.png

73393746986441dfaa84afd0f6846065.png

da496c9ce2a94da9b98b4919d8d5c0fa.png

7cbf2ee23d6c426bba33704ab44eeaa4.png

90c7a3aed0104496b8a8d3910ef91b4f.png

901e961dd0a1429994669f0fae7f1ff3.png

4567e168dda74fc1a30b0be175a72b2b.png

主要就是按键 ,发送的应用层逻辑编写,还有按键的初始化,最后这个一定要全部再回顾一遍,特别是枚举 初始化 数据发送过程。然后其实这个项目还能扩展一下,后面有空我还会优化的,如果有朋友看到这里可以自己试试。

第一个就是可以自己做一个矩阵扫描

第二个就是实现全键无冲,我们现在是键盘最多只能发送六个数据,全键无冲就可以发送多个

第三个就是使用上位机发送数据下来控制MCU,可以使用下面这个软件模拟一下。

后面有时间我会把这三个拓展方向优化加进来,不过最近一个月都在搞USB也是乏味了hhhh,想换个口味了,准备下一个学习232,485,CAN总线吧。

b028162ea1d54d168ed5f06c83f73fef.png

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

vue3+vite 模板vue3-element-admin框架如何关闭当前页面跳转 tabs

使用模版: 有来开源组织 / vue3-element-admin 需要关闭的.vue 页面增加以下方法 //setup 里import {LocationQuery, useRoute, useRouter} from "vue-router"; const router useRouter(); function close() {console.log(|--router.currentRoute.value, router.cur…

C++入门:命名空间namespace,cin,cout,缺省参数,函数的重载

namespace本质上是定义了一个命名空间域 通过创建命名空间域可以预防变量的冲突问题 命名冲突时,编译器会首先从局部中找,然后从全局中找,但是不会从命名空间中找 eg. ::符号和命名空间 :: 是域作用限定符 就可以访问namespace bit中的rand了,否则就默认找局部或全局的ran…

2024年全新靠谱的FTP替代升级解决方案

随着企业规模的扩大和业务的多元化,传统的TCP协议在数据传输效率上逐渐显现出局限性。TCP协议虽然以其稳定性和可靠性被广泛应用,但在面对大规模数据传输时,其性能瓶颈逐渐成为企业发展的阻碍。同时,基于TCP的应用协议如Telnet、F…

如何设计一个通用的 Excel 导入导出功能?

以JSON配置的方式去实现通用性和动态调整,当然,这个通用仍然存在一定的局限性,每个项目的代码风格都不同。 想要写出一个适合所有项目的通用性模块并不容易,这里的通用局限于其所在项目,所以该功能代码如果不适用于自…

【ReadPapers】A Survey of Large Language Models

LLM-Survey的llm能力和评估部分内容学习笔记——思维导图 思维导图 参考资料 A Survey of Large Language Models论文的github仓库

深度学习(四)笔记1

0.前提 往后我会以我的笔记形式来发布我的文章(每3次笔记为一篇文章),有爱的人可以自取学习,当然如果可以的话我会把我的文章翻出来变成文章。 1.数据操作 本期4.1数据操作的链接在这。 链接:https://pan.baidu.com/s…

Discuz! X3.5苗木_苗木网_苗木价格_苗木求购信息_苗木批发网模板utf-8

适合做苗木行业平台苗木网站、苗木信息网,提供苗木报价、各地苗木求购信息、绿化苗木采购招标、苗木基地展示、苗木百科知识、花木交易及苗木资讯、各地苗木信息网络行情。解压上传到template目录下,后台安装即可,包含PC手机端模板 下载地址:…

Java毕业设计-基于springboot开发的致远汽车租赁系统平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、业务员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot…

虹科Pico汽车示波器 | 免拆诊断案例 | 2018款东风风神AX7车发动机怠速抖动、加速无力

一、故障现象 一辆2018款东风风神AX7车,搭载10UF01发动机,累计行驶里程约为5.3万km。该车因发动机怠速抖动、加速无力及发动机故障灯异常点亮而进厂维修,维修人员用故障检测仪检测,提示气缸3失火;与其他气缸对调点火线…

解决nginx代理后,前端拿不到后端自定义的header

先说结论,因为前端和nginx对接,所以需要在nginx添加如下配置向前端暴露header add_header Access-Control-Expose-Headers Authorization 排查过程 1.后端设置了Authorization 的响应头作为token的返回,前后端本地联调没有问题 response.s…

隐私计算实训营第六讲-隐语PIR介绍及开发实践

隐私计算实训营第六讲-隐语PIR介绍及开发实践 文章目录 隐私计算实训营第六讲-隐语PIR介绍及开发实践1.隐语实现PIR总体介绍1.1按服务器数量分类1.2按查询类型分类 2. Index PIR - SealPIR3. Keyword PIR - Labeled PSI4.隐语PIR功能分层5.隐语PIR后续计划PIR协议开发PIR调用框…

基于SSM的文物管理系统

目录 背景 技术简介 系统简介 界面预览 背景 互联网的迅猛发展彻底改变了全球各类组织的管理策略。自20世纪90年代起,中国的政府机关和各类企事业单位就开始探索利用互联网技术进行信息管理。然而,由于当时网络覆盖不广、用户接受度不高、相关法律法…

YOLOv8全网独家改进: 小目标 | CAMixing:卷积-注意融合模块和多尺度提取能力 | 2024年4月最新成果

💡💡💡本文独家改进:CAMixingBlock更好的提取全局上下文信息和局部特征,包括两个部分:卷积-注意融合模块和多尺度前馈网络; 💡💡💡红外小目标实现涨点,只有几个像素的小目标识别率提升明显 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特…

【服务端】node.js详细的配置

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

JAVAEE之JavaScript

1.JavaScript JavaScript (简称 JS) 是世界上最流行的编程语言之一 是一个脚本语言, 通过解释器运行 主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行. 脚本是什么? 脚本(script)是使用一种特定的描述性语言&#x…

音乐家马常旭当选为中华名人库委员会副主席

4月2日,据中华名人库官网显示,马常旭已当选为中华名人库委员会副主席。此前马常旭是一名音乐家、中国内地著名男歌手。 马常旭资料 马常旭,男,汉族,2002年10月生,辽宁大连人。现任中华名人库委员会副主席&…

RVM安装Ruby笔记(Mac)

环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…

Taro多行文本最多展示5行,超出“查看更多”展示,点击弹层

Taro中,页面需求: 多行文本,展示最多展示5行,超出5行,展示“查看更多”按钮,点击弹层展示文本详细信息。 弹层代码就不说了,着重说一下怎么获取区域高度~ 1.区域设置max-height&am…

【Java多线程】6——集合线程安全

6 集合线程安全 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记仓库👉https://github.com/A-BigTree/tree-learning-notes 个人主页👉https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~&…

FPGA + 图像处理 (二) RGB转YUV色域、转灰度图及仿真

前言 具体关于色域的知识就不细说了,简单来讲YUV中Y通道可以理解为就是图像的灰度图,因此,将RGB转化为YUV是求彩色图的灰度直方图、进行二值化操作等的基础。 HDMI时序生成模块 这里先介绍一下仿真时用于生成HDMI时序,用这个时…