Кастомная HID-клавиатура не работает в Ubuntu

Вопрос или проблема

Я реализовал тестовую HID-клавиатуру, используя микроконтроллер STM32.

Ничего необычного, просто отправляет непрерывный поток ‘A’ после подключения со скоростью 10 в секунду.

В Windows работает прекрасно. Но когда я подключаю к своей машине с Ubuntu 16, ничего не отображается, хотя устройство распознается правильно, и я не вижу ошибок в dmesg.

Лог dmesg:

[  +9.163248] usb 2-1.1.2: новое устройство USB полного дуплекса номер 34, использующее ehci-pci
[  +0.110516] usb 2-1.1.2: Найдено новое USB-устройство, idVendor=0483, idProduct=5710
[  +0.000005] usb 2-1.1.2: Новые строки USB-устройства: Mfr=1, Product=2, SerialNumber=3
[  +0.000003] usb 2-1.1.2: Продукт: Ключ разблокировки корневого пароля
[  +0.000002] usb 2-1.1.2: Производитель: Nomadic Controls
[  +0.000002] usb 2-1.1.2: SerialNumber: 123456789
[  +0.002741] input: Nomadic Controls Root Password Unlock Key как /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.2/2-1.1.2:1.0/0003:0483:5710.0012/input/input39
[  +0.059560] hid-generic 0003:0483:5710.0012: input,hidraw2: USB HID v1.00 Клавиатура [Nomadic Controls Root Password Unlock Key] на usb-0000:00:1d.0-1.1.2/input0

Я протестировал с помощью evtest и вижу, что данные поступают нормально, просто не отображаются на экране по какой-то причине.

Лог evtest

ID устройства ввода: шина 0x3 производитель 0x483 продукт 0x5710 версия 0x100
Имя устройства ввода: "Nomadic Controls Root Password Unlock Key"
Поддерживаемые события:
  Тип события 0 (EV_SYN)
  Тип события 1 (EV_KEY)
    Код события 1 (KEY_ESC)
    Код события 2 (KEY_1)
    Код события 3 (KEY_2)
    Код события 4 (KEY_3)
    Код события 5 (KEY_4)
    Код события 6 (KEY_5)
    Код события 7 (KEY_6)
    Код события 8 (KEY_7)
    Код события 9 (KEY_8)
    Код события 10 (KEY_9)
    Код события 11 (KEY_0)
    Код события 12 (KEY_MINUS)
    Код события 13 (KEY_EQUAL)
    Код события 14 (KEY_BACKSPACE)
    Код события 15 (KEY_TAB)
    Код события 16 (KEY_Q)
    Код события 17 (KEY_W)
    Код события 18 (KEY_E)
    Код события 19 (KEY_R)
    Код события 20 (KEY_T)
    Код события 21 (KEY_Y)
    Код события 22 (KEY_U)
    Код события 23 (KEY_I)
    Код события 24 (KEY_O)
    Код события 25 (KEY_P)
    Код события 26 (KEY_LEFTBRACE)
    Код события 27 (KEY_RIGHTBRACE)
    Код события 28 (KEY_ENTER)
    Код события 29 (KEY_LEFTCTRL)
    Код события 30 (KEY_A)
    Код события 31 (KEY_S)
    Код события 32 (KEY_D)
    Код события 33 (KEY_F)
    Код события 34 (KEY_G)
    Код события 35 (KEY_H)
    Код события 36 (KEY_J)
    Код события 37 (KEY_K)
    Код события 38 (KEY_L)
    Код события 39 (KEY_SEMICOLON)
    Код события 40 (KEY_APOSTROPHE)
    Код события 41 (KEY_GRAVE)
    Код события 42 (KEY_LEFTSHIFT)
    Код события 43 (KEY_BACKSLASH)
    Код события 44 (KEY_Z)
    Код события 45 (KEY_X)
    Код события 46 (KEY_C)
    Код события 47 (KEY_V)
    Код события 48 (KEY_B)
    Код события 49 (KEY_N)
    Код события 50 (KEY_M)
    Код события 51 (KEY_COMMA)
    Код события 52 (KEY_DOT)
    Код события 53 (KEY_SLASH)
    Код события 54 (KEY_RIGHTSHIFT)
    Код события 55 (KEY_KPASTERISK)
    Код события 56 (KEY_LEFTALT)
    Код события 57 (KEY_SPACE)
    Код события 58 (KEY_CAPSLOCK)
    Код события 59 (KEY_F1)
    Код события 60 (KEY_F2)
    Код события 61 (KEY_F3)
    Код события 62 (KEY_F4)
    Код события 63 (KEY_F5)
    Код события 64 (KEY_F6)
    Код события 65 (KEY_F7)
    Код события 66 (KEY_F8)
    Код события 67 (KEY_F9)
    Код события 68 (KEY_F10)
    Код события 69 (KEY_NUMLOCK)
    Код события 70 (KEY_SCROLLLOCK)
    Код события 71 (KEY_KP7)
    Код события 72 (KEY_KP8)
    Код события 73 (KEY_KP9)
    Код события 74 (KEY_KPMINUS)
    Код события 75 (KEY_KP4)
    Код события 76 (KEY_KP5)
    Код события 77 (KEY_KP6)
    Код события 78 (KEY_KPPLUS)
    Код события 79 (KEY_KP1)
    Код события 80 (KEY_KP2)
    Код события 81 (KEY_KP3)
    Код события 82 (KEY_KP0)
    Код события 83 (KEY_KPDOT)
    Код события 86 (KEY_102ND)
    Код события 87 (KEY_F11)
    Код события 88 (KEY_F12)
    Код события 96 (KEY_KPENTER)
    Код события 97 (KEY_RIGHTCTRL)
    Код события 98 (KEY_KPSLASH)
    Код события 99 (KEY_SYSRQ)
    Код события 100 (KEY_RIGHTALT)
    Код события 102 (KEY_HOME)
    Код события 103 (KEY_UP)
    Код события 104 (KEY_PAGEUP)
    Код события 105 (KEY_LEFT)
    Код события 106 (KEY_RIGHT)
    Код события 107 (KEY_END)
    Код события 108 (KEY_DOWN)
    Код события 109 (KEY_PAGEDOWN)
    Код события 110 (KEY_INSERT)
    Код события 111 (KEY_DELETE)
    Код события 119 (KEY_PAUSE)
    Код события 125 (KEY_LEFTMETA)
    Код события 126 (KEY_RIGHTMETA)
    Код события 127 (KEY_COMPOSE)
  Тип события 4 (EV_MSC)
    Код события 4 (MSC_SCAN)
  Тип события 17 (EV_LED)
    Код события 0 (LED_NUML) состояние 1
    Код события 1 (LED_CAPSL) состояние 0
    Код события 2 (LED_SCROLLL) состояние 0
    Код события 3 (LED_COMPOSE) состояние 0
    Код события 4 (LED_KANA) состояние 0
Обработка повторов клавиш:
  Тип повтора 20 (EV_REP)
    Код повтора 0 (REP_DELAY)
      Значение    250
    Код повтора 1 (REP_PERIOD)
      Значение     33
Свойства:
Тестирование ... (нажмите для выхода)
Событие: время 1517685567.317551, тип 1 (EV_KEY), код 30 (KEY_A), значение 2
Событие: время 1517685567.317551, -------------- SYN_REPORT ------------
Событие: время 1517685567.357555, тип 1 (EV_KEY), код 30 (KEY_A), значение 2
Событие: время 1517685567.357555, -------------- SYN_REPORT ------------
Событие: время 1517685567.397568, тип 1 (EV_KEY), код 30 (KEY_A), значение 2
Событие: время 1517685567.397568, -------------- SYN_REPORT ------------
Событие: время 1517685567.421168, тип 17 (EV_LED), код 0 (LED_NUML), значение 0
Событие: время 1517685567.421168, -------------- SYN_REPORT ------------
Событие: время 1517685567.437542, тип 1 (EV_KEY), код 30 (KEY_A), значение 2
Событие: время 1517685567.437542, -------------- SYN_REPORT ------------
Событие: время 1517685567.477549, тип 1 (EV_KEY), код 30 (KEY_A), значение 2
Событие: время 1517685567.477549, -------------- SYN_REPORT ------------
Событие: время 1517685567.517555, тип 1 (EV_KEY), код 30 (KEY_A), значение 2
Событие: время 1517685567.517555, -------------- SYN_REPORT ------------
Событие: время 1517685567.557554, тип 1 (EV_KEY), код 30 (KEY_A), значение 2
Событие: время 1517685567.557554, -------------- SYN_REPORT ------------
Событие: время 1517685567.597552, тип 1 (EV_KEY), код 30 (KEY_A), значение 2
Событие: время 1517685567.597552, -------------- SYN_REPORT ------------
Событие: время 1517685567.637564, тип 1 (EV_KEY), код 30 (KEY_A), значение 2

Есть идеи, что может происходить?

Если evtest работает, все вовлеченные слои ядра (HID, ввод) работают, так что проблема заключается в трансляции /dev/input/event* в X или Wayland (в зависимости от того, что вы используете). По какой-то причине драйвер X evdev или libinput (в зависимости от используемого вами) не распознает ваше HID-устройство.

Для X11 посмотрите в /var/log/Xorg.0.log для подсказок и, возможно, напишите пользовательский xorg.conf для принудительного включения. Вы можете использовать xev, чтобы увидеть события X, и xinput, чтобы управлять устройствами ввода X. Я не могу помочь с Wayland.

Ответ или решение

Проблема с вашим пользовательским HID-клавиатурным устройством на базе микроконтроллера STM32 в операционной системе Ubuntu 16 вызывает интерес, поскольку устройство работоспособно на Windows, но не отправляет данные на экран в Ubuntu. Давайте подробно рассмотрим, что может быть причиной этой ситуации и как это можно исправить.

1. Анализ Работоспособности на Уровне Ядра

Согласно приведённым логам dmesg, устройство успешно распознается системой. Вывод показывает, что устройство HID был найден и отметка на уровень ядра была сделана, что подтверждает корректную работу ядра, драйверов HID и механизмов ввода:

[  +9.163248] usb 2-1.1.2: new full-speed USB device number 34 using ehci-pci
...
[  +0.059560] hid-generic 0003:0483:5710.0012: input,hidraw2: USB HID v1.00 Keyboard [Nomadic Controls Root Password Unlock Key] on usb-0000:00:1d.0-1.1.2/input0

Так как вы можете наблюдать данные с устройства через evtest, можно сделать вывод, что на уровне ядра всё функционирует корректно. Проблема, вероятно, связана с тем, как данные устройства интерпретируются в графической среде X11 или Wayland.

2. Проверка Управления Вводом

Ваша проблема заключается, скорее всего, в том, что драйверы ввода X11 (также известные как evdev или libinput) не принимают во внимание ваше HID-устройство. Для диагностики и устранения проблемы вы можете выполнить следующие шаги:

A. Логи X Server

Проверьте файл /var/log/Xorg.0.log на наличие сообщений об ошибках или предупреждений, связанных с вашим устройством. Эти логи могут предоставить важный контекст о том, почему ваша клавиатура не работает в X-сервере.

cat /var/log/Xorg.0.log | grep -i "nomadic"

B. Использование xev и xinput

Используйте команду xev для проверки того, регистрируются ли события от клавиатуры. Откройте терминал, запустите xev, и посмотрите, появятся ли какие-либо события, когда вы нажимаете клавиши на вашей клавиатуре:

xev

Если события не отслеживаются, это указывает на то, что устройство не доступно в X-сервере.

Также проверьте список устройств ввода с помощью xinput:

xinput list

Если ваше устройство отображается, но не работает, вам может потребоваться создать или редактировать конфигурацию для X.org.

3. Конфигурация Xorg

Если ваше устройство не определяется X-сервером, решить это можно с помощью создания пользовательского файла конфигурации в /etc/X11/xorg.conf.d/. Создайте файл, например, 99-custom-kbd.conf, и добавьте в него следующие строки:

Section "InputClass"
    Identifier "Custom HID Keyboard"
    MatchProduct "Nomadic Controls Root Password Unlock Key"
    Driver "evdev"  # или "libinput", в зависимости от вашего окружения
EndSection

Сохраните изменения и перезагрузите X-сервер или систему.

4. Миграция на Wayland

Если вы используете Wayland, ваша проблема может быть более сложной, поскольку поддержка пользовательских HID устройств может быть ограничена. На данный момент лучшим подходом будет протестировать ваше устройство в сеансе X11 либо обратиться к документации Wayland на предмет настройки пользовательских устройств ввода.

Заключение

Ваше HID-устройство успешно работает на уровне ядра, но необходимо выполнить несколько шагов для корректной интеграции с графической средой. Проверка логов X-сервера, использование xev и настройка конфигурации X могут помочь вам выявить и решить проблему. Таким образом, вы сможете обеспечить успешную работу вашей клавиатуры в Ubuntu 16.

Оцените материал
Добавить комментарий

Капча загружается...