1.  Introduction

Dès le lancement de la console PS3 (Japon : 2006-11-11 ; États-Unis : 2006-11-17 ; Europe : 2007-03-23) il a été question d'utiliser son joystick sans fil, surnommé "SIXAXIS", pour d'autres applications. On sait déjà que le SIXAXIS fonctionne comme un périphérique HID ordinaire en mode USB. Puisqu'il est commercialisé comme un périphérique Bluetooth, il était légitime d'espérer pouvoir l'utiliser avec n'importe quel ordinateur conforme à la norme, tout comme la Wiimote.

Ce document explique comment configurer Linux pour utiliser le SIXAXIS comme un périphérique Bluetooth HID.

2.  Avertissements

  • Ces instructions ont été rédigées sans le concours de Sony. L'auteur ne garantit pas que leur mise en œuvre n'endommagera pas votre SIXAXIS ou votre console PS3.

  • L'authentification et le chiffrement Bluetooth n'ont pas encore été testés. Ce document décrit un fonctionnement en mode non sécurisé, ce qui peut être dangereux pour certaines applications, et peut également rendre l'ordinateur hôte temporairement vulnérable à des attaques.

3.  Fonctionnement en mode joystick HID Bluetooth

3.1.  Configuration requise

À ce jour les distributions Linux les plus courantes ne gèrent pas explicitement le SIXAXIS en mode sans fil. C'est pourquoi les modifications décrites ci-dessous sont nécessaires.

  • linux-2.6.21 ou plus .  Les noyaux antérieurs ne gèrent pas les périphériques Bluetooth HID en mode "Report Protocol".

  • patch-hidd-3.9-pabr3 ou patch-hidd-3.19-pabr3 Avec ce patch le serveur HIDP Bluetooth de Linux (hidd) envoie une commande spéciale au SIXAXIS lorsqu'il se connecte. Sony a déjà fourni un patch similaire pour déclencher la transmission des évènements en mode USB.

  • sixpair.c (Requis uniquement si l'on souhaite utiliser le SIXAXIS avec un maître Bluetooth autre que la console PS3.) Le SIXAXIS ne semble pas implémenter la procédure standard d'appariement Bluetooth ; en remplacement, l'appariement est réalisé via la connexion USB, ce qui peut être considéré comme plus simple et plus sûr. Cet utilitaire en ligne de commande recherche le SIXAXIS sur les bus USB et lui indique l'adresse Bluetooth de son nouveau maître.

Alternativement, il devrait être possible de gérer le "Report Protocol" du profil Bluetooth HID avec des noyaux plus anciens en utilisant bthid à la place de hidd, avec un patch similaire.

Par ailleurs, le nouveau service "input" (bluetoothd-service-input), qui remplace hidd dans les versions récentes de bluez-utils, devrait supporter le SIXAXIS sans patch. Cependant, comme il n'accepte pas les connexions provenant de périphériques Bluetooth inconnus, un autre outil serait nécessaire pour mettre en place les autorisations préalables - par exemple un plugin pour udev, comme indiqué dans cette discussion.

Note.  Dans les discussions techniques en anglais au sujet de Bluetooth, le terme "controller" désigne non pas le "game controller" (c'est à dire le joystick), mais l'interface réseau Bluetooth intégrée dans l'ordinateur ou dans la console PS3, d'où parfois des malentendus.


3.2.  Mise en œuvre

  • Vérifier que /etc/bluetooth/hcid.conf contient :

    iscan disable;
    pscan enable;
    #auth enable;                                        
    #encrypt enable;                                     
    

  • Activer Bluetooth :

    # service bluetooth restart
    

  • Pour apparier avec un hôte autre que la console PS3 :

    • Connecter le SIXAXIS avec un cordon USB.

    • Exécuter sixpair :

      # wget http://www.pabr.org/sixlinux/sixpair.c
      # gcc -o sixpair sixpair.c -lusb
      # ./sixpair
      Current Bluetooth master: xx:xx:xx:xx:xx:xx
      Setting master bd_addr to xx:xx:xx:xx:xx:xx
      

    • Déconnecter le cordon USB.

  • Redémarrer le serveur HIDP avec les options appropriées :

    # service hidd stop
    # hidd --server --nocheck -n
    

    (N.B. : --nocheck n'est requis que lors de la première connexion.)

  • (Optionnel) Exécuter hcidump dans un autre shell, en vue de diagnostiquer les problèmes éventuels en comparant avec cette trace normale :

    # hcidump -t -V -x
    

  • Presser le bouton PS sur le SIXAXIS.

  • hidd doit indiquer :

    # hidd --server --nocheck -n
    hidd[8332]: Bluetooth HID daemon
    hidd[8332]: New HID device 00:19:C1:xx:xx:xx (Sony Computer Entertainment Wireless Controller)
    

  • /var/log/messages doit indiquer:

    input: Sony Computer Entertainment Wireless Controller as /class/input/inputX
    

  • Vérifier que le SIXAXIS est reconnu comme un joystick :

    # modprobe joydev
    # jstest /dev/js0      # ou jstest /dev/input/js0
    

    jstest doit signaler les pressions sur les boutons et les déplacements des sticks.

  • Après ces tests, réactiver la sécurité dans /etc/bluetooth/hcid.conf :

    auth enable;                                        
    encrypt enable;                                     
    

    et exécuter :

    # service bluetooth restart
    

4.  Utilisation des capteurs inertiels avec l'interface hidraw

L'interface joystick de Linux (joydev.ko, /dev/input/js*) ne transmet pas les mesures inertielles des accéléromètres et du gyro.

Pour des applications expérimentales, la voie la plus rapide permettant d'accéder à toutes les fonctionnalités de l'appareil consiste à gérer directement des sockets Bluetooth L2CAP (voir [LINMCTOOL]).

Pour une meilleure intégration avec le système d'exploitation, il est préférable d'utiliser l'interface hidraw, comme indiqué dans cette section. Elle donne accès aux input reports HID complets, et s'utilise de la même façon en mode USB et en mode Bluetooth.

4.1.  Configuration requise

4.2.  Mise en œuvre

  • Connecter le joystick avec un cordon USB et presser PS. dmesg doit afficher :

    input,hidraw1: USB HID v1.11 Joystick [Sony PLAYSTATION(R)3 Controller] on usb-xxxx:xx:xx.x-x
    

    et /dev/hidraw1 (ou un autre numéro) doit être créé automatiquement.

  • En mode Bluetooth, un fichier /dev/hidrawX est créé également, mais dmesg n'indique pas son numéro.

  • /dev/hidraw1 fournit les input reports bruts :

    # hexdump -v -e '48/1 "%02x " "\n"' < /dev/hidraw1   # For kernels <  2.6.26
    # hexdump -v -e '49/1 "%02x " "\n"' < /dev/hidraw1   # For kernels >= 2.6.26
    00 00 00 00 00 74 7b 7c 7c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  \
    00 00 00 00 02 ee 10 00 00 00 00 02 b2 77 01 81 02 05 01 ed 01 a4 00 02
    

  • sixhidtest.c décode les mesures inertielles :

    # wget http://www.pabr.org/sixlinux/sixhidtest.c
    # gcc -o sixhidtest sixhidtest.c
    # ./sixhidtest < /dev/hidraw1
    ax= 517 ay= 493 az= 420
    

  • xsixhidtest.c représente graphiquement la vitesse, la position et l'orientation calculées à partir des mesures des accéléromètres. Un filtrage passe-haut est utilisé pour stabiliser la double intégration ; le résultat est satisfaisant pour des signaux périodiques rapides, par exemple des mouvements circulaires. Cet exemple simple ne gère ni les mouvements combinant translation et rotation, ni les rotations autour de l'axe vertical.

    # wget http://www.pabr.org/sixlinux/xsixhidtest.c
    # gcc -o xsixhidtest xsixhidtest.c -lX11 -lm
    # ./xsixhidtest < /dev/hidraw1
    

5.  Limitations

  • Avec certains noyaux, au moins de 2.6.32 à 2.6.33.3, /dev/hidrawX renvoie 50 octets au lieu de 49. C'est corrigé dans la version 2.6.34.

  • Si sixhidtest affiche "Unsupported report length", mettre à jour le noyau (2.6.26 ou ultérieur), ou utiliser sixhidtest-20080426.c et xsixhidtest-20080426.c.

  • Il est recommandé d'utiliser un adaptateur Bluetooth supportant la version 2.0. Sans cela, il arrive que les messages reçus soient tronqués à 12 octets.

  • Sur certaines consoles PS3, hcidump affiche "Role Change" "Role: Master" et dmesg signale "hci_acldata_packet: hci0 ACL packet for unknown connection handle". Ce problème devrait disparaître avec linux-2.6.23 ou ultérieur.

  • Le gestionnaire de joystick HID de Linux devrait peut-être décoder les mesures inertielles comme des axes de joystick. Voir [USBHID] et [HIDP] pour comprendre le problème.

  • L'adaptateur Bluetooth de la console PS3 permet la mise sous tension à distance. Cette fonction n'a pas été testée sous Linux.

  • Le mode Bluetooth authentifié et chiffré n'a pas été testé. Une procédure d'échange de clé via USB est probablement nécessaire.

  • Les LEDs ne sont pas gérées. /dev/js0 devrait allumer la première LED, et ainsi de suite.

  • La transition entre le mode USB et le mode Bluetooth n'est pas transparente pour les applications.

  • La gestion de l'état de la batterie n'a pas été testée.

  • D'autres périphériques pour PlayStation utilisent aussi un appariement par USB, mais avec des protocoles légèrement différents. Certains sont pris en charge par [LINMCTOOL].


6.  Détails sur les vidéos de démonstration

La configuration mécanique à six degrés de liberté visible dans la première vidéo est appelée "manipulateur parallèle" ou "chaînes cinématiques parallèles". Les six servos R/C sont raccordés à une carte Gumstix avec module Bluetooth intégré. Les mesures des capteurs inertiels du SIXAXIS sont reçues via une socket PF_BLUETOOTH (et pas via l'API joystick, en raison de problèmes avec les descripteurs HID). L'algorithme distingue explicitement deux types de mouvement (rotation ou translation).

Dans la deuxième vidéo, la carte Linux embarquée transforme les données reçues du SIXAXIS en un signal PPM qui est injecté dans la chaîne de réception de l'hélicoptère (voir [CHROMICRO]). Le mode "stick" imite un émetteur RC mode 2 pour hélicoptère, avec les gaz sur la gâchette L2. En mode "capteur d'inclinaison", le pas cyclique est contrôlé par deux accéléromètres plutôt que par le stick droit.

7.  Remerciements

Le fonctionnement du SIXAXIS n'aurait pas pu être élucidé sans les contributions de Jim Paris and Samson Yeung.

Merci à Sony d'avoir permis l'utilisation de Linux sur la PS3 (fût-ce sous la surveillance d'un hyperviseur). La plupart des autres consoles sont beaucoup moins ouvertes.

Bibliographie

[CHROMICRO] ChRoMicro - Cheap Robotic Microhelicopter HOWTO (FR) . http://www.pabr.org/chromicro/doc/chromicro.fr.html .

[LINMCTOOL] linmctool - Utilitaire Linux pour périphériques à détection de mouvement . http://www.pabr.org/linmctool/linmctool.fr.html .

[USBHID] Universal Serial Bus. Device Class Definition for Human Interface Devices (HID). http://www.usb.org/developers/devclass_docs/HID1_11.pdf.

[HIDP] Bluetooth Specification. Human Interface Device (HID) Profile. http://www.bluetooth.com/Specification%20Documents/HID_SPEC_V10.pdf.