LINUX.ORG.RU

Cougar 500K виснет при нажатии на доп.клавиши

 , , ,


0

1

Всех с праздниками! И всего, всего, всего...
Дед Мороз подкинул головную боль в виде USB-клавиатуры Cougar 500K (http://cougargaming.com/products/keyboards/500k/), которая перестаёт работать после нажатия любой «дополнительной» клавиши (типа G0 .. G6, Fn и т.п.). При чём поведение не зависит от дистрибутива Linux и версии ядра.
На просторах интернета полезной информации пока не нашёл, хотя может плохо искал.
Что накопал на текущий момент:

  • 'lsusb' говорит о том, что есть три «входные оконечные точки» (IN End Points) — 1-HID Keyboard, 2-HID Mouse, 3-HID None;
  • Wireshark в Linux говорит о том, что HID-драйвер читает только первую «оконечную точку»;
  • Wireshark в Windows говорит о том, что драйвер (из комплекта Windows, ни каких доп.драйверов не ставил) читает все три «входных точки». При чем при нажатии «обычных» кнопок пакеты читаются только с первой EP, а при нажатии любой доп.кнопки читаются четыре пакета из 3ей EP, 1ой EP, 2ой EP и 3ей EP.

Отсюда делаю вывод, что в Linux клавиатура зависает (Wireshark не отлавливает ни каких пакетов), из-за того, что она ждёт пока не будут считаны пакеты из 2ой и 3ей EP. Вполне возможно, что ошибаюсь.
В инете нашёл исходники драйвера клавиатуры https://bitbucket.org/Swoogan/aziokbd/src/3c66523be3bc5688fd997cb7df8d45785809c4b6?at=default. Попытался по аналогии сделать свой драйвер. Но вот беда — модуль подгружается (отрабатывает функция 'usb_kbd_init(void)'), а функция 'usb_kbd_probe(struct usb_interface *iface, const struct usb_device_id *id)' не вызывается. В логах при подключении клавиатуры появляются следующие записи:

usb 3-2: USB disconnect, device number 32
usb 3-1: new full-speed USB device number 33 using xhci_hcd
usb 3-1: New USB device found, idVendor=060b, idProduct=500a
usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 3-1: Product: Cougar500k Gaming Keyboard
usb 3-1: Manufacturer: Cougar500k
input: Cougar500k Cougar500k Gaming Keyboard as /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/0003:060B:500A.0046/input/input62
hid-generic 0003:060B:500A.0046: input,hidraw2: USB HID v1.11 Keyboard [Cougar500k Cougar500k Gaming Keyboard] on usb-0000:00:14.0-1/input0
hid-generic 0003:060B:500A.0047: ignoring exceeding usage max
input: Cougar500k Cougar500k Gaming Keyboard as /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.1/0003:060B:500A.0047/input/input63
hid-generic 0003:060B:500A.0047: input,hiddev0,hidraw3: USB HID v1.11 Mouse [Cougar500k Cougar500k Gaming Keyboard] on usb-0000:00:14.0-1/input1
hid-generic 0003:060B:500A.0048: hiddev0,hidraw4: USB HID v1.11 Device [Cougar500k Cougar500k Gaming Keyboard] on usb-0000:00:14.0-1/input2
Понимаю, что делаю не правильно — хотел «нахрапом», но не получилось... Вот теперь вопрос — как заставить ядро при подключении клавиатуры использовать не HID-драйвер, а тот, который я ему подсуну?
Или нужно создавать драйвер-надстройку над hid-generic? Вообще такое возможно, для конкретного HID-устройства задать свой драйвер?

Ответ на: комментарий от anonymous

Дарёному коню в зубы не смотрят

Досталась без чеков и не понятно из какого магазина... А по делу есть что сказать?

Netzschlange
() автор топика

Найди клаву в

xinput list
Затем:
xinput --test <номер твоей клавиатуры>
И нажимай клавиши. Смотри на события, должны быть события key release, если их нет, а только key press - поздравляю, глючная клава может списываться в утиль.

Я надеюсь ты выключил в биосе USB_Legacy прежде чем спрашивать совета? :)

timdorohin ★★★★
()

Эта проблема давно известна, не первая клавиатура от cougar где такая фигня. Патчи так никто и не подготовил, ты можешь быть первым. Исходники драйвера клавиатуры лучше брать конкретно для твоего ядра, т.к. могут быть не очевидные изменения интерфейсов между версиями.

Khnazile ★★★★★
()
Последнее исправление: Khnazile (всего исправлений: 1)
Ответ на: комментарий от Khnazile

Первый шаг

В общем мне удалось заставить работать клавиатуру. Сейчас при нажатии доп.кнопок сканы кнопок скидываются в системный лог и система ни как на них не реагирует, а основные кнопки продолжают работать.
Но сделано через одно место:
во-первых — код драйвера взял по ссылке из первого поста и чуток его подправил, но этого мало — надо сочинять правильные исходники модуля;
во-вторых — драйвер ни в какую не хочет цепляться при подключении клавиатуры; только, если вручную отбиндить клавиатуру от драйвера 'usbhid' и прибиндить к нужному. Остался пока не решённым вопрос — как заставить ядро выбирать нужный драйвер (модуль)?

Netzschlange
() автор топика
Ответ на: Первый шаг от Netzschlange

Анонимус ниже правильно говорит, драйверы цепляются не самим ядром, а демоном udev, по этому надо править конфигурацию демона.

Я думаю, с тем что ты уже сделал можно смело идти в список рассылки linux-input и задавать вопросы там.

Khnazile ★★★★★
()
Последнее исправление: Khnazile (всего исправлений: 1)
Ответ на: комментарий от anonymous

Что-то с udev не получается

Покопался с правилами для udev. Может не внимательно ознакомился с документацией, но не смог найти каким образом можно заставить udev подцепить нужный драйвер. Насколько понял udev отлавливает события создания тех или иных устройств. А т.к. в linux всё файлы, то udev отслеживает создание файлов. И при совпадении условий либо выполняет определённые операции над этими файлами, либо запускает ту или иную команду.
Одно из «стандартных» правил запускает 'kmod' для загрузки модуля ядра (драйвера). Но 'kmod' только подгружает модуль, а за принятие решения, что нужно использовать именно этот драйвер, скорее всего отвечает ядро. А оно почему-то решает использовать модуль 'usbhid', а не тот, который я хотел бы подсунуть.
Вобщем пока не получается заставить: во-первых подгружать модуль при подключении клавиатуры (подгружаю через modprobe), а во-вторых использовать этот модуль вместо 'usbhid'. Наверно что-то напортачил с исходниками модуля и его сборкой.
Так же в процессе изысканий прихожу к мысли, что надо копать в сторону реализации что-то типа HID-драйвера (в исходниках ядра много таких «драйверов», в частности пытался переиспользовать драйвер для микрософтовской клавиатуры, но то же не «выходит каменный цветок»). Но информации по этой теме почти ноль — если про драйвера USB-устройств есть и в LDD3, и на просторах интернета много примеров, то про HID почти ничего.

Netzschlange
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.