STM32的USB 應用-2 usb_desc.c
STM32的USB 的 usb_desc.c檔 設備描述符,標準USB裝置有5種USB描述元,如下 :
1. 裝置描述元(Device) : 說明裝置的USB資訊,一個裝置只能有一組裝置描述元。
2. 配置描述元(Configuration) : 定義了裝置的配置資訊。
3. 介面描述元(Interface) : 說明介面所提供的配置。
4. 端點描述元(Endpoint) : USB裝置中的每一個端點都有自己的描述元(包括了端點的類型、大小等資訊)。
5. 字串描述元(String) : 是可選的。在STM32中如果你設計的裝置不想支援字串描述元, 在裝置、配置和介面描述元內的所有字串 描述元的索引都設為0即可。
個人前面提過將JoyStickMouse 來修改,所以後面都是用專案中JoyStickMouse的usb_desc.c來說明。
在usb_desc.c 可以找到三個宣告的陣列及其說明
/* USB Configuration Descriptor */
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const uint8_t Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC]
/* USB Configuration Descriptor */
const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =
這個陣列內容三個描述元,配置描述元(Configuration)、介面描述元(Interface)、 端點描述元(Endpoint)
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
/* USB String Descriptors (optional) */
const uint8_t Joystick_StringLangID
這個陣列包含語言別 /* LangID = 0x0409: U.S. English */
Joystick_StringVendor 供應商
Joystick_StringProduct 產品
Joystick_StringSerial 產品描述
但是對於鍵盤這些的描述還不夠的。我將原本的陣列Joystick_ReportDescriptor及個人修改的一並說明於下,對於USB Keyboard的設定我也是參考網路上的資料。
const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] = //#//JOYSTICK_SIZ_REPORT_DESC = 61
{
//********************************************************************************//
//-------------------- JoyStickMouse's source ----------------------------------//
/*--- USE Mouse ---*/
// 0x05, /*Usage Page(Generic Desktop)*/ USE Mouse
// 0x01,
// 0x09, /*Usage(Mouse)*/
// 0x02,
// 0xA1, /*Collection(Logical)*/
// 0x01,
// 0x09, /*Usage(Pointer)*/
// 0x01,
// /* 8 */
// 0xA1, /*Collection(Linked)*/
// 0x00,
// 0x05, /*Usage Page(Buttons)*/
// 0x09,
// 0x19, /*Usage Minimum(1)*/
// 0x01,
// 0x29, /*Usage Maximum(3)*/
// 0x03,
// /* 16 */
// 0x15, /*Logical Minimum(0)*/
// 0x00,
// 0x25, /*Logical Maximum(1)*/
// 0x01,
// 0x95, /*Report Count(3)*/
// 0x03,
// 0x75, /*Report Size(1)*/
// 0x01,
// /* 24 */
// 0x81, /*Input(Variable)*/
// 0x02,
// 0x95, /*Report Count(1)*/
// 0x01,
// 0x75, /*Report Size(5)*/
// 0x05,
// 0x81, /*Input(Constant,Array)*/
// 0x01,
// /* 32 */
// 0x05, /*Usage Page(Generic Desktop)*/
// 0x01,
// 0x09, /*Usage(X axis)*/
// 0x30,
// 0x09, /*Usage(Y axis)*/
// 0x31,
// 0x09, /*Usage(Wheel)*/
// 0x38,
// /* 40 */
// 0x15, /*Logical Minimum(-127)*/
// 0x81,
// 0x25, /*Logical Maximum(127)*/
// 0x7F,
// 0x75, /*Report Size(8)*/
// 0x08,
// 0x95, /*Report Count(3)*/
// 0x03,
// /* 48 */
// 0x81, /*Input(Variable, Relative)*/
// 0x06,
// 0xC0, /*End Collection*/
// 0x09,
// 0x3c,
// 0x05,
// 0xff,
// 0x09,
// /* 56 */
// 0x01,
// 0x15,
// 0x00,
// 0x25,
// 0x01,
// 0x75,
// 0x01,
// 0x95,
// /* 64 */
// 0x02,
// 0xb1,
// 0x22,
// 0x75,
// 0x06,
// 0x95,
// 0x01,
// 0xb1,
// /* 72 */
// 0x01,
// 0xc0
//********************************************************************************//
//-------------------- USB Keyboard be use -------------------------------------//
/*--- USE Keyboard ---*/
0x05, 0x01, /*USAGE_PAGE (Generic Desktop)*/
//#//用途頁(通用桌面設備)
0x09, 0x06, /*USAGE (Keyboard)*/
//#//用途(鍵盤)
0xa1, 0x01, /*COLLECTION (Application)*/
//#//集合(應用),需以End collection來結束他
0x05, 0x07, /*USAGE_PAGE (Keyboard/Keypad)*/
//#//用途(按鍵)
0x19, 0xe0, /*USAGE_MINIMUM (Keyboard LeftControl)*/
//#//用途最小值 (“left control key”,224)
0x29, 0xe7, /*USAGE_MAXIMUM (Keyboard Right GUI)*/
//#//用途最大值 (“left alt key”,231)
0x15, 0x00, /*LOGICAL_MINIMUM (0)*/
//#//邏輯最小值(0)
0x25, 0x01, /*LOGICAL_MAXIMUM (1)*/
//#//邏輯最大值(1)
0x95, 0x08, /*REPORT_COUNT (8)*/
//#//報告數值(8 bytes),報告的個數為8,即總共有8個bytes
0x75, 0x01, /*REPORT_SIZE (1)*/
//#//報告長度(1 bit),所以前面的邏輯最小值為”0”,邏輯最大值為”1”
0x81, 0x02, /*INPUT (Data,Var,Abs)*/
//#//輸入(資料, 變數, 絕對值),像鍵盤這類一般報告絕對值,而滑鼠移動這樣的則報告相對值,表示滑鼠移動多少,(它要說明的是滑鼠移動是相對座標,其實滑鼠移動也可以是絶對座標) 。
0x95, 0x01, /*REPORT_COUNT (1)*/
//#//報告數值(1 bytes)
0x75, 0x08, /*REPORT_SIZE (8)*/
//#//報告長度(8 bits)
0x81, 0x03, /*INPUT (Cnst,Var,Abs)*/
//#//輸入(常數,變數,絕對值),保留位元組
0x95, 0x06, /*REPORT_COUNT (6)*/
//#//報告長度(6 bytes)
0x75, 0x08, /*REPORT_SIZE (8)*/
//#//報告大小(8 bits)
0x25, 0xFF, /*LOGICAL_MAXIMUM (255)*/
//#//邏輯最大值(255)
0x19, 0x00, /*USAGE_MINIMUM (Reserved (no event indicated))*/
//#//用途最小值 (0)
0x29, 0x65, /*USAGE_MAXIMUM (Keyboard Application)*/
//#//用途最大值 (101)
0x81, 0x00, /*INPUT (Data,Ary,Abs)*/
//#//輸入(資料, 變數, 絕對值)
0x25, 0x01, /*LOGICAL_MAXIMUM (1)*/
//#//邏輯最大值(1)
0x95, 0x02, /*REPORT_COUNT (2)*/
//#//報告數值(2 bytes)
0x75, 0x01, /*REPORT_SIZE (1)*/
//#//報告大小(1 bits)
/* LED */
0x05, 0x08, /*USAGE_PAGE (LEDs)*/
//#//用途頁(LEDS),即用來控制鍵盤上的LED用的,因此下面會說明它是輸出用
0x19, 0x01, /*USAGE_MINIMUM (Num Lock)*/
//#//用途最小值 (“Num Lock”),用途最小值是Num Lock,即數字鍵鎖定燈
0x29, 0x02, /*USAGE_MAXIMUM (Caps Lock)*/
//#//用途最大值 (“Caps Lock”),用途最大值是Caps Lock
0x91, 0x02, /*OUTPUT (Data,Var,Abs)*/
//#//輸出(資料, 變數, 絕對值),1表示燈亮,0表示燈滅
0x95, 0x01, /*REPORT_COUNT (1)*/
//#//報告長度(1 bytes)
0x75, 0x06, /*REPORT_SIZE (6)*/
//#//報告大小(6 bits)
0x91, 0x03, /*OUTPUT (Cnst,Var,Abs)*/
//#//輸出(常數, 變數, 絕對值)
0xc0 /*END_COLLECTION*/
//#//集合結束(End collection)
//********************************************************************************//
}
; /* Joystick_ReportDescriptor */
1. 裝置描述元(Device) : 說明裝置的USB資訊,一個裝置只能有一組裝置描述元。
2. 配置描述元(Configuration) : 定義了裝置的配置資訊。
3. 介面描述元(Interface) : 說明介面所提供的配置。
4. 端點描述元(Endpoint) : USB裝置中的每一個端點都有自己的描述元(包括了端點的類型、大小等資訊)。
5. 字串描述元(String) : 是可選的。在STM32中如果你設計的裝置不想支援字串描述元, 在裝置、配置和介面描述元內的所有字串 描述元的索引都設為0即可。
個人前面提過將JoyStickMouse 來修改,所以後面都是用專案中JoyStickMouse的usb_desc.c來說明。
在usb_desc.c 可以找到三個宣告的陣列及其說明
/* USB Configuration Descriptor */
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const uint8_t Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC]
/* USB Configuration Descriptor */
const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =
這個陣列內容三個描述元,配置描述元(Configuration)、介面描述元(Interface)、 端點描述元(Endpoint)
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
/* USB String Descriptors (optional) */
const uint8_t Joystick_StringLangID
這個陣列包含語言別 /* LangID = 0x0409: U.S. English */
Joystick_StringVendor 供應商
Joystick_StringProduct 產品
Joystick_StringSerial 產品描述
但是對於鍵盤這些的描述還不夠的。我將原本的陣列Joystick_ReportDescriptor及個人修改的一並說明於下,對於USB Keyboard的設定我也是參考網路上的資料。
const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] = //#//JOYSTICK_SIZ_REPORT_DESC = 61
{
//********************************************************************************//
//-------------------- JoyStickMouse's source ----------------------------------//
/*--- USE Mouse ---*/
// 0x05, /*Usage Page(Generic Desktop)*/ USE Mouse
// 0x01,
// 0x09, /*Usage(Mouse)*/
// 0x02,
// 0xA1, /*Collection(Logical)*/
// 0x01,
// 0x09, /*Usage(Pointer)*/
// 0x01,
// /* 8 */
// 0xA1, /*Collection(Linked)*/
// 0x00,
// 0x05, /*Usage Page(Buttons)*/
// 0x09,
// 0x19, /*Usage Minimum(1)*/
// 0x01,
// 0x29, /*Usage Maximum(3)*/
// 0x03,
// /* 16 */
// 0x15, /*Logical Minimum(0)*/
// 0x00,
// 0x25, /*Logical Maximum(1)*/
// 0x01,
// 0x95, /*Report Count(3)*/
// 0x03,
// 0x75, /*Report Size(1)*/
// 0x01,
// /* 24 */
// 0x81, /*Input(Variable)*/
// 0x02,
// 0x95, /*Report Count(1)*/
// 0x01,
// 0x75, /*Report Size(5)*/
// 0x05,
// 0x81, /*Input(Constant,Array)*/
// 0x01,
// /* 32 */
// 0x05, /*Usage Page(Generic Desktop)*/
// 0x01,
// 0x09, /*Usage(X axis)*/
// 0x30,
// 0x09, /*Usage(Y axis)*/
// 0x31,
// 0x09, /*Usage(Wheel)*/
// 0x38,
// /* 40 */
// 0x15, /*Logical Minimum(-127)*/
// 0x81,
// 0x25, /*Logical Maximum(127)*/
// 0x7F,
// 0x75, /*Report Size(8)*/
// 0x08,
// 0x95, /*Report Count(3)*/
// 0x03,
// /* 48 */
// 0x81, /*Input(Variable, Relative)*/
// 0x06,
// 0xC0, /*End Collection*/
// 0x09,
// 0x3c,
// 0x05,
// 0xff,
// 0x09,
// /* 56 */
// 0x01,
// 0x15,
// 0x00,
// 0x25,
// 0x01,
// 0x75,
// 0x01,
// 0x95,
// /* 64 */
// 0x02,
// 0xb1,
// 0x22,
// 0x75,
// 0x06,
// 0x95,
// 0x01,
// 0xb1,
// /* 72 */
// 0x01,
// 0xc0
//********************************************************************************//
//-------------------- USB Keyboard be use -------------------------------------//
/*--- USE Keyboard ---*/
0x05, 0x01, /*USAGE_PAGE (Generic Desktop)*/
//#//用途頁(通用桌面設備)
0x09, 0x06, /*USAGE (Keyboard)*/
//#//用途(鍵盤)
0xa1, 0x01, /*COLLECTION (Application)*/
//#//集合(應用),需以End collection來結束他
0x05, 0x07, /*USAGE_PAGE (Keyboard/Keypad)*/
//#//用途(按鍵)
0x19, 0xe0, /*USAGE_MINIMUM (Keyboard LeftControl)*/
//#//用途最小值 (“left control key”,224)
0x29, 0xe7, /*USAGE_MAXIMUM (Keyboard Right GUI)*/
//#//用途最大值 (“left alt key”,231)
0x15, 0x00, /*LOGICAL_MINIMUM (0)*/
//#//邏輯最小值(0)
0x25, 0x01, /*LOGICAL_MAXIMUM (1)*/
//#//邏輯最大值(1)
0x95, 0x08, /*REPORT_COUNT (8)*/
//#//報告數值(8 bytes),報告的個數為8,即總共有8個bytes
0x75, 0x01, /*REPORT_SIZE (1)*/
//#//報告長度(1 bit),所以前面的邏輯最小值為”0”,邏輯最大值為”1”
0x81, 0x02, /*INPUT (Data,Var,Abs)*/
//#//輸入(資料, 變數, 絕對值),像鍵盤這類一般報告絕對值,而滑鼠移動這樣的則報告相對值,表示滑鼠移動多少,(它要說明的是滑鼠移動是相對座標,其實滑鼠移動也可以是絶對座標) 。
0x95, 0x01, /*REPORT_COUNT (1)*/
//#//報告數值(1 bytes)
0x75, 0x08, /*REPORT_SIZE (8)*/
//#//報告長度(8 bits)
0x81, 0x03, /*INPUT (Cnst,Var,Abs)*/
//#//輸入(常數,變數,絕對值),保留位元組
0x95, 0x06, /*REPORT_COUNT (6)*/
//#//報告長度(6 bytes)
0x75, 0x08, /*REPORT_SIZE (8)*/
//#//報告大小(8 bits)
0x25, 0xFF, /*LOGICAL_MAXIMUM (255)*/
//#//邏輯最大值(255)
0x19, 0x00, /*USAGE_MINIMUM (Reserved (no event indicated))*/
//#//用途最小值 (0)
0x29, 0x65, /*USAGE_MAXIMUM (Keyboard Application)*/
//#//用途最大值 (101)
0x81, 0x00, /*INPUT (Data,Ary,Abs)*/
//#//輸入(資料, 變數, 絕對值)
0x25, 0x01, /*LOGICAL_MAXIMUM (1)*/
//#//邏輯最大值(1)
0x95, 0x02, /*REPORT_COUNT (2)*/
//#//報告數值(2 bytes)
0x75, 0x01, /*REPORT_SIZE (1)*/
//#//報告大小(1 bits)
/* LED */
0x05, 0x08, /*USAGE_PAGE (LEDs)*/
//#//用途頁(LEDS),即用來控制鍵盤上的LED用的,因此下面會說明它是輸出用
0x19, 0x01, /*USAGE_MINIMUM (Num Lock)*/
//#//用途最小值 (“Num Lock”),用途最小值是Num Lock,即數字鍵鎖定燈
0x29, 0x02, /*USAGE_MAXIMUM (Caps Lock)*/
//#//用途最大值 (“Caps Lock”),用途最大值是Caps Lock
0x91, 0x02, /*OUTPUT (Data,Var,Abs)*/
//#//輸出(資料, 變數, 絕對值),1表示燈亮,0表示燈滅
0x95, 0x01, /*REPORT_COUNT (1)*/
//#//報告長度(1 bytes)
0x75, 0x06, /*REPORT_SIZE (6)*/
//#//報告大小(6 bits)
0x91, 0x03, /*OUTPUT (Cnst,Var,Abs)*/
//#//輸出(常數, 變數, 絕對值)
0xc0 /*END_COLLECTION*/
//#//集合結束(End collection)
//********************************************************************************//
}
; /* Joystick_ReportDescriptor */
留言
張貼留言