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 */

留言

這個網誌中的熱門文章

STM32 I2C-EEPROM 的讀寫

ADC的校正方法

如何提高STM32 ADC的精度