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 {