Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB HUB c поддержкой индикации портов
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Hoodwin
Не знает ли кто, как в линуксе настраивается работа модуля /drivers/usb/core/hub.c по части управления поведения стандартными светодиодами в USB hub-ах? Микросхема CY7C65632 имеет встроенную поддержку индикаторов каждого порта, однако они работают не так как я хотел бы.

Зеленый светодиод загорается сразу, как только устройство проходит нумерацию, а желтый не загорается вообще никогда. А я бы хотел сделать так, чтобы зеленый загорался когда устройство опозналось драйвером, (а еще лучше, чтобы открылось приложением), а желтый символизировал обмен данными. Например, если я втыкаю в USB WiFi адаптер, то желательно увидеть зеленый светодиод, когда запускается wpa_supplicant или хотя бы просто интерфейс поднимается (ifup). А желтый чтобы показывал, что идет передача по сети.

есть еще параметр модуля hub.c:
Код
     58 /* cycle leds on hubs that aren't blinking for attention */
     59 static bool blinkenlights = 0;
     60 module_param (blinkenlights, bool, S_IRUGO);
     61 MODULE_PARM_DESC (blinkenlights, "true to cycle leds on hubs");


но он в запущенной системе всегда readonly, а модуль собран в ядро, так что у меня не получилось поменять его на лету.
Jury093
Цитата(Hoodwin @ Jun 15 2016, 19:32) *
Зеленый светодиод загорается сразу, как только устройство проходит нумерацию, а желтый не загорается вообще никогда.

они работают согласно описанию чипа:
Код
On power up the CY7C6563X defaults to automatic mode, where the color of the Port Indicator (green, amber, off) indicates the functional status of the CY7C6563X port

в теории, если у вас хаб подключен правильно, то закоротив пинцетом питание выходного порта можно созерцать работу светодиода "amber", у нас так проверяют исправность защиты ключей питания портов на USB..
(если у вас не использованы сигналы PWR/OVR, то пинцет не ваш случай..)

Цитата
А я бы хотел сделать так, чтобы зеленый загорался когда устройство опозналось драйвером, (а еще лучше, чтобы открылось приложением), а желтый символизировал обмен данными. Например, если я втыкаю в USB WiFi адаптер, то желательно увидеть зеленый светодиод, когда запускается wpa_supplicant или хотя бы просто интерфейс поднимается (ifup). А желтый чтобы показывал, что идет передача по сети.

в том же мане упоминаются 2 режима:
Код
The CY7C6563X port indicators has two modes of operation: automatic and manual

поищите на их форуме или спросите у суппорта - авось что ответят на вопрос "как включить ручной режим?"
далее, поищите в сети спецификацию на USB 2.0, там расписаны поля для хабов, вас должен интересовать downstream port с полем "by bit 7 of the wHub"
далее, посредством несложной утилитки можно по USB дергать этот бит в нужное положение, _может_быть_ это отобразится на состояние светодиода

у вас линукс.. на мой взгляд проще чем возится с таким подключением, лучше использовать пару GPIO от проца (или взять обычный i2c gpio expander) и объявить свои светодиоды в классе gpio-led. тогда через sysfs вы получите все свои плюшки с минимальными хлопотами
Hoodwin
У нас питание сделано через защитные ключи, так что проверить работу желтого могу. Хотя, в общем, если зеленый работает по автоматическому алгоритму, то и желтый скорее всего тоже. Проблема в том, что это неинформативная индикация. Приборчик не имеет ни клавиатур, ни дисплеев, индикаторы хаба задуманы для того, чтобы любой пользователь, воткнув в него новое устройство, по индикаторам понял, что оно заработало правильно.

Делать, думаю, все равно придется через функции хаба, на то есть две причины:
1) я так понял, что светодиоды поддерживаются спецификацией USB, следовательно они должны работать с любыми хабами, где они есть, стандартными средствами. Со встроенными функциями к тому же BOM дешевле sm.gif

2) У нас в перспективе исполнительные устройства можно будет расширять с помощью хабов, воткнутых в хабы, так что кроме USB ничего туда не потянется.

Так что идея делать это через GPIO неудачная.

А вот есть же в исходнике функция set_port_led и led_work. как их задействовать?
Jury093
Цитата(Hoodwin @ Jun 16 2016, 11:44) *
А вот есть же в исходнике функция set_port_led и led_work. как их задействовать?

для начала убедитесь, что у хаба есть заявленое свойство, видимо как-то так:
CODE
lsusb -v -d 04b4:6572

Bus 001 Device 002: ID 04b4:6572 Cypress Semiconductor Corp.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 9 Hub

bla-bla

Hub Descriptor:
bLength 9
bDescriptorType 41
nNbrPorts 3
wHubCharacteristic 0x00e9
Per-port power switching
Per-port overcurrent protection
TT think time 32 FS bits
Port indicators

полагаю, что последняя строчка - это оно..

далее посмотрите в код driver/usb/ehci-hub.c
там есть занимательный закомментаренный код, вполне может что это ваше
CODE
static void
ehci_hub_descriptor (
struct ehci_hcd *ehci,
struct usb_hub_descriptor *desc
) {

bla-bla

#if 0
// re-enable when we support USB_PORT_FEAT_INDICATOR below.
if (HCS_INDICATOR (ehci->hcs_params))
temp |= HUB_CHAR_PORTIND; /* per-port indicators (LEDs) */
#endif
desc->wHubCharacteristics = cpu_to_le16(temp);
}

я запросто могу ошибаться и код этот, допустим, работал на старых ядрах с тупыми хабами. нынче хабы умеют самостоятельно рулить лампочками портов..
но как зацепка сойдет..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.