首页 文章

用linux控制USB电源(开/关)

提问于
浏览
149

是否可以使用linux手动打开/关闭USB电源?

有这个外置USB散热风扇(你用来冷却自己的那种,而不是PC),能够从终端控制它会很好,因为我想将风扇定位在远处 .

我想这也适用于其他各种各样的东西,因为那里有很多USB玩具 . 也许是空气净化器等(我听说它们确实不起作用) .

9 回答

  • 3

    USB 5v电源始终打开(即使计算机关闭,在某些计算机和某些端口上也是如此 . )您可能需要使用某种开关对Arduino进行编程,并通过USB插入到串行库中来控制它 . 电脑 .

    换句话说,通过串口libary与通过USB插入的Arduino进行通信的this开关教程和this教程的组合 .

  • 56

    连接我的Android手机时遇到问题,我无法为手机充电,因为电源开启然后关闭... PowerTop让我找到这个设置并且有助于解决问题(自动值导致问题):

    echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
    
  • 18

    Note. 此答案中的信息与较旧的内核相关(最高2.6.32) . 有关较新内核的信息,请参见tlwhitec's answer .

    # disable external wake-up; do this only once
    echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 
    
    echo on > /sys/bus/usb/devices/usb1/power/level       # turn on
    echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off
    

    (您可能需要将usb1更改为usb n)

    资料来源:Documentation / usb / power-management.txt.gz

  • 6

    根据 docs ,内核 2.6.32 对USB电源管理进行了一些更改,这些更改似乎在 2.6.38 中解决 . 现在,您需要等待设备变为 idle ,该设备由特定设备驱动程序控制 . 驱动程序需要支持它,否则设备将永远不会达到此状态 . 不幸的是,现在用户没有机会强行执行此操作 . 但是,如果你很幸运,你的设备可能会闲置,那么要关闭它,你需要:

    echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
    echo "auto" > "/sys/bus/usb/devices/usbX/power/level"
    

    或者,对于2.6.38及以上的内核:

    echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
    echo "auto" > "/sys/bus/usb/devices/usbX/power/control"
    

    这实际上意味着,在设备闲置时,请转到 suspend .

    因此,除非你的粉丝是“智能”的东西,可以看作是一个设备并由驱动程序控制,你可能在当前的内核上没有太多运气 .

  • 6

    我发现这些解决方案至少适用于正确配置的Terminus FE 1.1 USB集线器芯片:

    1.要关闭集线器所有USB端口的电源,您可以使用以下命令从内核解除集线器的绑定:

    echo "1-4.4.4" > /sys/bus/usb/drivers/usb/unbind
    

    重新打开电源 - 你可以用它绑回来

    echo "1-4.4.4" > /sys/bus/usb/drivers/usb/bind
    

    2.单独切换每个端口的电源比较棘手:我能够使用hubpower来控制每个端口 - 但它有一个缺点:hubpower首先断开usbdevfs,导致所有USB设备断开与系统的连接,至少在ubuntu上:

    usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
    rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);
    

    有了这个 ioctl 禁用,我能够关闭单独的端口电源而不会分离所有设备 - 但电源立即恢复(可能是由于内核看到一个未初始化的设备)导致USB设备只是做了"cold restart"这是我通常想要的去做 . 我补丁的中心力量是here

  • 7

    来自英特尔的 PowerTOP 允许您实时切换USB外围设备等设备 . 这些被称为'tunables' .

    sudo apt install powertop
    sudo powertop
    
    • 切换到'tunables' .

    • 向下滚动到您的设备 .

    • 按Enter进入切换省电模式( Good / Bad

    enter image description here

    请注意 Bad 表示设备始终打开 . 切换到 Good 将在预设的非活动保存时间(默认为2000毫秒)后关闭设备 .

    有关如何永久更改这些更改的详细信息,请参阅 PowerTOP 文档 .
    它为您生成配置脚本(几乎与此线程上的其他海报一样) .

    注意:这些脚本不会影响USB引脚电源(始终打开) .
    这些仅发送驱动程序协议以激活和停用设备 .

    如果您想控制引脚电源,可以使用支持的智能USB集线器,或者更好的是microcontroller .

  • 22

    您可以使用uhubctl - 命令行实用程序来控制兼容USB集线器的每个端口的USB电源 .

    披露 - 我是uhubctl的作者 .

  • 60

    我想这样做,用我的USB硬件我做不到 . 我写了一个hacky方式如何在这里做:http://pintant.cat/2012/05/12/power-off-usb-device/ . 简而言之:我使用USB继电器打开/关闭另一根USB线的Vc ......

  • 1
    echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind
    

    适用于ubuntu

相关问题