打印
[STM32F1]

STM32f103 USB移植之USB标准描述符

[复制链接]
585|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
t60yz|  楼主 | 2024-2-29 20:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在对USB协议进行学习和移植的过程有个东西不可避免,肯定会遇到,那就是USB的设备描述符。这个东西始终在usb协议中发挥作用,从设备的枚举到设备的配置,都是由usb描述符进行修改的。今天在移植的时候这个整理了一下usb描述符有关的知识。

/********************************************不啰嗦的分割线***********************************************/

        参考资料:深入浅出USB系统开发——基于ARM Cortex-M3    王川北 刘强
                          圈圈教你玩usb
                        http://www.openedv.com/thread-10971-1-1.html
        USB采用USB标准描述符说明一个USB设备,这些描述符包括设备描述符、配置描述符、接口描述符、端点描述符和字串描述符。在stm32 usb库中有关描述符在usb_desc.c和usb_desc.h中。

       在上个例程中并未对描述符进行修改,直接使用了原来配置,现在我们对描述符进行修改,在该示例中的配置为usb键盘的描述符设置。

        设备描述符给出了usb的一般信息,一个usb设备只能有一个设备描述符。在stm32 usb库中有关配置及含义如图所示。



使用特权

评论回复
沙发
t60yz|  楼主 | 2024-2-29 20:16 | 只看该作者
在usb库中除设备描述符以外的其他所有描述符均在Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC]这个数组中


使用特权

评论回复
板凳
t60yz|  楼主 | 2024-2-29 20:16 | 只看该作者
如果对描述符进行增删后,注意更改数组大小,在usb_desc.h中定义。

使用特权

评论回复
地板
t60yz|  楼主 | 2024-2-29 20:16 | 只看该作者
以下为配置描述符的说明,在一个usb设备描述符下可以有多个配置描述符。

使用特权

评论回复
5
t60yz|  楼主 | 2024-2-29 20:16 | 只看该作者
以下为接口描述符的说明,在一个usb配置描述符下可以有多个接口描述符。

使用特权

评论回复
6
t60yz|  楼主 | 2024-2-29 20:17 | 只看该作者
端点描述符,每个端点只能用作输入或输出的一种,端点0不可配置。


使用特权

评论回复
7
t60yz|  楼主 | 2024-2-29 20:17 | 只看该作者
HID为人机交互设备(Human Interface Device)的缩写,HID设备类除了支持标准USB描述符外,还自行定义了3种设备描述符,分别为HID描述符、报告描述符、物理描述符。一个HID设备只支持一个HID描述符;可以支持一个或多个报告描述符;物理描述符是可选的,发多数HID设备不需要使用它。
——————————

使用特权

评论回复
8
t60yz|  楼主 | 2024-2-29 20:17 | 只看该作者
下面为为HID描述符及说明

//以下为HID描述符
/******************** Descriptor of Joystick Mouse HID ********************/
/* 18 */
0x09,         /*bLength: HID Descriptor size                        字节数*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID                        配置描述符类型*/
0x00,         /*bcdHID: HID Class Spec release number                版本号*/
0x01,
0x00,         /*bCountryCode: Hardware target country                国家语言代码*/
0x01,         /*bNumDescriptors: Number of HID class descriptors to follow        描述符个数*/
0x22,         /*bDescriptorType                                                        下一个描述符类型*/
JOYSTICK_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor        报告描述符总长度*/
0x00,

使用特权

评论回复
9
t60yz|  楼主 | 2024-2-29 20:17 | 只看该作者
下面为HID的报告描述符
const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =
  {                                                                           
         0x05, 0x01, //         USAGE_PAGE (Generic Desktop)               
         0x09, 0x06, //         USAGE (Keyboard)                                       
         0xa1, 0x01, //         COLLECTION (Application)                       
         0x05, 0x07, //         USAGE_PAGE (Keyboard/Keypad)               
         0x19, 0xe0, //         USAGE_MINIMUM (Keyboard LeftControl)
         0x29, 0xe7, //         USAGE_MAXIMUM (Keyboard Right GUI)       
         0x15, 0x00, //         LOGICAL_MINIMUM (0)                                       
         0x25, 0x01, //         LOGICAL_MAXIMUM (1)                                       
         0x95, 0x08, //         REPORT_COUNT (8)                                       
         0x75, 0x01, //         REPORT_SIZE (1)                                       
         0x81, 0x02, //         INPUT (Data,Var,Abs)                               
         0x95, 0x01, //         REPORT_COUNT (1)                                       
         0x75, 0x08, //         REPORT_SIZE (8)                                       
         0x81, 0x03, //         INPUT (Cnst,Var,Abs)
         0x95, 0x06, //           REPORT_COUNT (6)
         0x75, 0x08, //           REPORT_SIZE (8)
         0x25, 0xFF, //           LOGICAL_MAXIMUM (255)
         0x19, 0x00, //           USAGE_MINIMUM (Reserved (no event indicated))
         0x29, 0x65, //           USAGE_MAXIMUM (Keyboard Application)
         0x81, 0x00, //         INPUT (Data,Ary,Abs)
         0x25, 0x01, //         LOGICAL_MAXIMUM (1)
         0x95, 0x02, //           REPORT_COUNT (2)
         0x75, 0x01, //           REPORT_SIZE (1)
         0x05, 0x08, //           USAGE_PAGE (LEDs)
         0x19, 0x01, //           USAGE_MINIMUM (Num Lock)
         0x29, 0x02, //           USAGE_MAXIMUM (Caps Lock)
         0x91, 0x02, //           OUTPUT (Data,Var,Abs)
         0x95, 0x01, //           REPORT_COUNT (1)
         0x75, 0x06, //           REPORT_SIZE (6)
         0x91, 0x03, //           OUTPUT (Cnst,Var,Abs)
         0xc0        //         END_COLLECTION
  }

使用特权

评论回复
10
t60yz|  楼主 | 2024-2-29 20:17 | 只看该作者
好了,我们对上面的描述符进行修改后,编译下载,在电脑上可以识别出键盘,在后面的会继续介绍usb键盘的移植过程

使用特权

评论回复
11
Henryko| | 2024-2-29 21:31 | 只看该作者
可以一个芯片同时模拟键盘鼠标吗

使用特权

评论回复
12
yangjiaxu| | 2024-2-29 21:39 | 只看该作者
害,这个USB描述符有些时候确实麻烦,改错了一点就不能使用

使用特权

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

本版积分规则

170

主题

1009

帖子

0

粉丝