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