Como ler as teclas extras do teclado (Steelseries APEX 300)

0

Eu tento obter as chaves extras do Steelseries APEX 300 funcionando. As teclas principais e as teclas especiais padrão estão funcionando corretamente.

No final, quero escrever um pequeno aplicativo (C / C ++ Qt) para atribuir alguns comandos a essas chaves.

Para isso, faço algumas pesquisas:

  1. procure o dispositivo:

    $ lsusb
    Bus 003 Device 004: ID 1038:1208 SteelSeries ApS 
    
  2. examine o log do kernel:

    [ 1173.630363] usb 3-1.1: new full-speed USB device number 13 using xhci_hcd
    [ 1173.748310] usb 3-1.1: New USB device found, idVendor=1038, idProduct=1208
    [ 1173.748314] usb 3-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    [ 1173.748316] usb 3-1.1: Product: SteelSeries Apex 300 Gaming Keyboard
    [ 1173.748317] usb 3-1.1: Manufacturer: SteelSeries
    [ 1173.750546]  0003:1038:1208.000D: hiddev0,hidraw0: USB HID v1.11 Device [SteelSeries SteelSeries Apex 300 Gaming Keyboard] on usb-0000:00:14.0-1.1/input0
    [ 1173.751418] input: SteelSeries SteelSeries Apex 300 Gaming Keyboard as /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.1/3-1.1:1.1/0003:1038:1208.000E/input/input32
    [ 1173.810811] hid-generic 0003:1038:1208.000E: input,hidraw2: USB HID v1.11 Keyboard [SteelSeries SteelSeries Apex 300 Gaming Keyboard] on usb-0000:00:14.0-1.1/input1
    [ 1173.812405] input: SteelSeries SteelSeries Apex 300 Gaming Keyboard as /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.1/3-1.1:1.2/0003:1038:1208.000F/input/input33
    [ 1173.870645] hid-generic 0003:1038:1208.000F: input,hidraw3: USB HID v1.11 Device [SteelSeries SteelSeries Apex 300 Gaming Keyboard] on usb-0000:00:14.0-1.1/input2
    
  3. Eu vi que hidraw0 , hidraw2 e hidraw3 foram adicionados. Então, eu finalmente vejo todos os hidraw* para sua saída e descobri usando sudo cat :

    • hidraw0 =?
    • hidraw1 = mouse
    • hidraw2 = teclas do teclado
    • hidraw3 = teclas de função especiais (volume ...)
    • hidraw4 = mouse
    • hidraw5 =?

É possível que hidraw0 seja a chave.

  1. Em / dev / input / by-id / , encontrei duas entradas de ajuste referentes ao APEX:

    $ls /dev/input/by-id/usb-SteelSeries_SteelSeries_Apex_300_*
    usb-SteelSeries_SteelSeries_Apex_300_Gaming_Keyboard-event-if02
    usb-SteelSeries_SteelSeries_Apex_300_Gaming_Keyboard-if01-event-kbd
    

    Aqui eu tento usar cat novamente:

    • *-event-if02 : nada
    • *-if01-event-kbd : entradas de teclado padrão

Encontrei uma postagem ( Reconhecer teclas extras do teclado: Steelseries Apex ) lidar com este teclado, mas meu conhecimento Haskell é muito pobre. Eu só entendo que o APEX precisa receber um comando para habilitar as chaves.

Você pode me dar algumas dicas por onde começar?

    
por Alex44 21.01.2018 / 19:48

2 respostas

0

Basta navegar pelo código de Haskell vinculado:

put (CmdEnableExtraKeys) = do
  put32 [0x02, 0x00, 0x02]

é o relatório que você precisa enviar (3 bytes),

withDevice 0x1038 [0x1200, 0x1202, 0x1208] $ \dev -> do
  withDeviceHandle dev $ \devHndl ->
  withDetachedKernelDriver devHndl 0 $
  withClaimedInterface devHndl 0 $ do ...

localiza um dispositivo com o ID de fornecedor 1038 e IDs de dispositivo 1200 , 1202 , 1208 , desanexa o driver do kernel e trabalha nele.

apexCtl :: DeviceHandle -> ByteString -> IO ()
apexCtl devHndl d = do
  putStrLn "WRITING SET_REPORT"
  writeControlExact devHndl controlSetup d noTimeout

faz a escrita real; writeControlExact é de System.USB , escreve um controle USB? e, portanto, parece ignorar a camada HID. Isso é um palpite, já que não estou familiarizado com essa biblioteca.

Então, eu ou tentaria colocar o programa Haskell em execução (as instruções estão no git readme que você vinculou), ou execute esse controle USB com o que você estiver mais familiarizado.

BTW, você pode usar evtest para entender melhor o que acontece na camada de entrada e observar os relatórios HID para entender a camada HID com

mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/hid/YOUR_DEVICE/rdesc
    
por 21.01.2018 / 21:17
0

Apex-Macros é outro programa para habilitar as chaves extras. Está escrito em C e pode ficar mais claro se você não estiver habituado a Haskell.

Eu suspeito que essa funcionalidade deva ser adicionada ao driver do kernel como uma peculiaridade de dispositivo.

O que funciona com este teclado no momento é a funcionalidade básica das teclas extras. Os programas ApexCtrl e Apex-Macros simplesmente enviam ao teclado um comando para reportar as chaves como chaves normais. Uma vez que este comando é enviado, o kernel recebe scancodes para as chaves L / M / MX e pode ser definido normalmente:

  • O hwdb pode substituir o mapeamento de scancodes para códigos de teclas específicos
  • O XKB pode substituir o mapeamento de códigos de teclas para keyyms específicos
  • aplicativos podem ser configurados para atuar nessas chaves

Eu uso uma versão antiga do ApexCtl , embora a compilação tenha falhado da última vez que tentei. A combinação de definições de chave básicas em opções de hwdb e XKB personalizado permite-me definir as chaves extras para keyyms não utilizados, que podem ser macrod para iniciar qualquer programa desejado com ferramentas como xbindkeys .

O hwdb que vem com o ApexCtl é para um formato antigo do udev e precisa ser atualizado. Eu acho que o Apex-Macros está usando os mesmos métodos, então o hwdb do ApexCtl deve ser efetivo com essa ferramenta também. Consulte a documentação do ApexCtl para a qual os scancodes pertencem a quais chaves de hardware e, em seguida, você pode ajustar as definições adequadamente .

# original -- ApexCtl/config/90-apex.hwdb
keyboard:usb:v1038p120[02]*

# new format + my tweaks
evdev:input:b0003v1038p120[028]*
 KEYBOARD_KEY_0700a8=prog1
 KEYBOARD_KEY_0700a9=prog2
 KEYBOARD_KEY_0700ac=coffee
 KEYBOARD_KEY_0700ad=msdos
 KEYBOARD_KEY_0700e8=nextsong
 KEYBOARD_KEY_0700e9=playpause
 KEYBOARD_KEY_0700ea=previoussong
 KEYBOARD_KEY_0700eb=stopcd
 KEYBOARD_KEY_0700ec=record
 KEYBOARD_KEY_0700f4=f13
 KEYBOARD_KEY_0700f5=f14
 KEYBOARD_KEY_0700f6=f15
 KEYBOARD_KEY_0700f7=f16
 KEYBOARD_KEY_0700f8=f17
 KEYBOARD_KEY_0700f9=f18
 KEYBOARD_KEY_0700fa=f19
 KEYBOARD_KEY_0700fb=f20
 KEYBOARD_KEY_0700fc=f21
 KEYBOARD_KEY_0700fd=f22
 KEYBOARD_KEY_0700fe=f23
 KEYBOARD_KEY_0700ff=f24

Com essas definições de código de acesso no hwdb, eu uso esse arquivo de símbolos XKB para definir opções conforme necessário. Normalmente eu uso a meta-opção apexf13 para extrair várias opções. As substituições reais são feitas em pequenas opções que manipulam um grupo de chaves por vez, para que possam ser substituídas sem afetar os outros grupos de chaves.

// place in /usr/share/X11/xkb/symbols/apex
// or a custom location for use with setxkbmap -I
// modify /usr/share/X11/xkb/rules/evdev{,.lst,.xml} to use systemwide

// These are intended to be loaded after inet(evdev) to override
// its generic ideas.

// for use with Apex300
// L1-L2 as layout toggles
partial alphanumeric_keys
xkb_symbols "lkeys_grp" {
    key <I156> { [ ISO_Next_Group, ISO_First_Group ] };
    key <I157> { [ ISO_Prev_Group, ISO_Last_Group  ] };
}; // end of "lkeys_grp"

// for use with Apex300
// L1-L2 as VolUp-VolDown
partial alphanumeric_keys
xkb_symbols "lkeys_vol" {
    key <I156> { [ XF86AudioRaiseVolume ] };
    key <I157> { [ XF86AudioLowerVolume ] };
}; // end of "lkeys_vol"

// for use with Apex300
// Combo arrows mute
partial alphanumeric_keys
xkb_symbols "arrows_mute" {
    key <I160> { [ XF86AudioMicMute      ] };
    key <I159> { [ XF86AudioMute         ] };
}; // end of "arrows_mute"

// for use with Apex300
// Combo arrows as browser Back/Forward, shifted Stop/Reload
partial alphanumeric_keys
xkb_symbols "arrows_www" {
    key <I160> { [ XF86Back,    XF86Stop   ] };
    key <I159> { [ XF86Forward, XF86Reload ] };
}; // end of "arrows_www"

// for use with Apex300
// MX1-MX5 as media keys
partial alphanumeric_keys
xkb_symbols "mxkeys_media" {
    key <I171> { [ XF86AudioNext                   ] };
    key <I172> { [ XF86AudioPlay,   XF86AudioPause ] };
    key <I173> { [ XF86AudioPrev                   ] };
    key <I174> { [ XF86AudioStop,   XF86Eject      ] };
    key <I175> { [ XF86AudioRecord                 ] };
}; // end of "mxkeys_media"

// for use with Apex300
// MX1-MX5 as Launch1-5
partial alphanumeric_keys
xkb_symbols "mxkeys_prog" {
    key <I171> { [ XF86Launch1 ] };
    key <I172> { [ XF86Launch2 ] };
    key <I173> { [ XF86Launch3 ] };
    key <I174> { [ XF86Launch4 ] };
    key <I175> { [ XF86Launch5 ] };
}; // end of "mxkeys_prog"

// for use with Apex300
// M1-M4 as F13-F16
partial alphanumeric_keys
xkb_symbols "mkeys1_f13" {
    key <FK13> { [ F13      ] };
    key <FK14> { [ F14      ] };
    key <FK15> { [ F15      ] };
    key <FK16> { [ F16      ] };
}; // end of "mkeys1_f13"

// for use with Apex300
// M5-M8 as F17-F20
partial alphanumeric_keys
xkb_symbols "mkeys5_f17" {
    key <FK17> { [ F17      ] };
    key <FK18> { [ F18      ] };
    key <FK19> { [ F19      ] };
    key <FK20> { [ F20      ] };
}; // end of "mkeys5_f17"

// for use with Apex300
// M9-M12 as F21-F24
partial alphanumeric_keys
xkb_symbols "mkeys9_f21" {
    key <FK21> { [ F21      ] };
    key <FK22> { [ F22      ] };
    key <FK23> { [ F23      ] };
    key <FK24> { [ F24      ] };
}; // end of "mkeys9_f21"

// for use with Apex300
// M1-M12 as F13-F24
partial alphanumeric_keys
xkb_symbols "mkeys_f13" {
    include "apex(mkeys1_f13)"
    include "apex(mkeys5_f17)"
    include "apex(mkeys9_f21)"
}; // end of "mkeys_f13"

// for use with Apex300
// M5-M8 as Launch5-8
partial alphanumeric_keys
xkb_symbols "mkeys5_prog5" {
    key <FK17> { [ XF86Launch5 ] };
    key <FK18> { [ XF86Launch6 ] };
    key <FK19> { [ XF86Launch7 ] };
    key <FK20> { [ XF86Launch8 ] };
}; // end of "mkeys5_prog5"

// for use with Apex300
partial alphanumeric_keys
xkb_symbols "apexf13" {
    include "apex(mkeys_f13)"
    include "apex(lkeys_volmute)"
    include "apex(arrows_mute)"
    include "apex(mxkeys_media)"
}; // end of "apexf13"

// define other options here

Quando os símbolos hwdb e xkb modificados forem carregados, você poderá usá-los nos aplicativos como seria de esperar. A única chave que não é configurável é a chave do logo SteelSeries, que é essencialmente uma chave Fn (brevemente documentada em Geometria Apex300 da XKB ).

Como exemplo, eu uso essa configuração em i3wm para vincular as chaves de mídia a playerctl :

#$mod+key activates playerctl thru dbus for MPRIS-capable players
bindsym $mod+XF86AudioRaiseVolume exec playerctl volume 0.05+
bindsym $mod+XF86AudioLowerVolume exec playerctl volume 0.05-
bindsym $mod+XF86AudioNext exec playerctl next
bindsym $mod+XF86AudioPrev exec playerctl previous
bindsym $mod+XF86AudioPlay exec playerctl play-pause
bindsym $mod+XF86AudioStop exec playerctl stop
    
por 21.01.2018 / 22:54