STM32f103 USB移植之USB标准描述符

        在对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键盘的移植过程









  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值