Bluetooth Apple Magic Keyboard용 Fn 키(2015)

Bluetooth Apple Magic Keyboard용 Fn 키(2015)

사용하는데 문제가 있어요애플 매직 키보드(리튬이온 배터리가 포함된 블루투스 무선, 충전 및 테더링 사용을 위한 Lightning 포트) Fedora 25 포함(커널 4.8.15-300.fc25.x86_64: ).

문제는 무선 모드에서 사용할 때 Fn키가 등록되지 않는 것 같습니다. 나는 그것을 시도했고 xev키 자체는 어떤 이벤트도 발생하지 않으며 다른 키와 함께 키를 누르면 다른 키만 누르는 것과 다르게 이벤트가 발생하지 않습니다. 해당 키를 사용하려는 이유 FnFn+ /를 Home별도로 매핑 End하고 이제 기본적으로 기능 키로 설정된 멀티미디어 키도 사용하고 싶기 때문입니다.

흥미롭게도 라이트닝 케이블을 사용하여 컴퓨터에 연결하면 키보드가 일반 Apple 유선 키보드처럼 작동합니다. 이는 Bluetooth 라디오를 사용하지 않고 Original Apple에 USB 하드웨어/드라이버(아마도 등록을 통해)를 사용하기 때문이라고 가정합니다. 알루미늄 키보드 USB 장치 ID가 다른데 확인하지 않았습니다.) 이렇게 하면 기능 키는 물론 인터넷에서 찾을 수 있는 기본 기능 키나 멀티미디어 키와 같은 모든 기능을 사용할 수 있습니다.

다만, 블루투스 키보드로 사용해도 동일한 기능이 나왔으면 좋겠습니다. 가능하다면 커널을 패치하겠습니다. 하지만 어디서 시작해야 할지, 어떻게 테스트하고 디버그해야 할지 모르겠습니다(분명히 덜 "침투적"인 방법을 먼저 시도하고 싶습니다).

이 문제를 해결하는 방법에 대한 아이디어를 환영합니다.

고쳐 쓰다

을 읽을 때 /dev/hidraw0키를 누르면 어떤 활동이 발생하므로 Fn이는 fn키가 시스템에 등록되었지만 도중에 분실되었음을 의미할 수 있습니다.

업데이트 2

evtest이 키를 누르면 이벤트가 표시되지 않으며 Fn( /dev/input/event4Magic Keyboard의 이벤트 장치) 이벤트가 발생하지 않습니다(다른 키는 수행됨). 그래서 문제는 Fn시스템이 키( /dev/hidraw0데이터 표시를 통해 암시됨)를 읽었지만 전달되지 않는다는 것입니다 /dev/input/event4. 그러나 Linux에서 사용자 입력 데이터 스트림이 어떻게 작동하는지 모르기 때문에 이는 단지 추측일 뿐입니다.

업데이트 3

fn다음은 키를 여러 번 누른 결과 입니다 (누르기 + 떼기).

> sudo cat /dev/hidraw2 | hexdump
0000000 0001 0000 0000 0000 0000 0001 0000 0000
0000010 0000 0200 0001 0000 0000 0000 0000 0001
0000020 0000 0000 0000 0200 0001 0000 0000 0000
0000030 0000 0001 0000 0000 0000 0200 0001 0000
0000040 0000 0000 0000 0001 0000 0000 0000 0200
0000050 0001 0000 0000 0000 0000 0001 0000 0000
0000060 0000 0200 0001 0000 0000 0000 0000 0001
0000070 0000 0000 0000 0200 0001 0000 0000 0000
0000080 0000 0001 0000 0000 0000 0200 0001 0000
0000090 0000 0000 0000 0001 0000 0000 0000 0200
00000a0 0001 0000 0000 0000 0000 0001 0000 0000
00000b0 0000 0200 0001 0000 0000 0000 0000 0001
00000c0 0000 0000 0000 0200 0001 0000 0000 0000
00000d0 0000 0001 0000 0000 0000 0200 0001 0000
00000e0 0000 0000 0000 0001 0000 0000 0000 0200
00000f0 0001 0000 0000 0000 0000 0001 0000 0000
0000100 0000 0200 0001 0000 0000 0000 0000 0001
0000110 0000 0000 0000 0200 0001 0000 0000 0000
0000120 0000 0001 0000 0000 0000 0200 0001 0000
0000130 0000 0000 0000 0001 0000 0000 0000 0200
0000140 0001 0000 0000 0000 0000 0001 0000 0000
0000150 0000 0200 0001 0000 0000 0000 0000 0001
0000160 0000 0000 0000 0200 0001 0000 0000 0000
0000170 0000 0001 0000 0000 0000 0200 0001 0000
0000180 0000 0000 0000 0001 0000 0000 0000 0200
0000190 0001 0000 0000 0000 0000 0001 0000 0000
00001a0 0000 0200 0001 0000 0000 0000 0000 0001
00001b0 0000 0000 0000 0200 0001 0000 0000 0000
00001c0 0000 0001 0000 0000 0000 0200 0001 0000
00001d0 0000 0000 0000 0001 0000 0000 0000 0200
00001e0 0001 0000 0000 0000 0000 0001 0000 0000
00001f0 0000 0200 0001 0000 0000 0000 0000 0001
0000200 0000 0000 0000 0200 0001 0000 0000 0000
0000210 0000 0001 0000 0000 0000 0200 0001 0000
0000220 0000 0000 0000 0001 0000 0000 0000 0200
0000230 0001 0000 0000 0000 0000 0001 0000 0000

이상한 점은 출시 후 가끔 2줄이 출력되기도 하는데, 대부분 1줄이 출력된다는 점이다 fn.

F2Fn+ 각각 다음과 같습니다 F2.

sudo cat /dev/hidraw2 | hexdump
0000000 0001 0000 0000 0000 0000 0001 3b00 0000
^[OQ0000010 0000 0000 0001 0000 0000 0000 0000 0001
^[OQ0000020 3b00 0000 0000 0000 0001 0000 0000 0000
^[OQ0000030 0000 0001 3b00 0000 0000 0000 0001 0000
0000040 0000 0000 0000 0001 3b00 0000 0000 0000
^[OQ0000050 0001 0000 0000 0000 0000 0001 3b00 0000
^[OQ0000060 0000 0000 0001 0000 0000 0000 0000 0001
^[OQ0000070 3b00 0000 0000 0000 0001 0000 0000 0000
0000080 0000 0101 0000 0000 0000 0000 0101 0600
^C

Fn+ F2:

> sudo cat /dev/hidraw2 | hexdump
0000000 0001 0000 0000 0000 0000 0001 0000 0000
^[OQ0000010 0000 0200 0001 3b00 0000 0000 0200 0001
0000020 0000 0000 0000 0200 0001 3b00 0000 0000
^[OQ0000030 0200 0001 0000 0000 0000 0200 0001 3b00
^[OQ0000040 0000 0000 0200 0001 0000 0000 0000 0200
^[OQ0000050 0001 3b00 0000 0000 0200 0001 0000 0000
^[OQ0000060 0000 0200 0001 3b00 0000 0000 0200 0001
0000070 0000 0000 0000 0200 0001 3b00 0000 0000
^[OQ0000080 0200 0001 0000 0000 0000 0200 0001 3b00
^[OQ0000090 0000 0000 0200 0001 0000 0000 0000 0200
^[OQ00000a0 0001 3b00 0000 0000 0200 0001 0000 0000
00000b0 0000 0200 0001 0000 0000 0000 0000 0101
00000c0 0000 0000 0000 0000 0101 0600 0000 0000
^C

업데이트 4

@dirkt의 요청에 따라 보고서 설명자 정보는 다음과 같습니다(주석에 설명된 대로 해당 줄을 실행할 수 없으므로 여기에 전체 덤프가 있습니다. 또한 이제 hidraw2키보드를 변경해야 한다는 점도 참고하세요).

> sudo ./hid-desc /dev/hidraw2
Report Descriptor Size: 171
Report Descriptor:
05 01 09 06 a1 01 85 01 05 07 15 00 25 01 19 e0 29 e7 75 01 95 08 81 02 95 05 75 01 05 08 19 01 29 05 91 02 95 01 75 03 91 03 95 08 75 01 15 00 25 01 06 00 ff 09 03 81 03 95 06 75 08 15 00 25 65 05 07 19 00 29 65 81 00 95 01 75 01 15 00 25 01 05 0c 09 b8 81 02 95 01 75 01 06 00 ff 09 03 81 02 95 01 75 06 81 03 06 02 ff 09 55 85 55 15 00 26 ff 00 75 08 95 40 b1 a2 c0 06 00 ff 09 14 a1 01 85 90 05 84 75 01 95 03 15 00 25 01 09 61 05 85 09 44 09 46 81 02 95 05 81 01 75 08 95 01 15 00 26 ff 00 09 65 81 02 c0 00 

Raw Name: Magic Keyboard
Raw Phys: 00:c2:c6:f7:eb:57
Raw Info:
    bustype: 5 (Bluetooth)
    vendor: 0x004c
    product: 0x0267

답변1

위 팁의 도움으로 Apple Magic Keyboard를 Bluetooth로 연결할 때 Fn 키가 작동하도록 하는 패치를 만들 수 있었습니다.

문제의 일부는 Magic Keyboard가 공급업체 ID 0x004c(Apple의 Bluetooth 공급업체 ID)를 표시하는 반면 hid-apple은 0x05ac(Apple USB 공급업체 ID)만 찾으므로 hid-apple 대신 hid-generic 모듈이 사용된다는 것입니다. .

두 번째 문제는 원래 apple_input_mappinggit 로그의 코드에서 발생했습니다.hidinput_configure_usage

패치는 여기에 게시됩니다:https://bugzilla.kernel.org/show_bug.cgi?id=99881#c41

답변2

부분 답변: HID 인프라 및 HID 원시 데이터 이해

(면책 조항: USB에 대해서만 이 모든 작업을 수행했지만 Bluetooth에도 동일하거나 유사한 방식으로 적용될 것이라고 가정합니다.)

HID 장치는 잘 정의된 형식으로 보고서를 보내고 받을 수 있습니다. 특정 장치의 형식은 다음과 같습니다.HID 설명자, USB의 경우 다른 USB 설명자와 매우 유사합니다(예: lsusb바인딩되지 않은 경우 나열될 수 있음). 자세한 내용(USB)은 다음에서 확인할 수 있습니다.HID(휴먼 인터페이스 장치)에 대한 장치 클래스 정의 PDF 문서.

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서로 다른 ID를 가진 여러 보고서가 있는 것처럼 표시되는 출력은 의심스러워 보입니다(이 보고서의 ID는 1이고 일반 키보드 보고서의 ID는 0입니다).

하지만 이를 보장하려면 HID 설명자가 필요합니다. HID 설명자는 장치의 ioctl을 통해 사용할 수 있습니다 hidraw. 예를 들어, https://github.com/DIGImend/usbhid-dumpget descriptor(USB만 해당)를 사용하여 https://github.com/DIGImend/hidrd구문 분석할 수 있습니다. /samples/hidraw/hid-example.cioctl을 통해 HID 설명자를 얻는 방법을 보여주는 파일도 커널 소스 코드에 있습니다. 이 파일은 쉽게 수정하여 이와 유사한 16진수 덤프를 생성할 수 있습니다 usbhid-dump. 블루투스로 써야해서 넣어놨어요페이스트빈. 컴파일용 make.

(외부 프로젝트를 컴파일하는 데 익숙하지 않은 경우: 두 파일의 zip 파일을 다운로드하고 각 파일의 압축을 빈 디렉터리( , ./bootstrap, )에 풉니다. ./configure이제 make바이너리로 직접 작업하고 추가할 수 있습니다 $PATH.)

이제 다음을 사용하여 설명자를 구문 분석할 수 있습니다.

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

이 출력(또는 작동하지 않는 경우 16진수 덤프)을 제공하는 것 외에도 다양한 다른 키(문자, 화살표)와 함께 누르면 어떤 일이 발생하는지 테스트 hidraw하세요 Fn. 또한 키를 정상적으로 눌렀을 때 어떤 일이 발생하는지 테스트해 보세요.

커널이 특별 보고서를 인식하도록 할 수 없는 경우 진행하는 최선의 방법을 모르겠습니다. 아마도 가장 쉬운 방법은 이벤트를 분석 hidraw하고 추가 입력 이벤트를 생성하는 C 프로그램을 작성하는 것입니다.생성 입력.

고쳐 쓰다: 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

01id hex에 대한 입력 이벤트 보고서 , id hex에 대한 배터리 상태 보고서 90, 평소대로 LED를 설정하는 출력 및 공급업체별 기능 제어가 있습니다 .

입력 이벤트 보고서의 바이트를 표시했습니다. 공급업체가 정의한 필드가 여러 개 있는데 우리는 그 필드가 무엇을 하는지 알지 못하며 추측만 할 수 있습니다.

입력 이벤트 보고서는 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. 최대 6개의 키를 동시에 누를 수 있습니다 K1. 벤더별로 다릅니다 . 이전 예에서 를 누르고 를 눌렀다 가 뗐다고 가정하면 비트 1은 수정자 (또는 적어도 이와 관련된 것)를 나타내는 것 같습니다.K6VAVBFnF2VBFn

hexdump -e '10/1 "%02X ""\n"'출력 라인당 9바이트를 얻고 Fn궁극적으로 재정의하려는 키 조합을 포함하여 여러 키 조합으로 이 가설을 테스트하는 데 사용합니다 .

고쳐 쓰다:완전성과 향후 참조를 위해 더 이상 이 특정 사례와 관련이 없다고 생각합니다. HID 이벤트는 UHID를 사용하여 주입될 수 있습니다. Documentation/hid/uhid.txt커널을 참조하세요 samples/uhid/uhid-example.c.

관련 정보