Передёрни!

2018-06-21

Ниже речь не о том, что вы подумали, а о программном сбросе USB-устройства в Linux.

Столкнулся с неприятной проблемой — в Armbian иногда подвисает USB-девайс (в частности, WiFi-свисток). Иногда означает действительно иногда, и проблемы бы не было, если бы устройство не работало 24х7 в unattended-режиме. Ну то есть где-то в шкафу и без желания туда лазить.

Проблема может быть как в “так-себе-драйверах”, в кратковременном скачке напряжения (вроде как 5в на USB у OrangePi заведено “на прямую” с питания без всяких фильтров). Но это совершенно не важно, нужно просто уметь сбросить USB устройство, причем без физического доступа к системе.

AskUbuntu поспешил на помощь и теперь достаточно повесить в cron вот такой вот простой скрипт:

1
2
3
4
#!/bin/sh
sh -c "echo 0 > /sys/bus/usb/devices/4-1/authorized"
sleep 5
sh -c "echo 1 > /sys/bus/usb/devices/4-1/authorized"

Запускать, ясное дело, нужно из под root или sudo. Ну и нужно знать примерные координаты устройства.
В моём случае магические цифры “4-1” взялись вот отсюда:

1
2
3
4
5
6
7
8
9
10
11
zno@cluster:~$ lsusb
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 009 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

И вот отсюда:

1
2
3
4
zno@cluster:~$ cat /sys/bus/usb/devices/4-1/idVendor 
148f
zno@cluster:~$ cat /sys/bus/usb/devices/4-1/idProduct
5370

Проверяем результат — после отработки в dmesg вот такое:

1
2
3
4
5
[42235.768120] usb 4-1: reset high-speed USB device number 2 using ehci-platform
[42235.979085] ieee80211 phy1: rt2x00_set_rt: Info - RT chipset 5390, rev 0502 detected
[42236.007336] ieee80211 phy1: rt2x00_set_rf: Info - RF chipset 5370 detected
[42236.008057] ieee80211 phy1: Selected rate control algorithm 'minstrel_ht'
[42236.015773] usb 4-1: authorized to connect

Чудо-скрипт можно будет расширить, а точнее переписать на каком-нибудь Python, передавая в качестве параметров vendor id и product id. Он будет ползать по /sys/usb/devices, искать первый или все идентификаторы (если устройств много), ну и передёргивать всё автоматом.

Короче, пригодится в дальнейшем. Может быть.


В массы

В трубу