Mini-tutoriel pour programmer ses logiciels pour Nintendo DS Lite (NDSL)

Par Tuyêt Trâm DANG NGOC (dntt)

1. Pourquoi programmer sur NDSL ?

Outre ses fonctionnalités ludiques (fonctionnalités premières par ailleurs), la nintendo DS possède un ensemble intéressant de périphériques embarqués de base (microphone, haut-parleur, écran tactile, écran, plein de boutons) et additionnel (caméra, rumble, mémoire additionnelle) ainsi qu'une connectivité WI-FI, une bonne autonomie, robustesse et compacité pour un prix relativement convenable. Ses 2 processeurs ARM en font un excellent support de programmation, parfait pour s'initier à la programmation de ce type de processeur.

Dimensions (console fermée) largeur 148.7mm, longueur 84.7mm, épaisseur 28.9mm
Ecran Supérieur retro-éclairé, 3 pouces, LCD couleur TFT transflectif, résolution 256x192 pixels et pitch de 0,24mm, affichage 260 000 couleurs
Ecran tactile Mêmes caractéristiques que l'écran supérieur, plus écran tactile analogique et transparent.
Communication Sans Fil Wi-Fi IEE 802.11 et format propriétaire Nintendo. La portée est de 10 à 30 mètres selon les conditions. Plusieurs joueurs peuvent utiliser des jeux multijoueurs avec une seule carte de jeu DS.
Commandes Ecran tactile, microphone à reconnaissance vocale intégré, boutons avant A/B/X/Y, manette +, boutons latéraux L/R, boutons Start et Select.
Ports d'entrée / sortie Deux ports jeu : l'un pour les cartes de jeu Nintendo DS et l'autre pour les cartouches de jeu Game Boy Advance. Prises pour casque stéréo et microphone.
Autres caractéristiques Horloge intégrée, date, heure, et alarme, étalonnage de l'écran tactile
CPU ARM7 à 33Mhz + ARM9 à 66Mhz
RAM 4 Mb
Son Hauts-parleurs stéréo capables de fournir un son surround virtuel selon les jeux
Energie Batterie Lithium ion fournissant dix heures de jeu pour quatre heures de charge, selon utilisation. Mode veille. Adaptateur d'alimentation

Sources http://www.afjv.com/press0503/050302_specifications_techniques_nintendo_ds.htm

Les logiciels alors réalisés sur DS peuvent être alors de très bonnes qualité, en témoigne les deux logiciels suivants :

Le système d'exploitation Linux a également été porté sur Nintendo DS, et a été appelé DSLinux [Site].

Ce mini-tutoriel se décompose en deux phases. La première pour décrire le matériel dont on a besoin et vérifier que le chargement et l'exécution des applications peuvent bien se faire sur la DS. La deuxième phase rentre dans la programmation de la DS en elle-même.

2. Charger une application sur sa Nintendo DS (et l'exécuter)

Tout d'abord se procurer une DS Lite :-). Puis deux solutions :

2.1 Solution de première génération

Récupérer une cartouche de boot à mettre dans le slot-1 et une cartouche de stockage à mettre dans le slot-2. Personellement, j'ai utilisé une Superkey pour le slot-1 et une SuperCard Lite Micro SD pour le slot-2. Cette dernière comme son nom l'indique se sert de carte Micro-SD comme support de stockage. La carte Micro-SD doit être formatée en FAT 16 (Attention, la FAT 32 n'est pas supportée dans le Slot-2).

Récupérer quelques logiciels amateurs (homebrew), leur nom se termine souvent par .nds. Il y en a plein par là :

Le gros soucis est le problème de compatibilité. En effet, il existe tout un tas de cartouche de boot () et encore un plus gros tas de cartouche de stockage (). Tous évidemment conçus de manière très différentes.

De ce fait, un programme .nds conçu pour être utilisé par la cartouche de stockage X ne va pas être utilisable si elle est lue avec la cartouche de stockage Y. Pendant un moment, le téléchargement des homebrew se déclinait donc plusieurs versions (version pour la cartouche X, version pour la Y, version pour la Z, etc.) et si notre cartouche n'était pas listée, eh ben tant pis.

Heureusement est arrivé le DLDI (Dynamically Linked Device Interface). Les développeurs programment alors en suivant les spécifications de cette interfaces plutôt que de se reposer sur l'interface spécifique à chaque cartouche de stockage. Ensuite, un pilote (driver) spécifique à la cartouche devra être appliqué (patché) sur le programmme pour l'adapter à sa cartouche. Ainsi, plus de problème de compatibilité, il n'y a plus qu'un seul programme mis en téléchargement, et c'est à l'utilisateur de patcher le programme en fonction de son type de cartouche avec le pilote correspondant.

Sous Linux, il suffit de récupérer dlditool [Site officiel][En cache], et de l'appliquer de la manire suivante :

dlditool [-t<type>] [-r<offset>] <dldi> <app>

Par exemple, pour ma SuperCard Lite, j'ai récupéré le pilote sclt.dldi [Site officiel][En cache]. Et pour un homebrew DS joliedemo.nds , je tape :

./dlditool -t nds sclt.dldi joliedemo.nds

Mon fichier est alors patché et sera fonctionnel pour ma cartouche SuperCard Lite. Il me suffit alors juste de le copier tel quel (par l'intermédiaire d'un lecteur de cartes) sur la carte MicroSD.

En démarrant alors ma Nintendo DS avec la cartouche de boot et la cartouche de stockage (avec sa carte MicroSD qu'il ne faut pas avoir oublié de remettre à l'intérieur), je pourrai alors sélectionner l'application joliedemo.nds qui sera chargée et exécutée.

2.2 Solution de deuxième génération

Dans la solution précédente, les deux slots étaient utilisés, et donc, il était impossible d'étendre sa Nintendo DS avec des accessoires supplémentaires : par exemple de la RAM additionnelle comme celle fournie avec Opéra ou le Rumble (vibration) fournie avec Metroid Pinball (quoiqu'une cartouche de stockake incluant le rumble existe : SuperCard Rumble, mais je vous le déconseille car la fonctionnalité rumble a été mise au détriment de la RAM...). De plus, force est de constater que le Slot-1 est sous-utilisé puisqu'il ne sert qu'à booter.

Bref, la nouvelle solution est de fusionner tout ça et de ne faire qu'une seule cartouche qui se logera dans le Slot-1 et qui servira à la fois de boot et de stockage. Cela laisse ainsi le Slot-2 utilisable pour autre chose (RAM supplémentaire, périphérique additionnel comme la caméra fournie avec le jeu Otona No DS Kao Training, Rumble, etc.)

Le principe est ensuite le même que dans la première solution, dldi, stockage dans une Micro-SD...

A noter que dans les cartouches les plus récentes, le patchage DLDI est fait automatiquement par la cartouche.

Pour l'achat des cartouches, j'ai toujours acheté sur http://www.hopebuy.com (société basée à Hong-Kong) et je n'ai personnellement jamais eu aucun soucis avec eux ; délai de livraison très courts (3-4 jours), produits impeccables, supports (mail et forum) très réactifs.

3. Programmer ses applications

Il y a deux manières principales de programmer sur DS.

3.1 Programmation native avec Devkit-Pro

Sur http://sourceforge.net/projects/devkitpro/, charger les paquetages suivants :

Créer un répertoire devkitpro dans lequel vous créerez un répertoire devkitarm et libnds. Positionnez les variables d'environnement DEVKITPRO, DEVKITARM et LIBNDS respectivement sur les chemins de ces répertoires.

Vous déasrchiverez/décompresserez le contenu de devkitARM dans le répertoire pointé par $DEVKITARM, libnds, libfat-nds et dswifi dans celui pointé par $LIBNDS. Enfin vous désarchiverez nds-examples là où vous voulez :-)

Testez la compilation d'un exemple en tapant simplement make dans le répertoire contenant l'exemple. Cela génère alors un fichier .nds qu'il suffira alors de copier sur le support de stockage de votre DS.

3.2 Programmation pour DS Linux

DSLinux est un noyau uClinux 2.6.14 modifié. Une fois DSLinux installé sur sa DS, le but sera alors de créer un programme qui sera exécuté au sein du système d'exploitation DSLinux.

3.2.1 Installation de DSLinux

Si vous n'avez pas l'intention d'écrire la moindre application sous DSLinux mais désirez installer DSLinux sur voter DS simplement pour frimer, il suffit de télécharger dslinux depuis http://kineox.free.fr/DS/ et de l'installer comme n'importe quelle application (voir section précédente).

Pour installer un environnement de développement pour DSLinux (texte fortement inspiré de http://www.dslinux.org/wiki/Compiling_DSLinux).

  1. Récupérer les sources de dslinux par téléchargement [Site] ou par subversion (svn checkout svn://dslinux.spline.de/dslinux/trunk dslinux)
  2. Récupérer la toolchain dslinux-toolchain [Site].
  3. Mettre dans le PATH le répertoire bin de dslinux et le répertoire bin de dslinux-toolchain.
  4. Dans le répertoire dslinux, taper make menuconfig afin de cross-compiler le noyau dslinux. Les réglages par défaut marchent très bien. Néanmoins, afin de personaliser votre noyau voici ce que vous pouvez paramétrer :
  5. Finalement, taper make et attendez que tout se compile. Le résultat se trouvera dans dslinux/images.

3.2.2 Programmation d'applications pour DSLinux

(Texte fortement inspiré de http://www.dslinux.org/wiki/Porting_Howto)

Il faut utiliser le shell de cross-compilation xsh. Pour le lancer taper dans le répertoire dslinux :

make xsh

Dans ce shell, pour compiler le programme C joliprogramme.c, taper :

$CC $CFLAGS $LDFLAGS joliprogramme.c -o joliprogramme

A noter que vos variables CC, CFLAGS et LDFLAGS ont été positionnées automatiquement en :

-xsh-> echo $CC
ucfront-gcc arm-linux-elf-gcc
-xsh-> echo $CFLAGS
-O2 -g -fomit-frame-pointer -fno-common -fno-builtin -Wall
-mswp-byte-writes -DCONFIG_NDS_ROM8BIT -mcpu=arm946e-s -mfpu=fpe3 -DEMBED
-D__PIC__ -fpic -msingle-pic-base -Dlinux -D__linux__ -Dunix -D__uClinux__
-xsh-> echo $LDFLAGS
-Wl,-elf2flt -D__PIC__ -fpic -msingle-pic-base -mswp-byte-writes

Le programme alors cross-compilé pourra être copié sur voter carte microSD et être exécuté depuis dslinux.

3.3.3 Configuration de DSLinux

DSLinux se configure un peu près comme tout système UNIX. Les fichiers de configurations se trouvent dans /etc.

a) Configuration réseaux.

L'interface réseau sous DSLinux est appelé nds et est WI-FI 802.11. Il ne supporte que le chiffrement WEP.

Commandes pour configurer son interface WI-FI :

Configuration IP de son interface réseau

Toutes les commandes sont appliquées directement mais les effets ne persistent pas au redémarrage du système. Elles doivent donc être appelées par le script /etc/rc qui est lancé par init au démarrage et qui lit le fichier de configuration /etc/rc.conf. Il suffit donc de paramétrrer les variables idoines dans ce fichier. C'est à dire :

b) Configuration "graphique"

Le programme nano est utilisé pour offrir un environnement graphique reconnaissant l'écran tactile comme souris.

c) Gestion des terminaux virtuels