Utilisation d'adaptateurs raphnet-tech sur RetroPie

Introduction

Le projet RetroPie est une merveilleuse alternative à l'utilisation d'un PC complet pour vos besoins d'émulation et de jeu rétro. La petite taille, le prix modique et la faible consommation électrique du Raspberry Pi en font la platforme idéale pour le salon, tout comme ces consoles que nous aimons tant.

Puisque RetroPie est basé sur Linux, la totalité des adaptateurs USB raphnet-tech sont supportés nativement. Mais comme j'ai appris qu'il y avait certaines complications avec les adaptateurs multi-joueurs, j'ai créé cette page pour aider.

Les adaptateurs qui fonctionnent tel quel

La bonne nouvelle est que la plupart de nos adaptateurs fonctionneront sans rien faire de spécial. Par exemple:

Adaptateurs multi-joueurs : Problème de valeurs initiales (mouvement vers le nord-ouest)

Les symptômes

Mouvement constant dans les menus de jeux, défilement inattendu lors du retour au menu d'EmulationStation...

La cause

Sous Linux (kernel 4.4), les valeurs initiales des joysticks USB HID ne sont pas initialisées correctement. Telles que sont les choses présentement, bien que des valeurs initiales soient demandées à l'adaptateur lors de son branchement, la réponse en est ignorée. Résultat: Des valeurs d'axe initiales pointant au nord-ouest.

Lorsqu'on utilise plusieurs manettes ou adaptateurs, or lorsqu'un adaptateur multi-manettes est utilisé, cela a des conséquences inattendues. Imaginez qu'avec la manette 1 vous contrôliez le menu EmulationStation. Vous démarrez un jeu supportant deux joueurs. Vous-vous êtes servi de la première manette seulement, ce qui a eu pour effet de remplacer ses valeurs initiales incorrectes. Mais deuxième manette à laquelle vous n'avez pas encore touché pointe toujours au nord-ouest. Si le menu principal de ce jeu permet aux deux joueurs de le contrôler, le résultat est un curseur se déplaçant en continu jusqu'à ce que vous touchiez, enfin, à un des boutons de la deuxième manette. Ceci n'est pas agréable, mais on s'en sort facilement.

Mais qu'arrive-t-il si vous avez un adaptateur à quatre manettes auquel vous n'avez câblé que les ports 1 et 2? Comment faire pour appuyer sur un bouton des manettes 3 et 4 si jamais les valeurs d'axes nord-ouest qu'elles rapportent ont un effet indésirables? Vous ne pouvez rien faire alors c'est grave!

Solution: Patch de kernel

J'ai créé les 3 patchs suivants qui ensemble corrigent le problème: Tout ceci implique de compiler votre propre kernel. Cela prends environ deux heures sur un Pi 2. Ce n'est pas très difficile, il suffit de suivre les instructions données sur cette page avec quelques étapes en plus (décrites plus bas):
https://www.raspberrypi.org/documentation/linux/kernel/building.md
# Obtention des sources du kernel
$ git clone ... # (Voir la page sur  raspberrypi.org mentionnée ci-dessus)

# Téléchargement des patchs
$ wget www.raphnet-tech.com/support/retropie/usbhid_iostart.diff
$ wget www.raphnet-tech.com/support/retropie/usbhid_start_before_connect.diff
$ wget www.raphnet-tech.com/support/retropie/jsdev_initial_value.diff

# Application des patchs
$ cd linux
$ patch -p1 < ../usbhid_iostart.diff
$ patch -p1 < ../usbhid_start_before_connect.diff
$ patch -p1 < ../jsdev_initial_value.diff

Suivez les directives de la page susmentionnée pour compiler et installer votre kernel, redémarrez et amusez vous!

Adaptateurs multi-joueurs et les kernels avant 4.2 (vieux)

Note: Cette section ne s'applique pas aux récentes images de carte SD RetroPie 3.8 car elles utilisent un kernel de la série 4.4.
La manière dont nos adaptateurs multi-joueurs sont conçus fait qu'ils apparaissent à Linux comme une seule manette. Par exemple, un adaptateur basé sur le circuit 4nes4snes (ex: Quatre SNES à USB) apparaissait autrefois comme un joystick comportant 4 paires d'axes et 32 boutons (8 par manette). Mais à partir d'une version de Linux, les 4 paires d'axes se sont fusionnées en une seule (contrôlée par toutes les manettes) et toujours 32 boutons.

Cela est vérifiable via la commande jstest:
pi@retropie:~ $ jstest /dev/input/js0 
Driver version is 2.1.0.
Joystick (raphnet.net 4nes4snes) has 2 axes (X, Y) and 32 buttons (...)

Pour corriger ce problème, en mars 2015 j'ai réalisé un patch kernel afin que l'adaptateur apparaisse en tant que plusieurs manettes indépemndantes. Ce patch a été inclu dans le kernel 4.2.0. Avec ce patch, les choses sont mieux qu'elles ne l'ont jamais été. Mais malheureusement, en date du 2 Mai 2016, les images de cartes SD incluses avec RetroPie contiennent encore un kernel de la série 4.1... Outre attendre, que pouvons nous faire? Doit-on absolument récupérer les sources du kernel, appliquer le patch, compiler le tout et installer? Heureusement non, il y a un moyen plus facile.

Il suffit d'ajouter ceci à la ligne de commande du kernel, l'effet sera le même que le patch.
usbhid.quirks=0x289b:0x0002:0x40,0x289b:0x0003:0x40,0x1781:0x0a9d:0x40
Il se peut que vous ne soyez pas très à l'aise avec l'idée de modifier le fichier /boot/cmdline.txt manuellement, car après tout une erreur ici peut empêcher votre système de démarrer. J'ai donc créé un petit script qui peut s'en charger:

Script: addRaphnetQuirks.sh

Transférez le script vers votre Pi, et branchez-vous y par ssh. Assurez-vous que le script est exécutable en utilisant chmod, puis exécutez-le.
pi@retropie:~ $ sudo chmod +x addRaphnetQuirks.sh
pi@retropie:~ $ sudo ./addRaphnetQuirks.sh

Raphnet-tech cmdline.txt updater script for USB HID quirks, v0.1
 www.raphnet-tech.com/support/retropie/

 Successfully updated /boot/cmdline.txt
Reste à redémarrer le Pi, et votre adaptateur sera vu comme autant de manettes! Amusez-vous bien!

Conclusion

Les adaptateurs raphnet-tech fonctionnent très bien avec RetroPie et Linux en général. Bien qu'aujourd'hui les adaptateurs multi-joueurs nécessitent de légères modifications au système, cette situation est temporaire et disparaîtra avec le temps alors que les éditeurs de distributions Linux passeront à des kernels plus récents.