历史上的今天
今天是:2025年07月30日(星期三)
2019年07月30日 | STM32f103 USB移植之USB标准描述符
2019-07-30 来源:eefocus
在对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库中有关配置及含义如图所示。

在usb库中除设备描述符以外的其他所有描述符均在Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC]这个数组中

如果对描述符进行增删后,注意更改数组大小,在usb_desc.h中定义。

以下为配置描述符的说明,在一个usb设备描述符下可以有多个配置描述符。

以下为接口描述符的说明,在一个usb配置描述符下可以有多个接口描述符。

端点描述符,每个端点只能用作输入或输出的一种,端点0不可配置。

HID为人机交互设备(Human Interface Device)的缩写,HID设备类除了支持标准USB描述符外,还自行定义了3种设备描述符,分别为HID描述符、报告描述符、物理描述符。一个HID设备只支持一个HID描述符;可以支持一个或多个报告描述符;物理描述符是可选的,发多数HID设备不需要使用它。
下面为为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,
下面为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
}
好了,我们对上面的描述符进行修改后,编译下载,在电脑上可以识别出键盘,在后面的会继续介绍usb键盘的移植过程

史海拾趣
|
关键字:摄像机 家用数码摄像机在拍摄过程中(如旅游、婚庆、生日、聚会等),最怕的就是突然出现故障,因为一旦出现故障,轻则影响拍摄活动,重则整个拍摄过程无法进行。 磁头堵塞就是数码摄像机最常见的故障之一, ...… 查看全部问答> |
|
用的是Altera的EP2S30系列的FPGA芯片,需要用到DDR SDRAM,需要接SSTL2电压标准,不知道VREF怎么连接,是不是VREF连到1.25V的话,VCCIO必须连到2.5V,不能连到3.3V。如果这样的话岂不是一个bank内除了DDR SDRAM以外其他的脚都不能用了请有经验的大 ...… 查看全部问答> |
|
我在Test1Dlg.cpp 文件中 使用 lphaBlend 函数 也导入了以下头文件和 lib #pragma comment (lib,\"Coredll.lib\") #include 出现错误误码: Test1Dlg.cpp E:\\Test1\\Test1Dlg.cpp(97) : error C2065: \'AlphaBlend\' : unde ...… 查看全部问答> |
|
QQ:37955698 技术交流QQ群:7757652 msp430@botom.cn 电话:13261892076 最新产品: MSP430开发板 学习板: MSP430F44X开发板 & ...… 查看全部问答> |
|
【求助】keilc编程 8958cpu 定义片外空间地址变量 8958cpu 定义片外空间地址变量 怎么定义 用什么数据类型好些。 我想定义 1个数组全局变量 2个数组局部变量 大小是[24]一维 [4][24]二维。… 查看全部问答> |
|
想要在FPGA中提取两个方波的相位差,两个方波频率约为1HZ,时间差比较小,然后用50MHZ的时钟计算时间差 用异或门的话同一周期会出现两个相位差 请问各位知道有更好的方法吗? 采用异或门: [ 本帖最后由 open82977352 于 2011-9-1 ...… 查看全部问答> |




