Управление питанием 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

  1. sudo aptitude install libusb-dev #устанавливаем зависимости на примере Debian-based систем
  2. wget http://www.gniibe.org/software/hub-ctrl.c #получаем исходники
  3. 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)