Управление питанием USB

Материал из virt2real wiki
Перейти к: навигация, поиск

Введение

Часто возникает необходимость программно отключить и снова подключить USB устройство. Например, многие 3G модемы не могут непрерывно работать длительное время, им требуется перезагрузка. Можно выключить и снова включить питание Виртурилки, можно выдернуть и снова вставить USB устройство. Но можно просто программно послать шине USB сигнал питания.

За VBUS (фактически, питание USB) отвечает GPIO66. При инициализации Виртурилки GPIO66 устанавливается в состояние LOW.

При подключении чего-либо в разъём micro-USB Виртурилки состояние GPIO66 изменится на HIGH. Даже если вставить кабель-переходник OTG - GPIO66 станет HIGH.

Как отключить

Таким образом, для сброса USB-устройства необходимо всего лишь программно установить этот GPIO в состояние LOW.

echo 0 > /proc/v2r_gpio/66

После чего увидим в консоли сообщение

[root@virt2real ~]# davinci_musb_interrupt 341: VBUS error workaround (delay coming)

Больше ничего делать не требуется. Спустя несколько секунд автоматически произойдёт переопределение устройства, оно снова будет подключено, запущены необходимые модули. Точно так же, как это произошло бы в случае ручного извлечения и повторного подключения USB устройства.

Уточнение

Данный способ был проверен на 3G модеме Huawei E353 и 4G модеме ZTE MF 823. Переподключаются отлично. Единственный нюанс - после повторного определения модема необходимо поднять интерфейс. Сделать это можно командой

ifup usb1

где usb1 - имя интерфейса устройства. У разных устройств могут быть разные имена интерфейсов, так что проверяйте какой именно интерфейс использует ваше устройство.