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

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

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

我想这也可能对其他各种事物有用,因为那里有很多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电源管理发生了一些变化,这些变化似乎在2.6.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"

这实际上意味着,在设备闲置的那一刻暂停

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


我发现这些解决方案至少适用于正确配置的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设备仅执行“冷启动”,这就是我一般都想做。 我修补的中心权力在这里

链接地址: http://www.djcxy.com/p/81293.html

上一篇: Controlling a USB power supply (on/off) with linux

下一篇: Controlling simple relay switch via USB