As teclas de função do teclado sempre acionam atalhos de mídia, independentemente de Fn ser pressionado

Aug 17 2020

Recentemente comprei um teclado mecânico Varmilo VA109M . Funciona bem no Windows, mas parece confundir minha instalação do Ubuntu, pois as teclas de função F1-F12 aparecem sempre para ativar atalhos de mídia, independentemente de eu ter segurado a tecla modificadora Fn dedicada ou não. Por exemplo, F12 aumentará o volume do meu sistema se eu pressioná-lo sozinho e fará o mesmo se eu pressionar Fn+F12; não há como fazê-lo funcionar como uma tecla F12 normal. Isso está me causando problemas porque eu faço muita programação e muitos atalhos de IDE dependem das teclas de função padrão.

Tentei redefinir as configurações internas do teclado segurando Fn+Esc, mas isso não ajudou. Minha instalação do Windows na mesma máquina funciona perfeitamente bem com este teclado. Existe algo que eu possa fazer para tentar diagnosticar exatamente o que o Ubuntu está confundindo?

EDIT: lsusbgera o seguinte:

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

Respostas

2 modwizcode Nov 07 2020 at 23:49

Isso tem solução!

Então, eu mesmo fiz algumas pesquisas sobre isso recentemente e, embora Jd3eBP esteja certo sobre o teclado fingir ser um teclado da Apple, na verdade é provavelmente um problema com o flash de Varmilo na fábrica.

Eles vendem uma versão do teclado para Mac que eu acho que difere apenas no firmware e na rotulagem, por padrão, acho que suporta o layout do Mac, também deve ser capaz de alternar para o "modo janelas", que provavelmente troca a ordem das teclas para o que você esperaria, ele se identifica como um teclado da Apple para que os Macs o tratem adequadamente.

No entanto, parece que talvez eles tenham acidentalmente atualizado esse firmware em todos os teclados, em vez de apenas nos do Mac, o que não é perceptível no Windows, pois ignora o id, mas no linux ativará o driver hid_apple.

Solução:

Vamos para a parte da resposta. Existem duas grandes opções para resolver isso, testei ambas e acabei achando a segunda bem melhor.

  1. Altere o hid_apple para um modo em que ele trate as teclas de função normalmente, pois isso basicamente resolverá o problema. Você pode encontrar instruções aqui sobre como fazer isso, funcionará no Ubuntu também.https://wiki.archlinux.org/index.php/Apple_Keyboard#Function_keys_do_not_work.

  2. Atualize novamente o teclado com o ID do produto e do fornecedor para que não seja detectado. Esta é sem dúvida a resposta certa, mas um pouco mais arriscada. Você pode obter os arquivos de firmware do site do fabricante aqui,https://en.varmilo.com/keyboardproscenium/Driverdownload, usando o download VA87M. O atualizador em si não funcionou (acho que precisava da localização chinesa instalada), então você pode usar o atualizador que foi fornecido para alguém aquihttps://www.reddit.com/r/Varmilo/comments/g4sabk/fn_lock_on_va87m/, usando o arquivo de firmware oficial da para uma boa medida. Se você não confia nisso, ouvi dizer que se você enviar um e-mail a Varmilo sobre o problema, eles fornecerão os arquivos necessários.

Esse atualizador funcionou no wine para mim depois de instalar o wine no site oficial. Isso apenas atualiza o ID do fornecedor e do produto para não aparecer como um teclado Apple, mas também remove a funcionalidade "mudar para o modo Windows/Mac" que não era usada na versão somente para Windows. Você provavelmente poderia atualizar o firmware do Mac para reverter ao comportamento antigo, se quiser, mas não testei isso.

3 JdeBP Aug 21 2020 at 15:23

Varmilo não faz USB direito. Evitar.

Em torno da WWW, pode ser visto que seus teclados relatam falsamente seus fabricantes como Apple (ID do fornecedor 05ac, conforme reivindicado pelo Varmilo VS109M e pelo Varmilo VA88M), Cypress (ID do fornecedor 04b4 , conforme reivindicado pelo Varmilo Z104M ), ROF Electronics ( ID do fornecedor ffff, conforme reivindicado por um Varmilo VA87M ), Nordic Semiconductor (ID do fornecedor 1915 , conforme reivindicado por um Varmilo VB87M ), Holtek e muito mais.

Isso é claramente errôneo e altamente problemático.

Se o dispositivo de hardware de alguém identifica seu fabricante (na enumeração de dispositivos de barramentos PCI, USB e outros) como Apple e seu produto como um teclado Apple específico, é perfeitamente legítimo que os sistemas operacionais o tratem como aquele teclado Apple . ID do fornecedor 05AC ID do produto 024F é o teclado de alumínio da Apple (EUA).

O problema aqui é que o VA109M não é esse teclado .

O teclado da Apple possui uma semântica especial e incomum para a Fntecla, que difere da maioria dos teclados. O driver de dispositivo Linux que é anexado aos teclados da Apple é hid_apple, e que sabe lidar com a Fnchave especial da Apple com seu "uso" USB HID privado.

O VA109M não é um teclado da Apple. É um teclado Varmilo. Não funciona como um teclado da Apple. Ele não emite o "uso" USB HID especial da Apple para arquivos Fn. Como a maioria dos teclados , ele não fica Fnvisível via USB .

Portanto, dirigi-lo como o teclado da Apple que diz que é, não funciona .

  • Uma correção ruim, que também não é trivial de implementar, é desabilitar ou remover o hid_appledriver do Linux.
  • Uma solução ruim é usar a fnmode=2opção para o hid_appledriver inverter seu Fnestado de deslocamento. Isso pelo menos muda para a semântica dessas teclas sendo teclas de função em vez de teclas de controle de mídia/dispositivo.
  • A correção certa é comprar teclados de um fabricante que saiba como definir IDs de fornecedor corretamente, em vez de Varmilo.

Leitura adicional

  • Vroomfondel (2020-06-17). udev: Teclado detectado incorretamente como Apple . Erro do Debian #963002.
1 RoubenTchakhmakhtchian Aug 18 2020 at 03:59

Segundo o fabricante:https://en.varmilo.com/keyboardproscenium/subject_product_detailed?subjectid=221

SO Windows apenas, o macOS não suporta teclas de atalho. Se isso se referir à tecla de função, essa pode ser a resposta. Talvez o suporte ao macOS seja tão irregular quanto o suporte ao Linux.