Управление питанием USB портов
Материал из Asterisk Forum Wiki
Содержание |
Введение
Для выполнения различных задач, к примеру переинициализация USB брелка на удалённой машине, пользуются двумя методами.
Первый метод основан на стандартных возможностях USB устройства переходить в режим пониженого энергопотребления ("Suspend mode"). Для управления состоянием устройства в данном случае используется SYSFS:
echo suspend | sudo tee /sys/bus/usb/devices/1-4/power/level #переводит устройство, подключенное к 4 порту в Suspend mode
echo on | sudo tee /sys/bus/usb/devices/1-4/power/level #переводит устройство, подключенное к 4 порту в Нормальный режим
Таким образом можно частично переинициализировать некоторые устройства, в которых реализована данная функция.
Второй метод, авторами которого являются TANAKA Akira и NIIBE Yutaka, был первоначально разработан для управления питанием устройств питающихся из сети 220 В, и основан на патче (kernelspace реализация для ядра 2.6.14) и программе hub-ctrl (самодостаточная userspace реализация) написанными NIIBE Yutaka.
hub-ctrl - программа позволяющая управлять питанием USB портов, на USB хабах, поддерживающих данную функцию.
Использование программы hub-ctrl
./hub-ctrl #выводит список доступных хабов
./hub-ctrl -b 001 -d 004 -P 1 -p 0 #выключаем 1-й порт хаба, на шине 001:004
./hub-ctrl -b 001 -d 004 -P 1 -p 1 #включаем 1-й порт
Примечания
- Реальный номер порта с тем, что нарисован на хабе может не совпадать!
- На некоторых системах необходимо иметь права root'a чтобы данные действия имели эффект.
- Следует знать что, питание полностью не отключается, а сбрасывается до определённого уровня. (у D-Link DUB-H7 H/WVer.: A5 - приблизительно до 1.4 В)
Компиляция hub-ctrl
- sudo aptitude install libusb-dev #устанавливаем зависимости на примере Debian-based систем
- wget http://www.gniibe.org/software/hub-ctrl.c #получаем исходники
- gcc -o hub-ctrl hub-ctrl.c -l usb #непосредственно компиляция
Как определить поддерживает ли хаб данную функцию?
Хабы, сделаные на основе чипсетов, поддерживающих данную функцию, в выводе команды "lsusb -v" показывают строку: "Per-port power switching":
...
Hub Descriptor:
...
- wHubCharacteristic 0x0029
- Per-port power switching
...
Это обязательный, но не достаточный признак того, что такой хаб будет работать по описаной схеме, т.к. производитель мог пустить цепь питания в обход чипсета.
Список известных хабов поддержывающих данную функцию
- Elecom: U2H-G4S [1]
- Sanwa Supply: USB-HUB14GPH [1]
- Targus, Inc.: PAUH212 [1]
- Hawking Technology: UH214 [1]
- D-Link DUB-H7 (проверено на H/W Ver.: A5) [2]
- NEC (ID 0409:0058 NEC Corp. HighSpeed Hub) [3]
Скрипт управления питанием модемами
#!/bin/bash # Filename: gsm-keeper # Purpose: This script checking for datacards which has "Busy" state # Authors: asteriskforum' users (asteriskforum.ru), (c) Sergey Fenko <foeckn[at]gmail.com> # License: This file is licensed under the GPL v2. ################################################################################ bus=$(lsusb | grep 2001:f103 | awk '{print $4$2}') #looking for D-Link DUB-H7 hub bus, $bus will look like dev:bus function hubctl { if [ -e ./hub-ctrl ] then ./hub-ctrl -b ${bus:4:3} -d ${bus:0:3} -P $1 -p 0 sleep 1 ./hub-ctrl -b ${bus:4:3} -d ${bus:0:3} -P $1 -p 1 fi } for card in $(asterisk -rx "datacard show devices" | grep -i busy | awk '{print $1}' | sed '/gw*/!d' | sort) do channel=$(asterisk -rx "core show channels" | awk '{print $1}' | grep $card) if [ -z "$channel" ]; then { echo "$card is not assigned to any channel - probably freezed - REINITIALIZING" asterisk -rx "datacard reset $card" let WPWR=1 } else echo "$card is busy and assigned to channel $channel - OK" fi done if [ "$WPWR" = "1" ] then { echo -e "Waiting some time for changes taking effect.\nIf any problems - will \"hard reset\"!" sleep 45s for card in $(asterisk -rx "datacard show devices" | grep -i busy | awk '{print $1}' | sed '/gw*/!d' | sort) do echo $card channel=$(asterisk -rx "core show channels" | awk '{print $1}' | grep $card) if [ -z "$channel" ] then echo "$card is not assigned to any channel - probably deeply freezed - REINITIALIZING (DOING HARD RESET!)" hubctl ${card:2:1} fi done } fi
Источники
1. http://www.gniibe.org/ac-power-by-usb/ac-power-control.html
2. http://www.asteriskforum.ru/viewtopic.php?t=5042&postdays=0&postorder=asc&start=1080
3. http://www.ip-phone-forum.de/showthread.php?p=1603698#post1603698
Особое Мнение
Проведённые Paco эксперименты с использованием Dlink DUB H-7 показали, что hub-ctrl -p 0 понижает напряжение только до уровня 1.47V. При этом после вставки модема в такой "выключенный порт" светодиод не моргает, однако файлы /dev/ttyUSBx для данного модема в системе появляются. Они даже могут быть открыты. Однако запись команд и чтение ответов из этого порта не заканчиваются успехом.
Фактически это означает, что модем находится в полудохлом состоянии и может быть повреждён.
Таким образом свойство Per-port power switching Dlink DUB H-7 не может быть использовано для полноценного управления питанием 3G модемов Huawei.
Используя hub-ctrl совместно с Dlink DUB H-7 вы делаете это на свой страх и риск, подвергая модем риску повреждения. -- Bg 17:18, 7 февраля 2011 (CET)