English version | Frames | PDF | RSS | Accueil

Utilisation du joystick de la PlayStation 3 en mode Bluetooth avec Linux


Table des matières

1. Introduction
2. Avertissements
3. Fonctionnement en mode joystick HID Bluetooth
3.1. Configuration requise
3.2. Mise en œuvre
4. Utilisation des capteurs inertiels avec l'interface hidraw
4.1. Configuration requise
4.2. Mise en œuvre
5. Limitations
6. Détails sur les vidéos de démonstration
7. Remerciements

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 :

      # 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.

  • Démarrer le serveur HIDP:

    # 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 traite pas les mesures inertielles des accéléromètres et du gyro. L'interface hidraw permet de contourner ce problème. 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

  • Un noyau avec CONFIG_HIDRAW.

  • patch-bluetooth-hidraw-pabr1. Ajoute la compatibilité hidraw à hidp.ko pour l'utilisation en mode Bluetooth. Non requis en mode USB.

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
    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 :

    # 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.

    # gcc -o xsixhidtest xsixhidtest.c -lX11 -lm
    # ./xsixhidtest < /dev/hidraw1
    

5.  Limitations

  • 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.

  • 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.

  • L'affichage de l'état de la batterie n'est pas géré.

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. 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.

Historique des versions
1.52008-04-29 Note sur les messages tronqués à 12 octets. ps3-bt-event-filter inutile avec linux-2.6.23+. Référence à la discussion sur udev. Ajout de patch-bluetooth-hidraw-pabr1, sixhidtest, xsixhidtest.
1.42007-10-15 -pabr3 : attendre la réponse HIDP. Patch pour bluez-utils-3.19. Note sur bluetoothd-service-input.
1.32007-07-31 Recommandation concernant ps3-bt-event-filter.diff. Enregistrement hcidump de référence. Vidéo hélico.
1.22007-04-29 Ajout patch-hidd-3.9-pabr2 dont contournement problème ppoll().
1.12007-04-27 Limitations supplémentaires. Notes sur l'intégration dans Linux. Note sur bthid.
1.02007-04-23 Première publication.

http://www.pabr.org/sixlinux/sixlinux.fr.html

Tous droits réservés. (All rights reserved.)