Jumeler un périphérique Wii de façon permanente avec Mac OS X

Aujourd’hui, une bidouille assez sale, mais qui a le mérite de fonctionner : comment jumeler de façon permanente une manette Wii (Wiimote, Wii Balance Board, Wii U Controller Pro, etc.) avec un Mac. Ca ne permet pas réellement de l’utiliser (le protocole HID utilisé est un peu modifié par Nintendo) mais ça permet de bidouiller facilement dans certains cas.

Si vous avez essayé un jour de connecter une Wiimote à un Mac, vous avez du remarquer une chose : la Wiimote n’accepte pas le classique 0000 comme code. La raison est simple : le code que la Wiimote (et plus généralement les périphériques Wii) attend n’est pas celui là.

Comme expliqué là, la manette attend l’adresse MAC du contrôleur Bluetooth de l’hôte (dans notre cas, le Mac, donc) inversé. Petit problème, Mac OS X ne permet pas de mettre un code en hexadécimal.

Il y a pourtant une solution, pas très propre : modifier le contrôleur Bluetooth pour que le code à taper passe en ASCII. L’idée est de mettre une adresse MAC qui — une fois inversée — est utilisable en ASCII avec des caractères numériques. Concrètement, on doit avoir une valeur hexadécimale comprise entre 30 et 39 : ces valeurs hexadécimales se traduisent en ASCII par les chiffres de 0 à 9. Pour faire simple, on va utiliser des 30 uniquement (la valeur qui représente le 0).

Il va donc falloir un contrôleur Bluetooth avec une puce CSR et une machine sous Linux (dans mon cas un Raspberry Pi).

Première chose à faire, installer le nécessaire sous Linux.

sudo apt-get install bluetooth bluez-utils blueman

Ensuite, on tape cette commande pour récupérer les mémoires à modifier.

sudo bccmd -d hci0 memtypes

Vous aurez une réponse de ce type :

psi (0x0001) = Flash memory (0)
psf (0x0002) = Flash memory (0)
psram (0x0008) = RAM (transient) (2)

Enfin, on flashe une nouvelle adresse MAC dans le contrôleur. Attention, ça peut rendre l’appareil inutilisable, donc mieux vaut tester sur un noname. Il faut utiliser les valeurs psi et psf, une dans chaque commande.

Le but est simple : mettre une adresse MAC qui une fois passée dans la moulinette de la Wiimote implique un code 000000. Il faut donc l’adresse 30:30:30:30:30:30.

sudo bccmd -d hci0 psset -s 0x0001 bdaddr 0x30 0x00 0x30 0x30 0x30 0x00 0x30 0x30
sudo bccmd -d hci0 psset -s 0x0002 bdaddr 0x30 0x00 0x30 0x30 0x30 0x00 0x30 0x30

Une fois que c’est fait, il faut enlever la clé Bluetooth, la remettre et taper la commande suivante pour vérifier si ça fonctionne.

hciconfig hci0 version

Dans mon cas, j’obtiens ça.

hci0: Type: BR/EDR Bus: USB
BD Address: 30:30:30:30:30:30 ACL MTU: 384:8 SCO MTU: 64:8
HCI Version: 2.0 (0x3) Revision: 0x77b
LMP Version: 2.0 (0x3) Subversion: 0x77b
Manufacturer: Cambridge Silicon Radio (10)

La commande suivante, sur le Mac, va forcer le système à passer directement sur le dongle externe. Attention, le comportement par défaut n’est pas celui-là : normalement, il va passer sur le dongle externe uniquement s’il est plus récent que l’interne.

sudo nvram bluetoothHostControllerSwitchBehavior="always"

Maintenant, il suffit de connecter la clé USB Bluetooth au Mac, et il devrait passer directement dessus. Attention, ça désactive les appareils connectés en Bluetooth…

Maintenant, il suffit de jumeler la manette avec le Mac en utilisant 000000 comme code.

Le principal souci, c’est que les manettes Wii ne sont pas totalement compatibles HID (contrairement aux manettes PlayStation 3 par exemple) et qu’elles ne sont pas utilisables sans un logiciel qui va émuler en partie le pilote. Cette méthode permet d’éviter la synchronisation à chaque utilisation mais n’évite pas (encore) l’utilisation de logiciels dédiés.