Linux

鍵盤功能鍵始終觸發媒體快捷鍵,無論是否按住 Fn

  • February 15, 2022

我最近買了一個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

這是可以解決的!

所以我最近自己對此進行了一些研究,雖然 Jd3eBP 關於鍵盤偽裝成 Apple 鍵盤的說法是正確的,但實際上這可能是 Varmilo 在工廠閃爍的問題。

他們出售Mac版本的鍵盤,我認為它僅在韌體和標籤上有所不同,預設情況下我認為它支持Mac佈局,它還應該能夠切換到“Windows模式”,這可能會將鍵的順序交換為正如您所期望的那樣,它將自己標識為 Apple 鍵盤,以便讓 Mac 正確對待它。

然而,似乎他們可能不小心將韌體刷到了每個鍵盤上,而不僅僅是 Mac 鍵盤上,這在 Windows 上並不明顯,因為它忽略了 id,但在 linux 上會啟動 hid_apple 驅動程序。

解決方案:

進入答案部分。解決這個問題有兩個很大的選擇,我測試了兩個,最後發現第二個更好。

  1. 將 hid_apple 更改為正常處理功能鍵的模式,afaik 這基本上可以解決問題。您可以在此處找到有關如何執行此操作的說明,它也適用於 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 韌體以恢復到舊的行為,但是我沒有對此進行測試。

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 鍵盤那樣工作。它不會為Fn. 像大多數鍵盤一樣,它根本無法Fn通過 USB 顯示。

因此,像它所說的 Apple 鍵盤那樣驅動它是行不通的

  • hid_apple一個糟糕的解決方法是禁用或從 Linux中刪除驅動程序,這也不是微不足道的。
  • 一個糟糕的解決方法是使用驅動程序的fnmode=2選項hid_apple來反轉其Fn換檔狀態。這至少切換到這些鍵的語義是功能鍵而不是媒體/設備控制鍵。
  • 正確的解決方法是從知道如何正確設置供應商 ID 的製造商處購買鍵盤,而不是從 Varmilo 處購買。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/604791