Driver de port parallèle B-208 (1/2) CE4.2 Driver de port parallèle Commande d’un module d’affichage LCD jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Module d'affichage LCD sur le port parallèle : présentation Objectif du chapitre Faire fonctionner un module d’affichage LCD couplé sur le port parallèle de la cible CEPC Étude sommaire du port parallèle standard des PC Étude sommaire du module LCD Écriture d’un driver pour ce module Écriture d’une application pour afficher deux lignes sur le module LCD Téléchargement dans le CEPC Exécution jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Port Parallèle d’un PC (1) Le port parallèle standard (SPP) est un port prévu dès l’origine du PC pour obtenir une liaison plus rapide que la liaison série de l’époque, utile pour commander une imprimante Dans un PC-XT ou dans un PC-AT le SPP n’était pas sur la carte mère mais sur une carte additionnelle qui contenait aussi un port série Carte à installer dans un connecteur du bus ISA jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Port Parallèle d’un PC (2) B-208 (1/2) CE4.2 Port Parallèle d’un PC (2) Il était possible d’installer sur le bus ISA deux cartes série/parallèle en choisissant par des straps deux décodages d’adresse possibles 0x378 : Parallel Printer 1 (LPT1) associé à l’IRQ7 0x278 : Parallel Printer 2 associé à l’IRQ5 Cet adaptateur parallèle n’était même pas un boîtier spécifique mais l’association d’un PAL et de quelques latches et drivers constituant trois registres Plus tard sont apparus des circuits spécifiques plus polyvalents En fait, il existait une troisième possibilité d’installation d’une imprimante dans la plage des adresses 0x3B0-0x3BF ; cette plage était partagée avec un contrôleur d’écran monochrome et donc disponible dès qu’on utilisait un contrôleur d’écran couleur/graphique logé à un autre endroit (0x3D0-0x.3DF). Le port série était dès l’origine réalisé avec un circuit spécialisé NS 16450. PAL : circuit de logique programmable, en l’occurrence, le circuit utilisé contenait très peu de circuits logiques Le circuit spécialisé PPI (Programmable Peripheral Interface) Intel 82C55A (deux ports) est un exemple de circuit beaucoup plus souple que la réalisation d’origine. Aujourd’hui, ces ports, en voie d’extinction, quand ils existent sont regroupés avec les chipsets ou dans un adaptateur chipset-ISA ou PCI-ISA. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Port Parallèle d’un PC (3) B-208 (1/2) CE4.2 Port Parallèle d’un PC (3) Registre de données (D0-D7) à l’adresse de base du port Registre de Status (S3-S7) à l’adresse de base du port + 1 utilisé pour ses cinq bits de poids forts seulement S3-S7, S0-S2 inutilisés ou inexistants Registre de commande (C0-C4) à l’adresse de base du port + 2 Utilisé pour ses cinq bits de poids faibles C0-C4, C5-C7 inutilisés ou inexistants ici nous n’utilisons que C0-C4 En fait on retrouve dans de vieux documents le bit C4 qui fut, à l’origine, utilisé pour autoriser ou interdire des interruptions lors du changement d’état du bit 6 du registre de status. Les bits C4 et C5 sont utilisés dans le port parallèle modernisé EPP. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Registres du port parallèle B-208 (1/2) CE4.2 Registres du port parallèle Registre de données Adresse de base D7 D6 D5 D4 D3 D2 D1 D0 Poids fort Registre de status (lecture) Poids faible Adresse de base + 1 S7 S6 S5 S4 S3 Les noms attribués dans la littérature aux bits des registres de commande et de status sont à géométrie variable du fait de l’inversion de certains signaux et suivant qu’on se réfère à l’attribution du signal ou au nom porté par la broche. Par exemple, le bit C3 du registre de contrôle est dénommé +SLCT IN dans le document de base IBM. Une écriture avec un 1 dans le bit C3 permet de sélectionner une imprimante. Il est présenté sur la broche 17 du connecteur DB25 après inversion, ce qui est cohérent avec le nom donné à la broche : -SLCT IN. Quand on lit le registre de commande, le signal présent sur la broche est inversé et on récupère bien dans le registre un bit +SLCT IN. Registre de contrôle Adresse de base + 2 C4 C3 C2 C1 C0 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Registres données et commande B-208 (1/2) CE4.2 Registres données et commande D0 D0 C0 C0 D1 D1 C1 C1 D2 D2 C2 C2 D3 D3 C3 C3 D4 D4 D5 D5 Nous ne montrons que ce qui concerne l’écriture puisque nous n’utiliserons pas de lecture avec notre afficheur. D6 D6 D7 D7 Registre données Buffer Registre commande Buffer jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Module d'affichage LCD sur le port parallèle : présentation Registre status Inutilisé dans notre application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation B-208 (1/2) CE4.2 Écriture sur un port VOID WRITE_PORT_UCHAR(PUCHAR Port, UCHAR Value); Parameters Port [in] Pointer to the port that must be a mapped memory range in I/O space. Value [in] Byte to be written to the port. Return Values None. Nota : les sorties C0, C1, C3 du registre de commande sont inversées, pour être directement compatibles avec les signaux standards d’une imprimante. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Module d’affichage LCD HD44780 Le module possède Une mémoire de 80 caractères : Display Data RAM (DD RAM) Un générateur de police de caractère Deux registres internes DR et IR Taille de l’afficheur utilisé : Nombre de lignes d’affichage : 2 Nombre de caractères par ligne : 20 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Signaux du module LCD Port de données D0-D7 RS Register Select E Enable R/W Lecture/écriture, pour nous 0 VDD Alimentation, pour nous sera prise sur le port sur la broche C2 VSS Masse VL Contrôle du contraste, pour nous 0, contraste maximal jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Câblage du module LCD sur le port parallèle CE4.2 Câblage du module LCD sur le port parallèle Module d’affichage LCD D7 D6 D5 D4 D3 D2 D1 D0 RS E R/W VSS VL VDD VDD VDD 10 KΩ 10 KΩ VDD VL à la masse donne le contraste maximum Les nombres 1 à 9 et 17 correspondent au brochage de la prise DB25 du port parallèle. Nous utiliserons aussi la broche 16 associée au bit C2 du registre de commande pour alimenter le module : un 1 dans la position C2 qui n’est pas inversée, permet d’appliquer une tension correcte à la broche VDD du module. D7 D6 D5 D4 D3 D2 D1 D0 C3 C0 Port parallèle 9 8 7 6 5 4 3 2 17 1 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Registres internes du module LCD Deux registres internes IR registre d’instruction DR registre de données Commande des registres par deux signaux RS : Register Selector relié à la broche C3 du port parallèle différencie ces deux registres E : Enable relié à la broche C0 du port parallèle valide l’introduction des données dans les registres jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Séquence d’écriture dans IR et DR B-208 (1/2) CE4.2 Séquence d’écriture dans IR et DR Repos IR RS=0 E=0 Repos DR RS=1 E=0 Donnée → IR RS=0 E→0 Donnée → DR RS=1 E→0 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Commandes pour écrire IR Signaux de commande en position de repos RS relié à C3 et E relié à C0 mais C3 et C0 sont complémentées d’où : commande . . . . 1 x x 1 (RS=0 E=0) Mettre l’instruction sur le port parallèle D0-D7 Écrire cette instruction dans le registre IR commande . . . . 1 x x 0 (RS=0 E=1) Retour à l’état de repos commande . . . . 1 x x 1 (RS=0 E=0) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Commandes pour écrire DR Signaux de commande en position de repos RS relié à C3 et E relié à C0 mais C3 et C0 sont complémentées d’où : commande . . . . 0 x x 1 (RS=1 E=0) Mettre la donnée sur le port parallèle D0-D7 Écrire cette donnée dans le registre DR commande . . . . 0 x x 0 (RS=1 E=1) Retour à l’état de repos commande . . . . 0 x x 1 (RS=1 E=0) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Options On peut commander la tension VDD avec la ligne C2, ce qui évite une alimentation externe La ligne C1 est réservée pour avoir un second signal Enable utilisé avec un afficheur à 4 lignes C2 VDD 1N4148 + 1 µF jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Détail des commandes IR et DR B-208 (1/2) CE4.2 Détail des commandes IR et DR Afficheur LCD à deux lignes → C1 inutilisé, à 0 Alimentation par le port → C2 toujours à 1 Repos en prévision d’une commande pour IR %1101 = 0xD «CTRL» C2=1 RS=0 E=0 Entrée de la commande dans IR %1100 = 0xC «CTRLEN» C2=1 RS=0 E=1 Repos en prévision d’une commande pour DR %0101 = 0x5 «DATA» C2=1 RS=1 E=0 Entrée de la commande dans DR %0100 = 0x4 «DATAEN» C2=1 RS=1 E=1 Les noms utilisés seront définis dans le programme par des #define. CTRL : pour la sélection du registre de contrôle CTRLEN : pour registre de contrôle enable DATA : pour la sélection du registre de données DATAEN : pour registre de contrôle enable jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Module d'affichage LCD sur le port parallèle : présentation DDRAM du module LCD Le module LCD contient une DDRAM gérée automatiquement par les écritures dans le registre DR La donnée écrite dans le registre DR est transférée systématiquement dans la DDRAM à une adresse définie par un compteur d’adresse interne (AC) AC incrémenté à chaque écriture dans DR AC initialisé par écriture de l’instruction Set DDRAM address dans le registre IR jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
LCD à 2 lignes de 20 caractères DDRAM 0x00 Première ligne 20 caractères 0x13 20 caractères 0x27 0x40 Seconde ligne 20 caractères 0x53 0x54 20 caractères 0x67 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Instructions pour le LCD (1) B-208 (1/2) CE4.2 Instructions pour le LCD (1) Clear Display: 0x01 Return Home: 0x02 Entry Mode Set: 0x04 à 0x07 (%000001 I/D S) I/D = 1 incrément S = 0 pas de décalage Display ON/OFF: 0x08 à 0x0F (%00001 D C B) D = 0 display OFF C = 0 cursor OFF B = 0 blink OFF Pour les détails de ces commandes il faut consulter la documentation du module LCD. Ici, ce sont les valeurs utilisées dans notre application qui sont mentionnées. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Instructions pour le LCD (2) Function Set: 0x38 pour nous (%001 DL N F 00) DL=1 Interface 8 bits N=0 LCD à deux lignes (0 pour une ligne) F=0 Matrice 5x7 Set DDRAM address: 0x80 à 0xFF (%1AAAAAAA) AAAAAAA Adresse à placer dans le compteur AC jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Initialisation du LCD Timing à respecter après la mise sous tension Séquence de commande obligatoire de configuration du LCD jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Timing à respecter après Power On jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Séquence d’initialisation B-208 (1/2) CE4.2 Séquence d’initialisation RESET:Instruction 0x30 (Function Set: interface 8 bits) envoyée 3 fois Display OFF Display ON Clear Display Function Set: taille de l’interface, nombre de lignes et police. (non modifiable ensuite) Mode Set: gestion affichage (décalage texte, incrément d’adresse mémoire) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Exemple d’envoi de commande // Mise du port dans l’état repos commande WRITE_PORT_UCHAR(PARCOMMAND, CTRL); Sleep(15); // Attente de 15ms après la mise sous tension // Function Set 1 (interface 8 bits) WRITE_PORT_UCHAR(PARDATA,0x30); WRITE_PORT_UCHAR(PARCOMMAND, CTRLEN); Sleep(2); // Attente de 2 ms (signal ENABLE actif) Sleep(5); // Attente de 5 ms jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Travail à réaliser Préparer une plate-forme Préparer un driver à inclure Générer le noyau avec le driver Préparer une application Générer l’application sans l’inclure avec le noyau Télécharger le noyau dans la cible Exécuter l’application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver Le driver comprendra deux IOCTL Écriture d’un caractère Positionnement du curseur On définira un projet PARA_DRV de type WCE Dynamic Link Library à inclure dans le noyau On créera un fichier PARA.def que l’on inclura dans le projet PARA_DRV jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Application L’application écrira un texte sur la ligne 1 du LCD puis positionnera le curseur en début de ligne 2 écrira un deuxième texte sur la ligne 2 On définira l’application PARA_APP de type WCE Application à ne pas inclure dans le noyau jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation PARA.def jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (1) // TODO: // #include nécessaires // Définition des IOCTL #define IOCTL_PUTC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_CURSEUR \ CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ METHOD_BUFFERED,FILE_ANY_ACCESS) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (2) // Définition des adresses du port parallèle #define PARBASE ((PUCHAR) 0x0378) #define PARDATA PARBASE #define PARCOMMAND PARBASE+2 // Définition des mots de commande #define CTRL 0xD #define CTRLEN 0xC #define DATA 0x5 #define DATAEN 0x4 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (3) BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (4) DWORD PAR_Init(DWORD dwContext) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("PARA_DRV: PAR_Init\n"))); // TODO: // Mise du port dans l’état repos commande jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (5) // TODO: // Envoi des trois Function Set de RESET // TODO: // Display OFF // TODO: // Display ON // TODO: // Clear Display // TODO: // Function Set (2 lignes, 8 bits) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (6) // TODO: // Mode Set (incrément, pas de décalage) // TODO: // Mise du port dans l’état repos data return dwRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (11) BOOL PAR_Deinit(DWORD hDeviceContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PARA_DRV: PAR_Deinit\n"))); return bRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (12) DWORD PAR_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("PARA_DRV: PAR_Open\n"))); return dwRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (13) BOOL PAR_Close(DWORD hOpenContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PARA_DRV: PAR_Close\n"))); return bRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (14) BOOL PAR_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { int val; BOOL bRet; jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (15) switch(dwCode) { // TODO: case IOCTL_PUTC: // TODO: case IOCTL_CURSEUR: jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Driver (16) // TODO: // Positionnement du curseur // Préparation adresse du curseur // Mise du port en repos commande // Envoi de la commande de positionnement // Mise du port en repos data }// switch *pdwActualOut=1; return bRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Application (1) // TODO: // #include nécessaires // Définition des IOCTL #define IOCTL_PUTC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_CURSEUR \ CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ METHOD_BUFFERED,FILE_ANY_ACCESS) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation B-208 (1/2) CE4.2 Application (2) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation port_parallèle_présentation.V1.0.ppt
Module d'affichage LCD sur le port parallèle : présentation Application (3) // TODO: // Déclarations et réservations // TODO: // Chargement du driver // TODO: // Ouverture du driver // TODO: // Envoi première chaîne // TODO: // Positionnement du curseur au début de la ligne 2 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Application (4) // TODO: // Envoi deuxième chaîne // TODO: // Fermeture des handles return 0; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation
Module d'affichage LCD sur le port parallèle : présentation Conclusion Nous avons dû construire un driver et une application rudimentaires pour commander un module d’affichage LCD installé sur un port parallèle standard de PC. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : présentation