typedef struct _Host_TypeDef { HOST_State gState; /* Host State Machine Value */ HOST_State gStateBkp; /* backup of previous State machine value */ ENUM_State EnumState; /* Enumeration state Machine */ CMD_State RequestState; USBH_Ctrl_TypeDef Control; USBH_Device_TypeDef device_prop; USBH_Class_cb_TypeDef *class_cb; USBH_Usr_cb_TypeDef *usr_cb; } USBH_HOST, *pUSBH_HOST;解析这个结构体
时间: 2025-08-21 13:02:40 AIGC 浏览: 25
<think>我们正在解析USBH_HOST结构体(在STM32 USB主机库中通常定义为USBH_HandleTypeDef)的成员及其作用。根据引用[1],这个结构体是管理主机库的核心数据结构。同时,引用[2]和[4]提到USB主机在处理复合设备(如键鼠一体)时需要对多个接口进行处理,这也与USBH_HOST结构体的管理有关。引用[3]则展示了在usb_host.c中如何通过回调函数处理数据接收,这涉及到USBH_HOST结构体中的回调函数成员。
下面我们将详细解析USBH_HOST结构体的各个成员变量及其作用。注意,不同版本的库可能成员略有不同,但核心成员基本一致。
### USBH_HOST(USBH_HandleTypeDef)结构体成员详解
1. **gState (全局状态)**
- **类型**:`USBH_StateTypeDef`
- **作用**:表示USB主机库的全局状态,例如:`HOST_IDLE`(空闲状态)、`HOST_DEV_DISCONNECTED`(设备断开连接状态)、`HOST_DEV_CONNECTED`(设备已连接状态)、`HOST_ENUMERATION`(枚举状态)、`HOST_CLASS_REQUEST`(类请求状态)等。这个状态机驱动整个USB主机协议栈的流程。
2. **eState (枚举状态)**
- **类型**:`USBH_StateTypeDef`
- **作用**:在全局状态为枚举状态(`HOST_ENUMERATION`)时,eState进一步细分子状态,例如:`ENUM_GET_DEVICE_DESC`(获取设备描述符)、`ENUM_SET_ADDRESS`(设置设备地址)、`ENUM_GET_CONFIG_DESC`(获取配置描述符)等。它控制枚举过程的每一步。
3. **device_prop (设备属性)**
- **类型**:`USBH_DevicePropTypeDef`
- **作用**:存储已连接设备的属性信息,包括设备描述符、配置描述符、接口描述符、端点描述符等。这些信息在枚举过程中被填充,后续用于配置设备和选择类驱动。
4. **pActiveClass (活动类驱动指针)**
- **类型**:`USBH_ClassTypeDef*`
- **作用**:指向当前活动设备类的驱动结构体。这个结构体包含了类特定的回调函数(如初始化、数据处理等)。例如,当设备是HID类时,指向`HID_ClassDriver`;当设备是MSC类时,指向`MSC_ClassDriver`。对于复合设备(如引用[2]和[4]提到的键鼠一体设备),可能需要处理多个接口,此时类驱动需要能够管理多个实例。
5. **pData (硬件句柄指针)**
- **类型**:`void*`
- **作用**:指向底层硬件控制句柄,通常是`HCD_HandleTypeDef`(如引用[1]所述)或`USB_OTG_CORE_HANDLE`。这个成员实现了硬件抽象层,将USB主机库与具体的USB控制器硬件(如USB OTG)解耦。
6. **Pipe (管道数组)**
- **类型**:`USBH_PipeTypeDef[]`
- **作用**:管道是USB主机与设备端点之间通信的逻辑通道。这个数组管理所有打开的管道资源。每个管道对应一个端点地址、传输类型(控制、批量、中断、等时)和带宽配置。索引0通常分配给控制端点(EP0)。
7. **Control (控制传输状态机)**
- **类型**:`USBH_CtrlTypeDef`
- **作用**:管理控制传输的状态和缓冲区。控制传输用于枚举和类特定请求,分为SETUP、DATA(可选)和STATUS三个阶段。该结构体包含当前控制传输的状态、数据缓冲区、剩余长度等信息。
8. **pUser (用户数据指针)**
- **类型**:`void*`
- **作用**:指向用户自定义数据的指针,通常用于在回调函数中传递应用层上下文。例如,在引用[3]中,USBH_CDC_ReceiveCallback函数通过phost(即USBH_HandleTypeDef指针)访问接收到的数据,如果应用需要额外的状态信息,可以通过pUser传递。
9. **pConnect_cb (连接回调函数指针)**
- **类型**:`void (*)(void*)`
- **作用**:当USB设备成功连接并枚举后,会调用此回调函数。应用程序可以在此函数中执行初始化操作(如打开设备、开始数据传输)。
10. **pDisconnect_cb (断开连接回调函数指针)**
- **类型**:`void (*)(void*)`
- **作用**:当USB设备断开连接时调用,用于清理资源(如关闭管道、重置状态)。
11. **Timer (超时计时器)**
- **类型**:`uint32_t`
- **作用**:用于各种操作(如控制传输、批量传输)的超时管理。计时器递减计数,超时则触发错误处理。
12. **其他成员**
- 根据库版本的不同,可能还包括:
- `current_interface`:当前正在处理的接口索引(用于复合设备)。
- `pClassDrivers`:类驱动列表(支持多个类驱动)。
- `ep0_size`:控制端点0的最大包大小。
### 成员交互示例(以设备枚举为例)
1. 设备连接后,`gState`从`HOST_IDLE`变为`HOST_ENUMERATION`。
2. `eState`在枚举子状态之间迁移:
- `ENUM_GET_DEVICE_DESC`:通过控制传输(使用`Control`成员)获取设备描述符。
- `ENUM_SET_ADDRESS`:设置设备地址。
- `ENUM_GET_CONFIG_DESC`:获取配置描述符(包括接口和端点描述符)。
3. 解析配置描述符后,根据接口类型(如HID)设置`pActiveClass`指向对应的类驱动。
4. 调用类驱动的`Init`函数初始化设备(如配置端点管道)。
5. 枚举完成,`gState`变为`HOST_CLASS`,并调用`pConnect_cb`通知应用层。
### 设计思想
- **状态机驱动**:通过`gState`和`eState`实现分层状态机,严格遵循USB协议流程。
- **硬件抽象**:`pData`成员将协议栈与硬件操作分离,提高可移植性。
- **类驱动框架**:`pActiveClass`支持动态绑定不同设备类的处理方法,便于扩展(如新增HID、MSC类)[^1]。
- **事件回调**:通过回调函数(如`pConnect_cb`)实现异步事件通知,简化应用层设计。
### 应用场景(参考引用[3]和[4])
在复合设备(如键鼠一体)中,USBH_HOST结构体需要管理多个接口:
1. 枚举时识别多个接口描述符。
2. 为每个接口创建独立的类驱动实例(如一个HID接口处理键盘,另一个处理鼠标)。
3. 在回调函数中区分不同接口的数据流(如引用[3]中的接收回调函数需要区分数据来源)。
---
§§相关问题§§
1. USB主机协议栈中状态机 (`gState`/`eState`) 的具体状态转换流程是怎样的?
2. 如何为自定义 USB 设备类扩展 `USBH_ClassTypeDef` 驱动接口?
3. `USBH_HOST` 结构体与 USB 控制器寄存器 (`USB_OTG_CORE_HANDLE`) 如何通过 `pData` 成员实现硬件操作?</think>### 结构体 `USBH_HOST`(即 `USBH_HandleTypeDef`)成员详解
`USBH_HOST` 是 STM32 USB 主机协议栈的核心控制结构体,负责管理 USB 主机的全局状态、设备枚举、数据传输和硬件交互。以下是其关键成员的详细解析(基于 STM32 HAL 库实现):
---
#### **核心成员及其作用**
1. **`gState`**
- **类型**:`USBH_StateTypeDef`
- **作用**:主机全局状态机,管理 USB 主机的整体工作流程[^1]。
- **典型状态**:
- `HOST_IDLE`:空闲状态
- `HOST_DEV_DISCONNECTED`:设备断开
- `HOST_ENUMERATION`:设备枚举中
- `HOST_CLASS_REQUEST`:类特定请求处理
2. **`eState`**
- **类型**:`USBH_StateTypeDef`
- **作用**:枚举子状态机,控制设备枚举的详细步骤[^1]。
- **典型状态**:
- `ENUM_GET_DEVICE_DESC`:获取设备描述符
- `ENUM_SET_ADDRESS`:分配设备地址
- `ENUM_GET_CONFIG_DESC`:获取配置描述符
3. **`device_prop`**
- **类型**:`USBH_DevicePropTypeDef`
- **作用**:存储 USB 设备的属性信息,包括:
- 设备描述符(`device_desc`)
- 配置描述符(`cfg_desc`)
- 接口描述符(`itf_desc`)
- 端点描述符(`ep_desc`)
- **关键性**:设备枚举后,所有描述符信息存储于此[^1][^2]。
4. **`pActiveClass`**
- **类型**:`USBH_ClassTypeDef*`
- **作用**:指向当前活动设备类的驱动结构体[^1]。
- **功能**:
- 绑定类驱动(如 HID/MSC/CDC)
- 调用类特定方法(如 `Init()`, `Process()`, `DeInit()`)
- **复合设备处理**:对多接口设备(如键鼠一体),需管理多个类驱动实例[^2][^4]。
5. **`pData`**
- **类型**:`void*`
- **作用**:指向底层硬件控制句柄(如 `USB_OTG_CORE_HANDLE`)[^1]。
- **功能**:
- 隔离硬件操作(寄存器读写)
- 传递底层硬件状态(如传输完成中断)
6. **`Pipe`**
- **类型**:`USBH_PipeTypeDef[USBH_MAX_PIPES]`
- **作用**:端点管道资源池,管理 USB 通信通道[^1]。
- **关键属性**:
- `ep_addr`:端点地址(如 `0x81` 表示 IN 端点1)
- `ep_type`:端点类型(控制/批量/中断/等时)
- `speed`:设备速度(全速/高速)
7. **`Control`**
- **类型**:`USBH_CtrlTypeDef`
- **作用**:控制传输状态机,管理标准请求(SETUP/DATA/STATUS 阶段)[^1]。
- **关键字段**:
- `setup`:SETUP 请求包(包含 `bmRequestType`, `bRequest` 等)
- `state`:控制传输状态(`CTRL_SETUP`, `CTRL_DATA_IN`, 等)
8. **`pUser`**
- **类型**:`void*`
- **作用**:用户自定义数据指针,用于回调函数传递上下文[^3]。
- **典型应用**:在 `USBH_CDC_ReceiveCallback` 中访问接收数据长度(如引用[3]所示)。
9. **回调函数指针组**
- **`pConnect_cb`**:设备连接回调
- **`pDisconnect_cb`**:设备断开回调
- **`pClassRequests_cb`**:类特定请求回调
- **作用**:实现事件驱动架构,异步通知应用层[^3][^4]。
---
#### **成员交互流程示例(设备枚举)**
```c
// 1. 设备连接触发全局状态变更
usb_host.gState = HOST_ENUMERATION;
// 2. 枚举子状态机处理
switch(usb_host.eState) {
case ENUM_GET_DEVICE_DESC:
// 通过Control成员发送GET_DESCRIPTOR请求
USBH_GetDescriptor(&usb_host, DEVICE_DESC, 0);
usb_host.eState = ENUM_SET_ADDRESS;
break;
case ENUM_SET_ADDRESS:
// 分配地址并激活管道
USBH_SetAddress(&usb_host, new_addr);
usb_host.device_prop.device_address = new_addr; // 更新设备属性
break;
}
// 3. 枚举成功后绑定类驱动
if (desc->bDeviceClass == HID_CLASS) {
usb_host.pActiveClass = &HID_ClassDriver; // 指向HID类驱动
usb_host.pActiveClass->Init(&usb_host); // 初始化类驱动
}
// 4. 触发连接回调
if (usb_host.pConnect_cb)
usb_host.pConnect_cb(usb_host.pUser); // 通知应用层
```
---
#### **特殊场景:复合设备处理**
对于键鼠一体设备(多接口设备),需扩展 `pActiveClass` 的使用:
1. **识别多接口**:
```c
if (usb_host.device_prop.cfg_desc->bNumInterfaces > 1) {
// 分配多个类驱动实例
}
```
2. **独立处理接口**:
- 为键盘接口绑定 `HID_Keyboard_Driver`
- 为鼠标接口绑定 `HID_Mouse_Driver`
3. **数据分离**:
- 在回调函数中根据接口号区分数据来源(如引用[4]所示)[^2][^4]。
---
### 设计思想总结
1. **分层架构**
- **硬件层**:通过 `pData` 抽象 USB 控制器操作
- **协议层**:`gState`/`eState` 实现 USB 2.0 状态机
- **应用层**:回调函数提供用户接口
2. **资源管理**
- 管道池(`Pipe[]`)预分配避免动态内存申请
- 描述符集中存储于 `device_prop`
3. **扩展性**
- `USBH_ClassTypeDef` 支持动态绑定新设备类
- 回调机制适配不同应用场景[^3][^4]。
---
阅读全文
相关推荐
















