stm32f107 usbh主模式库解析(2)

2018-12-19 23:21

■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);


stm32f107 usbh主模式库解析(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2015年夏最新电大城市管理学形成性考核册作业及答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: