USB集线器端口电源管理端口上下电
2026-04-29
本文链接为:http://www.usbzh.com/article/detail-1638.html ,欢迎转载,转载请附上本文链接。
USB集线器可以支持端口的上下电。
- 上电是通过SetPortFeatuer(PORT_POWER)实现的。
- 下电是通过ClearPortFeature(PORT_POWER)实现的。
不过由于libusb上层如果使用的是winusb驱动程序,导致这个请求是不支持的。需要使用libusb自己的驱动程序如libusb0.sys或者libusbk.sys
在github上开源了一个开源项目 uhubctl,就是实现的对USB HUB各端口的电源管理。https://github.com/mvp/uhubctl
其它相关:
https://github.com/codazoda/hub-ctrl.c
https://github.com/hevz/hubpower/blob/master/hubpower.c
其关键代码如下:
/*
* Use a control transfer via libusb to turn a port off/on.
* Returns >= 0 on success.
*/
static int set_port_status_libusb(struct libusb_device_handle *devh, int port, int on)
{
int rc = 0;
int request = on ? LIBUSB_REQUEST_SET_FEATURE
: LIBUSB_REQUEST_CLEAR_FEATURE;
int repeat = on ? 1 : opt_repeat;
while (repeat-- > 0) {
rc = libusb_control_transfer(devh,
LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_OTHER,
request, USB_PORT_FEAT_POWER,
port, NULL, 0, USB_CTRL_GET_TIMEOUT
);
if (rc < 0) {
perror("Failed to control port power!\n");
}
if (repeat > 0) {
sleep_ms(opt_wait);
}
}
return rc;
}
/*
* Try different methods to power a port off/on.
* Return >= 0 on success.
*/
static int set_port_status(struct libusb_device_handle *devh, struct hub_info *hub, int port, int on)
{
#if defined(__linux__)
if (!opt_nosysfs) {
if (set_port_status_linux(devh, hub, port, on) == 0) {
return 0;
}
}
#else
(void)hub;
#endif
return set_port_status_libusb(devh, port, on);
}
本文链接为:http://www.usbzh.com/article/detail-1638.html ,欢迎转载,转载请附上本文链接。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936 USB技术交流3:1031974172
USB调试笔记





