- PVSM.RU - https://www.pvsm.ru -
Как-то давно понадобился мне хаб, желательно с большим количеством портов и c достаточно удобной формой, пригодной для встраивания вместо флоппи-дисковода в отсек 3,5''. Беглый просмотр барахолки подкинул модель D-link DUB-H7, да еще и в комбинации «2 по цене 1». Внешний осмотр ничего особенного не дал, хаб как хаб, сделан добротно, капитальный «принтерный» USB AM-BM на оборотной стороне и 3 А блок питания. Как всегда первым делом разобрал, порадовался малому количеству пустых мест вместо элементов вкупе с качественной пайкой и успокоился. Правда на всякий случай зашел в интернет посмотреть, а что это за хаб и есть ли интересные проекты с его участием. Проектов не оказалось, отзывы пользователей 50/50, в общем, никакой динамики. Хаб на протяжении 5-7 лет довольно сносно работал и выполнял свою задачу, потом плавно переместился в коробку для электронного хлама и вполне возможно сгинул бы в итоге вместе с безызвестными переходниками, адаптерами и т. п. Но произошло у меня в жизни событие, которое заставило-таки меня покопаться в мешках со старым барахлом, найти этот, как оказалось уникальный D-link, и стряхнув пыль извлечь его на божий свет. Если интересно послушать зачем — добро пожаловать под cut.
С появлением маленьких удобных SoC роутеров (вроде любовно описанного мной в статье Руководство по доведению «до кондиции» клона популярного китайского мини-роутера Hame A15, он же «unbranded A5-V11» [1] ) и повсеместного внедрения openwrt для управления сонмами устройств (в абсолютном большинстве случаев, это устройства подключаемые по USB) очень актуальной задачей становится задача управления электропитанием всевозможных модемов, картридеров, usb-rs232 преобразователей и т. д. и т. п. Найболее часто встречается необходимость управления портом при работе с GSM-модемами (для перезагрузки, например). В принципе, народ наработал уже достаточное количество решений [2]. Для этих целей, начиная от использования свободных GPIO выводов в роутере, и заканчивая готовыми реле. Существуют решения и от сторонних производителей. Это например программируемый USB хаб на 4 порта от Acroname [3], который и в корпусе приятном и программным обеспечением богат, но стоит около 300$.
Есть вариант подешевле, умный переключаемый хаб с приятным названием Yupkit YKUSH [4] всего лишь за 35€:
Самые же экономные могут использовать связку из самого дешевого usb хаба, нормально закрытого 5V реле, и любой из Arduino-к для отключения питания от usb порта в случае необходимости. Стоимость такого решения < 10$, без учета временных затрат на пайку и программирование Arduino.
Казалось бы тупик. Либо дорого и красиво, либо просто и на соплях неказисто. Но оказалось существует третий вариант. Притом решение старо, как сама спецификация USB 2.0 [5] для хабов в которой оно описано.
Переводя на русский, получается, что в стандарте USB уже прописана возможность управления питанием портов, с помощью т.н. Per-Port Power Switching (PPPS), но вот встретить устройство, которое бы поддерживало эту возможность не просто тяжело, а очень тяжело. Для реализации PPPS-функционала необходимы дополнительные компоненты (полевые транзисторы и обвязка), которые в целях экономии в хабы не устанавливаются.
Чутко реагируя на запросы рынка некоторые производители указывают в спецификациях хабов функцию PPPS, но на деле дальше надписи на коробке дело не идет. И в принципе, придраться тяжело, ведь многие чипы внутри хабов эту функцию поддерживают, но вот реализовать ее без дополнительных переключателей (транзисторов) невозможно (чаще всего USB порты напрямую подключены к линии +5V).
Я даже разобрал специально несколько маленьких USB-хабов, которые планировал использовать совместно c A5-V11 роутером. Внутри оказались: чип GL850G [6] и горяче любимый китайцами FE1.1s [7]. Естественно внутри обнаружились только сами контроллеры с минимумом деталей. Ввиду миниатюрного размера платы поместить даже навесным монтажом транзистор и примкнувшие к нему детали тяжело. Пришлось это успокоится. Хотя, в зависимости от чипа, если в даташите встречается упоминание о over-current detection and Individual or ganged power control, то можно провести операцию по smart-изации такого устройства по методу описанному в статье [8]. Товарищ использовал комбинацию из транзистора и кучки резисторов для включения функции PPPS в своем хабе.
Также читая документацию, ловишь себя на том, что в ней нет-нет да и встречается упоминание о том, что режим управления портами можно реализовать, добавив дополнительно в схему какой-нибудь AIC1526-0 или MIC2026 (Dual-channel power distribution switch).
Обуреваемый невеселыми мыслями по поводу покупки китайских хабов с неизвестным функционалом («кота в мешке») и невозможности предварительной их проверки, я нечаянно натолкнулся на статью [9], посвященную настройке openwrt для управления питанием USB-хаба, притом в качестве примера приведен тот самый, заброшенный и забытый D-Link DUB-H7 в сером корпусе.
Изучив матчасть [10] стало ясно, что на борту хаба помимо достаточно продвинутого контроллера Philips ISP1521BE есть и целая куча тех самых dual-channel power distribution switch AIC1528-0 для полноценного переключения питания. Хотя судя по даташиту, чип с минимальным обвесом сам может управлять питанием downstream портов (а еще там много чего, как оказалось, не реализовано, например индикация активности upstream порта с помощью технологии GoodLink, или хост USB 1.1 для корректной поддержки смеси 2.0 и 1.1 на downstream портах и т.д. и т.п.).
Кстати, для тех, кто решится повторить пройденный мной путь, сразу скажу, что современные версии D-Link DUB-H7 (в черном глянцевом корпусе) уже не так полезны, как старички серого цвета.
По информации с wikidevi.com (1 [11],2 [12],3 [13],4 [14]) существует несколько ревизий данного хаба, с различным набором компонентов на борту, и соответственно с различным функционалом (А1/A5 — ISP1521BE 7-port, B1-2xGL854G 4-port, C1 — 2xGL850Z 4-port).
Внимание на D-Link DUB-H7 обращено еще и потому, что помимо его неплохого функционала, это еще и самый доступный (как по цене, так и по распространенности) в наших краях вариант. Из моделей, которые могли упоминаться попутно с «Per-Port Power Switching» можно дополнительно отметить, например, такие:
Мне искать упомянутые устройства не довелось, потому что когда-то повезло с версией ревизии A5. Правда сейчас, если бы пришлось покупать такой хаб, я бы постарался найти ревизию B1 [15], потому что помимо управления питанием портов, чип, на котором она построена (GL854G) имеет внутри такую штуку, как Multi Transaction Translator.
Небольшое отступление для того, чтобы расказать, что такое [16] этот Multi Transaction Translator (MTT) и почему он так важен и нужен. Передатчик операции (англ. transaction translator, TT) является важным компонентом любого высокоскоростного хаба, который обеспечивает связь между upstream и downstream портами концентратора, особенно в случае, когда эти порты работают на разных скоростях передачи данных. Фактически, TT отделяет низко- и среднескоростные устройства, от высокоскоростных (сугубо USB 2.0, например) и отвечает за работу на скоростях USB 1.1.
Передатчик операции может быть двух видов — одинарным (англ. Single Transaction Translator, STT) или множественным (англ. Multiple Transaction Translator, MTT). В случае STT используется один передатчик для всех портов, а в случае MTT — у каждого порта свой передатчик. Понятно что первый вариант более дешевый и простой, откуда происходит и основной недостаток такого варианта — в случае подключения к хабу нескольких USB 1.1 портов все они будут работать через одно-единственное «бутылочное горлышко». Думаю можно представить что будет со скоростью обмена.
Говоря простым языком, STT-хабы имеют ограничение на количество устройств, которыми можно пользоваться одновременно. В противном случае это чревато потерей пакетов из-за конфликтов в планировании передачи данных, перегрузкой хаба (особенно в случае использования активно обменивающихся данными устройств, вроде звуковых карт) и т.п. Поэтому лучше при выборе хаба сразу ориентироваться на устройства с MTT, а не искать потом причину нестабильности в работе. Если хаб уже имеется, и он, к несчастью, оказался с STT, то остается только внимательно проверить стандарты подключенных к хабу устройств и, по возможности, сократить количество подключенных USB 1.1 до одного.
К сожалению, абсолютное большинство недорогих хабов, построенных на бюджетных чипах (fe1.1s, GL850G, и ISP1521BE моего A5 хаба) на борту имеют STT, более дорогие и продвинутые (GL852G, GL854G (B1 ревизия обсуждаемого D-link DUB-H7), GL3520, VL812, VL813, SMSC USB2514) работают под управлением MTT.
Проверить тип передатчика операции можно либо прочитав даташит на чип (но часто китайцы не могут или не хотят сообщать марку чипа), либо подключив хаб к компьютеру с *nix и выполнив команду lsusb -v и найдя кусок служебной информации, относящийся к исследуемому хабу (по названию). В строке DeviceProtocol будет указано либо Single TT либо Multi TT. Ясно, что покупать лучше только с Multi :)
При запуске команды lsusb -v -t можно увидеть симпатичную иерархическую структуру подключенных usb-устройств.
Вместо lsusb можно использовать утилиту hwinfo с ключем --usb (ее желательно предварительно установить через sudo apt-get install hwinfo). Тогда вывод информации о usb устройствах будет выглядеть немного иначе:
В общем, кратенько с особенностями работы низкоскоростных устройств разобрались и теперь самое время перейти к программной части.
Cкажу сразу, найти способ реализации функционала PPPS в среде Windows мне не удалось (хотя бы из праздного интереса). Максимум — включить/отключить устройство с помощью утилиты devcon [17]. Буду рад, если кто-то из читателей поправит и дополнит. А пока же все процедуры проводятся на примере Ubuntu (в случае openwrt – алгоритм аналогичен, хотя в последних trunk-ах она уже должна быть включена в состав «дистрибутива»).
Итак, возможность Per-Port Power Switching (PPPS) или «попортового переключения питания» реализуется на хабах с аппаратной поддержкой этой функции с помощью программы hub-ctrl [18] или ее потомка uhubctrl [19]. Рассмотрю их по-очереди.
Программа написана японским борцом за независимость инженером Niibe Yutaka в далеком 2006 году. Но работает без проблем и сейчас. Для установки нам понадобится любой *nix и библиотека libusb-dev. На примере Ubuntu 16.04 LTS алгоритм следующий:
Устанавливаем доп. пакеты: sudo apt-get update && sudo apt-get install libusb-dev git gcc
Скачиваем исходники: git clone github.com/codazoda/hub-ctrl.c [20]
Комплируем с помощью gcc: cd hub-ctrl.c && gcc -o hub-ctrl hub-ctrl.c -lusb
В случае недоступности адреса, можно вручную закачать исходники отсюда [21] или отсюда [22] и скомпилировать описанной выше командой.
У программы достаточно простой синтаксис командной строки, укладывающийся в следующее описание:
./hub-ctrl [{-h HUBNUM | -b BUSNUM -d DEVNUM}] [-P PORT] [{-p [VALUE] | -l [VALUE]}]
где HUBNUM — номер хаба, BUSNUM-номер шины, DEVNUM-номер устройства, PORT-номер порта
Для того, чтобы узнать эти параметры, достаточно запустить команду lsusb:
Кстати, программа hub-ctrl может выступать в качестве своеобразного «пробника» usb-хаба на факт наличия в нем способности к управлению питанием портов. Достаточно ее запустить с ключом -v. Получаем список имеющихся в системе поддерживаемых хабов (строка INFO) и состояние портов (в моем случае все порты выключены).
lab@lab-G:~/hub$ sudo ./hub-ctrl -v
Hub #0 at 001:006
INFO: individual power switching.
WARN: Port indicators are NOT supported.
Hub Port Status:
Port 1: 0000.0000
Port 2: 0000.0000
Port 3: 0000.0000
Port 4: 0000.0000
Port 5: 0000.0000
Port 6: 0000.0000
Port 7: 0000.0000
А вот так будет выглядеть конфигурация, когда все порты включены:
lab@lab-G:~/hub$ sudo ./hub-ctrl -v
Hub #0 at 001:006
INFO: individual power switching.
WARN: Port indicators are NOT supported.
Hub Port Status:
Port 1: 0000.0100 power
Port 2: 0000.0100 power
Port 3: 0000.0100 power
Port 4: 0000.0100 power
Port 5: 0000.0100 power
Port 6: 0000.0100 power
Port 7: 0000.0100 power
Чтобы включить какой-то из портов нужно выполнить команду sudo ./hub-ctrl -h 0 -P 1 -p 1, где -h указывает какой хаб используем (0-й в моем случае), -P говорит какой порт (1-й порт в моем случае), а -p указывает на состояние (0-выключен, 1-включен).
Чтобы получить конфигурацию как на картинке выше, понадобилось последовательно выполнить следующие команды (для изначально отключенных портов):
sudo ./hub-ctrl -h 0 -P 2 -p 1
sudo ./hub-ctrl -h 0 -P 4 -p 1
sudo ./hub-ctrl -h 0 -P 6 -p 1
Соответственно, не сложно написать скрипт, который заставит for fun мигать светодиоды в нужной последовательности. Примеры таких вещей уже есть и успешно функционируют:
азбука Морзе [23] на usb-хабе, елочные гирлянды [24] и т.д. и т.п. Мне вот из возможностей hub-ctrl не хватило функции циклического включения для реализации своих сиюминутных светотехнических фантазий (чтобы не тратить время на написание скрипта ну и т.п.). Этот досадный недостаток устранен в преемнике — uhubctrl.
Программа uhubctrl представляет из себя оптимизированный аналог hub-ctrl и обладает некоторыми косметическими отличиями (ну и конечно же поддерживает большее количество устройств).
Теоретически, утилита может быть скомпилирована для запуска в среде windows, но… Но пока взаимодействует она с утройствами через драйвер winusb.sys, который не может обращаться напрямую к хабу. Также в программе заявлена поддержка USB 3.0 (хабов USB 3.0 поддерживающих Per-Port Power Switching, кстати, намного больше чем хабов USB 2.0 с аналогичным функционалом). При работе с USB 3.0 хабом, подключенным к USB 3.0 upstream-порты, программа определяет его как два независимых виртуальных хаба: USB 2.0 и USB 3.0, а уже сами USB-устройства будут подключены к одному из них в зависимости от их возможностей и скорости соединения. Соответственно, для управления такими устройствами программа по-умолчанию включает/отключает питание на виртуальных хабах (перевести утилиту в ручной режим можно добавив в команду запуска ключ -е).
Важно: некоторую путаницу может вызвать система адресации для USB-портов (она схожа для hub-ctrl и uhubctrl). При работе использует тот же метод адресации аналогичный таковому в ядре Linux: b-x.y.z, где b — номер шины USB, а x, y, z — номера портов цепочки узлов, начиная с корневого USB-хаба для данной шины. Если имеется больше чем один управляемый USB-хаб, определить правильные параметры можно запустив uhubctrl с параметром -l (location). Отмечу, что эта адресация является полустабильной — она не изменится, если вы отключите и подключите USB-устройства обратно к одному и тому же физическому порту.
Алгоритм компиляции программы аналогичен алгоритму для hub-ctrl. За тем только исключением, что дополнительно нужно установить библиотеку libusb-1.0 (версия 1.0.12 или позднее) привычной командой sudo apt-get install libusb-1.0-0-dev, а затем скомпилировать бинарик командой make.
Синтаксис запуска программы следующий
uhubctl -a off -p 2
Эта команда отключает питание (-a off, или -a 0) на порту 2 (-p 2). Поддерживаемые команды off/on/cycle (или 0/1/2). Ключ cycle отключает питание, выжидает некоторое время (определяется ключом -d) и включает его обратно. Т.е. теперь хаб запросто для мигания может заменить микроконтроллер.
А следует из этого то, что «секрет» в старом хабе от D-Link все-такие есть. Использование описанной технологии (PPPS) вполне обосновано при необходимости удаленного управления массивом устройств, подключенных к шине USB. Более того, способ этот уже используется для отключения жестких дисков [25], веб-камер [26] и GSM-модемов [27] (таких как на картинке):
Хотя, что касается модемов и упомянутого мной D-link DUB-H7, то есть люди [28], которые подвергают сомнению работоспособность такой связки (при работе с программой hub-ctrl).
Описанные в статье утилиты (lsusb, hwinfo, hub-ctrl) могут выступать отличным подспорьем при выборе очередного USB-хаба, особенно, если нет доступа к просмотру внутреннего устройства. На хабре уже описывались пользовательские идеи и ожидания от идеальных usb-хабов (здесь [29] и здесь [30]). Описанные алгоритмы проверки существующих хабов, на мой взгляд, отлично дополнят и разбавят описанные авторами подходы. Ну и так, вдогонку, герой моей статьи (D-link DUB-H7 ver. A5) на мой взгляд очень неплохо выглядит с точки зрения схемотехнических решений. На сим, пожалуй, откланяюсь :)
P.S. Вдогонку вопрос к членам хабра-сообщества, у которых вдруг совершенно случайно завалялся такой же как у меня D-link DUB-H7 в сером корпусе. Что за детали установлены на обведенных позициях? Особенно интересуют элементы RP1...RP2 (подозреваю на резисторную сборку из 0-х cопротивлений).
Автор: steanlab
Источник [40]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/299953
Ссылки в тексте:
[1] Руководство по доведению «до кондиции» клона популярного китайского мини-роутера Hame A15, он же «unbranded A5-V11»: https://habr.com/post/425281/
[2] решений: https://electronics.stackexchange.com/questions/393468/efficient-way-to-selectively-unpower-usb-ports
[3] Acroname: https://acroname.com/store/acroname-programmable-usb-hub
[4] Yupkit YKUSH: https://www.yepkit.com/products/ykush
[5] спецификация USB 2.0: https://web.archive.org/web/20120207112406/http://www.usb.org/developers/docs/usb_20_101111.zip
[6] GL850G: https://www.kean.com.au/oshw/WR703N/GL850G%20USB%20Hub%201.07.pdf
[7] FE1.1s: https://cdn-shop.adafruit.com/product-files/2991/FE1.1s+Data+Sheet+(Rev.+1.0).pdf
[8] статье: https://befinitiv.wordpress.com/2014/02/02/hacking-per-port-power-switching-to-an-usb-hub-2/
[9] статью: http://www.ibuyopenwrt.com/index.php/15-yun-compatible/hardware-yun/36-usb-hub-per-port-power-switching-2
[10] матчасть: http://pdf.datasheetcatalog.com/datasheet/philips/ISP1521-03.pdf
[11] 1: https://wikidevi.com/wiki/D-Link_DUB-H7_rev_A2
[12] 2: https://wikidevi.com/wiki/D-Link_DUB-H7_rev_A5
[13] 3: https://wikidevi.com/wiki/D-Link_DUB-H7_rev_B1
[14] 4: https://wikidevi.com/wiki/D-Link_DUB-H7_rev_C1
[15] B1: http://pccar.ru/showpost.php?p=364360&postcount=314
[16] что такое: http://www.cypress.com/file/124006/download
[17] devcon: https://superuser.com/a/502055/171440
[18] hub-ctrl: https://www.gniibe.org/development/ac-power-control-by-USB-hub/
[19] uhubctrl: https://github.com/mvp/uhubctl
[20] github.com/codazoda/hub-ctrl.c: https://github.com/codazoda/hub-ctrl.c
[21] отсюда: http://www.advistatech.com/software/hub-ctrl-20060120.c
[22] отсюда : http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
[23] азбука Морзе: https://gist.github.com/dardo82/52799ae762e8673c8726
[24] елочные гирлянды: https://www.joeldare.com/wiki/usb_powered_animated_christmas_lights
[25] жестких дисков: http://joeyh.name/blog/entry/usb_drives_with_no_phantom_load/
[26] веб-камер: https://gist.github.com/dardo82/66ab5f1947de0186dfbf
[27] GSM-модемов: https://www.sysmocom.de/products/sysmoqmod/index.html
[28] люди: http://atc-ip.ru/info/29/1.html
[29] здесь: https://habr.com/post/233781/
[30] здесь: https://habr.com/post/212947/
[31] simple-is-beauty.blogspot.com/2017/12/usb-port-control.html: http://simple-is-beauty.blogspot.com/2017/12/usb-port-control.html
[32] askubuntu.com/questions/149242/is-it-possible-to-power-up-ports-on-a-usb-hub-from-ubuntu: https://askubuntu.com/questions/149242/is-it-possible-to-power-up-ports-on-a-usb-hub-from-ubuntu
[33] michaelbluejay.com/batteries/dc-christmas-lights.html: https://michaelbluejay.com/batteries/dc-christmas-lights.html
[34] forum.archive.openwrt.org/viewtopic.php?id=49012: https://forum.archive.openwrt.org/viewtopic.php?id=49012
[35] atotto.hatenadiary.jp/entry/linux-sugoi-usb-hub-power-ctrl: http://atotto.hatenadiary.jp/entry/linux-sugoi-usb-hub-power-ctrl
[36] hant.helplib.com/GitHub/article_111870: https://hant.helplib.com/GitHub/article_111870
[37] www.quaxio.com/hub_ctrl: https://www.quaxio.com/hub_ctrl/
[38] forum.ixbt.com/topic.cgi?id=13: https://forum.ixbt.com/topic.cgi?id=13
[39] github.com/crazystick/py-hub-ctrl: https://github.com/crazystick/py-hub-ctrl
[40] Источник: https://habr.com/post/430220/?utm_campaign=430220
Нажмите здесь для печати.