■内核状态机 ■设备枚举 ■控制传输状态机 ■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驱动器结构框图