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

时间:2011-01-15 21:19:26

标签: linux usb

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

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

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

10 个答案:

答案 0 :(得分:61)

注意。此答案中的信息与较旧的内核相关(最高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

答案 1 :(得分:57)

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

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"

这意味着,在设备闲置时,请暂停

因此,除非您的粉丝是“智能”的东西,可被视为设备并由驱动程序控制,否则您可能在当前内核上没有太多运气。

答案 2 :(得分:21)

我发现这些解决方案至少适用于正确配置的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设备只是执行了“冷重启”这是我一般想做的事情。我修补的中心力量为here

答案 3 :(得分:18)

英特尔的

PowerTOP 允许您实时切换USB外围设备等设备。这些被称为“可调参数”。

sudo apt install powertop
sudo powertop
  • 切换到' tunables'。
  • 向下滚动到您的设备。
  • 按Enter进入切换省电模式(良好 / 错误

enter image description here

请注意,错误表示设备始终处于开启状态。切换到良好将在预设的非活动保存时间(默认为2000毫秒)后关闭设备。

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

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

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

答案 4 :(得分:8)

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

披露 - 我是uhubctl的作者。

答案 5 :(得分:6)

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

答案 6 :(得分:5)

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

适用于ubuntu

答案 7 :(得分:3)

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

换句话说,this切换教程和this教程的组合,通过串口libary与Arduino通过USB连接。

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

人们之所以发布这样的问题,是因为可怕的-确实是“ EVIL ”-USB自动挂起“ 功能”。

自动挂起将关闭“空闲” USB设备的电源,除非该设备的驱动程序正确支持此功能,否则该设备可能无法连接。因此,打开/关闭USB端口的电源是问题的征兆,而不是问题本身。

我将向您展示如何全局禁用自动挂起,而无需手动打开和关闭USB端口:

简短答案:

您不需要分别编辑“ autosuspend_delay_ms ”:可以全局禁用USB自动挂起,并使用以下命令永久

sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&usbcore.autosuspend=-1 /' /etc/default/grub

update-grub

systemctl reboot

“长答案”末尾出现一个 Ubuntu 18.04 屏幕截图,说明了我的成绩是如何实现的。

长答案:

确实会弃用USB Power Management Kernel Documentation状态的自动暂停,而在其位置“ autosuspend_delay_ms ”用于禁用USB自动暂停:

"In 2.6.38 the "autosuspend" file will be deprecated
and replaced by the "autosuspend_delay_ms" file."

如何,我的测试表明,如下所示在 / etc / default / grub 中设置usbcore.autosuspend=-1可以用作< strong> GLOBAL 切换USB自动暂停功能-您不需要不需要编辑单个“ autosuspend_delay_ms ”文件。

上面链接的同一document表示值为“ 0”为启用,而值为的值为禁用:< / p>

power/autosuspend_delay_ms

    <snip> 0 means to autosuspend
    as soon as the device becomes idle, and negative
    values mean never to autosuspend.  You can write a
    number to the file to change the autosuspend
    idle-delay time.

在下面带注释的 Ubuntu 18.04 屏幕截图中,说明了如何实现我的结果(并且可重现),请选中默认值“ 0”(启用 )在 autosuspend_delay_ms 中。

然后请注意,在Grub中设置usbcore.autosuspend=-1之后,这些值现在在重新启动后为负(已禁用)。这样可以省去编辑单个值的麻烦,并且现在可以通过脚本禁用USB自动挂起。

screengrab: autosuspend values Before and after globally editing

希望这会使禁用USB自动挂起变得更容易且更具脚本化-