stm32f107 usbh主模式库解析

简介

STM32F105/7 USB主模式库的目的是为USB主模式应用程序开发提供一个框架。 库代表了在STM32F105/7之上的 USB OTG周边底层驱动。它实现必要的软件块,目的是便于USB的主模式应用程序开发。

STM32F105/7USB主模式协议栈的库支持以下两个USB标准应用类: ■大批量存储类(MSC)用于访问USB闪存pendrives ■人机接口设备类(HID)用于键盘和鼠标设备 目录

1 USB的主模式包文件夹结构。..................6 2 USB主模式的库结构................................8 2.1库的结构框图............................8 2.2库内核的描述。................................9 2.2.1内核状态机。........................................9 2.2.2设备枚举。......................................10 2.2.3控制传输状态机。..............................11 2.2.4 USB的I / O请求模块。..................................11 2.2.5主模式通道控制模块。..............................12 2.3类驱动程序。..............................................13

2.3.1 USB大批量存储类(MSC)驱动程序。........................13

2.3.2 USB人机接口设备类(HID)鼠标键盘设备驱动。.......................................17 3库用户API和回调函数。..............................................................................20 3.1库用户API。..............................................................................................20 3.2用户的回调函数。..............................................................................................20 3.2.1类的回调函数。..............................................................................................20 3.2.2独立类的回调函数。.......................................................................................22

4演示固件。。。。。。……. . 25

4.1大容量存储类演示。…。。。。。。。。。。。。。。。。。。。。。。。。。。。25 4.1.1软件初始化。。。。。。。。。。。。。。。。。。。。。。。。。25 4.1.2大容量存储设备枚举。。。。。。。。。。。。。。。。。。25 4.1.3访问大容量存储器内容。。。。。。。。。。。。。。。。。26

4.1.4 Flash pendrive测试。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。26 4.2HID鼠标和键盘演示。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。27 4.2.1初始化准备。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。27 4.2.2鼠标或键盘设备枚举。。。。。。。。。。。。。。。。。。。。。。。。27

4.2.3 .鼠标演示。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。28 4.2.4键盘演示。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。28 4.3演示脚本。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。28

5已知的限制。........................................29 6修订历史。..........................................30 list of表

表1 内核文件…………………………………………………………………………………7 表2 class文件…………………………7 表3 枚举请求……………………………………11

表4 USB的I / O请求模块………………………………………………………12

表5 主模式通道控制模块……………………………………………………………………12 表6 大容量存储类模块…………………………………………………………..13 表7 MSC的内核模块……………………………………………………………………15 表8 MSC BOT模块……………………………………………………………15 表9 MSC SCSI命令……………………………………………………………16 表10 MSC文件系统接口功能………………………………………………………16 表11 efsl 主API…………………………………………………………………17 表12 HID类模块……………………………………………………………………17 表13 MSC内核模块的功能…………………………………………………………18 表14 鼠标和键盘初始化和HID Report解码功能……………………………19 表15 测试U盘……………………………………………………27

表16 演示的足迹…………………………………………………………………28 表17文件修订历史………………………………………………………………30 数字表

图1。文件夹结构。......................................................6 图2。USB主模式库框图结构。..................................8 图3。内核状态机。......................................................9 图4。设备枚举。....................................................10 图5。的MSC驱动器框图结构。................................14 图6。MS设备枚举。..................................................25 图7。MS设备内容的访问。............................................…26 图8。鼠标演示。..........................................................28 图9。键盘演示。........................................................28 1 USB主模式包文件夹结构

STM32的USB主模式封装库具有以下文件结构: 图1。文件夹结构

封装库文件夹具有如下组织结构 ■库

– CMSIS:微微控制器软件接口标准文件

– STM32_USB_HOST_Library: USB主模式库文件

– STM32_USB_HOST_Driver: STM32 USB2.0 OTG 外设低电平驱动 – STM32F10x_StdPeriph_Driver:STM32标准外设驱动程序 ■项目

–_USB_HOST_EXAMPLES/HID_KBrd_Mouse: 鼠标和HID键盘演示文件 –USB_HOST_EXAMPLES/MSC: 大容量存储类的演示文件 ■公用事业

–STM32_EVAL/STM3210C_EVAL: STM3210C_EVAL evalboard功能函数 ( GPIO,液晶显示,时钟配置,……)

–Third_Party/efsl: EFSL FAT文件系统,用于大容量存储例程 USB主模式库文件结构

USB主模式库文件夹”stm32_usb_host_library”是由两个主要子文件夹构成:

■内核:该文件夹包含USB主模式库内核文件。这些文件实现必要的功能,状态机和数据结构所需的:

–设备的识别和枚举, –USB控制传输管理,

–为解决控制,大批量或中断USB事务而设立的低级功能, –USB主模式通道配置。

■类:这个文件夹包含USB类管理所必需的文件。USB主模式库支持两种USB类:

–MSC:大批量存储类

–HID:为启动鼠标和键盘设备的人机接口设备类 下表详体说明了内核文件和类文件: 表1。内核文件 File Description

usbh_core.c / .h 使内核,设备枚举和控制权转移的状态机生效 usbh_stdreq.c / .h USB标准请求需要在设备枚举(USB 9章)

usbh_ioreq.c /.h USB的I / O请求:USB事务包括控制,大批量和中断通道请求 usbh_hcs.c /.h USB主模式控制信道(信道配置,分配,释放……) usbh_def.h 在USB主模式库中广泛使用的宏定义 表2。类文件

Class File Description

usbh_hid_core.c /.h HID类管理

HID usbh_hid_mouse.c ./h HID鼠标的具体例程

usbh_hid_keyboard.c /.h HID键盘的具体例程 usbh_msc_core.c /.h 大批量存储类管理

MSC usbh_msc_bot.c ./.h BOT”Bulk-Only传输协议的实现

usbh_msc_scsi.c /.h SCSI标准命令的执行

usbh_msc_fs_interface.c ./h 一个带有文件操作系统用于文件访问的接口

2 USB主模式的库结构 2.1库框图结构

USB主模式库具有以下框图结构: 图2. USB主模式库框图结构

如上图所示, USB主模式库由两个主要部分组成:内核 和类驱动程序。

库的核心主要由五块构成:

■内核状态机 ■设备枚举 ■控制传输状态机 ■USB的I / O请求 ■USB主模式通道控制

对于所有与类相关的操作,内核状态机都是操作一个特定的类驱动。在USB主模式库目前的版本中,两类驱动程序-HID和MSC已经实现。这类驱动程序使用内核层对底层驱动通信进行服务。

内核和类驱动程序与用户的应用程序交流都主要是通过定义回调函数来实现的。 不同的主模式模块库描述如下。 2.2描述库内核 2.2.1内核状态机 下图描述了库的状态机: 图3。内核状态机

内核状态机有8个状态:

■host_idle:主模式初始化后,内核在这个状态开始,在这个状态下为USB设备连接进行检测。这种状态也在当一个设备断开事件被检测到的时进入,同时也在当不可恢复错误发生时进入。

■host_issue_core_reset:当设备为发出一个USB总线复位请求则进入此状态。 ■host_dev_attached:内核进入这个状态,当一个设备连接。当一个全速或低速设备被检测到时,状态机移动到host_enumeration状态。

■host_enumeration:在这种状态中,内核根据一个基本的USB设备枚举进行。在枚举过程结束时,默认的配置(配置0)被选择。

■host_usr_input:这是一个紧跟在枚举后的中间状态,这个状态包括一个等待用户输入以便进行USB类操作。

■host_class_request:从这个状态开始,类驱动接管,类请求状态机为了处理所有的初始类控制请求被调用(例如:get_report_descriptor HID)。完成所需要的类请求后,内核移动到host_class状态。

■host_class:在这种状态下,类状态机被调用类相关的操作(非控制和控制操作)。 ■host_ctrl_xfer:,无论何时当有一个控制转移请求时进入此状态。

■host_error_state:无论何时从任何库状态机有一个不可恢复的错误时进入此状态;在这种情况下,一个用户调用回调函数(例如显示一条不可恢复的错误消息)。然后主模式库重新初始化。

内核状态机的过程是由usbh_process功能函数实现。这个函数应该从应用程序的主循环周期

调用。

USB主模式库初始化功能由函数usbh_init实现。这个函数这个函数应该在初始化过程中由用户应用程序调用。更多这方面的细节在section3提供。 2.2.2设备枚举

在检测完全速或低速设备之后,主库通过一个基本的设备枚举继续运行。 下面的关系图显示了参与设备枚举的不同的步骤。 图4。设备枚举

枚举状态机是在库的功能函数USBH_HandleEnum中实现,这是从内核状态机过程调用。 USBH_HandleEnum功能函数调用下面的库路径(在文件usbh_stdreq.c中实施): 表3。设备枚举请求

Function Description

USBH_Get_CfgDesc 获取配置描述符请求 USBH_Get_DevDesc 获取设备描述符请求

USBH_Get_StringDesc 得到字符串描述符的请求 USBH_GetDescriptor 一般取描述符请求 USBH_SetCfg(1) 配置请求

USBH_SetAddress2) 设置地址的请求 USBH_ClrFeature 清除功能请求

注:1 usbh_setcfg调用选择默认的配置(配置0)

2 usbh_setaddress要求设置设备地址为0x1。

用户回调函数将在用户枚举阶段结束时调用以使过程的描述信息(如显示的描述符的数据,例如)。为更多的细节,请参阅第3节。

**************************************************************************************************** 2.2.3控制传输状态机

当有控制传输需求时从内核或类驱动进入控制传输状态机,。该状态机实现了标准的控制转移阶段,即安装阶段,可选的数据阶段,最后,状态阶段。

控制传输状态机实现的功能是在功能函数USBH_HandleControl中。它是从内核状态机程序中调用。

2.2.4 USB的I / O请求模块

USB的I / O请求模块位于内核的低层。它的接口与关于控制,大批量,中断等的USB事务的USB底层驱动相连。

表4显示在I / O请求模块的主要功能。这些功能在文件usbh_ioreq.c中实施。 表4 USB的I / O请求模块

Function Description USBH_CtlSendSetup 关于设置事务

USBH_CtlSendData 关于控制数据输出阶段的事务 USBH_CtlReceiveData 关于控制数据输入阶段的事务

USBH_CtlReq 关于控制传输(设置,数据,状态阶段)的高级功能 USBH_BulkSendData 关于大批量输出的事务 USBH_BulkReceiveData 关于大批量输入的事务 USBH_InterruptSendData 关于中断输出事务 USBH_InterruptReceiveData 关于中断输入事务 2.2.5主模式通道控制模块

主模式通道控制模块位于较低的内核层,它允许把主模式通道配置为一个特定的操作(控制,大批量或中断传输型)也允许设置一个选定的主模式通道为设备端点来创建一个USB通道。对于USB通道控制模块的主要功能是在表6定义。这些功能在文件usbh_hcs.c中实施。 表5。主模式通道控制模块

Function Description

USBH_Open_Channel 开放和配置一个新的主模式通道 USBH_Modify_Channel 修改现有的主模式通道

USBH_Alloc_Channel 分配一个主模式通道到设备的端点(一个USB通道创建) USBH_Free_Channel 释放一个主模式通道 2.3类驱动程序

在枚举的结束时,内核通过调用特定功能的类驱动程序来管理所有的与类相关的操作。 请注意,某些类驱动的选择不是基于设备枚举的结果,而是当初始化主模式库通过调用函数usbh_init “预先定义的“。

类驱动通过使用结构类型usbh_class_cb_typedef来实现:

typedef struct _Device_cb {

USBH_Status (*Init) (USB_OTG_CORE_HANDLE *pdev , USBH_DeviceProp_TypeDef *hdev); void (*DeInit) (USB_OTG_CORE_HANDLE *pdev , USBH_DeviceProp_TypeDef *hdev); USBH_Status (*Requests)(USB_OTG_CORE_HANDLE *pdev, USBH_DeviceProp_TypeDef\\ *hdev);

USBH_Status (*Machine) (USB_OTG_CORE_HANDLE *pdev , USBH_DeviceProp_TypeDef\\ *hdev);

} USBH_Class_cb_TypeDef;

结构成员如下所述:

■初始化:此函数在类操作启动时调用以确保完成所有需要的初始化操作。这包括: –解析接口和端点描述符(请注意当前的USB主模式库只支持一种接口), –为非控制端点开放和分配主模式通道,

–调用用户回调函数(见第3节),以防止该设备不被支持的情况。

■去初始化:这个功能当重新初始化主模式为释放分配的主模式通道被调用。当一个设备拔出或在不可恢复的错误的情况下被调用。

■请求:执行类请求状态机的功能。在host_class_request状态下它被调用;其目的是实现类的初始化请求。

■机器:执行类内核状态机。在host_class内核状态被调用。

2.3.1 USB大批量存储类(MSC)驱动程序的目的是支持常见的USB接口的 u盘,使用BOT”Bulk-Only传输协议。

以下模块,位于class\\MSC文件夹,用于实现MSC驱动: 表6。大批量存储类模块

Module Description

usbh_msc_core.c /.h MSC内核状态机的实现

usbh_msc_bot.c ./.h BOT”Bulk-Only传输协议的实现 usbh_msc_scsi.c /.h SCSI命令的实现

usbh_msc_fs_interface.c ./h 文件操作系统访问文件的接口功能 图表5显示了模块之间的相互作用。 图5。MSC驱动器结构框图

============================================================ 操作流程描述:

MSC内核状态机通过必需的设备初始化来启动,这是:

■通过get_max_lun检测目前设备的逻辑单元的数目的类请求。请注意,只有一个逻辑单元的设备支持。

■bot_reset是发出复位设备BOT状态机的类请求。

■关于SCSI命令:mode_sense是为了检测设备是否写保护,read_capacity用于检测u盘容量。

经过上述设备初始化,MSC内核状态机调用应用程序的用户 回调函数。

用户回调可以让文件系统访问任何类型的文件。此操作解释成一个逻辑页读取或写入操作。文件系统接口为文件系统和MSC驱动器提供连接。

在SCSI水平,逻辑页读取或写入操作转换为SCSI命令:READ(10) or WRITE(10)。这些命令“Bulk-Only Tranport” 协议传输到u盘。

BOT层状态机是关于使用必要的USB内核I / O请求模块进行大批量输入输出传输。 MSC模块描述如下。 MSC内核模块:

MSC内核模块在“usb_msc_core.c”实现MSC驱动,它通过usbh_class_cb_typedef定义 msc_cbof结构类型(见2.3节)。

USBH_Class_cb_TypeDef MSC_cb = {

USBH_MSC_InterfaceInit, USBH_MSC_InterfaceDeInit, USBH_MSC_ClassRequest, USBH_MSC_Handle, };

表7.MSC内核模块

Function Description

USBH_MSC_InterfaceInit 解析接口和端点描述符和配置主模式通道(大批量输入输出通道)

USBH_MSC_InterfaceDeInit 去初始化路径(释放主模式通道)

USBH_MSC_ClassRequest 在MSC的情况下,此功能只将库内核状态机转移到host_class状态

USBH_MSC_Handle 执行MSC内核状态机 USBH_MSC_Issue_BOT 关于BOT复位类请求 USBH_MSC_Issue_GETMaxLUN 关于get_max_lun类请求 USBH_MSC_ErrorHandle MSC错误处理 MSC BOT模块:

MSC”Bulk-Only传输”(BOT)模块执行了传输协议通过发送SCSI命令(READ(10) or WRITE(10))。该模块在文件“usbh_msc_bot. c实现。

关于BOT协议的详细信息,请参阅usb.org大批量存储类文件。 BOT模块具有以下功能:

表8。MSC BOT模块

功能 描述 usbh_msc_init 初始化状态机 usbh_msc_handlebotxfer BOT传输状态机 MSC SCSI模块:

SCSI“小型计算机系统接口”模块在“usb_msc_scsi .C”在BOT顶部。它在需要访问u盘时执行SCSI命令集。 需要执行的命令: 表9. MSC SCSI命令

功能 描述

usbh_msc_read10 逻辑块读命令 usbh_msc_write10 逻辑块写入命令 usbh_msc_testunitready 检查设备状态命令 usbh_msc_readcapacity10 请求读取设备容量命令

usbh_msc_modesense6 检查大容量存储设备写保护状态命令 usbh_msc_requestsense 接收错误消息命令 MSC文件系统接口模块

MSC文件系统接口模块在“usbh_msc_fs_interface.C”允许文件系统与MSC驱动器连接。本模块必须移植到选定的文件系统。

当前的USB主模式库包来自开源的,支持EFSL FAT文件系统(见下一节对EFSL概述API)。

文件系统接口实现的功能: 表10.MSC文件系统接口功能 功能 描述

if_initinterface 允许初始化文件系统(例如获取u盘容量) if_readbuf 逻辑页读取功能接口 if_writebuf 逻辑页写功能接口 if_testunitready 测试单元是否准备好功能

if_requestsense 使用SCSI接口功能命令来请求错误信息功能接口

注:对EFSL文件系统,页面大小是固定的512个字节。对于更大的页面的U盘不支持。 EFSL文件系统概述

EFSL”嵌入式文件系统库”是一个开放源代码的文件系统库。支持嵌入式设备和微软FAT12,16和32的文件系统。

下表总结了EFSL主要api功能。

Table 11. EFSL主要的API

Function Prototype Description efs_init esint8 efs_init(EmbeddedFileSystem *efs, eint8* opts); 初始化文件系统

file_fopen esint8 file_fopen(File *file, FileSystem *fs, eint8 *filename, eint8 mode); 打开一个文件

file_fclose esint8 file_fclose(File *file);

关闭一个文件

file_read euint32 file_read (File *file, euint32 size, euint8 *buf); 读文件

file_write euint32 file_write(File *file, euint32 size, euint8 *buf); 写文件

Rmfile esint16 rmfile(FileSystem *fs,euint8* filename); 移除文件

mkdir esint8 mkdir(FileSystem *fs,eint8* dirname); 创建字典

ls_openDir esint8 ls_openDir(DirList *dlist,FileSystem *fs,eint8* dirname); 打开字典

ls_getNext esint8 ls_getNext(DirList *dlist); 获取另一个文件字典

2.3.2 USB人机接口设备(HID)类驱动鼠标键盘设备

V1.0 USB主机库中的HID类目的是实现支持HID鼠标和键盘设备。 HID报告通过中断输入传输收到。

以下模块,位于class\\HID文件夹,用于执行HID类:

Table 12. HID class modules

队列(模块) 描述

usbh _ hid_ core.c / .h 这个模块执行HID类核心状态机 usbh _hid_ mouse.c / H HID鼠标具体例程 usbh _hid _ keyboard.c / .h HID键盘的具体例程

各模块的主要功能如下。 HID类核心:

HID核心模块在“usb_hid_core.C”通过usbh_class_cb_typedef定义hid_cb类结构实现了HID类驱动程序(见2.3节)。

USBH_Class_cb_TypeDef HID_cb = {

USBH_HID_InterfaceInit, USBH_HID_InterfaceDeInit, USBH_HID_ClassRequest, USBH_HID_Handle };

下表总结了HID内核模块实现的功能。 函数原型描述

表13MSC核心功能模块

Function Description

USBH_HID_InterfaceInit 解析接口和端点描述符,设置一个主模式通道来获取一个中断输入通道(为了获取HID报告)

USBH_HID_InterfaceDeInit 释放分配的中断输入通道

USBH_HID_ClassRequest 实现需要的HID鼠标和键盘的设备的类请求状态机(如:获取HID

报告描述符,设置空闲时间,设置协议)。

USBH_HID_Handle HID类核心状态机(处理中断输入传输) USBH_Get_HID_ReportDescriptor 获取HID报告描述符类请求 USBH_ParseClassDesc 功能用于解析HID报告描述符 USBH_Set_Idle 用于设置空闲时间的类请求

USBH_Set_Report 用于发送报告输出数据(不是用于演示软件)的类请求 USBH_Set_Protocol 用于设置HID协议:启动或报告的类请求 1. usb_set_protocol被调用用来设置启动协议模式。 HID鼠标和键盘的具体管理:

检测鼠标或键盘装置通过在功能函数usbh_hid_interfaceinit中解析接口描述符来完成。 对于每种具体类型的设备的初始化和收到的数据报告的解码是由结构类型hid_cb_typedef声明的两个功能 它的定义如下:

typedef struct HID_cb {

void (*Init) (void);

void (*Decode) (uint8_t *data); } HID_cb_TypeDef

上述结构在发现鼠标或键盘的情况下实施hid_mouse_cb和hid_mouse_cb声明如下: HID_cb_TypeDef HID_MOUSE_cb = {

MOUSE_Init,

MOUSE_Decode, };

HID_cb_TypeDef HID_KEYBRD_cb= {

KEYBRD_Init, KEYBRD_Decode };

表14。鼠标和键盘初始化和HID报告的解码功能 功能 描述

mouse_init 为USB鼠标初始化程序

mouse_decode 为鼠标解码HID报告(解码鼠标X,Y的坐标,按下按钮) keybrd_init 为USB键盘 初始化程序

1。azerty或QWERTY键盘的选择是通过在文件usbh_hid_keybrd.h中# qwerty_keyboard, # azerty_keyboard来声明的

3库用户API和回调函数 3.1库用户API

库用户API功能局限于以下两个功能:

■void usbh_process(void):此功能实现的核心状态机程序。它要从用户的主循环周期调用。 ■usbh_init:这个函数应该被称为主机的USB硬件与库的初始化。 下面为usbh_init的函数原型:

void USBH_Init(USB_OTG_CORE_HANDLE *pdev, USBH_Class_cb_TypeDef *class_cb, USBH_Usr_cb_TypeDef *usr_cb)

–pdev:指向USB主机寄存器核心结构的指针(为了将来需要)

–class_cb:指针指向类结构USBH_Class_cb_TypeDef,它既可以指向MSC_cb类来操作MSC设备也可以指向HID_cb类操作HID鼠标/键盘设备。

–usr _cb:指向USBH_Usr_cb_TypeDef类结构。这个结构定义独立类回调函数。(见3.2.2节)

3.2用户的回调函数

用户回调函数在用户模板文件usbh_usr.c中声明 定义了两种类型的用户回调:

■与类的相关操作的回调函数(MSC或HID)

■与类操作相独立的回调函数;他们主要是在枚举阶段被调用。这些回调是一个USBH_Usr_cb_TypeDef结构类型中定义 3.2.1类的回调函数 MSC用户回调函数功能

对于MSC,下面的回调函数被调用:int usr_msc_application(void)。

类的初始化结束后,这个函数被MSC状态机调用的为了帮助用户访问文件操作系统。 在这个回调函数,用户可以访问任何FAT文件系统(文件打开,文件读,写文件……)使用EFSL文件系统API。

同时,用户可以访问一个与库MSC类驱动不同的出口结构变量,usbh_msc_param。这个变量提供关于大容量存储的关键信息。

这个变量是使用一种类型massstorageparameter_typedef定义的结构,定义如下: typedef struct __MassStorageParameter {

uint32_t MSCapacity; /*MS device capacity in bytes */

uint32_t MSSenseKey; /*Request Sense SCSI command returned value */ uint16_t MSPageLength; /* MS device Page length */ uint8_t MSBulkOutEp; /* Bulk OUT endpoint address */ uint8_t MSBulkInEp; /*Bulk IN endpoint address */

uint8_t MSWriteProtect; /*Write protection status, 0: non protected, 1:protected */ } MassStorageParameter_TypeDef; HID用户的回调函数

对HID类,以下定义的回调函数:

■void USR_MOUSE_Init(void):用户的鼠标应用程序初始化 ■void USR_KEYBRD_Init(void):键盘应用的用户初始化

■void USR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef *data):这个回调函数 被调用当hid_mouse_data_typedef数据类型的输入参数有效时(见下面附注1)。 ■void USR_KEYBRD_ProcessData (uint8_t data):这个回调被调用时,一个新的ASCII字符型。其特征是输入参数数据。

注:1 HID_MOUSE_Data_TypeDef定义如下:

typedef struct _HID_MOUSE_Data {

uint8_t x; uint8_t y;

uint8_t z; /* Not Supported */

uint8_t button; /*Bitmap showing pressed buttons 1:pressed, 0: non pressed */ }

HID_MOUSE_Data_TypeDef; 3.2.2类独立的回调函数

这类独立的回调函数是在一个结构类型定义 usbh_usr_cb_typedef定义如下:

typedef struct _USBH_USR_PROP {

void (*Init)(void);

void (*DeviceAttached)(void); void (*ResetDevice)(void);

void (*DeviceDisconnected)(void); void (*OverCurrentDetected)(void);

void (*DeviceSpeedDetected)(uint8_t DeviceSpeed); void (*DeviceDescAvailable)(void *); void (*DeviceAddressAssigned)(void);

void (*ConfigurationDescAvailable)(USBH_CfgDesc_TypeDef *, USBH_InterfaceDesc_TypeDef *, USBH_EpDesc_TypeDef *);

void (*ManufacturerString)(void *); void (*ProductString)(void *); void (*SerialNumString)(void *); void (*EnumerationDone)(void);

USBH_USR_Status (*UserInput)(void);

void (*USBH_USR_DeviceNotSupported)(void); void (*UnrecoveredError)(void); }

USBH_Usr_cb_TypeDef; 以上回调函数功能描述如下。

–初始化:初始化时被usbh_init内核调用的功能。在这个功能,用户可以实现任何自己的应用程序相关的特定的初始化。

–deviceattached:当一个USB设备连接时被调用。它可以通过显示屏告诉用户任何有用的设备连接信息。

–devicereset:从主模式发出的USB复位命令。 –devicedisconnect:“当一个设备断开时调用。

–overcurrentdetected:对USB的VBUS电流进行检测时调用。 –devicespeeddetected:检测装置传输速率时调用 –devicedescavailable:设备描述符有效时调用 –deviceaddressassigned:当设备地址分配时调用。

–configurationdescavailable:当设备,接口和端点描述符可用时调用描述符是可用的 –manufacturingstring:提取制造商字符串时调用。 –productstring:提取设备字符串时调用。 –serialnumstring:序列号字符串提取时调用。 –enumerationdone:枚举完成时调用。

–userinput:枚举的过程结束后,提示用户进一步的行动,如按下一个按钮启动主模式的类操作

–usbh_usr_devicenotsupported:被检测的设备是在不在当前类驱动程序支持时调用。 –unrecoverederror:在“host_error_state”状态时调用内核的状态机。它允许用户处理任何错误,在液晶屏上显示一个错误的信息,例如。

注:1设备的速率信息是通过devicespeed参数返回。可能的值是:0x1对应全速设备,0x2对应低速设备。

2设备描述符的信息通过指针DeviceDesc返回,它指向usbh_devdesc_typedefdefined型结构如下:

typedef struct _DeviceDescriptor {

uint8_t bLength;

uint8_t bDescriptorType;

uint16_t bcdUSB; /* USB Specification Number which device complies too */ uint8_t bDeviceClass;

uint8_t bDeviceSubClass; uint8_t bDeviceProtocol; uint8_t bMaxPacketSize;

uint16_t idVendor; /* Vendor ID (Assigned by USB Org) */

uint16_t idProduct; /* Product ID (Assigned by Manufacturer) */ uint16_t bcdDevice; /* Device Release Number */

uint8_t iManufacturer; /* Index of Manufacturer String Descriptor */ uint8_t iProduct; /* Index of Product String Descriptor */

uint8_t iSerialNumber; /* Index of Serial Number String Descriptor */ uint8_t bNumConfigurations; /* Number of Possible Configurations */ }

USBH_DevDesc_TypeDef;

3设备配置信息(配置,接口和端点描述符)通过结构指针返回usbh_cfgdesc_typedef,usbh_interfacedesc_typedef和usbh_epdesc_typedefdefined定义如下: typedef struct _ConfigurationDescriptor {

uint8_t bLength;

uint8_t bDescriptorType; uint16_t wTotalLength; uint8_t bNumInterfaces; uint8_t bConfigurationValue; uint8_t iConfiguration; uint8_t bmAttributes; uint8_t bMaxPower; }

USBH_CfgDesc_TypeDef;

typedef struct _InterfaceDescriptor {

uint8_t bLength;

uint8_t bDescriptorType; uint8_t bInterfaceNumber;

uint8_t bAlternateSetting; /* Value used to select alternative setting */ uint8_t bNumEndpoints; /* Number of Endpoints used for this interface */ uint8_t bInterfaceClass; /* Class Code (Assigned by USB Org) */

uint8_t bInterfaceSubClass; /* Subclass Code (Assigned by USB Org) */ uint8_t bInterfaceProtocol; /* Protocol Code */

uint8_t iInterface; /* Index of String Descriptor Describing this interface */ }

USBH_InterfaceDesc_TypeDef; typedef struct _EndpointDescriptor {

uint8_t bLength;

uint8_t bDescriptorType;

uint8_t bEndpointAddress; /* indicates what endpoint this descriptor is describing */

uint8_t bmAttributes; /* specifies the transfer type. */

uint16_t wMaxPacketSize; /* Maximum Packet Size this endpoint is capable of sending or receiving */

uint8_t bInterval; /* is used to specify the polling interval of certain transfers. */ }

USBH_EpDesc_TypeDef;

4为了移动内核状态机到host_class_request状态,userinput回调函数应该返回值usbh_usr_resp_ok类型的usbh_usr_status typedef enum {

USBH_USR_NO_RESP = 0, /*no response from user */ USBH_USR_RESP_OK = 1, }

USBH_USR_Status; 4演示程序

4.1大批量存储类的演示 4.1.1软件初始化

以下代码从main.c文件提取代码。文件显示调用usbh_processfor之前管理内核状态机必要的初始化。

usb_init被定义类驱动程序的参数调用,这是MSC类驱动,并使用用户回调函数 int main(void) {

/* Setup STM32 Hardware Configuration */ BSP_Init();

/* Init Host Library */

USBH_Init(&USB_OTG_FS_dev, &MSC_cb , &USR_Callbacks); while (1) {

/* Host Task handler */ USBH_Process(); } }

4.1.2大批量存储设备枚举

当附加一个全/低速设备的stm3210c_eval板,LCD显示下面的文字(例如,当挂载Kingston DataTraveler G2 u盘): 图6。MS设备枚举

4.1.3访问大批量存储设备的内容

枚举结束后,按下按钮B3显示屏幕下方,它提供以下信息: ■快闪随身碟容量(以兆字节) ■根文件夹中的文件

图7。MS设备内容的访问

请注意,在浏览大批量存储设备内容后,一个简单的文本文件“hostdemo.txt”写入闪存随身碟(假设它没有写保护)。

为了测试文件的读访问,用户可以从液晶显示屏上显示图像幻灯片,假设一些BMP图像在闪光的随身碟的根文件夹是可用的。

注:1 BMP图像与LCD屏幕大小在项目文件夹提供。 2如果设备是写保护的,则在液晶屏上会显示一条警告消息。

3带有多个逻辑单元的大批量存储设备不支持(错误信息会在液晶屏上显示)。

4如果没有BMP图像在u盘的根文件夹可用,一个警告信息会显示在液晶屏幕,2秒后,主模式重新初始化(重新启动u盘枚举)。 4.1.4u盘试验

由于嵌入式USB主模式是有限的,这些互操作性测试: 1。枚举,

2。与设备连接冷启动, 3。热拔出/连接 4。浏览根含量,

5。创建“hostdemo.txt”文件,

6。从设备读取数据到液晶屏:图像幻灯片, 7。发送消息到TFT-LCD(启动失败就提示)

已成功地应用于下表选择不同的闪光pendrives使用STM32F1057 / USB主模式库提供大批量存储示范的例子。 4.2HID鼠标和键盘演示 4.2.1初始化

与大容量存储设备一样(见第4.1.1),除了HID类驱动程序在usbh_initfunction选择: /* Init Host Library */

USBH_Init(&USB_OTG_FS_dev, &HID_cb , &USR_Callbacks); 4.2.2鼠标或键盘设备枚举

类似的大容量存储设备(见4.1.2节) 鼠标演示

鼠标设备枚举后,按下按钮,B3显示下面的屏幕上,这

显示鼠标的3个按钮,指针(绿十字)。 图8。鼠标演示

Keyboard demo

After keyboard enumeration, pressing button B3 displays an LCD screen where the user can

type some text:

Figure 9. Keyboard demo

演示的脚印 5已知的限制

的USB主模式协议栈STM32F105 / 7具有以下称当前的版本 局限性:

1。它只支持两个USB标准级的应用,即:

A)大批量存储类(MSC)访问USB闪存pendrives, B)人机接口设备(HID)的键盘和鼠标设备类。 2。它只支持一个接口和一个配置的选择(默认设置)。 3。它不支持多个逻辑单元的大容量存储设备。 4。它具有EFSL FAT文件系统支持:

A)页的大小是固定的512个字节。Flash pendrives高粒度不支持。

B)不支持长文件名和Unicode。

5。很短的时间之间的延迟装置脱离/连接可能会导致异常操作。 6。兼容性问题已经遇到的一些设备(TA BL E 1 5未列出)在枚举相。

7。连接和断开一个不支持的类设备然后将后支持类设备,枚举是正确的,但设备不能访问。一个设备的复位是必要的。

联系客服:779662525#qq.com(#替换为@)