2021-11-08
Et c'est reparti ! Je me retrouve, une fois de plus, à développer un outil pour configurer des périphériques USB sous Linux. Cette fois-ci, c'est au tour du clavier gaming Suora FX de chez Roccat de passer entre mes mains... Voyons un peu ce qu'il a dans le ventre ! 😁️
Pour la petite histoire, je me suis retrouvé à tripatouiller le Suora FX pour donner un coup de main à un collègue. Il utilise ce clavier depuis quelques semaines au boulot ; et s'il semble en être plutôt content dans l'ensemble, le clavier à tout de même un gros défaut : de base il est animé de vagues arcs-en-ciel très lumineuses et totalement insupportables... Je vous laisse juger par vous-même :
Apperçu des licorneries du Suora FX
Connaissant ma « passion » pour le reverse engineering de périphériques USB, mon collègue est donc venu me demander s'il n'y avait pas moyen de bricoler quelque chose pour que son clavier arrête de vomir des arcs-en-ciel ; si possible avant de se faire assassiner par ses voisins de bureaux. 😛️
Mon premier réflex pour étudier le fonctionnement du clavier a été de suivre la même méthode que celle que j'ai utilisée pour les souris et les casques SteelSeries. J'installe donc Roccat Swarm, l'outil de configuration fourni par le constructeur, sur une machine virtuelle Windows... Et ce fut un échec : je n'ai jamais réussi à faire marcher ce truc... 😭️
Heureusement, après quelques recherches, je suis tombé sur le dépôt Github d'un petit programme écrit en Vala, permettant de parler au Suora FX. On pourrait se dire que ça y est, c'est bon, finalement quelqu'un a déjà fait un outil pour configurer le clavier... mais pas tout à fait. L'outil en question est un éditeur de texte permettant de scripter le clavier en Lua : c'est un peu « too much » pour ce que l'on cherche à accomplir... Mais au moins on dispose des infos utiles dans le code source du logiciel ! 👌️
Essayons donc d'écrire rapidement un petit script Python pour stopper la déferlante arc-en-ciel du clavier...
Pour commencer il nous faudra libusb1 pour pouvoir dialoguer avec des périphériques USB. Sous Debian / Ubuntu, on peut l'installer avec la commande suivante :
sudo apt install python3-libusb1
En suite on peut écrire le script suivant, que j'ai nommé smecta.py (oui oui 😛️), pour éteindre le clavier:
#!/usr/bin/env python3 import usb1 VENDOR_ID = 0x1e7d PRODUCT_ID = 0x3246 INTERFACE = 0x03 # On récupère une connexion a notre périphérique USB context = usb1.USBContext() handle = context.openByVendorIDAndProductID( VENDOR_ID, PRODUCT_ID, skip_on_error=True, ) # On demande au noyau Linux d'arrêter de contrôler l'interface dont on a besoin handle.detachKernelDriver(INTERFACE) # On prend le contrôle de l'interface handle.claimInterface(INTERFACE) # On prépare les données que l'on va envoyer data = [ 0x08, 0x02, # Commande (ne change jamais) 0x01, # Effet prédéfini : 0x01 - 0x0D 0x0A, # Vitesse : 0x00 (rapide) - 0x0A (lent) 0x00 # Luminosité : 0x00 (éteint) - 0x32 (max) 0x01, # Couleur : 0x01 - 0x08. Dans l'ordre: # rouge, vert, jaune, bleu, cyan, violet, blanc 0x00, # Options : 0x00 la plupart du temps, ou une # valeur de 0x01 à 0x04 lorsque l'effet 0x03 est utilisé 0xE9, # Somme de contrôle, calculée en soustrayant # l'ensemble des octets précédent à 0xFF : # 0xFF - 0x08 - 0x02 - 0x01 - 0x0A - 0x00 - 0x01 - 0x00 = 0xE9 ] # On envoie les données au clavier handle.controlWrite(0x21, 0x09, 0x0300, 0x03, data) # On relâche notre contrôle sur l'interface du clavier handle.releaseInterface(INTERFACE) # Et on rend la main au noyau Linux handle.attachKernelDriver(INTERFACE)
On peut à présent exécuter notre script avec les commandes suivantes :
chmod +x smecta.py sudo ./smecta.py
Oui, vous avez bien vu, il faut exécuter le script en root pour pouvoir accéder au périphérique USB. Mais on peut heureusement améliorer cela facilement en configurant udev (on en reparle un peu plus bas 😉️).
Si tout s'est bien passé, le clavier devrait à présent être éteint, pour le plus grand bonheur de votre rétine ! Fini les arcs-en-ciel ! 😎️
Maintenant qu'on a pu écrire un petit script fonctionnel, il ne nous reste plus qu'à développer un petit outil en ligne de commande pour que ça soit plus pratique à utiliser. Je vous présente donc suorafxctl :
https://github.com/flozz/suorafxctl
Pour commencer, il faut installer la libusb 1.0 sur la machine, ce qui peut être fait avec la commande suivante sous Debian / Ubuntu et leurs dérivés :
sudo apt install libusb-1.0-0
Ensuite, vous pouvez installer suorafxctl avec pip :
sudo pip install suorafxctl
Si vous souhaiter pouvoir utiliser l'outil sans avoir besoin d'être root, créez le fichier /etc/udev/rules.d/99-roccat-suora-fx.rules et placez-y la ligne suivante :
SUBSYSTEM=="usb", ATTRS{idVendor}=="1e7d", ATTRS{idProduct}=="3246", MODE="0666"
Puis indiquez à udev qu'il doit prendre en compte vos changements:
sudo udevadm trigger
Il ne vous reste plus qu'à débrancher / rebrancher votre clavier pour que les nouveaux paramètres soient effectifs.
L'outil s'utilise très simplement en ligne de commande. Pour obtenir l'aide vous pouvez taper la commande suivante :
suorafxctl --help
usage: suorafxctl [-h] [-e EFFECT] [-s 0-10] [-b 0-50] [-c COLOR] [-r] optional arguments: -h, --help show this help message and exit -e EFFECT, --effect EFFECT Illumination effect (full-lit, breathing, color-shift, wave-right, wave-left, wave-up, wave-down, fade-out, fade-in, ripple, rain, snake, spiral, game-over, scanner, radar) -s 0-10, --speed 0-10 Illumination effect speed, from 0 (fast) to 10 (slow) -b 0-50, --brightness 0-50 keyboard brightness, from 0 (light off) to 50 -c COLOR, --color COLOR Illumination color (red, green, yellow, blue, aqua, purple, white) -r, --reset reset all settings to their default The first call to this command will reset all unspecified settings to their default value
Par exemple, si vous souhaitez définir une couleur bleue statique et moyennement lumineuse sur le clavier, vous pouvez passer les paramètres suivants :
suorafxctl --effect full-lit --brightness 25 --color blue
L'outil Roccat Swarm permet beaucoup d'autres personnalisations pour le Suora FX (enfin lorsque l'on arrive à le faire fonctionner 🙄️), mais je me contenterai de ces quelques options basiques dans suorafxctl. Elles sont suffisantes pour le but recherché : préserver sa rétine des déferlantes arc-en-ciel du clavier. 🦄️
J'espère en tout cas que cet article et que cet outil pourront vous être utiles. Je vous retrouve dans pas trop longtemps (enfin j'espère) pour un nouvel article ! 😉️
--------------------------------------------------------------------------------