domodom
Accueil du site > mini2440 > Windows CE > Tutoriaux > Un driver GPIO pour la mini2440

Un driver GPIO pour la mini2440

vendredi 30 avril 2010, par Dom

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.

Lire cet article en anglais.

17 Messages de forum

  • A GPIO driver for mini2440 1er mai 2010 11:32, par h4med

    Thank you domodom, Great work ! A very amateur question ! How we can use this library in C# ? my problem is how to include gpio.h library within C#.

    • A GPIO driver for mini2440 2 mai 2010 23:41, par Dom

      I don’t know for the moment, I will have a look on this as soon as possible.

  • A GPIO driver for mini2440 4 mai 2010 00:28

    Brilliant - works perfectly for me. Thanks.

  • Un driver GPIO pour la mini2440 20 mai 2010 06:53, par mikaelo

    Dans le cas ou je ne veux pas recompiler mon noyau et generer une nouvelle image WIN CE, peux tu me dire comment generer une DLL et la loader en dynamique (comme sous linux) ?

    Je crois avoir lu (dis moi si je me trompe ) qu’il faut utiliser regserv32 ou quelque chose dans le style... peut tu me donner des info je suis sous grosse pression car je dois faire une demo pour samedi prochain a un client ....

    Merci

    • Un driver GPIO pour la mini2440 20 mai 2010 09:42, par Dom

      Tu linkes ton application avec le .lib de ta dll, tu copies ta dll dans le répertoire Windows de la carte et il n’y a rien d’autre à faire au niveau système. Au démarrage de ton application, ta dll sera chargée par le système. Si le système ne la trouve pas, tu auras une boîte de dialogue d’erreur t’expliquant que l’application n’est pas compatible avec ta cible.

  • A GPIO driver for mini2440 27 mai 2010 20:49, par Alex

    Hi Dominique,

    Thanks for the support and the driver !!!!!!!!!!

    I finally got it working

    Thanks !!!

    Alex Maasmechelen (B)

  • A GPIO driver for mini2440 31 mai 2010 12:02, par Sergej

    Hello, Domodom. Thanks a lot for your driver, it works perfectly. But i have one question : can i work with analog inputs AIN0 - AIN3 through your driver ? Best regards, Sergej.

    • A GPIO driver for mini2440 31 mai 2010 16:53, par Dom

      Hello Sergej,
      No, I don’t think that AINx can be used as gpio.
      Best regards

  • A GPIO driver for mini2440 4 juin 2010 18:28, par spaccabbomm

    Hi, thank you very much for your work. I’m using it and i think there is an error about setting port A as output. As the S3C2440 manual says, to set the pin as output you have to write 0 to GPACON register. Am i right ?

    • A GPIO driver for mini2440 7 juin 2010 00:11, par Dom

      Yes, you’re right, the port A configuration is different, there is only one bit for each pin. I will try to correct my driver as soon as possible.

  • A GPIO driver for mini2440 2 décembre 2010 20:41, par Eduardo Gabriel

    I try it in Platform Builder but got a error.

    There is no gpio.dll in your source code, so when I try to sysgen the Platform builder didn’t find gpio.dll file.

    How can I generate this missing gpio.dll file ?

    • A GPIO driver for mini2440 9 décembre 2010 17:20, par Dom

      Hello
      I don’t provide the dll because you have the source to build it by yourself.
      Did you verify that the driver is well generated when you build your solution ?
      Dom

  • Un driver GPIO pour la mini2440 14 février 2011 19:20, par Anita

    Great ! It Work Perfect !! Thank you !

    Recently, I got Mini6410, howerver, I can’t detect the status of the user key... Do you plan to develop the GPIO for Mini6410 ?

    • Un driver GPIO pour la mini2440 15 février 2011 12:15, par Dom

      What do call the "status of the user key" ?
      I don’t have time for the moment to port my driver for the mini6410, i don’t think it is a big amount of work for someone who wants to do it by himself. I will maybe do it later.

      • Un driver GPIO pour la mini2440 16 février 2011 05:59, par Anita

        Sorry for my English ! The "status of the user key" mesns whether the key (K1 K6) is pressed down. Whether the keys on mini6410 can simulate "Keyboard code" to send KeyEventArgs in Visual Studio C# project ?

        • Un driver GPIO pour la mini2440 21 février 2011 09:47, par Dom

          My GPIO driver can be used to read the status of the buttons, but it doesn’t simulate a keyboard code, you have to modify the driver by yourself.

          • Un driver GPIO pour la mini2440 2 mars 2011 12:26, par Anita

            Sorry for my late report !

            The GPIO driver can be used to read the status of the buttons => That is what I want in mini6410. In mini2440, the button can simulate a keyboard code, but it can’t in mini6410... Before I found the GPIO driver, I used keydown event in C#, but now I use GPIO to read the button status and work great !

SPIP | Contact me | | Plan du site | Suivre la vie du site RSS 2.0      Version Française | English version