stm32f107 usbh主模式库解析

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

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键盘 初始化程序

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