USB调试笔记
+ -

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

0 篇笔记 写笔记

USB集线器端口电源管理端口上下电
USB集线器可以支持端口的上下电。上电是通过SetPortFeatuer(PORT_POWER)实现的。下电是通过ClearPortFeature(PORT_POWER)实现的。不过由于libusb上层如果使用的是winusb驱动程序,导致这个请求是不支持的。需要使用libusb自己的驱动程序......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!