无论是否按下 Fn,键盘功能键始终会触发媒体快捷键

Noo*_*lie 6 linux ubuntu keyboard

我最近买了一台Varmilo VA109M机械键盘。它在 Windows 上运行良好,但似乎让我的 Ubuntu 安装感到困惑,因为F1-F12功能键似乎总是激活媒体快捷方式,无论我Fn是否按住了专用的修饰键。例如,F12如果我单独按下它,则会增加系统音量,如果我按下Fn+也会增加系统音量F12;没有办法让它像普通F12钥匙一样工作。这给我带来了问题,因为我进行了大量编程,并且许多 IDE 快捷方式依赖于标准功能键。

我尝试通过按住Fn+来重置键盘的内部设置Esc,但这没有帮助。我在同一台机器上安装的 Windows 与此键盘完美配合。我能做些什么来尝试准确诊断 Ubuntu 的困惑吗?

编辑:lsusb输出以下内容:

Bus 001 Device 003: ID 05ac:024f Apple, Inc. Varmilo Keyboard
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x05ac Apple, Inc.
  idProduct          0x024f 
  bcdDevice            1.00
  iManufacturer           1 
  iProduct                2 
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x005b
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              350mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      75
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      85
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0010  1x 16 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      33
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0020  1x 32 bytes
        bInterval               4
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0020  1x 32 bytes
        bInterval               4
Run Code Online (Sandbox Code Playgroud)

Jde*_*eBP 6

Varmilo 没有正确使用 USB。避免。

在 WWW 上可以看到,其键盘各种错误地报告其制造商为 Apple(Varmilo VS109M 和 Varmilo VA88M 声称的供应商 ID 05ac)、Cypress(Varmilo Z104M 声称的供应商 ID 04b4 )、ROF Electronics(供应商 ID ffff(Varmilo VA87M 声称)、Nordic Semiconductor(Varmilo VB87M 声称供应商 ID 1915 )、Holtek 等。

这显然是错误的,而且是有很大问题的。

如果一个硬件设备将其制造商(在 PCI、USB 等总线的设备枚举中)标识为 Apple,并将其产品标识为特定的 Apple 键盘,那么操作系统将其视为Apple 键盘是完全合法的。供应商 ID 05AC 产品 ID 024F 是 Apple 铝制键盘(美国)。

这里的问题是VA109M不是那个键盘

Apple 键盘具有特殊且不寻常的按键语义Fn,与大多数键盘不同。连接到 Apple 键盘的 Linux 设备驱动程序是hid_apple,它知道Fn使用其私有 USB HID“用法”来处理 Apple 的特殊密钥。

VA109M 不是 Apple 键盘。这是阿米洛(Varmilo)键盘。它不像苹果键盘那样工作。它不会发出 Apple 特殊 USB HID“用法” Fn与大多数键盘一样,它根本无法Fn通过 USB 显示。

因此,像苹果键盘所说的那样驱动它是行不通的

  • 一个糟糕的解决办法是hid_apple从 Linux 中禁用或删除该驱动程序,但实施起来也很重要。
  • 一个糟糕的解决方法是使用驱动程序fnmode=2的选项hid_apple来反转其Fn换档状态。这至少切换到这些键的语义是功能键而不是媒体/设备控制键。
  • 正确的解决办法是从知道如何正确设置供应商 ID 的制造商那里购买键盘,而不是从 Varmilo 那里购买。

进一步阅读


小智 6

这个是可以解决的!

所以我最近自己对此做了一些研究,虽然 Jd3eBP 关于冒充 Apple 键盘的键盘是正确的,但实际上可能是 Varmilo 在工厂闪烁的问题。

他们销售 Mac 版本的键盘,我认为该键盘的不同之处仅在于固件和标签,默认情况下我认为它支持 Mac 布局,它还应该能够切换到“Windows 模式”,这可能会将按键的顺序交换为正如你所期望的,它会将自己标识为 Apple 键盘,以便让 Mac 正确对待它。

然而,看起来他们可能不小心将该固件刷到了每个键盘上,而不仅仅是 Mac 上的键盘,这在 Windows 上并不明显,因为它忽略了 id,但在 Linux 上会激活 hid_apple 驱动程序。

解决方案:

进入答案部分。有两个大的选择可以解决这个问题,我测试了两个,最终发现第二个更好。

  1. 将 hid_apple 更改为正常处理功能键的模式,相信这基本上可以解决问题。您可以在此处找到有关如何执行此操作的说明,它也适用于 Ubuntu。https://wiki.archlinux.org/index.php/Apple_Keyboard#Function_keys_do_not_work

  2. 使用产品和供应商 ID 重新刷新键盘,使其不会被检测到。这可以说是正确的答案,但风险更大。您可以使用 VA87M 下载从制造商网站https://en.varmilo.com/keyboardproscenium/Driverdownload获取固件文件。更新程序本身不起作用(我认为我需要安装中文本地化),因此您可以使用此处提供给某人的更新程序https://www.reddit.com/r/Varmilo/comments/g4sabk/fn_lock_on_va87m/,使用官方固件文件作为良好的措施。如果您不相信这一点,我听说如果您向 Varmilo 发送电子邮件询问该问题,他们将提供所需的文件。

从官方网站安装 wine 后,该更新程序在 wine 下为我工作。这只是重新刷新供应商和产品 ID,使其不作为 Apple 键盘出现,它还删除了仅 Windows 版本中未使用的“切换到 windows/mac 模式”功能。如果您愿意的话,您可以刷新 Mac 固件以恢复到旧的行为,但我没有对此进行测试。