J’ai vu de nombreux internautes chercher un moyen simple de piloter les entrées/sorties de la mini2440. Ce n’est pas trop compliqué sous CE 5.0, mais c’est plus difficile sous CE 6.0.
J’ai donc profité d’une soirée libre pour écrire un tel driver ainsi qu’une petite application qui l’utilise.
Fonctionnement des GPIOs sur le s3c2440
L’utilisation des ports d’entrée/sortie est assez simple sur le s3c2440. Pour chaque port, 3 registres permettent de configurer les pins de chaque port et les utiliser :
GPxCON : Configuration du type de chaque pin du port (entrée, sortie, fonction spéciale).
GPxDAT : état courant de chaque pin du port (état de la sortie si pin en sortie, état de l’entrée si port en entrée).
GPxUP : permet d’activer ou non une résistance de pullup pour chaque pin du port (utile en entrée).
Attention, le port A ne peut pas être utilisé en entrée et il ne dispose donc pas de registre d’activation des résistances de pullup.
Driver Windows CE 6.0
Le driver que j’ai écrit est un driver de type Stream. Ce driver est chargé par le système au démarrage, on peut ensuite accéder au driver via les fonctions CreateFile et DeviceIoControl. Le fonctionnement est classique. Un buffer virtuel est créé puis mappé sur les adresses physiques des registres du processeur. On accède aux registres via ce buffer virtuel.
3 commandes IOCTL sont proposées :
IOCTL_GPIO_SET_PIN_CONFIGURATION : configuration d’une pin d’un port.
IOCTL_GPIO_SET_PIN_OUTPUT_VALUE : configuration de l’état d’une pin configurée en sortie.
IOCTL_GPIO_GET_PIN_INPUT_VALUE : lecture de l’état d’une pin configurée en entrée.
Je ne rentrerai pas plus en avant dans le détail du code, j’ai essayé d’écrire un code clair et commenté facilement compréhensible.
Intégration du driver dans une image Windows CE 6.0
On va d’abord copier les sources du driver dans les sources des drivers de la mini2440 : copier le répertoire GPIO du fichier zip dans \WINCE600\PLATFORM\Mini2440\SRC\DRIVERS (Wince600 est le répertoire dans lequel j’ai installé Windows CE)
On va ensuite ajouter le fichier .h associé au driver : copier le fichier gpio.h dans C :\WINCE600\PLATFORM\Mini2440\SRC\INC
Pour que l’outil de génération trouve notre driver, il faut ajouter le nom du répertoire contenant le sources du driver dans le fichier \WINCE600\PLATFORM\Mini2440\SRC\DRIVERS\dirs : ajouter gpio
Ok, lors de la génération, l’outil va compiler notre driver et générer le fichier gpio.dll. Mais pour que le fichier gpio.dll soit inclus dans notre image, il faut ajouter la ligne suivante dans le fichier \WINCE600\PLATFORM\Mini2440\FILES\platform.bib :
gpio.dll $(_FLATRELEASEDIR)\gpio.dll NK SHK
dans la partie MODULES
Allez, on y est presque, il reste à configurer le système pour qu’il charge notre driver au démarrage de la carte en ajoutant les lignes suivantes dans la registry (fichier \WINCE600\PLATFORM\Mini2440\FILES\platform.reg) :
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\GPI]
"Prefix"="GPI"
"Dll"="GPIO.DLL"
"Order"=dword:100
"Index"=dword:0
"FriendlyName"="Domodom GPIO Driver"
Et voilà , il n’y a plus qu’à regénérer une image et la flasher dans la mini2440. Si tout est ok, lors du démarrage, si vous avez activé les traces de debug via la liaison série (voir cet article), le message suivant doit s’afficher :
Chargement du driver GPIO...
Application de test du driver
L’application suivante permet de tester facilement le driver sans aucune modification de la carte. En effet, elle utilise les leds (connectées sur les pins GPB5 à GPB8) et les boutons (pins GPG0, GPG3, GPG5, GPG6, GPG7 et GPG11). Pour allumer une led, il suffit de mettre la sortie connectée sur celle-ci à 0 (voir le schéma pour comprendre pourquoi). Des résistances de pullup sont déjà présentes sur la carte en série avec chaque bouton, du coup, l’utilisation des pullups internes n’est pas nécessaire.
L’article suivant explique comment écrire une application VB.Net pour utiliser le driver.
Enfin, Darren a porté la même application en c# et a eu la gentillesse de me l’envoyer, merci à lui.
Voilà , tout est dit, il n’y a plus qu’à tester chez vous, en théorie, ça devrait fonctionner du premier coup sur votre carte.