蓝牙Apple Magic Keyboard的Fn键(2015)

橙子

我在Fedora 25(内核:)上使用Apple Magic Keyboard(带LiIon电池的蓝牙无线网络,用于充电和系留连接的Lightning端口)时遇到问题4.8.15-300.fc25.x86_64

问题在于,在无线模式下使用时,Fn密钥似乎没有注册。我尝试过xev,该键本身不会触发任何事件,并且与另一个键所按下的键相比,按下另一个键所导致的触发事件也不会引起任何不同。我想使用该Fn键的原因是因为我想分别将Fn+ /映射Home和,End并且还使用默认情况下现在是功能键的多媒体键。

有趣的是,当我用闪电电缆将其连接到计算机时,该键盘可以用作普通的Apple有线键盘,我认为这是由于未使用蓝牙无线电并求助于USB硬件/驱动程序(可能已向与原始的Apple铝制键盘不同的USB设备ID,我没有验证)。这样做允许使用功能键以及默认情况下在Internet上找到的所有功能,如功能键或多媒体键。

但是,我希望将其用作蓝牙键盘时具有相同的功能。我会尽可能修补内核,但不知道从哪里开始以及如何进行测试和调试(显然,我想先尝试使用较少的“侵入性”手段)。

任何关于如何解决此问题的想法都欢迎。

更新

当我从中读取内容/dev/hidraw0时,Fn按下键时我会进行一些活动,因此这可能意味着fn按键已由系统注册,但一路上迷路了……

更新2

evtest按下该Fn时不显示任何事件,并且/dev/input/event4(魔术键盘的事件设备)不触发事件(其他键可以触发)。因此,我认为问题在于该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
直接

部分答案:理解HID基础结构和HID原始数据

(免责声明:我只为USB完成了所有这些操作,但我想它会以相同或相似的方式应用于蓝牙)。

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描述符可通过hidraw设备上的ioctl获得例如https://github.com/DIGImend/usbhid-dump您可以使用来获取描述符(仅限USB)并https://github.com/DIGImend/hidrd进行解析。/samples/hidraw/hid-example.c内核源代码中还有一个文件,显示了如何通过ioctl获取HID描述符。可以很容易地对其进行修改以产生类似于的十六进制转储usbhid-dump您必须将其用于蓝牙,所以我将其放在pastebin中用编译make

(如果您不习惯编译外部项目:下载zip文件两个,每个解压到一个空目录,./bootstrap./configuremake。现在你可以直接使用的二进制文件,将它们添加$PATH等)

现在您可以使用

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

除了提供此输出(或hexdump,如果不起作用)之外,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

有一个输入事件报告的ID十六进制01,一个电池状态报告的ID十六进制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没有空间K1K6高达6个键按压simultanously。VA并且VB是特定于供应商的。假设在上一个示例中Fn按住并刚刚按下并释放F2,我的猜测是in中的位1VB代表Fn(或至少与之相关的)修饰符

使用hexdump -e '10/1 "%02X ""\n"'得到9个字节每行输出,并结合检验这一假设Fn与几个键,包括你到底想要重新定义的组合。

更新:为了完整性和将来的参考,尽管我认为在这种情况下它不再重要:可以使用UHID注入HID事件,请参见Documentation/hid/uhid.txtandsamples/uhid/uhid-example.c在内核中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Apple Magic Keyboard 2,无法通过蓝牙正常工作(16.10)

来自分类Dev

Windows FN键上的Apple Magic键盘

来自分类Dev

Ctrl + Alt + Del 在 Windows 上使用“Apple Magic Keyboard 2 with keypad”

来自分类Dev

Ubuntu 18.04 配对 Apple Magic Keyboard 1,显示“已配对”但没有来自键盘的输入

来自分类Dev

如何在Linux中的Apple Keyboard上交换功能键的“ fn”使用

来自分类Dev

Apple Magic Trackpad多点触控配置

来自分类Dev

在Linux下的Apple Keyboard上,如何在没有fn修饰键的情况下使功能键起作用?

来自分类Dev

如何使用Apple Magic Mouse鼠标配置“自然滚动”?

来自分类Dev

如何使用Apple Magic Mouse鼠标配置“自然滚动”?

来自分类Dev

Apple Magic Mouse可以在Windows 7 x86 / x64上完全运行吗?

来自分类Dev

如何在没有Boot Camp的PC上安装Apple Magic Trackpad?

来自分类Dev

为什么xorg的默认配置禁用了我的Apple Magic Trackpad上定义的按钮区域?

来自分类Dev

为什么xorg的默认配置禁用了我的Apple Magic Trackpad定义的按钮区域?

来自分类Dev

是否存在将Apple Thunderbolt显示器/ Apple无线键盘/ Apple Magic Mouse鼠标与PC和Mac都通过KVM切换的解决方案?

来自分类Dev

OSX El Captian:如何在没有Apple Magic Mouse鼠标或触控板的情况下切换屏幕

来自分类Dev

如何在不按Fn的情况下在Android蓝牙键盘上使用功能键?

来自分类Dev

有没有办法在Apple无线键盘上重新映射Fn和Ctrl键?

来自分类Dev

Ubuntu 12.10上的Apple蓝牙键盘(和鼠标)问题

来自分类Dev

Ubuntu 12.10上的Apple蓝牙键盘(和鼠标)问题

来自分类Dev

将Apple蓝牙键盘与Windows 7 PC配对

来自分类Dev

使用蓝牙耳机在Apple Watch中录制音频

来自分类Dev

在运行Windows 7的笔记本电脑上使用Apple Magic Mouse鼠标时,如何防止其断开连接?

来自分类Dev

Apple Magic Trackpad 2可以单击和手势,但不会在X中移动鼠标,只能在Wayland中移动

来自分类Dev

使用sudo运行程序会给出无效的MIT-MAGIC-COOKIE-1键无法打开显示:

来自分类Dev

什么是ELF Magic?

来自分类Dev

Scala中的Magic PartialFunction

来自分类Dev

Java Magic日期分配

来自分类Dev

黑色Lambda Magic

来自分类Dev

什么是ELF Magic?

Related 相关文章

  1. 1

    Apple Magic Keyboard 2,无法通过蓝牙正常工作(16.10)

  2. 2

    Windows FN键上的Apple Magic键盘

  3. 3

    Ctrl + Alt + Del 在 Windows 上使用“Apple Magic Keyboard 2 with keypad”

  4. 4

    Ubuntu 18.04 配对 Apple Magic Keyboard 1,显示“已配对”但没有来自键盘的输入

  5. 5

    如何在Linux中的Apple Keyboard上交换功能键的“ fn”使用

  6. 6

    Apple Magic Trackpad多点触控配置

  7. 7

    在Linux下的Apple Keyboard上,如何在没有fn修饰键的情况下使功能键起作用?

  8. 8

    如何使用Apple Magic Mouse鼠标配置“自然滚动”?

  9. 9

    如何使用Apple Magic Mouse鼠标配置“自然滚动”?

  10. 10

    Apple Magic Mouse可以在Windows 7 x86 / x64上完全运行吗?

  11. 11

    如何在没有Boot Camp的PC上安装Apple Magic Trackpad?

  12. 12

    为什么xorg的默认配置禁用了我的Apple Magic Trackpad上定义的按钮区域?

  13. 13

    为什么xorg的默认配置禁用了我的Apple Magic Trackpad定义的按钮区域?

  14. 14

    是否存在将Apple Thunderbolt显示器/ Apple无线键盘/ Apple Magic Mouse鼠标与PC和Mac都通过KVM切换的解决方案?

  15. 15

    OSX El Captian:如何在没有Apple Magic Mouse鼠标或触控板的情况下切换屏幕

  16. 16

    如何在不按Fn的情况下在Android蓝牙键盘上使用功能键?

  17. 17

    有没有办法在Apple无线键盘上重新映射Fn和Ctrl键?

  18. 18

    Ubuntu 12.10上的Apple蓝牙键盘(和鼠标)问题

  19. 19

    Ubuntu 12.10上的Apple蓝牙键盘(和鼠标)问题

  20. 20

    将Apple蓝牙键盘与Windows 7 PC配对

  21. 21

    使用蓝牙耳机在Apple Watch中录制音频

  22. 22

    在运行Windows 7的笔记本电脑上使用Apple Magic Mouse鼠标时,如何防止其断开连接?

  23. 23

    Apple Magic Trackpad 2可以单击和手势,但不会在X中移动鼠标,只能在Wayland中移动

  24. 24

    使用sudo运行程序会给出无效的MIT-MAGIC-COOKIE-1键无法打开显示:

  25. 25

    什么是ELF Magic?

  26. 26

    Scala中的Magic PartialFunction

  27. 27

    Java Magic日期分配

  28. 28

    黑色Lambda Magic

  29. 29

    什么是ELF Magic?

热门标签

归档