stm32f107 usbh主模式库解析_第1页
stm32f107 usbh主模式库解析_第2页
stm32f107 usbh主模式库解析_第3页
stm32f107 usbh主模式库解析_第4页
stm32f107 usbh主模式库解析_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

简介STM32F105/7USB主模式库的目的是为USB主模式应用程序开发提供一个框架。库代表了在STM32F105/7之上的USBOTG周边底层驱动。它实现必要的软件块,目的是便于USB的主模式应用程序开发。STM32F105/7USB主模式协议栈的库支持以下两个USB标准应用类:■大批量存储类(MSC)用于访问USB闪存pendrives■人机接口设备类(HID)用于键盘和鼠标设备目录.68USB.68USB主模式的库结构 8 9 8 9 9 10 112.2库内核的描述。 2.2.1内核状态机。 2.2.2设备枚举。 2.2.3控制传输状态机。 .……11122.2.4USB的I/O请求模块。.……11122.2.5主模式通道控制模块。•…2.3类驱动程序。 13USB2.3类驱动程序。 13USB大批量存储类(MSC)驱动程序。 USB人机接口设备类(HID)鼠标键盘设备驱动。3库用户API和回调函数。3.1库用户API。 3.2用户的回调函数。……3.2.1类的回调函数。…….3.2.2独立类的回调函数。4演示固件。。。13172020 20 20 22254.1大容量存储类演示。…。4.1大容量存储类演示。…。。。254.1.1软件初始化。。。。。254.1.2大容量存储设备枚举。。。。。254.1.3访问大容量存储器内容。。。。。264.1.4Flashpendrive测试。。。。。264.2HID鼠标和键盘演示。。。。。274.1.2大容量存储设备枚举。。。。。254.1.3访问大容量存储器内容。。。。。264.1.4Flashpendrive测试。。。。。264.2HID鼠标和键盘演示。。。。。274.2.1初始化准备。。。。。274.2.2鼠标或键盘设备枚举。。。。。274.2.3.鼠标演示。。。。。284.2.4键盘演示。。。。。28TOC\o"1-5"\h\z5已知的限制。 296修订历史。 30listof表表1内核文件 7表2class文件 7表3枚举请求 11表4USB的I/O请求模块 12表5主模式通道控制模块 12表6大容量存储类模块 13表7MSC的内核模块 15表8MSCBOT模块 15表9MSCSCSI命令 16表10MSC文件系统接口功能 16表11efsl主API 17表12HID类模块 17表13MSC内核模块的功能 18表14鼠标和键盘初始化和HIDReport解码功能 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。键盘演示。 281USB主模式包文件夹结构STM32的USB主模式封装库具有以下文件结构:图1。文件夹结构ESTM32_USB_HOST_LIB_PACKAGE―i-LibrairiesJ1CMSIS-BSTM32_US0_HOST_Library—Class-iHID□MSC-rCore_HSTM32_USB_HOST_DriverTSTM3£F1O)r_SttlPeriph_Driver_HProject—iUSB_HOST_Example&—HID_KBrd_MousefflMSC—i-Utilities一STM32_EVAL」STM3210C_EVALThilrd_Party—efsl封装库文件夹具有如下组织结构■库CMSIS:微微控制器软件接口标准文件一STM32_USB_HOST_Library:USB主模式库文件一STM32_USB_HOST_Driver:STM32USB2.0OTG夕卜设低电平驱动STM32F10x_StdPeriph_Driver:STM32标准外设驱动程序■项目-_USB_HOST_EXAMPLES/HID_KBrd_Mouse:鼠标和HID键盘演示文件-USB_HOST_EXAMPLES/MSC:大容量存储类的演示文件■公用事业-STM32_EVAL/STM3210C_EVAL:STM3210C_EVALevalboard功能函数(GPIO,液晶显示,时钟配置,……)Third_Party/efsl:EFSLFAT文件系统,用于大容量存储例程USB主模式库文件结构USB主模式库文件夹”stm32_usb_host」ibrary”是由两个主要子文件夹构成:■内核:该文件夹包含USB主模式库内核文件。这些文件实现必要的功能,状态机和数据结构所需的:-设备的识别和枚举,-USB控制传输管理,-为解决控制,大批量或中断USB事务而设立的低级功能,-USB主模式通道配置。■类:这个文件夹包含USB类管理所必需的文件。USB主模式库支持两种USB类:

-MSC:大批量存储类-HID:为启动鼠标和键盘设备的人机接口设备类下表详体说明了内核文件和类文件:使内核,设备枚举和控制权转移的状态机生效USB标准请求需要在设备枚举(USB9章)USB的I/O请求:USB事务包括控制,大批量和中断通道请求USB使内核,设备枚举和控制权转移的状态机生效USB标准请求需要在设备枚举(USB9章)USB的I/O请求:USB事务包括控制,大批量和中断通道请求USB主模式控制信道(信道配置,分配,释放……)在USB主模式库中广泛使用的宏定义DescriptionHID类管理HID鼠标的具体例程HID键盘的具体例程大批量存储类管理B0T”Bulk-0nly传输协议的实现SCSI标准命令的执行一个带有文件操作系统用于文件访问的接口usbh_hid_core.c/.hHIDusbh_hid_mouse.c./husbh_hid_keyboard.c/.husbh_msc_core.c/.hMSCusbh_msc_bot.c./.husbh_msc_scsi.c/.husbh_msc_fs_interface.c./h2USB主模式的库结构2.1库框图结构USB主模式库具有以下框图结构:图2.USB主模式库框图结构UserapplicationLibraryuserAPIs&callbacklunctions? 4STMIS2USBOTGSTMIS2USBOTGperipheralIdw-leveldriver$貲tem如上图所示,USB主模式库由两个主要部分组成:内核和类驱动程序。库的核心主要由五块构成:■内核状态机■设备枚举■控制传输状态机■USB的I/O请求■USB主模式通道控制对于所有与类相关的操作,内核状态机都是操作一个特定的类驱动。在USB主模式库目前的版本中,两类驱动程序-HID和MSC已经实现。这类驱动程序使用内核层对底层驱动通信进行服务。内核和类驱动程序与用户的应用程序交流都主要是通过定义回调函数来实现的。不同的主模式模块库描述如下。2.2描述库内核2.2.1内核状态机下图描述了库的状态机:内核状态机有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_descriptorHID)。完成所需要的类请求后,内核移动至host_class状态。■host_class:在这种状态下,类状态机被调用类相关的操作(非控制和控制操作)。■host_ctrl_xfer:,无论何时当有一个控制转移请求时进入此状态。■host_error_state:无论何时从任何库状态机有一个不可恢复的错误时进入此状态;在这种情况下,一个用户调用回调函数(例如显示一条不可恢复的错误消息)。然后主模式库重新初始化。内核状态机的过程是由usbh_process功能函数实现。这个函数应该从应用程序的主循环周期调用。USB主模式库初始化功能由函数usbh」nit实现。这个函数这个函数应该在初始化过程中由用户应用程序调用。更多这方面的细节在section3提供。2.2.2设备枚举在检测完全速或低速设备之后,主库通过一个基本的设备枚举继续运行。下面的关系图显示了参与设备枚举的不同的步骤。图4。设备枚举Gelfirst8bytesofdevicedescriptorUSBresetGetfulldevicedescriptorSetdeviceaddressGatconfigurationdescriplorGelstringdescriptors

(MFCdproductandserialnumber}Setdeviceconfiguration枚举状态机是在库的功能函数USBH_HandleEnum中实现,这是从内核状态机过程调用。USBH_HandleEnum功能函数调用下面的库路径(在文件usbh_stdreq.c中实施):表3。设备枚举请求FunctionDescriptionFunctionUSBH_Get_CfgDescUSBHGetDevDesc获取配置描述符请求USBH_Get_CfgDescUSBHGetDevDesc获取配置描述符请求获取设备描述符请求USBH_Get_StringDescUSBH_GetDescriptorUSBH_SetCfg(1)USBH_SetAddress2)USBH_ClrFeature得到字符串描述符的请求一般取描述符请求配置请求设置地址的请求清除功能请求注:1usbh_setcfg调用选择默认的配置(配置0)2usbh_setaddress要求设置设备地址为0x1。用户回调函数将在用户枚举阶段结束时调用以使过程的描述信息(如显示的描述符的数据,例如)。为更多的细节,请参阅第3节。****************************************************************************************************2.2.3控制传输状态机当有控制传输需求时从内核或类驱动进入控制传输状态机,。该状态机实现了标准的控制转移阶段,即安装阶段,可选的数据阶段,最后,状态阶段。控制传输状态机实现的功能是在功能函数USBH_HandleControl中。它是从内核状态机程序中调用。2.2.4USB的I/O请求模块USB的I/O请求模块位于内核的低层。它的接口与关于控制,大批量,中断等的USB事务的USB底层驱动相连。表4显示在I/O请求模块的主要功能。这些功能在文件usbh_ioreq.c中实施。表4USB的I/O请求模块FunctionUSBH_CtlSendSetupUSBH_CtlSendDataUSBH_CtlReceiveDataUSBH_CtlReqUSBH_BulkSendDataUSBH_BulkReceiveDataUSBH_InterruptSendDataUSBH_InterruptReceiveDataFunctionUSBH_CtlSendSetupUSBH_CtlSendDataUSBH_CtlReceiveDataUSBH_CtlReqUSBH_BulkSendDataUSBH_BulkReceiveDataUSBH_InterruptSendDataUSBH_InterruptReceiveData2.2.5主模式通道控制模块关于设置事务关于控制数据输出阶段的事务关于控制数据输入阶段的事务关于控制传输(设置,数据,状态阶段)的高级功能关于大批量输出的事务关于大批量输入的事务关于中断输出事务关于中断输入事务主模式通道控制模块位于较低的内核层,它允许把主模式通道配置为一个特定的操作(控制,大批量或中断传输型)也允许设置一个选定的主模式通道为设备端点来创建一个USB通道。对于USB通道控制模块的主要功能是在表6定义。这些功能在文件usbh_hcs.c中实施。表5。主模式通道控制模块FunctionUSBH_Open_ChannelUSBH_Modify_ChannelUSBH_Alloc_ChannelUSBH_Free_ChannelDescription开放和配置一个新的主模式通道修改现有的主模式通道分配一个主模式通道到设备的端点(一个USB通道创建)释放一个主模式通道2.3类驱动程序在枚举的结束时,内核通过调用特定功能的类驱动程序来管理所有的与类相关的操作。请注意,某些类驱动的选择不是基于设备枚举的结果,而是当初始化主模式库通过调用函数usbh」nit"预先定义的"。

类驱动通过使用结构类型usbh_class_cb_typedef来实现:typedefstruct_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.1USB大批量存储类(MSC)驱动程序的目的是支持常见的USB接口的u盘,使用BOT”Bulk-Only传输协议。以下模块,位于class'MSC文件夹,用于实现MSC驱动:表6。大批量存储类模块Moduleusbh_msc_core.c/.husbh_msc_bot.c./.husbh_msc_scsi.c/.husbh_msc_fs_interface.c./hModuleusbh_msc_core.c/.husbh_msc_bot.c./.husbh_msc_scsi.c/.husbh_msc_fs_interface.c./hMSC内核状态机的实现BOT”Bulk-Only传输协议的实现SCSI命令的实现文件操作系统访问文件的接口功能图表5显示了模块之间的相互作用。图5。MSC驱动器结构框图操作流程描述:USBrequestsUSBrequestsMSC内核状态机通过必需的设备初始化来启动,这是:■通过get_max_lun检测目前设备的逻辑单元的数目的类请求。请注意,只有一个逻辑单元的设备支持。■bot_reset是发出复位设备BOT状态机的类请求。■关于SCSI命令:mode_sense是为了检测设备是否写保护,read_capacity用于检测u盘容量。经过上述设备初始化,MSC内核状态机调用应用程序的用户回调函数。用户回调可以让文件系统访问任何类型的文件。此操作解释成一个逻辑页读取或写入操作。文件系统接口为文件系统和MSC驱动器提供连接。在SCSI水平,逻辑页读取或写入操作转换为SCSI命令:READ(10)orWRITE(10)。这些命令"Bulk-OnlyTranport”协议传输到u盘。BOT层状态机是关于使用必要的USB内核I/O请求模块进行大批量输入输出传输。MSC模块描述如下。MSC内核模块:MSC内核模块在"usb_msc_core.c”实现MSC驱动,它通过usbh_class_cb_typedef定义msc_cbof结构类型(见2.3节)。USBH_Class_cb_TypeDefMSC_cb={USBH_MSC_InterfaceInit,USBH_MSC_InterfaceDeInit,USBH_MSC_ClassRequest,USBH_MSC_Handle,};表7.MSC内核模块FunctionUSBH_MSC_InterfaceInitDescription解析接口和端点描述符和配置主模式通道(大批量输入输出通道)USBH_MSC_InterfaceDeInitUSBH_MSC_ClassRequest去初始化路径(释放主模式通道)在MSC的情况下,此功能只将库内核状态机转移到host_class状态USBH_MSC_HandleUSBH_MSC_Issue_BOTUSBH_MSC_Issue_GETMaxLUNUSBH_MSC_ErrorHandle执行MSC内核状态机关于BOT复位类请求关于get_max_lun类请求MSC错误处理MSCBOT模块:MSC”Bulk-Only传输”(BOT)模块执行了传输协议通过发送SCSI命令(READ(10)orWRITE(10))。该模块在文件“usbh_msc_bot.c实现。关于BOT协议的详细信息,请参阅大批量存储类文件。BOT模块具有以下功能:

表&MSCBOT模块描述初始化状态机描述初始化状态机BOT传输状态机usbh_msc_initusbh_msc_handlebotxferMSCSCSI模块:SCSI“小型计算机系统接口”模块在“usb_msc_scsi.C”在BOT顶部。它在需要访问u盘时执行SCSI命令集。需要执行的命令:表9.MSCSCSI命令描述逻辑块读命令描述逻辑块读命令逻辑块写入命令检查设备状态命令请求读取设备容量命令检查大容量存储设备写保护状态命令接收错误消息命令usbh_msc_read10usbh_msc_write10usbh_msc_testunitreadyusbh_msc_readcapacity10usbh_msc_modesense6usbh_msc_requestsenseMSC文件系统接口模块MSC文件系统接口模块在“usbh_msc_fs_interface.C”允许文件系统与MSC驱动器连接。本模块必须移植到选定的文件系统。当前的USB主模式库包来自开源的,支持EFSLFAT文件系统(见下一节对EFSL概述API)。文件系统接口实现的功能:表10.MSC文件系统接口功能功能描述if_initinterfaceif_readbufif_writebufif_testunitreadyif_requestsense注:对EFSL文件系统,EFSL文件系统概述允许初始化文件系统(例如获取u盘容量)逻辑页读取功能接口逻辑页写功能接口测试单元是否准备好功能使用SCSI接口功能命令来请求错误信息功能接口页面大小是固定的512个字节。对于更大的页面的U盘不支持。EFSL”嵌入式文件系统库”是一个开放源代码的文件系统库。支持嵌入式设备和微软FAT12,16和32的文件系统。下表总结了EFSL主要api功能。Table11.EFSL主要的APIFunction Prototype Descriptionefs_init esint8efs_init(EmbeddedFileSystem*efs,eint8*opts);初始化文件系统file_fopenesint8file_fopen(File*file,FileSystem*fs,eint8*filename,eint8mode);打开一个文件file_fcloseesint8file_fclose(File*file);

关闭一个文件file_readeuint32file_read(File*file,euint32size,euint8*buf);读文件file_writeeuint32file_write(File*file,euint32size,euint8*buf);写文件Rmfile esint16rmfile(FileSystem*fs,euint8*filename);移除文件mkdir esint8mkdir(FileSystem*fs,eint8*dirname);创建字典ls_openDir esint8ls_openDir(DirList*dlist,FileSystem*fs,eint8*dirname);打开字典ls_getNextesint8ls_getNext(DirList*dlist);获取另一个文件字典2.3.2USB人机接口设备(HID)类驱动鼠标键盘设备V1.0USB主机库中的HID类目的是实现支持HID鼠标和键盘设备。HID报告通过中断输入传输收到。以下模块,位于class'HID文件夹,用于执行HID类:Table12.Table12.HIDclassmodules队列(模块)usbh_hid_core.c/.husbh_hid_mouse.c/Husbh_hid_keyboard.c/.h描述这个模块执行HID类核心状态机HID鼠标具体例程HID键盘的具体例程各模块的主要功能如下。HID类核心:HID核心模块在"usb_hid_core.C"通过usbh_class_cb_typedef定义hid_cb类结构实现了HID类驱动程序(见2.3节)。USBH_Class_cb_TypeDefHID_cb={USBH_HID_InterfaceInit,USBH_HID_InterfaceDeInit,USBH_HID_ClassRequest,USBH_HID_Handle};下表总结了HID内核模块实现的功能。函数原型描述表13MSC核心功能模块Function DescriptionUSBH_HID_InterfaceInit解析接口和端点描述符,设置一个主模式通道来获取一个中断输入通道(为了获取HID报告)

USBH_HID_InterfaceDelnit释放分配的中断输入通道USBH_HID_ClassRequest 实现需要的hid鼠标和键盘的设备的类请求状态机(如:获取hid报告描述符,设置空闲时间,设置协议)。USBH_HID_HandleHID类核心状态机(处理中断输入传输)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」nterfaceinit中解析接口描述符来完成。对于每种具体类型的设备的初始化和收到的数据报告的解码是由结构类型hid_cb_typedef声明的两个功能它的定义如下:typedefstructHID_cb{void(*Init)(void);void(*Decode)(uint8_t*data);}HID_cb_TypeDef上述结构在发现鼠标或键盘的情况下实施hid_mouse_cb和hid_mouse_cb声明如下:HID_cb_TypeDefHID_MOUSE_cb={MOUSE_Init,MOUSE_Decode,};HID_cb_TypeDefHID_KEYBRD_cb={KEYBRD_Init,KEYBRD_Decode};表14。鼠标和键盘初始化和HID报告的解码功能功能mouse功能mouse」nitmouse_decodekeybrd_init为USB鼠标初始化程序为鼠标解码HID报告(解码鼠标X,Y的坐标,按下按钮)为USB键盘初始化程序1°azerty或QWERTY键盘的选择是通过在文件usbh_hid_keybrd.h中#qwerty_keyboard,#azerty_keyboard来声明的3库用户API和回调函数3.1库用户API库用户API功能局限于以下两个功能:■voidusbh_process(void):此功能实现的核心状态机程序。它要从用户的主循环周期调用。■usbh_init:这个函数应该被称为主机的USB硬件与库的初始化。下面为usbh」nit的函数原型:voidUSBH_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,下面的回调函数被调用:intusr_msc_application(void)。类的初始化结束后,这个函数被MSC状态机调用的为了帮助用户访问文件操作系统。在这个回调函数,用户可以访问任何FAT文件系统(文件打开,文件读,写文件 )使用EFSL文件系统API。同时,用户可以访问一个与库MSC类驱动不同的出口结构变量,usbh_msc_param。这个变量提供关于大容量存储的关键信息。这个变量是使用一种类型massstorageparameter_typedef定义的结构,定义如下:typedefstruct__MassStorageParameter{uint32_tMSCapacity;/*MSdevicecapacityinbytes*/uint32_tMSSenseKey;/*RequestSenseSCSIcommandreturnedvalue*/uint16_tMSPageLength;/*MSdevicePagelength*/uint8_tMSBulkOutEp;/*BulkOUTendpointaddress*/uint8_tMSBulkInEp;/*BulkINendpointaddress*/uint8_tMSWriteProtect;/*Writeprotectionstatus,0:nonprotected,1:protected*/}MassStorageParameter_TypeDef;HID用户的回调函数对HID类,以下定义的回调函数:■voidUSR_MOUSE_Init(void):用户的鼠标应用程序初始化■voidUSR_KEYBRD_Init(void):键盘应用的用户初始化■voidUSR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef*data):这个回调函数被调用当hid_mouse_data_typedef数据类型的输入参数有效时(见下面附注1)。■voidUSR_KEYBRD_ProcessData(uint8_tdata):这个回调被调用时,一个新的ASCII字符型。其特征是输入参数数据。注:1HID_MOUSE_Data_TypeDef定义如下:typedefstruct_HID_MOUSE_Data{uint8_tx;uint8_ty;uint8_tz;/*NotSupported*/uint8_tbutton;/*Bitmapshowingpressedbuttons1:pressed,0:nonpressed*/}HID_MOUSE_Data_TypeDef;3.2.2类独立的回调函数这类独立的回调函数是在一个结构类型定义usbh_usr_cb_typedef定义如下:typedefstruct_USBH_USR_PROP{void(*Init)(void);void(*DeviceAttached)(void);void(*ResetDevice)(void);void(*DeviceDisconnected)(void);void(*OverCurrentDetected)(void);void(*DeviceSpeedDetected)(uint8_tDeviceSpeed);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」nit内核调用的功能。在这个功能,用户可以实现任何自己的应用程序相关的特定的初始化。-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型结构如下:typedefstruct_DeviceDescriptor{uint8_tbLength;uint8_tbDescriptorType;uint16_tbcdUSB;/*USBSpecificationNumberwhichdevicecompliestoo*/uint8_tbDeviceClass;uint8_tbDeviceSubClass;uint8_tbDeviceProtocol;uint8_tbMaxPacketSize;uint16_tidVendor;/*VendorID(AssignedbyUSBOrg)*/uint16_tidProduct;/*ProductID(AssignedbyManufacturer)*/uint16_tbcdDevice;/*DeviceReleaseNumber*/uint8_tiManufacturer;/*IndexofManufacturerStringDescriptor*/uint8_tiProduct;/*IndexofProductStringDescriptor*/uint8_tiSerialNumber;/*IndexofSerialNumberStringDescriptor*/uint8_tbNumConfigurations;/*NumberofPossibleConfigurations*/}USBH_DevDesc_TypeDef;3设备配置信息(配置,接口和端点描述符)通过结构指针返回usbh_cfgdesc_typedef,usbh_interfacedesc_typedef和usbh_epdesc_typedefdefined定义如下:typedefstruct_ConfigurationDescriptor{uint8_tbLength;uint8_tbDescriptorType;uint16_twTotalLength;uint8_tbNumInterfaces;uint8_tbConfigurationValue;uint8_tiConfiguration;uint8_tbmAttributes;uint8_tbMaxPower;}USBH_CfgDesc_TypeDef;typedefstruct_InterfaceDescriptor{uint8_tbLength;uint8_tbDescriptorType;uint8_tbInterfaceNumber;uint8_tbAlternateSetting;/*Valueusedtoselectalternativesetting*/uint8_tbNumEndpoints;/*NumberofEndpointsusedforthisinterface*/uint8_tbInterfaceClass;/*ClassCode(AssignedbyUSBOrg)*/uint8_tbInterfaceSubClass;/*SubclassCode(AssignedbyUSBOrg)*/uint8_tbInterfaceProtocol;/*ProtocolCode*/uint8_tiInterface;/*IndexofStringDescriptorDescribingthisinterface*/}USBH_InterfaceDesc_TypeDef;typedefstruct_EndpointDescriptor{uint8_tbLength;uint8_tbDescriptorType;uint8_tbEndpointAddress;/*indicateswhatendpointthisdescriptorisdescribing*/uint8_tbmAttributes;/*specifiesthetransfertype.*/uint16_twMaxPacketSize;/*MaximumPacketSizethisendpointiscapableofsendingorreceiving*/uint8_tbInterval;/*isusedtospecifythepollingintervalofcertaintransfers.*/}USBH_EpDesc_TypeDef;4为了移动内核状态机到host_class_request状态,userinput回调函数应该返回值usbh_usr_resp_ok类型的usbh_usr_statustypedefenum{USBH_USR_NO_RESP=0,/*noresponsefromuser*/USBH_USR_RESP_OK=1,}USBH_USR_Status;4演示程序4.1大批量存储类的演示4.1.1软件初始化以下代码从main.c文件提取代码。文件显示调用usbh_processfor之前管理内核状态机必要的初始化。usb_init被定义类驱动程序的参数调用,这是MSC类驱动,并使用用户回调函数intmain(void){/*SetupSTM32HardwareCofiguration*/BSP_Init();/*InitHostLibrary*/USBH_Init(&USB_OTG_FS_dev,&MSC_cb,&USR_Callbacks);while(1){/*HostTaskhandler*/USBH_Process();}}4.1.2大批量存储设备

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论