1. 程式人生 > >STM32f103 USB移植之USB標準描述符

STM32f103 USB移植之USB標準描述符

        在對USB協議進行學習和移植的過程有個東西不可避免,肯定會遇到,那就是USB的裝置描述符。這個東西始終在usb協議中發揮作用,從裝置的列舉到裝置的配置,都是由usb描述符進行修改的。今天在移植的時候這個整理了一下usb描述符有關的知識。

/********************************************不囉嗦的分割線***********************************************/

        參考資料:深入淺出USB系統開發——基於ARM Cortex-M3    王川北 劉強

                          圈圈教你玩usb

        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鍵盤的移植過程