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

kam*_*iro 156 linux usb

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

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

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

Rom*_*aka 61

注意.此答案中的信息与较旧的内核相关(最高2.6.32).有关较新内核的信息,请参阅tlwhitec的答案.

# 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在Linux Ubuntu 2.6.32-26中不起作用 (7认同)
  • 即使我使用sudo,我也会收到权限被拒绝错误! (7认同)
  • 即使在使用sudo之后,对我来说也是"允许否认" (3认同)
  • 权限被拒绝,因为 `sudo foo > bar` 形式的命令被解析为 _direct 输出到 `bar`,然后使用 `sudo`_ 运行 `foo`。重定向失败,因为它发生在您获得 root 访问权限之前。解决方法是使用`sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'`,依此类推:获取root,运行新地狱执行重定向,然后输出一些东西进入重定向的文件描述符。 (3认同)
  • @kamziro:试试`lsusb` (2认同)

tlw*_*tec 58

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

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
echo "auto" > "/sys/bus/usb/devices/usbX/power/level"
Run Code Online (Sandbox Code Playgroud)

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

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usbX/power/control"
Run Code Online (Sandbox Code Playgroud)

字面意思是,在设备闲置时暂停.

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

  • 要**恢复**暂停的设备,你可以在">"/ sys/bus/usb/devices/usbX/power/control"`上再次禁用"echo"的"autosuspend",但我认为你需要了解最初的目的.自动暂停功能仅用于启用空闲设备进入低功耗状态(可能看起来处于关闭状态),只有在需要时才能通过主机或某些外部事件恢复.这种情况会自动发生(或应该发生).实际上端口本身并没有真正关闭.真的,请阅读[docs](http://www.kernel.org/doc/Documentation/usb/power-management.txt);) (4认同)
  • 我可以确认它适用于内核> 3.10.只需确保您使用的设备"id"是正确的:`dmesg | grep"usb"`并使用"usb"之后的数字,例如:`usb 2-4.4:SerialNumber:A0848020`你将使用:`/sys/bus/usb/devices/2-4.4/power/... `.此外,请确保设备未使用.我创建了一个[脚本来简化这个过程](https://raw.githubusercontent.com/lepe/scripts/master/ubs_power.sh) (4认同)

gra*_*rew 23

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

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

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/unbind
Run Code Online (Sandbox Code Playgroud)

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

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/bind
Run Code Online (Sandbox Code Playgroud)

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

usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);
Run Code Online (Sandbox Code Playgroud)

有了这个ioctl禁用,我能够关闭单独的端口电源而无需分离所有设备 - 但电源立即恢复(可能是由于内核看到未初始化的设备)导致USB设备只是做"冷启动"这就是我一般都想做.我补丁的中心力量在这里

  • 无论芯片组如何,bind/unbind都不会关闭USB端口.该设备仍然获得电力...... (5认同)
  • 鼠标激光关闭,键盘无法输入,调制解调器停止闪烁 - 在我的平台上一切正常 (2认同)

Dom*_*ano 19

英特尔的PowerTOP允许您实时切换USB外围设备等设备.这些被称为'可调参数'.

sudo apt install powertop
sudo powertop
Run Code Online (Sandbox Code Playgroud)
  • 切换到'tunables'.
  • 向下滚动到您的设备.
  • 按Enter进入切换省电模式(/)

在此输入图像描述

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

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

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

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

  • 真棒!:DI认为这是用户最友好的方式(尽管在低级别它会产生与其他答案中概述的相同的操作.)谢谢,并且你的答案可能会达到顶峰;) (2认同)
  • 感谢您的回答。我必须从哪里开始挖掘以更改预设的非活动保存时间? (2认同)

mvp*_*mvp 9

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

披露 - 我是uhubctl的作者.

  • 在 Beaglebone Black 上就像魅力一样。 (2认同)

小智 7

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


小智 5

echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind
Run Code Online (Sandbox Code Playgroud)

适用于ubuntu

  • 不会关闭设备电源,只会将其从设备列表中删除。如何关闭 USB 端口电源? (3认同)
  • 你是唯一适用于我的案例的解决方案。我正在使用 acer make 笔记本电脑 12.04LTS Ubuntu。 (2认同)
  • 这也是唯一对我有用的解决方案,可以在不拔掉电源的情况下关闭 Wacom Intuos5 touch M 平板电脑(在 Fedora 28 上) (2认同)

F1L*_*nux 5

人们之所以提出这样的问题,是因为可怕的——确实是“邪恶” ——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
Run Code Online (Sandbox Code Playgroud)

一个Ubuntu的18.04屏幕抓取遵循在“龙回答”如何说明我的成绩均达到结束。

长答案:

确实,USB 电源管理内核文档声明自动挂起将被弃用,取而代之的是“ autosuspend_delay_ms ”用于禁用 USB 自动挂起:

"In 2.6.38 the "autosuspend" file will be deprecated
and replaced by the "autosuspend_delay_ms" file."
Run Code Online (Sandbox Code Playgroud)

无论其我的测试显示设置usbcore.autosuspend=-1的/ etc /默认/ grub中,如下可以作为一个全球切换为USB autosuspend functionality-你就不要需要编辑个人“ autosuspend_delay_ms ”文件。

上面链接的同一文档指出值“0”是启用负值禁用

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.
Run Code Online (Sandbox Code Playgroud)

在下面带注释的Ubuntu 18.04屏幕抓取中,说明了我的结果是如何实现的(和可重现的),请注意autosuspend_delay_ms 中的默认值为“0”(启用)。

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

screengrab:全局编辑之前和之后的自动挂起值

希望这能让禁用 USB 自动挂起更容易,更容易编写脚本-