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类回调(驱动程序)和与此类相关的配置描述符。 **usbd_audio_out_if(.c,.h):**此文件包含低层音频输出驱动程序(从USB主机输出到扬声器)。
CDC:(Communication device class )此驱动程序管理2007年11月16日的“通信设备通用串行总线类别定义修订版1.2”,以及2007年2月9日的“通用串行总线通信类子类规范PSTN设备修订版1.2”的子协议规范。
**usbd_cdc_core(.c,.h):**该文件包含CDC类回调(驱动程序)和与该类相关的配置描述符。主要函数如下:
static uint8_t usbd_cdc_Init(void *pdev, uint8_t cfgidx):初始化CDC接口。 static uint8_t usbd_cdc_DeInit(void *pdev, uint8_t cfgidx):反初始化CDC接口。 static uint8_t usbd_cdc_Setup(void *pdev, USB_SETUP_REQ *req):处理CDC控制请求。 static uint8_t usbd_cdc_EP0_RxReady(void *pdev):处理CDC控制请求数据。 static uint8_t usbd_cdc_DataIn(void *pdev, uint8_t epnum):处理CDC IN数据阶段。 static uint8_t usbd_cdc_DataOut(void *pdev, uint8_t epnum):处理CDC OUT数据阶段。 static uint8_t usbd_cdc_SOF(void *pdev):处理SOF事件(数据缓冲区更新和同步) static void Handle_USBAsynchXfer(void *pdev):处理IN数据缓冲区包装。 **usbd_cdc_if_template (.c,.h):**该文件提供了一个驱动程序模板,它允许您为CDC终端实现低层功能。在移植时,用户需要自行修改该文件。例如:示例程序的usbd_cdc_vcp.c/h文件就是基于此的。 底层硬件接口通过各自的驱动程序结构进行管理:
typedef struct _CDC_IF_PROP { uint16_t (*pIf_Init) (void); uint16_t (*pIf_DeInit) (void); uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint8_t* Buf, uint32_t Len); uint16_t (*pIf_DataTx) (void); // !!! 注意:源码中该函数与手册中的说明的不同(手册中的例子该函数时有参数的) uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len); } CDC_IF_Prop_TypeDef;
每个硬件接口驱动程序都应提供CDC_IF_Prop_TypeDef类型的结构指针。如果给定内存接口不支持某项功能,则相对字段将设置为NULL值。该文件中的主要函数如下: - uint16_t pIf_Init (void): 初始化低层CDC接口。 - uint16_t pIf_DeInit (void): 反初始化低层CDC接口。 - uint16_t pIf_Ctrl (uint32_t Cmd,uint8_t* Buf, uint32_t Len): 处理CDC控制请求解析和执行。 - uint16_t pIf_DataTx (void): 处理从低层终端到USB主机的CDC数据传输(IN传输)。 - uint16_t pIf_DataRx (uint8_t* Buf,uint32_t Len): 处理来自USB主机的CDC数据接收到低层终端(OUT传输)。
为了加速IN传输的数据管理,低层驱动程序(usbd_cdc_xxx_if.c / .h)应该使用从CDC核心导出的两个全局变量:
extern uint8_t APP_Rx_Buffer []:将CDC收到的数据写入此缓冲区。 这些数据将通过CDC核心功能中的USB IN端点发送。 extern uint32_t APP_Rx_ptr_in:将此指针递增或在将接收到的数据写入缓冲区APP_Rx_Buffer时将其返回以开始地址。 该驱动程序提供结构指针:extern CDC_IF_Prop_TypeDef APP_FOPS;其中APP_FOPS应该在usbd_conf.h文件中定义为低层接口结构指针。
|