HuaWng 发表于 2024-10-12 12:38

【STM32H7S78-DK测评】-进阶任务之USB DEVICE - HID

本帖最后由 HuaWng 于 2024-10-12 19:17 编辑

USB HID是用途非常广泛的USB在嵌入式产品的使用方向,可以方便的模拟出鼠标、键盘或者键鼠复合设备。除了USB HID还有的设备支持蓝牙低功耗等射频特性也可以模拟成HID设备。本次体验的板卡STM32H7S78-DK提供了两个USB,分别是USB1 HS与USB2 FS。

USB HID设备类的应用场合
  USB HID类是USB设备的一个标准设备类,包括的设备非常多。HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标、USB键盘、USB游戏操纵杆等。但HID设备类不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。

  USB HID设备的一个好处就是操作系统自带了HID类的驱动程序,而用户无需去开发驱动程序,只要使用API系统调用即可完成通信。


与USB HID设备有关的描述符     

HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括三个HID设备类特定的描述符:HID描述符、报告描述符、实体描述符。  除了HID的三个特定描述符组成对HID设备的解释外,5个标准描述符中与HID设备有关的部分有:设备描述符中:bDeviceClass, bDeviceSubClass, bDeviceProtocol三个值必须为0接口描述符中:bInterfaceClass的值必须时0x03, bInterfaceSubClass的值为0或1, 为1表示HID设备是一个启动设备(Boot Device, 一般对PC机有意义,意思是BIOS启动时能识别您使用的HID设备,切只有标准鼠标或者键盘才能称为Boot Device),为0表示HID设备是操作系统启动厚才能识别使用的设备。bInterfaceProtocol的取值含义如下:  bInterfaceProtocol的取值(十进制)    含义  0                    NONE  1                    键盘  2                    鼠标  3-255                 保留
接下来是实验部分。目标是模拟出一个USB HID设备,并且能够在上位机展示该设备。
首先定义好相关的设备制造商名称,PID以及VID等参数,如下所示。/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines
* @brief Private defines.
* @{
*/

#define USBD_VID   1155
#define USBD_LANGID_STRING   1033
#define USBD_MANUFACTURER_STRING   "STM-BBS.21IC"
#define USBD_PID   22315
#define USBD_PRODUCT_STRING   "STM-BBS.21IC HID EXAMPLE"
#define USBD_CONFIGURATION_STRING   "HID Config"
#define USBD_INTERFACE_STRING   "HID Interface"
上述定义的参数是USB HID设备描述符的一部分:__ALIGN_BEGIN uint8_t USBD_HID_DeviceDesc __ALIGN_END =
{
0x12,                     /*bLength */
USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
0x00,                     /*bcdUSB */

0x02,
0x00,                     /*bDeviceClass*/
0x00,                     /*bDeviceSubClass*/
0x00,                     /*bDeviceProtocol*/
USB_MAX_EP0_SIZE,         /*bMaxPacketSize*/
LOBYTE(USBD_VID),         /*idVendor*/
HIBYTE(USBD_VID),         /*idVendor*/
LOBYTE(USBD_PID),      /*idProduct*/
HIBYTE(USBD_PID),      /*idProduct*/
0x00,                     /*bcdDevice rel. 2.00*/
0x02,
USBD_IDX_MFC_STR,         /*Index of manufacturerstring*/
USBD_IDX_PRODUCT_STR,       /*Index of product string*/
USBD_IDX_SERIAL_STR,      /*Index of serial number string*/
USBD_MAX_NUM_CONFIGURATION/*bNumConfigurations*/
};
USBD_DescriptorsTypeDef HID_Desc =
{
USBD_HID_DeviceDescriptor,
USBD_HID_LangIDStrDescriptor,
USBD_HID_ManufacturerStrDescriptor,
USBD_HID_ProductStrDescriptor,
USBD_HID_SerialStrDescriptor,
USBD_HID_ConfigStrDescriptor,
USBD_HID_InterfaceStrDescriptor
};
上述的定义最终会在USB Device初始化函数(USBD_Init(&hUsbDeviceHS, &HID_Desc, DEVICE_HS)中被使用。然后调用(USBD_RegisterClass(&hUsbDeviceHS, &USBD_HID)来注册USB设备,最后调用(USBD_Start(&hUsbDeviceHS) 来启动USB设备。


对于具体的鼠标应用而言,还需要定义鼠标相关的报告描述。
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc __ALIGN_END =
{
0x05, 0x01,      /* Usage Page (Generic Desktop Ctrls)   */
0x09, 0x02,      /* Usage (Mouse)                        */
0xA1, 0x01,      /* Collection (Application)               */
0x09, 0x01,      /*   Usage (Pointer)                      */
0xA1, 0x00,      /*   Collection (Physical)                */
0x05, 0x09,      /*   Usage Page (Button)                */
0x19, 0x01,      /*   Usage Minimum (0x01)               */
0x29, 0x03,      /*   Usage Maximum (0x03)               */
0x15, 0x00,      /*   Logical Minimum (0)                */
0x25, 0x01,      /*   Logical Maximum (1)                */
0x95, 0x03,      /*   Report Count (3)                   */
0x75, 0x01,      /*   Report Size (1)                  */
0x81, 0x02,      /*   Input (Data,Var,Abs)               */
0x95, 0x01,      /*   Report Count (1)                   */
0x75, 0x05,      /*   Report Size (5)                  */
0x81, 0x01,      /*   Input (Const,Array,Abs)            */
0x05, 0x01,      /*   Usage Page (Generic Desktop Ctrls) */
0x09, 0x30,      /*   Usage (X)                        */
0x09, 0x31,      /*   Usage (Y)                        */
0x09, 0x38,      /*   Usage (Wheel)                      */
0x15, 0x81,      /*   Logical Minimum (-127)             */
0x25, 0x7F,      /*   Logical Maximum (127)            */
0x75, 0x08,      /*   Report Size (8)                  */
0x95, 0x03,      /*   Report Count (3)                   */
0x81, 0x06,      /*   Input (Data,Var,Rel)               */
0xC0,            /*   End Collection                     */
0x09, 0x3C,      /*   Usage (Motion Wakeup)                */
0x05, 0xFF,      /*   Usage Page (Reserved 0xFF)         */
0x09, 0x01,      /*   Usage (0x01)                         */
0x15, 0x00,      /*   Logical Minimum (0)                  */
0x25, 0x01,      /*   Logical Maximum (1)                  */
0x75, 0x01,      /*   Report Size (1)                      */
0x95, 0x02,      /*   Report Count (2)                     */
0xB1, 0x22,      /*   Feature (Data,Var,Abs,NoWrp)         */
0x75, 0x06,      /*   Report Size (6)                      */
0x95, 0x01,      /*   Report Count (1)                     */
0xB1, 0x01,      /*   Feature (Const,Array,Abs,NoWrp)      */
0xC0               /* End Collection                         */
};上述鼠标相关描述符的定义出现在文件usbd_hid.c中,其属于STM32_USB_Device_Library,是ST免费提供的中间件的一部分。

最后一步是烧录,把USB1接口通过TYPE-C接口连接到电脑,可以看到ST BBS.21IC这个HID设备显示出来。








micoccd 发表于 2024-10-12 16:47

最后这个信息界面是在哪里显示出来的

HuaWng 发表于 2024-10-12 17:18

micoccd 发表于 2024-10-12 16:47
最后这个信息界面是在哪里显示出来的

是在usbTreeView这个Windows工具里面。

Amazingxixixi 发表于 2024-10-31 16:15

这个案例不错。

suncat0504 发表于 2024-10-31 17:24

USB HID的处理太繁琐了

地瓜patch 发表于 2024-10-31 18:39

看了这个帖子不懂usb的协议也能开发usb

sdlls 发表于 2024-11-12 09:27

USB HID在嵌入式产品中的广泛应用,能够模拟出鼠标、键盘等常见设备,同时还拓展到了蓝牙低功耗等射频特性模拟HID设备的领域

mattlincoln 发表于 2024-11-12 11:43

列举了多种USB HID设备的应用场合,包括鼠标、键盘和游戏操纵杆等。

ulystronglll 发表于 2024-11-13 18:31

USB HID设备的一个显著好处,即操作系统自带了HID类的驱动程序,用户无需开发驱动程序即可使用API系统调用完成通信。

albertaabbot 发表于 2024-11-13 22:58

介绍了STM32H7S78-DK板卡提供的两个USB端口(USB1 HS和USB2 FS),并解释了它们的区别和应用场景。

小猪猪啊 发表于 2024-11-14 15:40

USB HID的处理太繁琐了

小猪猪啊 发表于 2024-11-14 15:41

看了这个帖子不懂usb的协议也能开发usb

小猪猪啊 发表于 2024-11-14 15:43

USB HID在嵌入式产品中的广泛应用,能够模拟出鼠标、键盘等常见设备,同时还拓展到了蓝牙低功耗等射频特性模拟HID设备的领域

wengh2016 发表于 2024-11-14 20:47

详细解释了USB HID设备的定义和用途,帮助读者理解HID设备的广泛适用性和重要性。

usysm 发表于 2024-11-17 19:58

与USB HID设备有关的描述符,这些描述符是设备与主机通信的重要组成部分。

vivilyly 发表于 2024-11-18 09:39

阐述了USB HID设备类的广泛用途和重要性。通过提及HID设备可以方便地模拟出鼠标、键盘或键鼠复合设备等,文章生动地展示了HID设备在人机交互方面的强大功能。

eefas 发表于 2024-11-20 19:58

聚焦于 USB HID 与 STM32H7S78-DK 的文章无疑是该领域的佳作典范

10299823 发表于 2024-11-20 20:47

展现出了对 HID 技术标准的精准把握。通过对 HID 类设备的详细定义,从常见的人机交互设备如鼠标、键盘、游戏操纵杆等,到突破传统认知的 “不一定有人机接口但符合类别规范即为 HID 设备” 的深入解读,极大地拓宽了读者对 USB HID 应用边界的理解。

uptown 发表于 2024-11-21 14:47

关于STM32H7S78-DK板卡上USB HID设备类的应用介绍,内容丰富且深入,专业知识讲解到位,强调操作便利性

primojones 发表于 2024-11-21 16:40

介绍了HID设备的基本概念,还深入探讨了与HID设备相关的技术细节,如描述符的作用和结构,这对于技术爱好者和开发者来说非常有价值。
页: [1] 2
查看完整版本: 【STM32H7S78-DK测评】-进阶任务之USB DEVICE - HID