用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设备仅执行“冷启动”,这就是我一般都想做。 我修补的中心权力在这里