Windows-USB集线器HUB端口状态PortStatus
2024-01-18
113
0
USB集线器驱动定义了几种状态用于标识下游端口及连接设备的状态信息。
//
// Hub and Port status defined below also apply to StatusChnage bits
//
#define HUB_STATUS_LOCAL_POWER 0x01
#define HUB_STATUS_OVER_CURRENT 0x02
//PortStatus
#define PORT_STATUS_CONNECT 0x001
#define PORT_STATUS_ENABLE 0x002
#define PORT_STATUS_SUSPEND 0x004
#define PORT_STATUS_OVER_CURRENT 0x008
#define PORT_STATUS_RESET 0x010
#define PORT_STATUS_POWER 0x100
#define PORT_STATUS_LOW_SPEED 0x200
#define PORT_STATUS_HIGH_SPEED 0x400
该端口状态是USB集线器GetPortStatus的扩展。
PORT_STATUS_CONNECT
USB集线器驱动即下游端口的总线创建下游端口的子设备之后,标识该端口为PORT_STATUS_CONNECT。所以PORT_STATUS_CONNECT至少在获取设备描述符,SET_ADDRESS正常之后。
USB集线器驱动用于管理其连接到该该线器下的所有子设备,包括其下游端口状态的标识。同时也对系统关于USB集线器的一些自定义IOCTL的的信息应答。这其中就包括IOCTL_INTERNAL_USB_GET_PORT_STATUS。USB集线器通过判断其端口的状态返回其相应的标识。
//首先通过GetPortStatus获取端口状态
ntStatus = USBH_SyncGetPortStatus(deviceExtensionHub,
DeviceExtensionPort->PortNumber,
(PUCHAR) &portData->PortState,
sizeof(portData->PortState));
// translate hup port status bits
if (portData->PortState.PortStatus & PORT_STATUS_ENABLE) {
*portStatus |= USBD_PORT_ENABLED;
}
if (portData->PortState.PortStatus & PORT_STATUS_CONNECT ) {
*portStatus |= USBD_PORT_CONNECTED;
}
PORT_STATUS_ENABLE
和PORT_STATUS_CONNECT类似,也是GetPortStatus的一部分。
但USB集线器自定义接口IOCTL_INTERNAL_USB_ENABLE_PORT可以对端口进行禁用和使能。
对端口禁用和启用,使用USB集线器的类请求SetHubFeature的C_PORT_ENABLE实现。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936