Вопрос или проблема
Я реализовал тестовую 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.