La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Jc/md/lp-01/05Driver UART en polling : présentation1 DRIVER UART EN POLLING Présentation.

Présentations similaires


Présentation au sujet: "Jc/md/lp-01/05Driver UART en polling : présentation1 DRIVER UART EN POLLING Présentation."— Transcription de la présentation:

1 jc/md/lp-01/05Driver UART en polling : présentation1 DRIVER UART EN POLLING Présentation

2 jc/md/lp-01/05Driver UART en polling : présentation2 Objectif du chapitre Écrire un driver rudimentaire et lintégrer dans Windows CE pour prendre connaissance des mécanismes Le driver choisi est le gestionnaire dune liaison série classique dans le monde PC à base de lUART Ce composant présent dans la cible même sil est utilisé de la façon la plus simple, en polling, nous permettra dessayer notre driver

3 jc/md/lp-01/05Driver UART en polling : présentation3 Driver en polling À écrire avec la plate-forme z_cible_CEPC Le driver assure linterface entre le système et le contrôleur de la liaison série Côté système il dialogue par des IOCTL, ici réduits à trois pour –Envoyer un caractère –Tester le status en réception puisque nous prévoyons une gestion par polling –Recevoir un caractère Côté périphérie, le dialogue consiste à lire et à écrire dans les registres du contrôleur

4 jc/md/lp-01/05Driver UART en polling : présentation4 Contrôleur Contrôlé par douze registres internes Registres sélectionnés par une combinaison –Des adresses A2, A1 et A0 –Dun complément fourni par le signal Read/Write –Dun second complément fourni par le bit « DLAB » poids fort du registre Line Control Register Nota : –Nous nutiliserons pas la FIFO intégrée –Les registres Interrupt Register et Interrupt Status Register seront présentés dans le prochain chapitre

5 jc/md/lp-01/05Driver UART en polling : présentation5 Adressage des registres du DLAB A2 A1 A0R/W Register RReceive Buffer Register WTransmit Buffer Register R/WInterrupt Register x RInterrupt Status Register x WFIFO Control Register x 0 1 1R/WLine Control Register x 1 0 0R/WModem Control Register x 1 0 1R/WLine Status Register x 1 1 0R/WModem Status Register x 1 1 1R/WScratch Register R/WDivisor Latch (LSB) R/WDivisor Latch (MSB)

6 jc/md/lp-01/05Driver UART en polling : présentation6 Receive Buffer Register Registre de 8 bits qui contient la donnée reçue de la périphérie et à destination du CPU Accessible en lecture seule à ladresse 000, en fonctionnement normal (DLAB = 0) Dans le cas dutilisation des FIFOs, ce registre fournit successivement les données disponibles dans la FIFO de réception

7 jc/md/lp-01/05Driver UART en polling : présentation7 Transmitter Holding Register Registre de 8 bits qui contient la donnée reçue du CPU et à destination de la périphérie Accessible en écriture seule à ladresse 000, en fonctionnement normal (DLAB = 0), après linitialisation du Baud Rate Generator Dans le cas dutilisation des FIFOs, ce registre introduit successivement les données fournies par le CPU dans la FIFO démission

8 jc/md/lp-01/05Driver UART en polling : présentation8 FIFO Control Register Bit 0 : 1 autorise FIFOs Receiver et Transmitter Bit 1 : 1 réinitialisation de la FIFO du Receiver Bit 2 : 1 réinitialisation de la FIFO du Transmitter Bit 3 : 1 DMA Mode Bit 4 : réservé Bit 5 : réservé Bit 6 : seuil de déclenchement IT FIFO (LSB) Bit 7 : seuil de déclenchement IT FIFO (MSB

9 jc/md/lp-01/05Driver UART en polling : présentation9 Line Control Register Bit 0 : codage nombre de bits de data (LSB) Bit 1 : codage nombre de bits de data (MSB) Bit 2 : 0 un bit de stop, 1 deux bits de stop Bit 3 : 0 pas de parité, 1 parité Bit 4 : codage et contrôle de la parité Bit 5 : codage et contrôle de la parité, Bit 6 : 1 génération dun break Bit 7 : DLAB, 1 sélection Divisor Latch Ex : codage nombre de bits 11 8 bits de data

10 jc/md/lp-01/05Driver UART en polling : présentation10 MODEM Control Register Bit 0 : gère le signal DTR Bit 1 : gère le signal RTS Bit 2 : signal OUT1 Bit 3 : signal OUT2 (EI/DI) Bit 4 : mode Loopback Bit 5 : 0 Bit 6 : 0 Bit 7 : 0

11 jc/md/lp-01/05Driver UART en polling : présentation11 Registres détat ou de « status » Dans ces registres, la présence dun bit à 1 indique la présence dun événement Line Status Register –Consacré aux données –Par exemple le bit 0 positionné à 1 indique quune donnée à été reçue, etc. MODEM Status Register –Consacré à la gestion dun MODEM –Par exemple le bit 7 positionné à 1 indique quune fréquence porteuse est détectée, etc. Nous nutiliserons que le Line Status Register

12 jc/md/lp-01/05Driver UART en polling : présentation12 Line Status Register Bit 0 : 1 Receiver Data Ready Bit 1 : 1 Overrun Bit 2 : 1 Parity Error Bit 3 : 1 Framing Error Bit 4 : 1 Break Interrupt Bit 5 : 1 Transmit Holder Register vide Bit 6 : 1 Transmitter vide Bit 7 : 1 erreur dans la FIFO de réception

13 jc/md/lp-01/05Driver UART en polling : présentation13 Autres registres Dautres registres sont utilisés pour gérer les interruptions. Comme nous utilisons une gestion par interrogation (polling), nous ne les détaillons pas. Un Scratch Register sans aucune influence sur le fonctionnement du est à la disposition des programmeurs

14 jc/md/lp-01/05Driver UART en polling : présentation14 Baud Rate Generator La vitesse de transmission est fixée à partir de lhorloge utilisée divisée systématiquement par 16 puis par la valeur des Divisor Latch LS et MS Avec un oscillateur à 1,8432 MHz le nombre à placer dans les Divisor Latch LS et MS est : –110 bauds1047 –1200 bauds96 –9600 bauds12 –38400 bauds 3

15 jc/md/lp-01/05Driver UART en polling : présentation15 Lecture et écriture des registres Windows CE nous propose deux fonctions pour écrire ou lire les registres du Dans larchitecture x86, ces registres sont supposés placés dans un espace réservé aux entrées-sorties : le « I/O Space » L I/O Space est indépendant de lespace mémoire habituel. Dans cet espace, on parle plutôt dun port que dune adresse mémoire. La distinction entre les deux espaces est réalisée par le hardware

16 jc/md/lp-01/05Driver UART en polling : présentation16 Lecture dun port UCHAR READ_PORT_UCHAR( PUCHAR Port ); Parameters Port [in] Pointer to the port that must be a mapped memory range in I/O space. Return Values This function returns the byte read from the specified port address.

17 jc/md/lp-01/05Driver UART en polling : présentation17 Écriture dans 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.

18 jc/md/lp-01/05Driver UART en polling : présentation18 Mise en œuvre 1.Préparation du driver 2.Préparation de lapplication 3.Téléchargement dans la cible 4.Lancement du driver 5.Exécution de lapplication

19 jc/md/lp-01/05Driver UART en polling : présentation19 File New Project or File Cocher Valider Nommer

20 jc/md/lp-01/05Driver UART en polling : présentation20 Choix du projet Cocher Valider

21 jc/md/lp-01/05Driver UART en polling : présentation21 Projet obtenu

22 jc/md/lp-01/05Driver UART en polling : présentation22 Fichiers créés sous la plate-forme

23 jc/md/lp-01/05Driver UART en polling : présentation23 Fichiers supplémentaires Pour un projet de Dll, deux fichiers doivent être ajoutés Fichier de définition de module.def pour : –Créer une Dll et lui attribuer un nom –Annoncer aux autres programmes les points dentrée du driver Fichier dentête.h dans lequel on prépare des macros utilisables avec le driver pour faciliter lutilisation des IOCTL

24 jc/md/lp-01/05Driver UART en polling : présentation24 Fichier.def (1) Fichier texte Dans le menu principal de Platform Builder : File New Project or File Dans la fenêtre New Project or File Onglet Files Choisir Text File Renseigner le nom de fichier Cocher Add to Project puis OK

25 jc/md/lp-01/05Driver UART en polling : présentation25 Fichier.def (2) Onglet Files Choisir Renseigner Cocher OK

26 jc/md/lp-01/05Driver UART en polling : présentation26 TTYpoll_DRV.def (1) LIBRARY TTYpoll_DRV EXPORTS TTY_Init TTY_Open TTY_IOControl TTY_Close TTY_Deinit

27 jc/md/lp-01/05Driver UART en polling : présentation27 TTYpoll_DRV.def (2)

28 jc/md/lp-01/05Driver UART en polling : présentation28 Fichier.h (1) Fichier dentête habituel Dans le menu principal de Platform Builder : File New Project or File Dans la fenêtre New Project or File Onglet Files Choisir C/C++ Header File Renseigner le nom de fichier Cocher Add to Project puis OK

29 jc/md/lp-01/05Driver UART en polling : présentation29 Fichier.h (2)

30 jc/md/lp-01/05Driver UART en polling : présentation30 TTYpoll.h (1) # define IOCTL_PUTC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2048, \ METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GETC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2049, \ METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GET_RX_STATUS \ CTL_CODE(FILE_DEVICE_UNKNOWN,2050, \ METHOD_BUFFERED, FILE_ANY_ACCESS)

31 jc/md/lp-01/05Driver UART en polling : présentation31 TTYpoll.h (2)

32 jc/md/lp-01/05Driver UART en polling : présentation32 TTYpoll_DRV.cpp Fichiers dentêtes Constantes dadressage des registres du Constantes de définition des bits de status Point dentrée de la dll Code des points dentrée du driver Init, Deinit, Open, Close et IOControl avec des parties à compléter Code des IOCTL PUTC, GETC et GET_RX_STATUS avec des parties à compléter

33 jc/md/lp-01/05Driver UART en polling : présentation33 Driver : fichiers dentêtes #include "stdafx.h" #include #include "TTYpoll.h"

34 jc/md/lp-01/05Driver UART en polling : présentation34 Driver : adressage du sérialiseur #define IoPortBase((PUCHAR) 0x02F8) //Registres du sérialiseur : offset par rapport à IoPortBase #define comLineControl3 #define comDivisorLow0 #define comDivisorHigh1 #define comFIFOControl2 #define comIntEnable1 #define comModemControl4 #define comLineStatus5 #define comTxBuffer0 #define comRxBuffer0

35 jc/md/lp-01/05Driver UART en polling : présentation35 Driver : définition des bits de status //Bits de status du sérialiseur #define LS_TSR_EMPTY0x40 #define LS_THR_EMPTY0x20 #define LS_RX_BREAK0x10 #define LS_RX_FRAMING_ERR0x08 #define LS_RX_PARITY_ERR0x04 #define LS_RX_OVERRRUN0x02 #define LS_RX_DATA_READY0x01 #define LS_RX_ERRORS(LS_RX_FRAMING_ERR | LS_RX_PARITY_ERR | LS_RX_OVERRRUN )

36 jc/md/lp-01/05Driver UART en polling : présentation36 Driver : point dentrée de la dll BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; }

37 jc/md/lp-01/05Driver UART en polling : présentation37 Driver : TTY_Init DWORD TTY_Init(DWORD dwContext) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("SERIAL: TTY_Init\n"))); // Initialisation du sérialiseur // 9600 bauds, 8 bits, pas de parité, pas d'IT, DTR, RTS // pas de FIFO // TODO return dwRet; }

38 jc/md/lp-01/05Driver UART en polling : présentation38 Driver : TTY_Deinit BOOL TTY_Deinit(DWORD hDeviceContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("SERIAL: TTY_Deinit\n"))); return bRet; }

39 jc/md/lp-01/05Driver UART en polling : présentation39 Driver : TTY_Open DWORD TTY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("SERIAL: TTY_Open\n"))); // Vidage du buffer de réception pour éliminer les // caractères résiduels // TODO return dwRet; }

40 jc/md/lp-01/05Driver UART en polling : présentation40 Driver : TTY_Close BOOL TTY_Close(DWORD hOpenContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("SERIAL: TTY_Close\n"))); return bRet; }

41 jc/md/lp-01/05Driver UART en polling : présentation41 Driver : TTY_IOControl (début) BOOL TTY_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { switch(dwCode)

42 jc/md/lp-01/05Driver UART en polling : présentation42 Driver : TTY_IOControl (IOCTL_PUTC) case IOCTL_PUTC: // Attente de transmetteur prêt // TODO // Envoi du caractère // TODO break;

43 jc/md/lp-01/05Driver UART en polling : présentation43 Driver : TTY_IOControl (IOCTL_GETC) case IOCTL_GETC: // Lecture du caractère // TODO RETAILMSG(1,(TEXT(" TTY caractère lu\n"))); break;

44 jc/md/lp-01/05Driver UART en polling : présentation44 Driver : TTY_IOControl (..._STATUS) case IOCTL_GET_RX_STATUS: // Lecture du status // TODO break;

45 jc/md/lp-01/05Driver UART en polling : présentation45 Driver : TTY_IOControl (fin) } // Fin du switch *pdwActualOut = 1; return TRUE; } // Fin IOControl

46 jc/md/lp-01/05Driver UART en polling : présentation46 Compilation du driver

47 jc/md/lp-01/05Driver UART en polling : présentation47 Création de limage

48 jc/md/lp-01/05Driver UART en polling : présentation48 Application Application qui utilise le driver TTYpoll_DRV Le programme est très simple, il doit : –Écrire un $ avec IOCTL_ PUTC –Attendre la réception dun caractère avec IOCTL_GET_RX_STATUS –Lire le caractère reçu avec IOCTL_GETC –Envoyer lécho avec IOCTL_PUTC –Boucler jusquà la réception du caractère ESCAPE (0x1B) –Se terminer après la réception de ESCAPE

49 jc/md/lp-01/05Driver UART en polling : présentation49 File New Project or File Choisi r Nomme r Valider

50 jc/md/lp-01/05Driver UART en polling : présentation50 Choix du projet Choisir Valider

51 jc/md/lp-01/05Driver UART en polling : présentation51 Projet obtenu

52 jc/md/lp-01/05Driver UART en polling : présentation52 PlatformSettings Choisir Valider

53 jc/md/lp-01/05Driver UART en polling : présentation53 Ajout de TTYpoll.h au projet (1) Ouvrir le répertoire des fichiers du projet TTYpoll_APP Faire un clic droit sur le répertoire des fichiers dentête Header Files Dans le menu déroulant, choisir Add Files to Folder Sélectionner dans la fenêtre qui souvre le répertoire à visiter Sélectionner le fichier à insérer TTYpoll.h Valider

54 jc/md/lp-01/05Driver UART en polling : présentation54 Ajout de TTYpoll.h au projet (2) Choix du répertoire Choix du fichier Valider

55 jc/md/lp-01/05Driver UART en polling : présentation55 Projet obtenu

56 jc/md/lp-01/05Driver UART en polling : présentation56 Choix du type dimage Déroule r Choisir Valider

57 jc/md/lp-01/05Driver UART en polling : présentation57 Schéma dutilisation du driver Pour utiliser notre driver, notre application doit exécuter plusieurs phases : –Enregistrement du driver dans la registry –Ouverture du driver –Utilisation des IOControl préparées –Fermeture du driver –Suppression du driver de la registry Le driver sera géré par un handle que lapplication devrait fermer avant de se terminer

58 jc/md/lp-01/05Driver UART en polling : présentation58 Lancement dun driver (1) Lancement (passage dans XXX_Init) HANDLE RegisterDevice( LPCWSTR lpszType, DWORD dwIndex, LPCWSTR lpszLib, DWORD dwInfo); Paramètres lpszType : nom du device (COM,TTY…) dwIndex : numéro du device (2 pour COM2) lpszLib : nom de la dll dwInfo : passage éventuel de paramètres

59 jc/md/lp-01/05Driver UART en polling : présentation59 Lancement dun driver (2) Valeur de retour Handle associé au composant enregistré dans la registry Remarque –En fait, cest la fonction XXX_Init qui fournit le handle –Ce handle est communiqué aux fonctions XXX_Open, XXX_Deinit, XXX_PowerUp et XXX_PowerDown

60 jc/md/lp-01/05Driver UART en polling : présentation60 Ouverture du driver CreateFile est la fonction à utiliser pour créer ou ouvrir un device ou un port COM. Ici, ce sera sous une forme simplifiée avec les seuls arguments : –Pointeur sur le nom et numéro du driver (ce pointeur sera obtenu par la macro TEXT) –Accès autorisés en lecture et en écriture : GENERIC_READ | GENERIC_WRITE –OPEN_EXISTING paramètre dwCreationDispostion à utiliser dans le cas dun appel lié à un device –Les autre paramètres seront 0 ou NULL

61 jc/md/lp-01/05Driver UART en polling : présentation61 CreateFile (1) HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDispostion, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);

62 jc/md/lp-01/05Driver UART en polling : présentation62 CreateFile (2) Paramètres lpFileName: à fournir (macro TEXT) dwDesiredAccess: à fournir dwShareMode: 0 lpSecurityAttributes: NULL dwCreationDispostion: à fournir dwFlagsAndAttributes: 0 hTemplateFile: 0 Valeur de retour Handle ou INVALID_HANDLE_VALUE

63 jc/md/lp-01/05Driver UART en polling : présentation63 Utilisation des IOCTL La fonction DeviceIoControl envoie un IOCTL donné en paramètre à un device driver indiqué en paramètre. Nombreux paramètres La valeur de retour indique si lopération a réussi ou échoué.

64 jc/md/lp-01/05Driver UART en polling : présentation64 DeviceIoControl (1) BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);

65 jc/md/lp-01/05Driver UART en polling : présentation65 DeviceIoControl (2) Paramètres hDevice: handle sur le device ou le port dwIoControlCode: IOCTL à exécuter lpInBuffer: adresse du buffer de données dentrée nInBufferSize: longueur du buffer dentrée lpOutBuffer: adresse du buffer de données de sortie nOutBufferSize: longueur du buffer de sortie lpBytesReturned: pointeur sur la longueur des données effectivement dans le buffer de sortie lpOverlapped: toujours NULL

66 jc/md/lp-01/05Driver UART en polling : présentation66 DeviceIoControl (3) Valeur de retour 0 pour un échec, non 0 pour une réussite Remarque Le handle à utiliser est celui qui est fourni par la fonction CreateFile. Les IOCTL sont ceux qui ont été définis par la macro CTL_CODE.

67 jc/md/lp-01/05Driver UART en polling : présentation67 Fermeture du handle du driver CloseHandle pour fermer le handle associé au driver

68 jc/md/lp-01/05Driver UART en polling : présentation68 Suppression du driver de la registry La fonction DeregisterDevice supprime le driver de la registry BOOL DeregisterDevice( Handle hDevice ); Parameters hDevice [in] Handle to a registered device returned from RegisterDevice Return Values TRUE indicates success. FALSE indicates failure.

69 jc/md/lp-01/05Driver UART en polling : présentation69 Fermeture du handle du device DerigisterDevice ne ferme pas le handle associé au device doù : Fermeture du handle associé au device par CloseHandle

70 jc/md/lp-01/05Driver UART en polling : présentation70 Application : includes #include "stdafx.h" #include "../TTYpoll_DRV/TTYpoll.h" #include

71 jc/md/lp-01/05Driver UART en polling : présentation71 Application : entrée int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // Déclarations et réservations // TODO

72 jc/md/lp-01/05Driver UART en polling : présentation72 Application : lancement du driver // Lancement du driver (RegisterDevice) // TODO // Test de Handle correct (Handle !=0) // TODO // si incorrect // message et fin de lapplication // TODO // si correct MessageBox(NULL,_T(" Register TTY1 OK"), _T("UartApp"),MB_OK);

73 jc/md/lp-01/05Driver UART en polling : présentation73 Application : ouverture du driver // Ouverture du driver (CreateFile) // TODO // Test de Handle correct (Handle !=0) // TODO // si incorrect // message et fin de lapplication // TODO // si correct

74 jc/md/lp-01/05Driver UART en polling : présentation74 Application : boucle de réception // Boucle d'émission et de réception dun caractère carac[0]='$'; while(carac[0]!=0x1B) // Attente du caractère escape { // Envoi d'un caractère // TODO // Lecture du status et attente de récepteur Ready // TODO // Acquisition d'un caractère // TODO } // Fin de boucle while

75 jc/md/lp-01/05Driver UART en polling : présentation75 Application : fermetures // Fermeture du driver // TODO // Déchargement du driver // TODO return 0; }

76 jc/md/lp-01/05Driver UART en polling : présentation76 Génération de lapplication

77 jc/md/lp-01/05Driver UART en polling : présentation77 Essai de TTYpoll_APP.exe Télécharger dans la cible le noyau avec le driver TTYpoll_DRV.dll qui a été inclus lors du Make Image Lancement du programme dapplication Target Run Program Sélection de TTYpoll_APP

78 jc/md/lp-01/05Driver UART en polling : présentation78 Essai

79 jc/md/lp-01/05Driver UART en polling : présentation79 Sélection de TTYpoll_APP Valider

80 jc/md/lp-01/05Driver UART en polling : présentation80 Cible On observe un $ sur lécran, puis lécho de tous les caractères tapés Le programme se termine lorsquon tape le caractère ESCAPE

81 jc/md/lp-01/05Driver UART en polling : présentation81 Conclusion Nous avons : –Construit un driver simple –Généré une image de système incluant ce driver –Utilisé ce driver dans une application –Téléchargé le système dans la cible –Téléchargé et exécuté lapplication dans la cible TODO –Saisir une chaîne de caractères


Télécharger ppt "Jc/md/lp-01/05Driver UART en polling : présentation1 DRIVER UART EN POLLING Présentation."

Présentations similaires


Annonces Google