我正在使用 Lubuntu 16.04。我有模拟扬声器,它们从 USB 插座获取电源。我希望它们在关闭电脑并挂起时关闭。我以为这很容易,但我花了很多时间在谷歌上搜索,仍然没有找到解决方案。
我最好的选择似乎是uhubctl因为这似乎可以在我的硬件上运行(作者警告说并非所有集线器控制器都支持该功能)。我相信这一点,因为我已经成功关闭了 USB 键盘。
因此,现在我需要知道要指定什么才能关闭扬声器的 USB 插座上的电源。这必然需要一些猜测,因为它们不是真正的 USB 设备,不会显示在 lsusb 中。查看后面板和主板手册,我看到插入扬声器的四个插座组被描述为 USB 2.0 端口 7-10。我的鼠标和网络摄像头插在同一组插座中。
运行不带参数的 uhubctl 会得到:
Current status for hub 2-1 [8087:8002, USB 2.00, 8 ports]
Port 1: 0100 power
Port 2: 0100 power
Port 3: 0100 power
Port 4: 0100 power
Port 5: 0100 power
Port 6: 0100 power
Port 7: 0100 power
Port 8: 0100 power
Current status for hub 1-1 [8087:800a, USB 2.00, 6 ports]
Port 1: 0100 power
Port 2: 0100 power
Port 3: 0100 power
Port 4: 0100 power
Port 5: 0100 power
Port 6: 0100 power
Current status for hub 4-5 [174c:3074 ASUS TEK. ASM107x, USB 3.00, 4 ports]
Port 1: 02a0 power 5gbps Rx.Detect
Port 2: 02a0 power 5gbps Rx.Detect
Port 3: 02a0 power 5gbps Rx.Detect
Port 4: 02a0 power 5gbps Rx.Detect
Current status for hub 3-9 [174c:2074 ASUS TEK. ASM107x, USB 2.10, 4 ports]
Port 1: 0100 power
Port 2: 0303 power lowspeed enable connect [047d:2043 NOVATEK Kensington U+P Keyboard]
Port 3: 0100 power
Port 4: 0100 power
这没什么帮助。我的键盘出现了,但我的所有其他 USB 设备(鼠标、Seagate HDD、网络摄像头)都没有出现。
我尝试了各种命令:
uhubctl -a off -p 2 -l 3-9 #Turns off keyboard as expected
uhubctl -a off -p 2 -l 4-5 #ALSO turns off keyboard. Why ?
uhubctl -a off -p 12345678 -l 2-1 #Does not turn anything off
uhubctl -a off -p 123456 -l 1-1 #Does not turn anything off
uhubctl -a off -p 134 -l 4-5 #Does not turn anything off.
所以我可以关闭键盘。没有列出其他 USB 设备(尽管它们在那里),并且无法关闭它们。
我不知道集线器名称代表什么,例如 2-1、1-1、4-5、3-9。而且似乎没有任何方法可以从 lsusb 推断出集线器名称。
lsusb 给出:
Bus 002 Device 002: ID 8087:8002 Intel Corp.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:800a Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 174c:3074 ASMedia Technology Inc. ASM1074 SuperSpeed hub
Bus 004 Device 002: ID 0bc2:ab24 Seagate RSS LLC
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 007: ID 047d:2043 Kensington
Bus 003 Device 003: ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub
Bus 003 Device 002: ID 0f62:1001 Acrox Technologies Co., Ltd Targus Mini Trackball Optical Mouse
Bus 003 Device 006: ID 046d:0994 Logitech, Inc. QuickCam Orbit/Sphere AF
Bus 003 Device 004: ID 0b05:180a ASUSTek Computer, Inc.
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
lsusb -t 给出:
/: Bus 08.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
|__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M
|__ Port 5: Dev 3, If 0, Class=Hub, Driver=hub/4p, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/15p, 480M
|__ Port 5: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 9: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 7, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 2: Dev 7, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 10: Dev 4, If 1, Class=Vendor Specific Class, Driver=btusb, 12M
|__ Port 10: Dev 4, If 2, Class=Vendor Specific Class, Driver=btusb, 12M
|__ Port 10: Dev 4, If 0, Class=Vendor Specific Class, Driver=btusb, 12M
|__ Port 10: Dev 4, If 3, Class=Application Specific Interface, Driver=, 12M
|__ Port 14: Dev 6, If 0, Class=Video, Driver=uvcvideo, 480M
|__ Port 14: Dev 6, If 1, Class=Video, Driver=uvcvideo, 480M
|__ Port 14: Dev 6, If 2, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 14: Dev 6, If 3, Class=Audio, Driver=snd-usb-audio, 480M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
我可以看到集线器名称和总线/端口号之间存在某种关系,但我无法得出规则。
我从 lsusb 注意到 USB 2.0 设备似乎使用 Intel 控制器,而 USB 3.0 和 2.1 设备似乎使用 ASUS 控制器。我怀疑 Intel 芯片是否不支持电源控制,因此我尝试了 USB 2.1 插槽中的扬声器,当它连接到键盘时,我可以关闭它。没有运气。
有人知道为什么 uhubctrl 会表现得如此吗?
也许 uhubctl 只是个幌子,不会起作用。我知道还有其他方法可以在 Ubuntu 中切换电源,但它们似乎依赖于能够确定代表 USB 插槽的目录。我不知道该怎么做。
答案1
uhubctl 作者在这里:
uhubctl
使用与 Linux 内核相同的 USB 设备寻址方法:,b-x.y.z
其中b
是 USB 总线号,然后x
,是从根 USB 集线器开始的集线器链的端口号。此寻址是半稳定的 - 如果您拔下 USB 设备并将其重新插入相同的物理端口,它不会改变。y
z
- 为了回答你的第二个问题,我需要引用这来自 uhubctl README:
如果您将兼容的 USB 3.0 集线器连接到 USB3 上游端口,它将被检测为 2 个独立的虚拟集线器:USB2 和 USB3,并且您的 USB 设备将根据其功能和连接速度连接到 USB2 或 USB3 虚拟集线器。要控制此类集线器的电源,必须关闭/打开 USB2 和 USB3 虚拟集线器的电源,以使电源关闭/打开更改生效。uhubctl 将尝试自动执行此操作(除非您使用选项 -e 禁用此行为)。
- 最后,uhubctl 只会列出声称支持 PPPS(每端口电源切换)的 USB 集线器。但是,有些集线器声称支持但实际上不起作用(切换电路在物理上缺失)。我坚持认为已知可以工作的所有集线器列表一定。