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 : corrigé1 DRIVER UART EN POLLING Corrigé

Présentations similaires


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

1 jc/md/lp-01/05Driver UART en polling : corrigé1 DRIVER UART EN POLLING Corrigé

2 jc/md/lp-01/05Driver UART en polling : corrigé2 Objectif du chapitre Fournir le corrigé des exercices proposés dans le chapitre : Driver UART en polling : présentation

3 jc/md/lp-01/05Driver UART en polling : corrigé3 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 à écrire dans les registres du contrôleur

4 jc/md/lp-01/05Driver UART en polling : corrigé4 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

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

6 jc/md/lp-01/05Driver UART en polling : corrigé6 Choix du projet Cocher Valider

7 jc/md/lp-01/05Driver UART en polling : corrigé7 Projet obtenu

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

9 jc/md/lp-01/05Driver UART en polling : corrigé9 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

10 jc/md/lp-01/05Driver UART en polling : corrigé10 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

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

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

13 jc/md/lp-01/05Driver UART en polling : corrigé13 TTYpoll_DRV.def (2)

14 jc/md/lp-01/05Driver UART en polling : corrigé14 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

15 jc/md/lp-01/05Driver UART en polling : corrigé15 Fichier.h (2)

16 jc/md/lp-01/05Driver UART en polling : corrigé16 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)

17 jc/md/lp-01/05Driver UART en polling : corrigé17 TTYpoll.h (2)

18 jc/md/lp-01/05Driver UART en polling : corrigé18 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 Code des IOCTL PUTC, GETC et GET_RX_STATUS

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

20 jc/md/lp-01/05Driver UART en polling : corrigé20 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

21 jc/md/lp-01/05Driver UART en polling : corrigé21 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 )

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

23 jc/md/lp-01/05Driver UART en polling : corrigé23 Driver : TTY_Init (1) 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 // DLAB=1, réglage BAUD RATE WRITE_PORT_UCHAR(IoPortBase+comLineControl,0x80); WRITE_PORT_UCHAR(IoPortBase+comDivisorLow,0x0C); WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh,0x00);

24 jc/md/lp-01/05Driver UART en polling : corrigé24 Driver : TTY_Init (2) // DLAB=0, réglage 8 bits DATA WRITE_PORT_UCHAR(IoPortBase+comLineControl,0x03); // Pas de FIFO WRITE_PORT_UCHAR(IoPortBase+comFIFOControl,0x00); // Pas dIT WRITE_PORT_UCHAR(IoPortBase+comIntEnable,0x00); // DTR, RTS WRITE_PORT_UCHAR(IoPortBase+comModemControl,0x03); return dwRet; }

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

26 jc/md/lp-01/05Driver UART en polling : corrigé26 Driver : TTY_Open (1) 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 while((READ_PORT_UCHAR(IoPortBase+comLineStatus) & LS_RX_DATA_READY) ==1) READ_PORT_UCHAR(IoPortBase+comRxBuffer); return dwRet; }

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

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

29 jc/md/lp-01/05Driver UART en polling : corrigé29 Driver : TTY_IOControl (IOCTL_PUTC) case IOCTL_PUTC: // Attente de transmetteur prêt while(!(READ_PORT_UCHAR(IoPortBase +comLineStatus) & LS_THR_EMPTY)) ; // Envoi du caractère WRITE_PORT_UCHAR(IoPortBase+ comTxBuffer,pBufIn[0]); break;

30 jc/md/lp-01/05Driver UART en polling : corrigé30 Driver : TTY_IOControl (IOCTL_GETC) case IOCTL_GETC: // Lecture du caractère pBufOut[0] = READ_PORT_UCHAR(IoPortBase +comRxBuffer); RETAILMSG(1,(TEXT("TTY caractère lu\n"))); break;

31 jc/md/lp-01/05Driver UART en polling : corrigé31 Driver : TTY_IOControl (..._STATUS) case IOCTL_GET_RX_STATUS: // Lecture du status pBufOut[0] = (READ_PORT_UCHAR( IoPortBase+comLineStatus) & LS_RX_DATA_READY); if(pBufOut[0] == 1) RETAILMSG(1,(TEXT(" TTY RX Ready\n"))); break;

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

33 jc/md/lp-01/05Driver UART en polling : corrigé33 Compilation du driver

34 jc/md/lp-01/05Driver UART en polling : corrigé34 Création de limage

35 jc/md/lp-01/05Driver UART en polling : corrigé35 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

36 jc/md/lp-01/05Driver UART en polling : corrigé36 File New Project or File

37 jc/md/lp-01/05Driver UART en polling : corrigé37 Choix du projet

38 jc/md/lp-01/05Driver UART en polling : corrigé38 Projet obtenu

39 jc/md/lp-01/05Driver UART en polling : corrigé39 PlatformSettings

40 jc/md/lp-01/05Driver UART en polling : corrigé40 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

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

42 jc/md/lp-01/05Driver UART en polling : corrigé42 Projet obtenu

43 jc/md/lp-01/05Driver UART en polling : corrigé43 PlatformSettings

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

45 jc/md/lp-01/05Driver UART en polling : corrigé45 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

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

47 jc/md/lp-01/05Driver UART en polling : corrigé47 Application : entrée int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // Déclarations et réservations HANDLE hDevice,hTTY; UCHAR carac[80]; DWORD nb;

48 jc/md/lp-01/05Driver UART en polling : corrigé48 Application : lancement du driver // Lancement du driver (RegisterDevice) hDevice = RegisterDevice(TEXT("TTY"),1, TEXT("TTYpoll_DRV.dll"),NULL); // Test de Handle correct (Handle !=0) if(hDevice == 0) { MessageBox(NULL,_T("CannotRegisterTTY1"), _T("UartApp"),MB_OK); return 0; } MessageBox(NULL,_T("Register TTY1 OK"), _T("UartApp"),MB_OK);

49 jc/md/lp-01/05Driver UART en polling : corrigé49 Application : ouverture du driver // Ouverture du driver (CreateFile) hTTY = CreateFile(TEXT("TTY1:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); // Test de Handle correct (Handle !=0) if(hTTY == INVALID_HANDLE_VALUE) { MessageBox(NULL, _T("Cannot open TTY1"), _T("UartApp"),MB_OK); DeregisterDevice(hDevice); CloseHandle(hDevice); return 0; }

50 jc/md/lp-01/05Driver UART en polling : corrigé50 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 DeviceIoControl(hTTY,IOCTL_PUTC,carac,1,carac,1,&nb,NULL); // Lecture du status et attente de récepteur Ready do DeviceIoControl(hTTY,IOCTL_GET_RX_STATUS, carac,1,carac,1,&nb,NULL); while(carac[0]!=1); // Acquisition d'un caractère DeviceIoControl(hTTY,IOCTL_GETC,carac,1,carac,1,&nb,NULL); } // Fin de boucle while

51 jc/md/lp-01/05Driver UART en polling : corrigé51 Application : fermetures // Fermeture du driver CloseHandle(hTTY); // Déchargement du driver DeregisterDevice(hDevice); CloseHandle(hDevice); return 0; }

52 jc/md/lp-01/05Driver UART en polling : corrigé52 Génération de lapplication

53 jc/md/lp-01/05Driver UART en polling : corrigé53 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

54 jc/md/lp-01/05Driver UART en polling : corrigé54 Essai

55 jc/md/lp-01/05Driver UART en polling : corrigé55 Sélection de TTYpoll_APP Valider

56 jc/md/lp-01/05Driver UART en polling : corrigé56 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

57 jc/md/lp-01/05Driver UART en polling : corrigé57 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 : corrigé1 DRIVER UART EN POLLING Corrigé"

Présentations similaires


Annonces Google