打印
[STM32H7]

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

[复制链接]
80|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HuaWng|  楼主 | 2024-10-12 12:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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
  * [url=home.php?mod=space&uid=247401]@brief[/url] 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[USB_LEN_DEV_DESC] __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 manufacturer  string*/
  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[HID_MOUSE_REPORT_DESC_SIZE] __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工具里面。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

32

帖子

0

粉丝