首页
学习
活动
专区
圈层
工具
发布

USB HID通信协议详解

USB HID通信协议详解 一、什么是USB HID? USB HID(Human Interface Device,人机接口设备)是USB协议中的一个标准设备类别,专门为需要与人交互的设备设计。...对比表格:HID vs 其他USB设备类型 特性 USB HID设备 其他USB设备(如存储设备) 主要用途 人机交互 数据传输、存储 通信方式 中断传输为主 批量传输为主 延迟要求 低延迟(实时响应...报告描述符 - HID的"灵魂",定义设备能力 用途:告诉主机"我能做什么" 内容:定义按钮、轴、滑块等输入元素 格式:基于项目的紧凑二进制格式 五、报告描述符实例分析 简单鼠标的报告描述符示例: 0x05...跨平台兼容性好 灵活 - 可通过报告描述符自定义功能 ⚠️ 局限: 数据量有限 - 不适合大数据传输 描述符复杂 - 学习曲线较陡 带宽受限 - 高速设备可能需要其他方案 总结 USB HID协议是人机交互设备的基石...理解HID的关键在于掌握报告描述符的设计和中断传输的特性。无论是简单的键盘鼠标,还是复杂的游戏外设,都是基于这一套灵活而强大的协议实现的。

57710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    真车转向拨杆拆车件+Arduino实现欧卡2游戏内模拟对应功能——第1部分:前期调研

    对于例如 Arduino Uno 这样的板子,默认使用 ATmega328P,仅通过 USB 转串口芯片(如 ATmega16U2)进行通信,所以默认并不支持作为 HID 设备发送自定义描述符。...无 USB 控制器无法模拟 HID 报告或识别为“键盘设备”UNO R3 的 USB 接口是 CH340G / ATmega16U2仅做串口通信,不具备 HID 功能❗️那为什么网上那段代码能编译?...实现步骤概览第一步:自定义 USB HID 描述符 → Joystick 类型(8 个按钮)修改 usb_desc.c 中的 HID 报告描述符部分,描述这个设备有 8 个按键。...你已经深入到了 USB HID 的核心内容 —— HID 报告描述符 和 USB 设备描述符配置,我来一步一步为你 从原理到操作解释清楚。✅ 前提:你现在做的是什么?...除了 HID 报告描述符之外,你还要修改其它几个描述符字段,说明这个设备是一个 HID 设备,使用我们上面定义的报告描述符。这些也都在 usb_desc.c 中:✅ 关键字段改法:1.

    1.9K10

    信创系统支持 USB HID 设备的两种方案

    2. libusb 简介:通用 USB 访问库,HID 是 USB 设备的一类。...特点: 可以访问 HID 以及非 HID USB 设备; 更底层,需要自己解析 HID 报告; 更灵活,可以实现特定控制请求。...特点: 最底层,直接访问 HID 报告字节; 不经过通用 HID 层解析; 可结合 ioctl() 获取 HID 报告描述符、发送 Feature Report 等。...设备描述符获取 创建设备时,通过Linux的ioctl接口获取HID报告描述符: 使用 HIDIOCGRDESCSIZE ioctl获取描述符大小 使用 HIDIOCGRDESC ioctl获取完整的报告描述符...数据传输流程 读取输入报告: Linux设备的数据通过 read() 系统调用读取 报告被加入事件队列,主线程通过 process_hid_report() 处理 Windows应用程序通过 IOCTL_HID_READ_REPORT

    43910

    USB初学(一)---USB-HID的初步认识【转】

    HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容。 USB设备描述符-概述 当插入USB设备后,主机会向设备请求各种描述符来识别设备。...从框图中,可以看出除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。...HID描述符 0x22:报告描述符 0x23:物理描述符 7 wDescriptorLength 2 数字 报告描述符总长度 9 bDescriptorType 1 常量用于识别描述符类型的常量,使用在有一个以上描述符的设备...主机接收USB设备的异步传输数据 USB主机发送有实时性要求的数据给USB设备 从USB主机到USB设备的中断输出数据传输是可选的,当不支持中断输出数据传输时,USB主机通过控制管道将数据传输给USB设备...表1、USB HID规范定义的HID设备可用端点 管道 要求 说明 控制(端点0) 必须 传输USB描述符、类请求代码以及供查询的消息数据等 中断输入 必须 传输从设备到主机的输入数据 中断输出 可选

    17K61

    基于STM32CUBE的USB鼠标键盘二合一

    看来你们对USB兴趣一般,所以这次我把它放在次条。感兴趣的就看一眼,没兴趣的就算了。 前面两篇文章分别说了如何实现基于STM32的USB鼠标和基于STM32的USB键盘。...具体操作和USB鼠标的操作一样,这里就不重复了。 同理,VID和PID要和之前的设备不一样。设置完成以后,直接生成工程。 ?.../*bInterval: Polling Interval */ 第三,修改HID描述符中,报告描述符的长度: ?...向USB主机发送数据的时候,数组的第一个元素是报告ID,后面才是键盘数据或鼠标数据。实现前面两节的例程的时候,USB键盘我们定义了一个8元素的数组,USB鼠标我们定义了一个4元素的数组。...现在我们只需要一个数组,它同一时间,只发送一种数据,所以大小为8,然后,还要包含报告ID,所以变成9. 在USB协议中,报告ID默认是数组的第一个元素。

    3.2K41

    Linux驱动开发: USB驱动开发

    在USB主机访问USB设备的描述符时,USB设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。...除此之外, HID 设备还有三种特殊的描述符: HID 描述符、报告描述符、物理描述符。一个 USB 设备只能支持一个 HID 描述符,但可以支持多个报告描述符,而物理描述符则可以有也可以没有。...3.2 HID 描述符 HID 描述符用于识别 HID 设备中所包含的额外描述符,例如报告描述符或物理描述符等。...他设备描述符的数量。由于 HID 设备至少需要包括一个报告描述符,故其值至小为 0x01。 bDescriptorType: HID 描述符附属的类别描述符长度。...3.3 报告描述符 HID 设备的报告描述符是一种数据报表,主要用于定义 HID 设备和 USB 主机之间的数据交换格式, HID 设备报告描述符的类型值为 0x22。

    77.2K22

    DIY一个专属HID注入设备吧

    但是由于价格原因,大多数研究人员首选Teensy USB开发板并基于Arduino IDE实现HID注入攻击。...电脑主机是通过设备描述符识别USB设备类型的,并在规定的端点建立与设备的通信关系,因此要做的第一步是要配置好设备的描述符。...参考STM32F10X USB设备开发套件(STM32_USB-FS-Device_Lib_V4.0.0)中JoyStickMouse例程,按照lsj9383[1]的思路对配置描述符和报告描述符进行修改...在电脑识别出HID设备的基础上,调整端点收发缓存区的分配,再配置设备的Init和Reset函数。接着就可以用Joystick_Send函数发送按键数据,参数非零代表有键按下,全零则代表松开。...按照zengming00[4]的教程,对mass_mal.c中的MAL_Init,MAL_GetStatus,MAL_Read,MAL_Write函数进行修改,使之解锁访问并读写内部flash数据。

    1.8K00

    原创 Paper | USB设备开发:从入门到实践指南(一)

    2.1.6 HID报告描述符 当USB主机通过接口描述符得知USB设备是USB HID设备时,将会再获取HID报告描述符,在USBPcap中捕获到的HID报告描述符如图21所示: 图21:Wireshark...查看HID报告描述符 定义HID报告描述符的代码在bash脚本中如下所示: # Write the report descriptor # Source: https://www.kernel.org/...报告描述符来源于Linux内核示例,如图22所示: 图22:Linux USB HID gadget 驱动文档 所以下一步我们需要能顺利阅读HID报告描述符,可以参考官方文档,官方文档的优点是内容齐全,...在大致了解了如何向USB主机发送数据后,再来看看HID的报告描述符: static struct hidg_func_descriptor my_hid_data = { .subclass...到这里键盘的HID报告描述符的定义就分析完了,我们发现该描述符定义的内容和我们的输入数据的格式是吻合的。 发送的buf第一字节就是表示8个控制按键,第二字节固定为0,后面6个字节为输入按键。

    3.4K00

    基于STM32CubeMX的USB鼠标例程

    最近在玩STM32CUBE的USB功能,用起来还是挺方便的。只要配置一下,设备描述符、配置描述符、接口描述符什么的,都能给你自动生成,其中还包括比较复杂的报告描述符。...只要在USB设备的D+数据线上接一个1.5K的上拉电阻即可。而我这里这个上拉电阻的电源端是接到了STM32的PA15上面。如图: ? 所以,如果你的板子上,上拉电阻默认接到VCC,这一步就不用管了。...USB设备回答:… 6、两次回答一样,说明USB设备的地址分配成功。USB主机继续提问,获取其它描述符。 7、USB设备,在向主机回复配置集合的时候,表明自己的身份:你好,我是个鼠标!...也就是说,在配置集合中,有信息说明这个设备是鼠标,我们看下。在usb_hid.c文件中,有一个数组:USBD_HID_CfgFSDesc,其中一行: ? 单是这个还不够,还要结合报告描述符。...无论是配置集合,还是报告描述符,这里都不做解释,因为一两篇文章根本说不完。这里只说一点,由于报告描述符的规定,鼠标设备向电脑发送数据的时候,一般是发送4个字节的数据。

    2.4K21

    USB总线和协议

    USB描述符详解6.1 设备描述符设备描述符是USB设备的"身份证",包含了设备的基本信息。它的长度固定为18字节,包括USB版本号、设备类代码、厂商ID(VID)、产品ID(PID)、设备版本号等。...6.3 接口和端点描述符接口描述符定义了设备的功能接口,一个配置可以包含多个接口。比如一个USB复合设备可能同时包含HID接口和CDC接口。...USB类驱动7.1 HID类HID是最常见的USB设备类之一,包括鼠标、键盘、游戏手柄等。HID类的优势是操作系统都内置了HID驱动,无需安装额外驱动就能使用。...HID设备通过报告来传输数据,报告格式由报告描述符定义。在嵌入式开发中,我们经常用HID类来实现自定义的数据传输,因为它简单方便。7.2 CDC类CDC主要用于串口通信。...7.3 MSC类MSC用于U盘、移动硬盘等存储设备。MSC类基于SCSI协议,支持读写扇区、查询容量等操作。实现MSC类设备需要提供底层的存储介质访问接口,比如Flash、SD卡等。

    34220

    硬件笔记(8)----USB学习笔记5

    bMaxPacketSize 会报告由端点 0 支持的数据包的最大字节数量。根据设备,数据包的大小可以为 8 个字节、16 个字节、32 个字节和 64 个字节。...10.7 其他杂项描述符类型 报告描述符:某个 USB 类设备可能需要一组扩展式的描述符信息。开发者必须保证 USB 设备所需要的任意额外的描述符信息都包含在描述符文件里。...例如,对于 HID 类设备,开发者必须将报告描述符添加到描述符文件内,用于定义其他设备属性。如果需要额外的描述符,可以在类定义规范或其他类的支持文档中查找相关的描述符格式。...更多有关报告描述符的信息,请参考 AN57473 — PSoC®3 和 PSoC 5LP 的 USB HID 初级应用笔记以及 AN58726 — PSoC®3 和 PSoC 5LP 的 USB HID...支持 LPM 特性的所有 USB 2.0 设备都需要使用 USB 2.0 的扩展描述符来报告其 LPM 能力。USB 2.0 扩展描述符是BOS 描述符的一部分。

    2.1K20

    基于STM32CUBE的USB键盘例程.docx

    还有就是端点每次发送的数据包长度: ? 之前是4,不够用了,现在改成16. 最后配置集合中增加一部分端点描述符,因为USB键盘对主机来说,不光有输入,还有输出。..., /*bInterval: Polling Interval */ 3 修改HID描述符 修改HID描述符中的报告描述符长度: ?...上面提到了,之前是鼠标描述符,长度74,现在改成键盘描述符,长度63. 4 生成键盘的报告描述符 把USB鼠标的报告描述符删掉,换成USB键盘的报告描述符。...不会写USB键盘的报告描述符怎么办? USB官方提供了一个USB报告描述符自动配置的工具,打开!里面有各种例程,我们直接复制一个USB键盘的报告描述符即可。 ?...获取报告描述符的部分,之前这里是鼠标的报告描述符信息,现在换成了键盘的。

    1.4K31

    使用stm32cubeMX生成模板,配置stm32f103c8t6键鼠一体化

    引脚设置为GPIO_EXTI1 NVIC中使能EXTI line1 interrupt RCC中HSE选择Crystal/ceramic Resonator SYS中Debug选择serial wire USB...中勾选Device(FS) USB_DEVICE中Class选择HID 设备描述符修改vid和pid的值(避免和连接到电脑上其他usb设备冲突而引起错误) GPIO中pa1配置成Pull-down(按键接...修改USBD_HID_CfgFSDesc(HID设备全速配置描述符) *USB_HID_CONFIG_DESC_SIZ 大小改为41U image.png *Descriptor of Joystick...Mouse interface 中端点数量改为0x02,接口协议改为0x01 image.png *配置描述符末尾新增输出端点描述符 image.png 3....修改报告描述符HID_MOUSE_ReportDesc *替换报告描述符内容为 //将整个报告描述符复制替换过去, 其中键盘REPORT_ID是1,鼠标REPORT_ID是2 0x05, 0x01

    1.6K60

    【STM32F429】第9章 RL-USB各种USB描述符简介

    /USB_hardware 9.2 USB描述符概述(USB Descriptors) USB设备使用描述符报告其属性,描述符是具有定义格式的数据结构。...设备加入USB网络后,USB主机立即发送设置请求。将指示该设备选择配置和接口,以匹配USB主机上运行的应用程序需求。选择配置和接口后,设备必须为活动的端点提供服务,以此与USB主机交换数据。...例如,IP语音电话可能具有: 一个音频类接口,带有2个同步端点,用于在每个方向上传输音频数据。 一个HID接口,带有一个用于内置键盘的IN中断端点。...RL-USB支持用户在必要时可以选择覆盖USB描述符。当需要在运行时更改设备类或需要创建其他报告时,可能就是这种情况。...USB主机可以动态选择接口。 接口描述符永远不会在端点编号中包含端点0。如果接口仅使用端点0,则必须将字段bNumEndpoints设置为零。

    74030

    【STM32H7】第9章 RL-USB各种USB描述符简介

    /USB_hardware 9.2 USB描述符概述(USB Descriptors) USB设备使用描述符报告其属性,描述符是具有定义格式的数据结构。...设备加入USB网络后,USB主机立即发送设置请求。将指示该设备选择配置和接口,以匹配USB主机上运行的应用程序需求。选择配置和接口后,设备必须为活动的端点提供服务,以此与USB主机交换数据。...例如,IP语音电话可能具有: 一个音频类接口,带有2个同步端点,用于在每个方向上传输音频数据。 一个HID接口,带有一个用于内置键盘的IN中断端点。...RL-USB支持用户在必要时可以选择覆盖USB描述符。当需要在运行时更改设备类或需要创建其他报告时,可能就是这种情况。...USB主机可以动态选择接口。 接口描述符永远不会在端点编号中包含端点0。如果接口仅使用端点0,则必须将字段bNumEndpoints设置为零。

    73320

    【STM32F407】第9章 RL-USB各种USB描述符简介

    /USB_hardware 9.2 USB描述符概述(USB Descriptors) USB设备使用描述符报告其属性,描述符是具有定义格式的数据结构。...设备加入USB网络后,USB主机立即发送设置请求。将指示该设备选择配置和接口,以匹配USB主机上运行的应用程序需求。选择配置和接口后,设备必须为活动的端点提供服务,以此与USB主机交换数据。...例如,IP语音电话可能具有: 一个音频类接口,带有2个同步端点,用于在每个方向上传输音频数据。 一个HID接口,带有一个用于内置键盘的IN中断端点。...RL-USB支持用户在必要时可以选择覆盖USB描述符。当需要在运行时更改设备类或需要创建其他报告时,可能就是这种情况。...USB主机可以动态选择接口。 接口描述符永远不会在端点编号中包含端点0。如果接口仅使用端点0,则必须将字段bNumEndpoints设置为零。

    80410

    浅谈总线通信机制----USB学习指南与总结

    (2)电源态(供电态) 就是给设备供电,分为设备接入时的默认供电值,配置阶段后的供电值(按数据中要求的最大值,可通过编程设置),在配置描述符中可以配置最大电流。...USB的包(宏观上来说)有四种:令牌包、数据包、握手包、特殊包。包是USB传输数据的基本单位。每种类型的包都会有不同的域来构成。...枚举将是整个USB学习的重中之重,枚举就是主机从设备读取各种描述符信息,这样主机就可以根据这些信息加载合适的的驱动程序,从而知道是什么类型的设备,如何进行通信等等。...而主机要获取设备相关的信息就必须要发起请求,请求主要有:USB标准请求(有一定的格式组成)、HID类请求等。 ? ? ?...说到描述符,USB有标准描述符,分别是:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符 (可选),每个设备都必须要支持标准描述符,还有HID描述符,报告描述符,物理描述符等。 ? ?

    1.5K20

    19.Linux-USB总线驱动分析

    然后USB总线驱动程序都会给它分配一个地址(编号) PC机想访问USB总线上某个USB设备时,发出的命令都含有对应的地址(编号) USB是一种主从结构。...集线器检测到这个状态后,它就报告给USB主控制器(或者通过它上一层的集线器报告给USB主控制器),这样就检测到设备的插入了。...中断传输不是说我的设备真正发出一个中断,然后主机会来读取数据。它其实是一种轮询的方式来完成数据的通信。USB设备会在设备驱动程序中设置一个参数叫做interval,它是endpoint的一个成员。...设备与主机会有若干个通信的”端点”,每个端点都有个端点号,除了端点0外,每一个端点只能工作在一种传输类型(控制传输、中断传输、批量传输、实时传输)下,一个传输方向下 传输方向都是基于USB主机的立场说的...; //设置匹配USB的接口类型为HID类, 因为USB_INTERFACE_CLASS_HID=0x03 //HID类是属于人机交互的设备,比如:USB键盘,USB鼠标,USB触摸板,

    10.5K91

    USB 协议核心概念与实践

    在介绍数据发送流程之前,我们先来看下描述符。 描述符 所有的 USB 设备端设备,都使用一系列层级的描述符 (Descriptors) 来向主机描述自身信息。...中断传输通常是非周期性的,并且传输过程保留部分带宽,常用于时间敏感的数据,比如键盘、鼠标等 HID 设备。...('test') 总的来说分为几步, 根据设备描述符查找到指定的设备 获取该设备的配置描述符,选择并激活其中一个 在指定的配置中查找接口和端点描述符 使用端点描述符进行数据传输 如果不清楚 USB 的工作原理...Upper Level: 通过 Gadget Driver 抽象的接口,实现基于 USB 协议的上层应用,比如 USB 网卡、声卡、文件存储、HID 设备等。...gfs.png 前文提到的基于树莓派 Zero 实现的各类 USB 设备,大部分都是基于 Gadget ConfigFS 接口实现的。

    2.4K51
    领券