Изменение скорости USB в Linux

Иногда возникает необходимость снизить скорость USB-порта с Hi-speed (25—480 Мбит/с) до Full-speed (0,5—12 Мбит/с).

В Linux это возможно, но нужно узнать шину (контроллер, BUS) и порт. Проверить эту можно командой

ls /sys/bus/usb/devices/usb*/../companion

которая покажет контроллеры с возможностью переключения

Далее используем dmesg: dmesg покажет после подключения устройства нечто вроде:

usb 2-1: new high speed USB device [...] Первая цифра (2) - это bus/controller. Вторая цифра (1) - порт. Важно чтобы устройство было перечислено как High-Speed, иначе можно ничего не делать и дальше не читать ;-)

Далее выполняем

echo PORT >/sys/bus/usb/drivers/usb/usbBUS/../companion

где PORT и BUS - числа, полученные ранее, т.е. 1 (PORT) и 2 (BUS)

echo 1 >/sys/bus/usb/drivers/usb/usb2/../companion

и смотрим dmesg:

  usb 2-1: USB disconnect, address 21
  ...
  usb 6-1: new full speed USB device [...]

Note that the bus number changes, because each controller (EHCI and UHCI/OHCI) has its own bus.

The device will now operate as Full-Speed device. Also, if you remove the device and plug something else into the port, it will work as Full-Speed. If you want to return the port to High-Speed, do this:

echo -PORT >/sys/bus/usb/drivers/usb/usbBUS/../companion

using the EHCI (!) PORT and BUS numbers from above, e.g.,

echo -1 >/sys/bus/usb/drivers/usb/us2/../companion

check dmesg. It should say something like

  usb 6-1: USB disconnect, address 21
  ...
  usb 2-1: new high speed USB device [...]

The bus number changes back to the EHCI's bus.

 

Для выключения устройства его можно просто усыпить:

root@myhost:/tmp# echo "0" > "/sys/bus/usb/devices/usb2/power/autosuspend_delay_ms"
root@myhost:/tmp# echo "auto" > "/sys/bus/usb/devices/usb2/power/control"
root@myhost:/tmp# lsusb
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 026: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

И потом включить для работы - таким образом получается "reset"

root@myhost:/tmp# echo "on" > "/sys/bus/usb/devices/usb2/power/control"
root@myhost:/tmp# lsusb -t
/: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
|__ Port 2: Dev 26, If 0, Class=Vendor Specific Class, Driver=option, 12M
|__ Port 2: Dev 26, If 1, Class=Vendor Specific Class, Driver=option, 12M
|__ Port 2: Dev 26, If 2, Class=Vendor Specific Class, Driver=option, 12M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
|__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
root@myhost:/tmp#

 

Источник: http://lists.en.qi-hardware.com/pipermail/discussion/2011-August/008508.html , https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci-drivers-ehci_hcd

usb, linux