Клавиша Fn для Bluetooth Apple Magic Keyboard (2015)

grep -lir 'A B \n D C \n whatever' ./folder_to_search

результатом будут все файлы с точным соответствием текста

3
01.03.2017, 19:24
2 ответа

Частичный ответ : Разобраться в инфраструктуре HID и необработанных данных HID

(Отказ от ответственности: я сделал все это только для USB, но полагаю, что это применимо таким же или аналогичным образом к Блютуз).

HID-устройства могут отправлять и получать отчеты в четко определенном формате. Формат для конкретного устройства задается дескриптором HID , который для USB очень похож на другие дескрипторы USB (например, lsusb может перечислить их, если они не связаны). Подробности (для USB) можно найти в документе PDF Определение класса устройств для устройств с интерфейсом пользователя (HID) .

Документацию ядра для HID можно найти Documentation / hid . Как поясняет hiddev.txt , поток данных для события выглядит следующим образом:

 usb.c --> hid-core.c --> hid-input.c --> input-subsystem

В drivers / hid / hid-input.c , в частности в подпрограмме hidinput_configure_usage отчет анализируется в соответствии с дескриптором HID.

Итак, если вы не видите клавишу Fn , значит, здесь что-то идет не так.

Вывод на hidraw0 выглядит подозрительно, как будто существует несколько видов отчетов с разными идентификаторами (этот отчет имеет идентификатор 1, обычные отчеты с клавиатуры имеют идентификатор 0).

Но для уверенности нам нужен дескриптор (-ы) HID. Дескрипторы HID доступны через ioctl на устройстве hidraw . Вы можете использовать, например, https://github.com/DIGImend/usbhid-dump , чтобы получить дескриптор (только USB), и https://github.com/DIGImend/hidrd ], чтобы разобрать его. Также есть / samples / hidraw / hid-example.файл c в исходном коде ядра, который показывает, как получить дескриптор HID через ioctl; его можно легко изменить для создания шестнадцатеричного дампа, подобного usbhid-dump . Вам придется использовать его для Bluetooth, поэтому я поместил его в pastebin . Компилируйте с помощью make .

(Если вы не привыкли компилировать внешние проекты: загрузите zip-файл для обоих, распакуйте каждый в пустой каталог, ./ bootstrap , ./ configure , make . Теперь вы можете использовать двоичные файлы напрямую, добавлять их $ PATH и т. д.)

Теперь вы можете анализировать дескриптор, используя

sudo ./hid-desc /dev/hidraw0 | tail -n+3 | head -1 | hidrd-convert -ihex -ospec

В дополнение к предоставлению этого вывода (или шестнадцатеричного дампа , если что-то не работает), проверьте, что происходит на hidraw , если вы нажимаете Fn в сочетании с различными другими клавишами (буквенными, стрелками). Также проверьте, что происходит при обычном нажатии клавиш.

Я не уверен, как лучше поступить, если невозможно заставить ядро ​​распознавать специальные отчеты. Возможно, самый простой способ - написать программу на C, которая анализирует события из hidraw и генерирует дополнительные события ввода, аналогично input-create .

Обновление : дескриптор HID содержит дополнительный 00 в конце. Если вы удалите это, он анализирует до

Usage Page (Desktop),                           ; Generic desktop controls (01h)
Usage (Keyboard),                               ; Keyboard (06h, application collection)
Collection (Application),
    Report ID (1),                      ; +00 report id
    Usage Page (Keyboard),                      ; Keyboard/keypad (07h)
    Logical Minimum (0),
    Logical Maximum (1),
    Usage Minimum (KB Leftcontrol),             ; Keyboard left control (E0h, dynamic value)
    Usage Maximum (KB Right GUI),               ; Keyboard right GUI (E7h, dynamic value)
    Report Size (1),
    Report Count (8),
    Input (Variable),                   ; +01 modifier
    Report Count (5),
    Report Size (1),
    Usage Page (LED),                           ; LEDs (08h)
    Usage Minimum (01h),
    Usage Maximum (05h),
    Output (Variable),
    Report Count (1),
    Report Size (3),
    Output (Constant, Variable),
    Report Count (8),
    Report Size (1),
    Logical Minimum (0),
    Logical Maximum (1),
    Usage Page (FF00h),                         ; FF00h, vendor-defined
    Usage (03h),
    Input (Constant, Variable),         ; +02 vendor
    Report Count (6),
    Report Size (8),
    Logical Minimum (0),
    Logical Maximum (101),
    Usage Page (Keyboard),                      ; Keyboard/keypad (07h)
    Usage Minimum (None),                       ; No event (00h, selector)
    Usage Maximum (KB Application),             ; Keyboard Application (65h, selector)
    Input,                              ; +03 6 keysym bytes
    Report Count (1),
    Report Size (1),
    Logical Minimum (0),
    Logical Maximum (1),
    Usage Page (Consumer),                      ; Consumer (0Ch)
    Usage (Eject),                              ; Eject (B8h, one-shot control)
    Input (Variable),                   : +09.0
    Report Count (1),
    Report Size (1),
    Usage Page (FF00h),                         ; FF00h, vendor-defined
    Usage (03h),
    Input (Variable),                   ; +09.1
    Report Count (1),
    Report Size (6),
    Input (Constant, Variable),         : +09.2-7
    Usage Page (FF02h),                         ; FF02h, vendor-defined
    Usage (55h),
    Report ID (85),
    Logical Minimum (0),
    Logical Maximum (255),
    Report Size (8),
    Report Count (64),
    Feature (Variable, No Preferred, Volatile),
End Collection,
Usage Page (FF00h),                             ; FF00h, vendor-defined
Usage (14h),
Collection (Application),
    Report ID (144),
    Usage Page (Power Device),                  ; Power device (84h, power page)
    Report Size (1),
    Report Count (3),
    Logical Minimum (0),
    Logical Maximum (1),
    Usage (61h),
    Usage Page (Power Batsys),                  ; Power battery system (85h, power page)
    Usage (44h),
    Usage (46h),
    Input (Variable),
    Report Count (5),
    Input (Constant),
    Report Size (8),
    Report Count (1),
    Logical Minimum (0),
    Logical Maximum (255),
    Usage (65h),
    Input (Variable),
End Collection

. Есть один отчет о входных событиях с шестнадцатеричным идентификатором 01 , один отчет о состоянии батареи с шестнадцатеричным идентификатором 90 , один выход для установки светодиодов как обычный и один элемент управления функцией, зависящий от поставщика.

Я пометил байты для отчета о входных событиях.Есть несколько полей, определяемых поставщиками, где мы не знаем, что они делают, и должны гадать.

Отчет о входном событии состоит из 10 байтов, и ваши примеры декодируются следующим образом:

ID MM VA K1 K2 K3 K4 K5 K6 VB

01 00 00 00 00 00 00 00 00 02  ; press? Fn 
01 00 00 00 00 00 00 00 00 00  ; release? Fn

01 00 00 3b 00 00 00 00 00 00  ; press F2
01 00 00 00 00 00 00 00 00 00  ; release

01 00 00 00 00 00 00 00 00 00  ;
01 00 00 00 00 00 00 00 00 02  ; press Fn?
01 00 00 3b 00 00 00 00 00 02  ; press F2
01 00 00 00 00 00 00 00 00 02  ; release F2 (but not Fn?)

ID - это отчет. MM - это стандартные 8 битов модификатора, в которых нет места для клавиши Fn . K1 - K6 - одновременное нажатие до 6 клавиш. VA и VB зависят от поставщика. Предполагая, что вы удерживали Fn и просто нажали и отпустили F2 в последнем примере, я предполагаю, что бит 1 в VB представляет собой модификатор для Fn (или хотя бы что-то связанное с этим).

Используйте hexdump -e '10 / 1 "% 02X" "\ n" ', чтобы получить 9 байтов вывода на строку, и проверьте эту гипотезу, объединив Fn с несколькими ключи, включая те комбинации, которые вы хотите переопределить в конце.

Обновление : для полноты и справки в будущем, хотя я предполагаю, что это больше не актуально для данного конкретного случая: можно вводить события HID с помощью UHID, см. Documentation / hid / uhid.txt и samples / uhid / uhid-example.c в ядре.

2
27.01.2020, 21:18

С помощью приведенных выше советов мне удалось создать патч, благодаря которому клавиша Fn работает, когда клавиатура Apple Magic Keyboard подключена через Bluetooth.

Частично проблема заключалась в том, что Magic Keyboard отображается с идентификатором поставщика 0x004c (идентификатор поставщика Bluetooth для Apple )и спрятан -Apple ищет только 0x05ac (идентификатор поставщика Apple USB ), поэтому универсальный модуль hid -использовался вместо hid -apple.

Вторая проблема была в apple_input_mapping, которая исходно исходит из кода в hidinput_configure_usageв соответствии с журналом git.

Патч размещен здесь:https://bugzilla.kernel.org/show_bug.cgi?id=99881#c41

3
27.01.2020, 21:18

Теги

Похожие вопросы