Передёрни!

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

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

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

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

#!/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" взялись вот отсюда:

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  

И вот отсюда:

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

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

[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, искать первый или все идентификаторы (если устройств много), ну и передёргивать всё автоматом.

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

На корм коту

Магазин открыт!

ещё