1. 程式人生 > >STM32 之 標準外設版USB驅動庫詳解(架構+檔案+函式+使用說明+示例程式)

STM32 之 標準外設版USB驅動庫詳解(架構+檔案+函式+使用說明+示例程式)

寫在前面

  • 目前,ST的USB驅動有兩套,一套是早期的獨立版USB驅動,官方培訓文件中稱為Legacy library,最新版為2.2.0;一套為針對其Cube系列的驅動,根據晶片不同可能有區別,具體見對應晶片的Cube驅動包,官方培訓文件中稱為Cube library。 本文使用的為Legacy libraryUSB驅動。更詳細的請參考博文STM32 之 USB IP(USB模組) 詳解
  • 本文多出自於ST的官方文件 及 2016~2017的培訓文件,讀者也可以直接去ST官網查閱相關文件。

關於驅動

  STM32 MCU有兩種帶USB功能的IP
USB IP
針對不同的晶片有不同的獨立版本驅動(主要是晶片不同,USB的是有區別的)。目前有如下幾個:

以下文章主要介紹STSW-STM32046。關於STM32 的USB IP,更詳細的請參考博文STM32 之 USB IP(USB模組) 詳解

驅動結構

  目前,獨立版USB驅動並不是支援所有的STM3的晶片,且ST已經不再維護獨立版的USB庫(被Cube系列取代),具體見驅動原始碼即可。驅動原始碼的結構還是比較簡單的,主要包含驅動庫原始碼、使用示例、其他實用程式、發行說明文件四大部分。驅動目錄結構如下圖所示:
USB Folder
  重點在Libraries目錄中。其中的USB OTG是USB Device和USB Host 的基礎。在實際使用,USB OTG是USB Device和USB Host 的底層驅動

。(在一開始學習時,還以為每部分都可以獨立使用!!)。
  此外,從上圖可看到這個USB庫裡還帶了標準外設庫原始碼。主要是因為之前還沒有HAL庫。而且ST在Cube系列中,重新實現了所有原始碼(包括USB驅動)即:HAL庫。但是需要說明的是,以上USB庫不僅僅可以和標準外設庫連用,還可以和HAL庫連用。
  本文主要說明USB驅動,同目錄下的標準庫驅動(其他博文中有詳細說明)不再多說。其他部分在實際移植過程中可作為參考,例如各種示例程式等,也不詳細介紹。USB驅動的整個驅動庫的架構如下圖:
USB arct

USB OTG core

  USB OTG core,即:STM32晶片內嵌的USB OTG 控制器。

STM32F105/07xx器件內嵌了一個USB OTG FS核心,而STM32F2xx和STM32F4xx器件內嵌了一個USB OTG FS核心和一個HS核心。 見下圖:
F4 OTG
比較如下:
Compare
  USB晶片也分為Controller部分和PHY部分。Controller部分主要實現USB的協議和控制。內部邏輯主要有MAC層、CSR層和FIFO控制層,還有其他低功耗管理之類層次。MAC實現按USB協議進行資料包打包和解包,並把資料按照UTMI匯流排格式傳送給PHY(USB3.0為PIPE)。CSR層進行暫存器控制,軟體對USB晶片的控制就是通過CSR暫存器,這部分和CPU進行互動訪問,主要作為Slave通過AXI或者AHB進行互動。FIFO控制層主要是和DDR進行資料互動,控制USB從DDR搬運資料的通道,主要作為Master通過AXI/AHB進行互動。PHY部分功能主要實現並轉串的功能,把UTMI或者PIPE口的並行資料轉換成序列資料,再通過差分資料線輸出到晶片外部。
  一般來說,如果usb phy封裝在晶片內,基本採用UTMI+的介面。不封裝到晶片內的一般採用ULPI介面,這樣可以降低pin的數量。
  關於STM32晶片內嵌的OTG FS控制器、OTG HS控制器、OTG FS PHY具體見晶片手冊。

USB OTG full speed core

  OTG_FS 是一款雙角色裝置(DRD) 控制器,同時支援從機功能和主機功能,完全符合USB 2.0 規範的On-The-Go 補充標準。此外,該控制器也可配置為“僅主機”模式或“僅從機”模式,完全符合USB 2.0 規範。在主機模式下,OTG_FS 支援全速(FS,12 Mb/s)和低速(LS,1.5 Mb/s)收發器,而從機模式下則僅支援全速(FS,12 Mb/s)收發器。OTG_FS 同時支援HNP 和SRP。主機模式下需要的唯一外部裝置是提供VBUS的電荷泵。其硬體框圖如下
OTG_FS
  OTG_FS支援HNP(主機協商協議)和SRP(會話請求協議)。 唯一需要的外部裝置是Host模式下VBUS電源的電荷泵。
OTG_FS 介面的通用特性如下:

  • 經USB-IF 認證,符合通用序列匯流排規範第2.0 版
  • 模組內嵌的PHY 還完全支援定義在標準規範OTG 補充第1.3 版中的OTG 協議
    • 支援A-B 器件識別(ID 線)
    • 支援主機協商協議(HNP) 和會話請求協議(SRP)
    • 允許主機關閉VBUS以在OTG 應用中節省電池電量
    • 支援通過內部比較器對VBUS電平採取監控
    • 支援主機到從機的角色動態切換
  • 可通過軟體配置為以下角色:
    • 具有SRP 功能的USB FS 從機(B 器件)
    • 具有SRP 功能的USB FS/LS 主機(A 器件)
    • USB On-The-Go 全速雙角色裝置
  • 支援FS SOF 和LS Keep-alive 令牌
    • SOF 脈衝可通過PAD 輸出
    • SOF 脈衝從內部連線到定時器2 (TIM2)
    • 可配置的幀週期
    • 可配置的幀結束中斷
  • 具有省電功能,例如在USB 掛起期間停止系統、關閉數字模組時鐘、對PHY 和DFIFO電源加以管理
  • 具有采用高階FIFO 控制的1.25 KB 專用RAM
    • 可將RAM 空間劃分為不同FIFO,以便靈活有效地使用RAM
    • 每個FIFO 可儲存多個數據包
    • 動態分配儲存區
    • FIFO 大小可配置為非2 的冪次方值,以便連續使用儲存單元
  • 一幀之內可以無需要應用程式干預,以達到最大USB 頻寬

OTG_FS 介面在主機模式下具有以下主要特性和要求:

  • 通過外部電荷泵生成VBUS電壓。
  • 多達8 個主機通道(管道):每個通道都可以動態實現重新配置,可支援任何型別的USB 傳輸。
  • 內建硬體排程器可:
    • 在週期性硬體佇列中儲存多達8 箇中斷加同步傳輸請求
    • 在非週期性硬體佇列中儲存多達8 個控制加批量傳輸請求
  • 管理一個共享RX FIFO、一個週期性TX FIFO 和一個非週期性TX FIFO,以有效使用USB 資料RAM。

OTG_FS 介面在從機模式下具有以下特性:

  • 1 個雙向控制端點0
  • 3 個IN 端點(EP),可配置為支援批量傳輸、中斷傳輸或同步傳輸
  • 3 個OUT 端點,可配置為支援批量傳輸、中斷傳輸或同步傳輸
  • 管理一個共享Rx FIFO 和一個Tx-OUT FIFO,以高效使用USB 資料RAM
  • 管理多達4 個專用Tx-IN FIFO(分別用於每個使能的IN EP),降低應用程式負荷
  • 支援軟斷開功能。

關於該部分的詳細說明,參見晶片的參考手冊第34節:USB on-the-go full-speed (OTG_FS)

USB OTG high speed core

  OTG_HS 是一個雙角色裝置(DRD) 控制器,同時支援從機和主機功能,並且完全符合USB 2.0 規範的On-The-Go 補充標準。此外,該控制器也可配置為僅主機或僅從機控制器,完全符合USB 2.0 規範。在主機模式中,OTG_HS 支援高速(HS,480 Mbits/s)、全速(FS、12 Mbits/s)和低速(LS,1.5 Mbits/s)傳輸,而在從機模式中,僅支援高速(HS,480 Mbits/s)和全速(FS、12 Mbits/s)傳輸。OTG_HS 還支援HNP 和SRP。OTG 模式下需要的唯一外部裝置是提供VBUS 的電荷泵。
USB OTG high speed core

USB DMA 不支援內部Flash定址

OTG_HS支援HNP(主機協商協議)和SRP(會話請求協議)。 所需的唯一外部裝置是OTG模式下VBUS電源的電荷泵。

OTG_HS 介面的通用特性如下:

  • 經USB-IF 認證,符合通用序列匯流排規範2.0 版本
  • 支援3 個PHY 介面
    • 片上全速PHY
    • 連線外部全速PHY 的I2 C 介面
    • 連線外部高速PHY 的ULPI 介面
  • 支援主機協商協議(HNP) 和會話請求協議(SRP)
  • 在OTG 應用中允許主機關閉VBUS以節省功耗,而不需要外部元件
  • 允許使用內部比較器來監視VBUS電平
  • 支援主機和從機之間的動態角色切換
  • 可通過軟體配置為以下角色:
    • 支援SRP 的USB HS/FS 從機(B 器件)
    • 支援SRP 的USB HS/FS/LS 主機(A 器件)
    • USB OTG FS 雙角色裝置
  • 支援HS/FS SOF 以及低速(LS)“Keep-alive”令牌並具有如下功能:
    • SOF 脈衝引腳輸出功能
    • SOF 脈衝與定時器2 (TIM2) 的內部連線
    • 可配置的幀週期
    • 可配置的幀結束中斷
  • 模組內嵌DMA,並可軟體配置AHB 的突發傳輸型別
  • 具備省電功能,例如在USB 掛起期間停止系統時鐘,關閉數字模組內部時鐘域、PHY 和DFIFO 電源管理
  • 具有包含高階FIFO 管理的專用4K 位元組資料RAM:
    • 可以將儲存區配置為不同FIFO,以便靈活高效地使用RAM
    • 每個FIFO 可包含多個數據包
    • 動態地進行儲存器分配
    • FIFO 大小可配置為2 的冪以外的值,以便連續使用儲存區
  • 一幀之內可以無需要應用程式干預,以達到最大USB 頻寬

主機模式下的OTG_HS 介面特徵如下:

  • 需要外部電荷泵來生成VBUS
  • 具有多達12 個主機通道(管道),每個通道可動態地進行重新配置,可支援任何型別的USB 傳輸
  • 內建硬體排程器:
    • 在週期性硬體佇列中儲存多達8 箇中斷加同步傳輸請求
    • 在非週期性硬體佇列中儲存多達8 個控制加批量傳輸請求
  • 管理一個共享RX FIFO、一個週期性TX FIFO 和一個非週期性TX FIFO,以有效使用USB 資料RAM
  • 在主機模式下具備對SOF 幀週期進行動態調校的功能

OTG_HS 介面在從機模式下具有以下特性:

  • 具有1 個雙向控制端點0
  • 具有5 個IN 端點(EP),可配置為支援批量、中斷或同步傳輸
  • 具有5 個OUT 端點,可配置為支援批量、中斷或同步傳輸
  • 管理一個共享Rx FIFO 和一個Tx-OUT FIFO,可高效使用USB 資料RAM
  • 管理多達6 個專用Tx-IN FIFO(每個IN 配置的EP 使用一個)以降低應用程式負載
  • 具備軟斷開功能

關於該部分的詳細說明,參見晶片的參考手冊第35節:USB on-the-go high-speed (OTG_HS)

USB OTG low level driver files

  USB OTG驅動原始碼目錄結構及程式碼架構如下圖所示:
OTG Struct

模組 檔案 說明
Common usb_core.c/h 該檔案包含硬體抽象層和USB通訊操作
Common usb_conf_template.h 該檔案包含主機、裝置和OTG模式的核心配置引數:傳送FIFO大小,接收FIFO大小,核心模式和選定功能等。*使用者需要根據自己的需求,使用這個檔案對USB OTG low level driver進行合理的配置。這個檔案應該被複制到應用程式資料夾並根據應用程式的需要進行修改。
Common usb_bsp_template.c 該檔案包含了USB使用的低階核心配置(中斷、GPIO等)。使用者需要使用這個檔案配置USB使用的硬體資源。這個檔案應該被複制到應用程式資料夾並根據應用程式的需要進行修改。
Host usb_hcd.c/h 該檔案包含USB_HOST_Library訪問核心時使用的Host介面層。
Host usb_hcd_int.c/h 該檔案包含Host模式所使用的中斷子程式。
Device usb_dcd.c/h 該檔案包含USB_HOST_DEvice用於訪問核心時使用的的Device介面層。
Device usb_dcd_int.c/h 該檔案包含Device模式的中斷子程式。
OTG usb_otg.c/h 該檔案包含SRP和HNP協議的實現以及有關於OTG模式的中斷。

USB OTG low level driver 配置

  USB OTG low level driver 配置是通過一個名為usb_conf.h的配置檔案進行配置的。在實際的移植過程中,可以複製原始碼中的usb_conf_template.h然後更名為usb_conf.h,然後編輯修改即可。具體可配置的專案見下表:

定義 描述
USB_OTG_FS_CORE 使能核心的全速模式
USB_OTG_HS_CORE 使能核心的高速模式
RX_FIFO_FS_SIZE 設定全速模式下接收的FIFO的大小
RX_FIFO_HS_SIZE 設定高速模式下接收的FIFO的大小
TXn_FIFO_FS_SIZE 設定全速模式下指定裝置端點的傳送FIFO的大小,n 為裝置的端點號使用的索引值
TXn_FIFO_HS_SIZE 設定高速模式下指定裝置端點的傳送FIFO的大小,n 為裝置的端點號使用的索引值
TXH_NP_FS_FIFOSIZ 設定全速模式下,作為USB Host時,非週期性傳送的FIFO的大小
TXH_NP_HS_FIFOSIZ 設定高速模式下,作為USB Host時,非週期性傳送的FIFO的大小
TXH_P_FS_FIFOSIZ 設定全速模式下,作為USB Host時,週期性傳送的FIFO的大小
TXH_P_HS_FIFOSIZ 設定高速模式下,作為USB Host時,週期性傳送的FIFO的大小
USB_OTG_ULPI_PHY_ENABLED 為高速模式使能ULPI介面的PHY。通常為外接的PHY晶片
USB_OTG_EMBEDDED_PHY_ENABLED 為高速模式晶片內嵌的FS PHY。一般STM32系列晶片內嵌了一個PHY晶片。晶片不同其PHY的對於全速和高速的支援情況也不同
USB_OTG_HS_LOW_PWR_MGMT_SUPPORT 使能高速模式下的低功耗管理功能
USB_OTG_FS_LOW_PWR_MGMT_SUPPORT 使能全速模式下的低功耗管理功能
USB_OTG_HS_INTERNAL_DMA_ENABLED 使能高速模式下的DMA特性
USB_OTG_HS_DEDICATED_EP1_ENABLED 使能高速模式下,作為USB Device時,專用的端點1的特性

USB OTG low level driver 使用

  在USB OTG low level driver的使用中,配置選項均在usb_conf.h中。除此之外,對於某些變數的定義也有如下需要注意的事項。
The Rx and Tx FIFOs size and start address are set inside this function to use one more endpoints in addition to the control Endpoint (0). The user can change the FIFO settings by modifying the default values and changing the FIFO depth for each Tx FIFO in the usb_conf.h file.

Low level driver structures

該部分使用一個結構體USB_OTG_CORE_HANDLE來定義需要使用的變數、狀態和緩衝區等。這個結構體也是使用者在使用時需要重點關注的第一個結構體。具體如下:

typedef struct USB_OTG_handle
{
  USB_OTG_CORE_CFGS    cfg;
  USB_OTG_CORE_REGS    regs;
#ifdef USE_DEVICE_MODE
  DCD_DEV     dev;
#endif
#ifdef USE_HOST_MODE
  HCD_DEV     host;
#endif
#ifdef USE_OTG_MODE
  OTG_DEV     otg;
#endif
}
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;

同時在使用DMA時,需要注意:

  • 目前,DMA僅在高速模式下使用。
  • 在使用DMA時,必須要保證所有需要處理DMA 收發Buf的結構體必須是四位元組對齊的。所以,USB_OTG_handle(其封裝了所有內部Buffer和變數)必須要四位元組對齊。具體可使用如下程式碼:
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
    #pragma data_alignment=4   
  #endif
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_Core __ALIGN_END;

__ALIGN_BEGIN__ALIGN_END為特殊的編譯器巨集值,具體見usb_conf_template.h的定義。

USB OTG low level driver中的Host層

  該部分主要是指usb_hcd.c/husb_hcd_int.c/h兩個檔案。在初始化主機驅動程式(HCD)之後,低階驅動程式為資料和URB狀態監視儲存多個結構和緩衝區。 主機通道結構儲存在主機驅動程式中,並通過主機號索引從上層訪問。USB Host 的定義結構:

typedef struct _HCD
{
  uint8_t                  Rx_Buffer [MAX_DATA_LENGTH];  /* 此緩衝區儲存IN資料包,並可以從全域性主機核心結構直接訪問,如下所示:pdev-> host.Rx_Buffer。*/
  __IO uint32_t            ConnSts; /* 連線狀態。 它可以直接或通過使用HCD_IsDeviceConnected()函式進行訪問。 */
  __IO uint32_t            PortEnabled;  /* */
  __IO uint32_t            ErrCnt[USB_OTG_MAX_TX_FIFOS];  /* 在一次傳輸過程中儲存通道上的錯誤數量。 */
  __IO uint32_t            XferCnt[USB_OTG_MAX_TX_FIFOS]; /* 儲存已在Rx_Buffer中接收和可用的IN資料的數量。 它可以直接訪問或使用GetXferCnt()函式訪問。*/
  __IO HC_STATUS           HC_Status[USB_OTG_MAX_TX_FIFOS];  /* 由驅動程式內部使用。 可被上層訪問。它儲存一個通道上的當前傳輸的狀態 */
  __IO URB_STATE           URB_State[USB_OTG_MAX_TX_FIFOS]; /* 該變數保持主機通道上的傳輸狀態。*/
  USB_OTG_HC               hc [USB_OTG_MAX_TX_FIFOS]; 
  uint16_t                 channel [USB_OTG_MAX_TX_FIFOS]; /* 這個變數管理主機通道狀態(使用或空閒)。 */
}
HCD_DEV , *USB_OTG_USBH_PDEV;

usb_hcd_int.c/h檔案中使用如下結構來處理USB中斷

typedef struct _USBH_HCD_INT
{
  uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* DevPortEnabled) (USB_OTG_CORE_HANDLE *pdev);  
  uint8_t (* DevPortDisabled) (USB_OTG_CORE_HANDLE *pdev); 
}USBH_HCD_INT_cb_TypeDef;

extern USBH_HCD_INT_cb_TypeDef *USBH_HCD_INT_fops;
  1. 在庫層中,一旦定義了USBH_HCD_INT_cb_TypeDef結構,就應該將其分配給USBH_DCD_INT_fops指標。因為庫內部實際使用變數USBD_HCD_INT_fops
  2. 必須在中斷中引用函式uint32_t USBH_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)

USB OTG low level driver中的Device層

  該部分主要是指usb_dcd.c/husb_dcd_int.c/h兩個檔案。這兩個檔案主要是定義實現USB作為Device時的每個斷點的收發緩衝器、起始地址等。USB Device的定義結構:

/* DCD_DEV結構包含用於實時儲存與裝置有關的所有資訊,控制傳輸狀態機以及端點資訊和狀態的所有變數和結構。
在此結構中,device_config儲存當前的USB裝置配置,device_state控制具有以下狀態的狀態機:
// EP0 State
#define USB_OTG_EP0_IDLE        0
#define USB_OTG_EP0_SETUP       1
#define USB_OTG_EP0_DATA_IN     2
#define USB_OTG_EP0_DATA_OUT    3
#define USB_OTG_EP0_STATUS_IN   4
#define USB_OTG_EP0_STATUS_OUT  5
#define USB_OTG_EP0_STALL       6
在這個結構中,device_status定義了連線,配置和電源狀態:
// Device Status
#define USB_OTG_DEFAULT        0
#define USB_OTG_ADDRESSED      1
#define USB_OTG_CONFIGURED     2
*/
typedef struct _DCD
{
  uint8_t        device_config;
  uint8_t        device_state;
  uint8_t        device_status;
  uint8_t        device_old_status;
  uint8_t        device_address;
  uint8_t        connection_status;  
  uint8_t        test_mode;
  uint32_t       DevRemoteWakeup;
  USB_OTG_EP     in_ep   [USB_OTG_MAX_TX_FIFOS];
  USB_OTG_EP     out_ep  [USB_OTG_MAX_TX_FIFOS];
  uint8_t        setup_packet [8*3];
  USBD_Class_cb_TypeDef         *class_cb;
  USBD_Usr_cb_TypeDef           *usr_cb;
  USBD_DEVICE                   *usr_device;  
  uint8_t        *pConfig_descriptor;
 }
DCD_DEV , *DCD_PDEV;

usb_dcd_int.c/h檔案中使用如下結構來處理USB中斷

typedef struct _USBD_DCD_INT
{
  uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
  uint8_t (* DataInStage)  (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
  uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev);  

  uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev);
  uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev);   

}USBD_DCD_INT_cb_TypeDef;
  1. 在庫層中,一旦定義了USBD_DCD_INT_cb_TypeDef結構,就應該將其分配給USBD_DCD_INT_fops指標。因為庫內部實際使用變數USBD_DCD_INT_fops
  2. 必須在中斷中引用函式uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)

選擇合適的USB physical 介面

  使用者可以根據以上配置來選擇自己的PHY。

  • 對於全速模式,會使用晶片內嵌的全速的PHY。只能工作在全速模式
  • 對於高速模式,使用者可以選擇兩種PHY:
    • ULPI介面的外部高速PHY:此時,USB HS Core將以高速模式執行。 此時使用者可以通過修改usb_core.c檔案中OTG_HS_GUSBCFG暫存器的ULPIFSLS位元位來修改為全速模式。
    • 晶片內嵌的全速PHY:USB HS Core將以全速模式執行。儘管選擇了高速。

作為 USB Host 時,如果接入了一個低速裝置,則核心會自動降速。

USB host library

  USB Host庫是基於支援Host模式、Device模式和OTG模式的通用USB OTG低階驅動程式的,其適用於高速,全速和低速(主機模式)。
  USBHost的移植配置部分見另一篇博文

  • 支援多資料包傳輸功能,可傳輸大量資料; 而不必將其分成最大資料包大小的傳輸。
  • 使用配置檔案更改核心和庫配置,而不更改庫程式碼(只讀)。
  • 32位對齊的資料結構在高速模式下處理基於DMA的傳輸。
  • 從使用者級別支援多個USB OTG核心例項。
  • 圍繞全域性狀態機構建。
  • 完全相容實時作業系統(RTOS)。

USB host 原始檔及函式

其原始碼目錄結構及執行狀態機如下圖:
這裡寫圖片描述
USB Host
  核心狀態機過程由USBH_Process函式實現。 應該從應用程式主迴圈週期性地呼叫該函式。 USB主機庫的初始化由USBH_init函式實現。 該函式應在初始化期間從使用者應用程式呼叫。
HOST_IDLE: 在主機初始化之後,核心在這種狀態下開始輪詢USB裝置連線。 當檢測到裝置斷開連線事件時以及未發生錯誤時也會進入此狀態。
HOST_ISSUE_CORE_RESET: 當連線一個裝置以產生一個USB匯流排RESET時進入這個狀態。
HOST_DEV_ATTACHED: 當一個裝置連線時,核心進入這個狀態。 當一個裝置被檢測到時,狀態機轉到HOST_ENUMERATION狀態。
HOST_ENUMERATION: 在這種狀態下,核心進行USB裝置的基本列舉。 在列舉過程結束時,選擇預設裝置配置(配置0)。
HOST_USR_INPUT: 這是一箇中間狀態,它遵循列舉幷包括等待使用者輸入以啟動USB類操作。
HOST_CLASS_REQUEST: 從此狀態開始,類驅動程式接管,並呼叫類請求狀態機以處理所有初始類控制請求(例如:HID的Get_Report_Descriptor)。 完成所需的類請求後,核心將移至HOST_CLASS狀態。
HOST_CLASS: 在這種狀態下,類狀態機被稱為類相關操作(非控制和控制操作)。
HOST_CTRL_XFER: 每當需要控制轉移時就會進入該狀態。
HOST_ERROR_STATE: 只要有任何庫狀態機發生未恢復的錯誤,就會進入此狀態。 在這種情況下,呼叫使用者回撥函式(例如,顯示未恢復的錯誤訊息)。 然後主機庫被重新初始化。

函式呼叫關係如下:
ProjecHostFile

在檢測到裝置後,主庫繼續進行裝置的基本列舉。下圖顯示了裝置列舉中涉及的不同步驟。
Host Enum

Core

 USB host Core由五大塊組成:Core host core、USB enumeration、USB control transfer management、USB I/O requests、Channels management。 Core中各檔案說明如下:

  • usbh_core (.c, .h):該檔案包含處理所有USB通訊和狀態機的功能。
  • usbh_stdreq(.c, .h) :該檔案實現裝置列舉的標準請求。
    • USBH_Get_CfgDesc:獲取配置描述符請求。
    • USBH_Get_DevDesc:獲取裝置描述符請求。
    • USBH_Get_StringDesc:獲取字串描述符請求。
    • USBH_GetDescriptor:通用獲取描述符請求
    • USBH_SetCfg:設定配置請求。選擇預設配置(配置0)
    • USBH_SetAddress:設定地址請求。將地址設定為1
    • USBH_ClrFeature:清除特徵的請求
  • usbh_ioreq (.c, .h): 該檔案處理USB事務的生成。
    • USBH_CtlSendSetup:發起一個設定事務。
    • USBH_CtlSendData:發起一個控制資料OUT階段事務。
    • USBH_CtlReceiveData:發起一個控制資料IN階段事務。
    • USBH_CtlReq:用於生成控制傳輸的高階功能(設定,資料,狀態階段)。
    • USBH_BulkSendData:發起 一個bulk OUT事務。
    • USBH_BulkReceiveData:發起一個 bulk IN事務。
    • USBH_InterruptSendData:發起一個 中斷OUT事務。
    • USBH_InterruptReceiveData:發起一個 中斷IN事務。
  • usbh_hcs (.c, .h) : 該檔案處理主機通道分配和觸發程序。
    • USBH_Open_Channel:開啟並配置新的主機通道。
    • USBH_Modify_Channel:修改現有的主機通道。
    • USBH_Alloc_Channel:將主機通道分配給裝置端點(建立USB)。
    • USBH_Free_Channel:釋放一個主機通道
    • USBH_DeAllocate_AllChannel:釋放所有主機通道(在非初始化階段使用)
  • usbh_conf.h: 該檔案包含裝置介面編號,配置編號和最大資料包大小的配置。

  在列舉結束時,USB核心呼叫特定的類驅動程式函式來管理所有與類相關的操作。結構如下:

typedef struct _USBH_Class_cb
{
  USBH_Status  (*Init) (USB_OTG_CORE_HANDLE *pdev , void *phost);
  void (*DeInit) (USB_OTG_CORE_HANDLE *pdev , void *phost);
  USBH_Status  (*Requests) (USB_OTG_CORE_HANDLE *pdev ,void *phost); 
  USBH_Status  (*Machine) (USB_OTG_CORE_HANDLE *pdev, void *phost);
} USBH_Class_cb_TypeDef;

庫使用者API函式僅限於以下兩個函式:

  • void USBH_Process (void): 該功能實現核心狀態機程序。它應該從使用者主迴圈週期性地呼叫。
  • USBH_Init: 應該呼叫這個函式來初始化USB主機硬體和庫。

Class

 Class資料夾包含所有與類實現相關的檔案,並符合這些類中構建的協議的規範。使用如下結構將類引入到USB驅動

typedef struct _USBH_USR_PROP
{
  void (*Init)(void);       /* HostLibInitialized */
  void (*DeInit)(void);       /* HostLibInitialized */  
  void (*DeviceAttached)(void);           /* DeviceAttached */
  void (*ResetDevice)(void);
  void (*DeviceDisconnected)(void); 
  void (*OverCurrentDetected)(void);  
  void (*DeviceSpeedDetected)(uint8_t DeviceSpeed);          /* DeviceSpeed */
  void (*DeviceDescAvailable)(void *);    /* DeviceDescriptor is available */
  void (*DeviceAddressAssigned)(void);  /* Address is assigned to USB Device */
  void (*ConfigurationDescAvailable)(USBH_CfgDesc_TypeDef *,
                                     USBH_InterfaceDesc_TypeDef *,
                                     USBH_EpDesc_TypeDef *); 
  /* Configuration Descriptor available */
  void (*ManufacturerString)(void *);     /* ManufacturerString*/
  void (*ProductString)(void *);          /* ProductString*/
  void (*SerialNumString)(void *);        /* SerialNubString*/
  void (*EnumerationDone)(void);           /* Enumeration finished */
  USBH_USR_Status (*UserInput)(void);
  int  (*UserApplication) (void);
  void (*DeviceNotSupported)(void); /* Device is not supported*/
  void (*UnrecoveredError)(void);
}
USBH_Usr_cb_TypeDef;
  • MSC: (Mass storage class)大容量儲存類驅動程式用於支援通用USB快閃記憶體驅動程式,使用BOT“Bulk-Only Transport”協議和透明SCSI命令集。
    USBHostMSC
    驅動程式檔案說明如下:
    usbh_msc_core.c /.h: MSC核心狀態機實現。
    usbh_msc_bot.c /.h : BOT(Bulk-Only Transport)協議實現。
    usbh_msc_scsi.c /.h : SCSI命令的實現。
    usbh_msc_fatfs.c/.h: 用於與Fatfs檔案系統進行檔案訪問操作介面的功能。*其就是Fatfs中diskio.c/.h的實現。

  • HID: (Human Interface Device)USB主機庫v1.0中的HID類實現用於支援HID啟動的滑鼠和鍵盤裝置。 使用中斷IN傳輸接收HID報告。
    USBHostHID
    usbh_hid_core.c /.h: 該模組實現了HID類核心狀態機。
    usbh_hid_mouse.c /.h: HID滑鼠特定例程。
    usbh_hid_keybd.c /.h: HID鍵盤特定例程。

  • CDC: (Communication Device Class) USB通訊裝置類是USB組織定義的一類專門給各種通訊裝置(電信通訊裝置和中速網路通訊裝置)使用的USB子類。
    USBHostCDC

USB host library configuration

  USB Host 配置(針對Core部分)是通過一個名為usbh_conf.h的配置檔案進行配置的。使用者可以複製原始碼中的usbh_conf_template.h然後更名為usbh_conf.h,然後編輯修改即可。

USB host library 使用方法

第一步: 整理需要的原始碼:USB OTG原始碼、USB Host Core原始碼、USB Device Class 原始碼,Keil示例如下:
Project File
第二步:usb_bsp.c/h檔案中,實現 USB 需要使用的底層硬體資源。具體函式見上文及原始碼檔案的註釋。
第三步: 根據需要修改usbd_usr.c/h檔案。
第四步: 根據原始碼進行各種配置

  • USB OTG 配置檔案usb_conf.h。具體配置選項見上文及原始碼中的註釋。
  • USB Host配置檔案usbh_conf.h。具體配置選項見上文及原始碼中的註釋。

第五步: 實現USB Host所使用的類的原始檔。例如本文使用了USB Host的MSC類,所以上圖中出現了fatfs相關檔案。
第六步: 在自己晶片對應的stm32f4xx_it.c檔案中新增USB中斷處理函式。
第七步: 定義USB_OTG_CORE_HANDLE USB_OTG_CoreUSBH_HOST USB_Host全域性變數,然後呼叫如下函式初始化USB Host 即可

 USBH_Init( &USB_OTG_Core, 
    #ifdef USE_USB_OTG_FS  
        USB_OTG_FS_CORE_ID,
    #else 
        USB_OTG_HS_CORE_ID,
    #endif 
        &USB_Host,
        &USBH_MSC_cb, /* 該變數在所使用的類檔案中定義/宣告 */
        &USR_cb );        /* 該變數在usbd_usr.c/h檔案中定義/宣告 */

第八步: 在主程式中迴圈呼叫void USBH_Process (void)。該函式處理實現USB Host狀態機。

USB device library

  • 支援多資料包傳輸功能,以便可以傳送大量資料,而無需將其分割為最大資料包大小傳輸。
  • 在控制端點上支援最多三個背靠背傳輸(與OHCI控制器相容)。
  • 使用配置檔案更改核心和庫配置,而不更改庫程式碼(只讀)。
  • 32位對齊的資料結構來處理高速模式下的基於DMA的傳輸。
  • 從使用者級別支援多個USB OTG核心例項。

USB device 原始檔及函式

原始碼檔案結構及驅動架構如下圖:
USBDeviceStruct
原始碼檔案函式呼叫關係如下:
函式呼叫關係

Core

  Core資料夾包含修訂版2.0通用序列匯流排規範定義的USB裝置庫機器。其主要由USB device core、USB requests、USB I/O requests三部分組成。各檔案及其內部函式的說明如下:

  • usbd_core (.c, .h): 該檔案包含處理所有USB通訊和狀態機的功能。該檔案中的主要函式如下:
    • void USBD_Init(USB_OTG_CORE_HANDLE *pdev, USB_OTG_CORE_ID_TypeDef coreID, USBD_Class_cb_TypeDef *class_cb, USBD_Usr_cb_TypeDef *usr_cb):初始化裝置庫並載入類驅動程式和使用者回撥。
    • USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev):反初始化裝置庫
    • uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev):處理USB規範的SETUP階段
    • uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum):處理USB規範的Data Out階段
    • uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum):處理USB規範的Data In階段
    • uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev):處理復位事件
    • uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev):處理Resume事件
    • uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev):處理Suspend事件
    • uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev):處理SOF事件
    • USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx:配置裝置並啟動介面。
    • USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx):清除當前配置引數
    • uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev):處理不完整的同步IN傳輸
    • uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev):處理不完整的同步OUT傳輸
    • uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev):處理裝置連線事件
    • static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev):處理裝置斷開事件
  • usbd_req( .c, .h): USB請求處理。該檔案中的主要函式如下:
    • void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len):將ASCII字串轉換為Unicode字串以格式化字串描述符。
    • static uint8_t USBD_GetLen(uint8_t *buf):返回字串的長度
    • USBD_Status USBD_StdDevReq(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理標準USB裝置請求。
    • USBD_Status USBD_StdItfReq(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理標準USB介面請求。
    • USBD_Status USBD_StdEPReq(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理標準USB端點請求。
    • static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理獲取描述符的請求。
    • static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):設定新的地址
    • static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理設定裝置引數的請求。
    • static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理獲取裝置引數的請求。
    • static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理獲取裝置狀態的請求。
    • static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理設定裝置特性的請求。
    • static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理清除裝置特性的請求。
    • void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):將請求緩衝區複製到SETUP結構中
    • void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req):處理控制管道上的USB錯誤。
  • usbd_ioreq (.c, .h) : 該檔案為控制端點提供IO請求API。
    • USBD_Status USBD_CtlSendData( USB_OTG_CORE_HANDLE *pdev, uint8_t *pbuf, uint16_t len):在控制管道上傳送資料
    • USBD_Status USBD_CtlContinueSendData(USB_OTG_CORE_HANDLE *pdev, uint8_t *pbuf, uint16_t len):繼續在控制管道上傳送資料。
    • USBD_Status USBD_CtlPrepareRx(USB_OTG_CORE_HANDLE *pdev, uint8_t *pbuf, uint16_t len):準備核心以在控制管道上接收資料。
    • USBD_Status USBD_CtlContinueRx(USB_OTG_CORE_HANDLE *pdev, uint8_t *pbuf, uint16_t len):繼續在控制管道上接收資料。
    • USBD_Status USBD_CtlSendStatus(USB_OTG_CORE_HANDLE *pdev):在控制管道上傳送一個零長度的資料包
    • USBD_Status USBD_CtlReceiveStatus(USB_OTG_CORE_HANDLE *pdev):在控制管道上接收一個零長度的資料包
  • usbd_conf.h: 該檔案包含裝置的配置: - 供應商ID,產品ID,字串等

  在USB裝置庫初始化期間,Core部分通過選擇相應的類回撥結構來選擇USB類。 在usbd_core.h檔案中,類結構定義(詳細說明見註釋)如下:

typedef struct _Device_cb
{
  uint8_t  (*Init)         (void *pdev , uint8_t cfgidx);/* 當裝置收到設定的配置請求時呼叫此回撥; 在這個函式中,類介面使用的端點被開啟。 */
  uint8_t  (*DeInit)       (void *pdev , uint8_t cfgidx);/* 當收到清除配置請求時呼叫此回撥; 此函式關閉類介面使用的端點。*/
 /* Control Endpoints 控制端點使用 以下幾個 */
  uint8_t  (*Setup)        (void *pdev , USB_SETUP_REQ  *req);/* 呼叫此回撥來處理特定的類設定請求 */
  uint8_t  (*EP0_TxSent)   (void *pdev );/*傳送狀態完成時呼叫此回撥。*/
  uint8_t  (*EP0_RxReady)  (void *pdev );/*當接收狀態結束時呼叫此回撥。*/
  /* Class Specific Endpoints*/
  uint8_t  (*DataIn)       (void *pdev , uint8_t epnum);/*這個回撥被呼叫來執行相對於非控制端點階段的資料。*/
  uint8_t  (*DataOut)      (void *pdev , uint8_t epnum);/*呼叫此回撥函式以執行相對於非控制端點的資料輸出階段。*/
  uint8_t  (*SOF)          (void *pdev);/*當收到SOF中斷時呼叫此回撥函式; 這個回撥函式可以用來同步一些程序和幀開始。*/
  uint8_t  (*IsoINIncomplete)  (void *pdev);/*當最後一個同步IN傳輸未完成時呼叫此回撥。*/
  uint8_t  (*IsoOUTIncomplete)  (void *pdev);/*當最後一個同步OUT傳輸未完成時呼叫此回撥。*/

  uint8_t  *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length);/*該回調返回USB配置描述符。*/
#ifdef USB_OTG_HS_CORE 
  uint8_t  *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length);/*該回調在高速模式下返回使用的類的其他配置描述符*/
#endif

#ifdef USB_SUPPORT_USER_STRING_DESC 
  uint8_t  *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index,  uint16_t *length);/*這個回撥函式返回使用者定義的字串描述符。*/ 
#endif
} USBD_Class_cb_TypeDef;

每個Class都會在自己的實現檔案中用該結構定義一個全域性變數(例如本文使用的為CDC,則會有USBD_Class_cb_TypeDef USBD_CDC_cb;),表示類自己本身,供Core部分載入。具體為通過USBD_Init函式載入類。
  該庫提供使用者回撥結構,允許使用者新增特殊程式碼來管理USB事件。 在usbd_core.h檔案中,這個使用者結構定義(具體介紹見註釋)如下:

typedef struct _USBD_USR_PROP
{
  void (*Init)(void);/* 該裝置庫啟動(完成初始化後)時呼叫該回調。 */
  void (*DeviceReset)(uint8_t speed);/*當裝置檢測到來自主機的重置事件時,會呼叫此回撥。*/
  void (*DeviceConfigured)(void);/*當裝置收到設定的配置請求時,會呼叫此回撥。*/
  void (*DeviceSuspended)(void);/*當裝置檢測到來自主機的暫停事件時,會呼叫此回撥。*/
  void (*DeviceResumed)(void);/*當裝置檢測到來自主機的恢復事件時,會呼叫此回撥。*/
  void (*DeviceConnected)(void);/*當裝置連線到主機時呼叫此回撥。*/
  void (*DeviceDisconnected)(void);/*當裝置與主機斷開連線時呼叫此回撥。*/
}
USBD_Usr_cb_TypeDef;

這部分需要使用者自己來實現。用法與上面的裝置類的結構一個樣!同樣通過USBD_Init函式載入。在驅動內部,會在合適的位置呼叫使用者回撥的各函式。
  該庫提供描述符回撥結構,以允許使用者在應用程式執行時管理裝置和字串描述符。 在usbd_core.h檔案中,這個描述符結構定義如下:

typedef struct _Device_TypeDef
{
  uint8_t  *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length);/* 返回裝置描述符 */
  uint8_t  *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length);/* 返回返回語言ID字串描述符*/
  uint8_t  *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length);/* 返回製造商字串描述符 */ 
  uint8_t  *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length);/* 返回產品描述符 */
  uint8_t  *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); /* 返回序列號字串描述符。 */
  uint8_t  *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length);/* 返回配置描述符 */ 
  uint8_t  *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length);/* 返回介面描述符 */

#if (USBD_LPM_ENABLED == 1)
  uint8_t  *(*GetBOSDescriptor)( uint8_t speed , uint16_t *length); 
#endif   
} USBD_DEVICE, *pUSBD_DEVICE;

  在驅動原始碼的示例中,可以找到一個名為usbd_desc.c的檔案,該檔案即為使用者實現的各種USB Device的描述符。這樣,驅動在工作時,即會返回使用者定義的各種描述符了。

通過上面的結構可以看到,其中提供的介面並不包含USB2.0規範定義的全部描述符,例如:端點描述符。主要是其不能由使用者自定義!

Class

 Class資料夾包含所有與類實現有關的檔案。它符合這些類中構建的協議的規範。驅動在結構上使用如下定義的結構來將類引入到USB庫中

typedef struct _Device_cb
{
  uint8_t  (*Init)         (void *pdev , uint8_t cfgidx);
  uint8_t  (*DeInit)       (void *pdev , uint8_t cfgidx);
 /* Control Endpoints*/
  uint8_t  (*Setup)        (void *pdev , USB_SETUP_REQ  *req);  
  uint8_t  (*EP0_TxSent)   (void *pdev );    
  uint8_t  (*EP0_RxReady)  (void *pdev );  
  /* Class Specific Endpoints*/
  uint8_t  (*DataIn)       (void *pdev , uint8_t epnum);   
  uint8_t  (*DataOut)      (void *pdev , uint8_t epnum); 
  uint8_t  (*SOF)          (void *pdev); 
  uint8_t  (*IsoINIncomplete)  (void *pdev); 
  uint8_t  (*IsoOUTIncomplete)  (void *pdev);   

  uint8_t  *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length); 
#ifdef USB_OTG_HS_CORE 
  uint8_t  *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length);   
#endif

#ifdef USB_SUPPORT_USER_STRING_DESC 
  uint8_t  *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index,  uint16_t *length);   
#endif  

} USBD_Class_cb_TypeDef;

每個類中,各函式最終封裝為以上的結構變數。由於類比較多,下面只針對用的到幾個類做詳細介紹。其他詳細說明請參見ST手冊。

  • HID: 該模組按照2001年6月27日的“人機介面裝置(HID)版本1.11的裝置類定義”管理MSC類V1.11。該驅動程式實現了規範的以下幾個方面:引導介面子類、滑鼠協議、用法頁面:通用桌面、用法:操縱桿、收集:應用程式。
    usbd_hid (.c, .h):該檔案包含HID類回撥(驅動程式)和與此類相關的配置描述符。
  • MSC:該模組按照“通用序列匯流排海量儲存類(MSC)批量傳輸(BOT)1.0版1999年9月31日”管理MSC類V1.0。該驅動程式實現了規範的以下幾個方面:Bulk-only傳輸協議、子類:SCSI透明命令集(參考SCSI主命令 - 3)。
    usbd_msc( .c, .h):該檔案包含MSC類回撥(驅動程式)和與此類相關的配置描述符。
    usbd_bot (.c, .h): 該檔案處理批量傳輸協議。
    usbd_scsi (.c, .h): 該檔案處理SCSI命令。
    usbd_info (.c,.h):該檔案包含大容量儲存裝置的重要查詢頁面和感應資料。
    usbd_mem.h: 該檔案包含來自SCSI層的被呼叫函式的函式原型,以訪問物理介質。
  • DFU:(Device firmware upgrade )DFU核心按照“裝置韌體升級版本1.1 2004年8月5日的裝置類規範”管理DFU類V1.1。這個核心實現了規範的以下幾個方面:裝置描述符管理、配置描述符管理、列舉為DFU裝置(僅在DFU模式下)、請求管理(支援ST DFU子協議,與DFU協議相容)、記憶體請求管理(下載/上傳/擦除/分離/ GetState / GetStatus)、DFU狀態機實現。
    usbd_dfu_core(.c,.h): 該檔案包含DFU類回撥(驅動程式)和與此類相關的配置描述符。
    usbd_flash_if(.c,.h):該檔案包含與內部快閃記憶體介面相關的DFU類回撥。
    usbd_otp_if (.c,.h):該檔案包含與OTP儲存器相關的介面的DFU類回撥。
    usbd_template_if(.c,.h):該檔案提供了一個驅動程式模板,允許您實現更多的記憶體介面。在移植時,使用者需要自行修改該檔案。
  • Audio:此驅動程式管理音訊類1.0遵循“USB裝置類定義的音訊裝置V1.0 Mar.18,98”。沒用過,不做過多說明
    usbd_audio_core(.c,.h):該檔案包含AUDIO類回撥(驅動程式)和與此類相關