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

用linux手动打开/closuresUSB电源是否可行?

有这个外部的USB散热风扇(你用来冷却自己,而不是电脑),并且能够从terminal控制它是很好的,因为我想把风扇放在很远的地方。

我想这也可以用于各种其他的事情,因为那里有很多的USB玩具。 也许空气净化器等(我听说他们并没有真正的工作)。

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

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

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

根据文档 ,从内核2.6.32的USB电源pipe理有几个变化,似乎在2.6.38解决。 现在,您需要等待设备闲置 ,这是由特定的设备驱动程序。 驱动程序需要支持它,否则设备永远不会达到这个状态。 不幸的是,现在用户没有机会强制这一点。 但是,如果您幸运,您的设备可能会闲置,那么要closures此function,您需要:

 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" 

这实际上意味着, 暂时停止设备闲置。

所以除非你的粉丝是一个“智能”的东西,可以被看作一个设备,并由驱动程序控制,否则你可能不会有太多的运气在当前的内核上。

我发现这些解决scheme至less适用于正确configuration的Terminus FE 1.1 USB集线器芯片:

1.要closures集线器所有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设备从系统中断开,至less在Ubuntu :

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

有了这个ioctl禁用,我可以closures各个端口的电源,而不用分离所有的设备 – 但是电源立即恢复(可能是由于内核看到一个未初始化的设备),导致USB设备只是做一个“冷启动”我一般都想做。 我修补的权力在这里

英特尔的PowerTOP允许您实时切换诸如USB外设等设备。 这些被称为“可调谐”。

 sudo apt install powertop sudo powertop 
  • 切换到“可调参数”。
  • 向下滚动到您的设备。
  • 按Enter键切换省电模式( /

在这里输入图像描述

请注意, Bad表示设备始终打开。 切换到良好将在预设的非活动保存时间后closures设备(默认为2000毫秒)。

有关如何使这些更改永久化的详细信息,请参阅PowerTOP文档。
它为你生成configuration脚本(就像这个线程上的其他海报所描述的一样)。

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

如果你想控制引脚功率,你可以使用一个支持的智能USB集线器,或者更好的是一个微控制器 。

我想这样做,用我的USB硬件,我不能。 我写了一个黑客的方式如何在这里: http : //pintant.cat/2012/05/12/power-off-usb-device/ 。 简而言之:我使用USB继电器来打开/closures另一个USB电缆的Vc …

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

免责声明 – 我是uhubctl的作者。

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

适用于Ubuntu

USB 5v电源一直处于开启状态(即使计算机已closures,在某些计算机上以及某些端口上)。您可能需要使用某种开关对Arduino进行编程,并通过串口库将USB控制器插入电脑。

换句话说, 这个开关教程和本教程的组合通过串行库通信到Arduino通过USB插入。

我有一个问题,当连接我的android手机,我无法充电我的手机,因为电源开关,然后closures… PowerTop让我find这个设置,并有助于解决这个问题(自动值是造成问题):

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