STM32 USB Host 同时连接多个设备样例(如鼠标和键盘)
在网上搜了很多都是USB Host单独连接鼠标或键盘的样例, 而当前很多无线鼠标键盘都是并到一个USB口上的, 也就是同一个USB有两个interface. 而官方提供的USB Host库中只会对一个Interface进行处理, 要么键盘要么鼠标, 所以为了能够同时使用键盘和鼠标要对USB Host库进行修改才行.
具体修改如下:
首先使用CubeMX创建了一个带USB HID类功能的工程, 创建步骤很简单网上有很多文档不在这里讨论.
接着进入正题, 修改USB Host库文件.
- usbh_def.h
修改USBH_ClassTypeDef, 使当前Class支持多接口:
/* USB Host Class structure */
typedef struct
{
const char *Name;
uint8_t ClassCode;
USBH_StatusTypeDef(*Init)(struct _USBH_HandleTypeDef *phost);
USBH_StatusTypeDef(*DeInit)(struct _USBH_HandleTypeDef *phost);
USBH_StatusTypeDef(*Requests)(struct _USBH_HandleTypeDef *phost);
USBH_StatusTypeDef(*BgndProcess)(struct _USBH_HandleTypeDef *phost);
USBH_StatusTypeDef(*SOFProcess)(struct _USBH_HandleTypeDef *phost);
/* [ */
void *pData[USBH_MAX_NUM_INTERFACES]; /* HID interfaces Handle */
uint8_t InterfaceNum; /* interface 数量 */
__IO uint8_t CurrInterface; /* 当前interface */
/* ] */
} USBH_ClassTypeDef;
修改HID_HandleTypeDef, 记录interface的协议类型:
/* Structure for HID process */
typedef struct _HID_Process
{
uint8_t OutPipe;
uint8_t InPipe;
HID_StateTypeDef state;
uint8_t OutEp;
uint8_t InEp;
HID_CtlStateTypeDef ctl_state;
FIFO_TypeDef fifo;
uint8_t *pData;
uint16_t length;
uint8_t ep_addr;
uint16_t poll;
uint32_t timer;
uint8_t DataReady;
HID_DescTypeDef HID_Desc;
USBH_StatusTypeDef