Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
1
Driver UART en polling : corrigé
B-205 CE4.2 DRIVER UART EN POLLING Corrigé jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
2
Driver UART en polling : corrigé
B-205 CE4.2 Objectif du chapitre Fournir le corrigé des exercices proposés dans le chapitre : Driver UART en polling : présentation jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
3
Driver UART en polling : corrigé
B-205 CE4.2 Driver en polling À écrire avec la plate-forme z_cible_CEPC Le driver assure l’interface 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 jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
4
Driver UART en polling : corrigé
Mise en œuvre Préparation du driver Préparation de l’application Téléchargement dans la cible Lancement du driver Exécution de l’application jc/md/lp-01/05 Driver UART en polling : corrigé
5
File → New Project or File
Cocher Nommer Valider jc/md/lp-01/05 Driver UART en polling : corrigé
6
Driver UART en polling : corrigé
Choix du projet Cocher Valider jc/md/lp-01/05 Driver UART en polling : corrigé
7
Driver UART en polling : corrigé
Projet obtenu jc/md/lp-01/05 Driver UART en polling : corrigé
8
Fichiers créés sous la plate-forme
jc/md/lp-01/05 Driver UART en polling : corrigé
9
Fichiers supplémentaires
B-205 CE4.2 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 d’entrée du driver Fichier d’entête .h dans lequel on prépare des macros utilisables avec le driver pour faciliter l’utilisation des IOCTL Les fichiers .def servent à beaucoup d’autres choses non utilisées ici. La syntaxe est particulière : le nom des points d’entrée prédéfinis (Init, Open, PoxerDown, etc.) doit être précédé d’un préfixe fait avec de trois symboles, ici TTY, et le signe souligné. jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
10
Driver UART en polling : corrigé
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 jc/md/lp-01/05 Driver UART en polling : corrigé
11
Driver UART en polling : corrigé
Fichier .def (2) Onglet Files Renseigner Cocher Choisir OK jc/md/lp-01/05 Driver UART en polling : corrigé
12
Driver UART en polling : corrigé
TTYpoll_DRV.def (1) LIBRARY TTYpoll_DRV EXPORTS TTY_Init TTY_Open TTY_IOControl TTY_Close TTY_Deinit jc/md/lp-01/05 Driver UART en polling : corrigé
13
Driver UART en polling : corrigé
TTYpoll_DRV.def (2) jc/md/lp-01/05 Driver UART en polling : corrigé
14
Driver UART en polling : corrigé
Fichier .h (1) Fichier d’entê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 jc/md/lp-01/05 Driver UART en polling : corrigé
15
Driver UART en polling : corrigé
Fichier .h (2) jc/md/lp-01/05 Driver UART en polling : corrigé
16
Driver UART en polling : corrigé
B-205 CE4.2 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, \ #define IOCTL_GET_RX_STATUS \ CTL_CODE(FILE_DEVICE_UNKNOWN,2050, \ CTL_CODE est une macro utilisée systématiquement pour obtenir des IOCTL standardisés et uniques dans un système. Les valeurs 2048, 2049 et 2050 sont trois valeurs arbitraires choisies simplement dans les valeurs autorisées pour les OEM (2048 à 4095). jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
17
Driver UART en polling : corrigé
TTYpoll.h (2) jc/md/lp-01/05 Driver UART en polling : corrigé
18
Driver UART en polling : corrigé
TTYpoll_DRV.cpp Fichiers d’entêtes Constantes d’adressage des registres du 16550 Constantes de définition des bits de status Point d’entrée de la dll Code des points d’entrée du driver Init, Deinit, Open, Close et IOControl Code des IOCTL PUTC, GETC et GET_RX_STATUS jc/md/lp-01/05 Driver UART en polling : corrigé
19
Driver : fichiers d’entêtes
#include "stdafx.h" #include <wdm.h> #include <windev.h> #include "TTYpoll.h" jc/md/lp-01/05 Driver UART en polling : corrigé
20
Driver : adressage du sérialiseur
#define IoPortBase ((PUCHAR) 0x02F8) //Registres du sérialiseur : offset par rapport à IoPortBase #define comLineControl 3 #define comDivisorLow 0 #define comDivisorHigh 1 #define comFIFOControl 2 #define comIntEnable 1 #define comModemControl 4 #define comLineStatus 5 #define comTxBuffer 0 #define comRxBuffer 0 jc/md/lp-01/05 Driver UART en polling : corrigé
21
Driver : définition des bits de status
//Bits de status du sérialiseur #define LS_TSR_EMPTY 0x40 #define LS_THR_EMPTY 0x20 #define LS_RX_BREAK 0x10 #define LS_RX_FRAMING_ERR 0x08 #define LS_RX_PARITY_ERR 0x04 #define LS_RX_OVERRRUN 0x02 #define LS_RX_DATA_READY 0x01 #define LS_RX_ERRORS (LS_RX_FRAMING_ERR | LS_RX_PARITY_ERR | LS_RX_OVERRRUN ) jc/md/lp-01/05 Driver UART en polling : corrigé
22
Driver : point d’entrée de la dll
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } jc/md/lp-01/05 Driver UART en polling : corrigé
23
Driver UART en polling : corrigé
B-205 CE4.2 Driver : TTY_Init (1) DWORD TTY_Init(DWORD dwContext) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("SERIAL: TTY_Init\n"))); // Initialisation du sérialiseur 16550 // 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); DWORD TTY_Init(DWORD dwContext) { // Initialisation : 9600 bauds, 8 bits, pas de parité, pas d'IT, DTR, RTS, pas de FIFO DWORD dwRet = 1; RETAILMSG(1,(TEXT("SERIAL: TTY_Init\n"))); // DLAB=1, réglage BAUD RATE WRITE_PORT_UCHAR(IoPortBase+comLineControl,0x80); WRITE_PORT_UCHAR(IoPortBase+comDivisorLow,0x0C); WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh,0x00); // DLAB=0, réglage 8 bits DATA WRITE_PORT_UCHAR(IoPortBase+comLineControl,0x03); // Pas de FIFO WRITE_PORT_UCHAR(IoPortBase+comFIFOControl,0x00); // Pas d’IT WRITE_PORT_UCHAR(IoPortBase+comIntEnable,0x00); // DTR, RTS WRITE_PORT_UCHAR(IoPortBase+comModemControl,0x03); return dwRet; } jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
24
Driver UART en polling : corrigé
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 d’IT WRITE_PORT_UCHAR(IoPortBase+comIntEnable,0x00); // DTR, RTS WRITE_PORT_UCHAR(IoPortBase+comModemControl,0x03); return dwRet; } jc/md/lp-01/05 Driver UART en polling : corrigé
25
Driver UART en polling : corrigé
Driver : TTY_Deinit BOOL TTY_Deinit(DWORD hDeviceContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("SERIAL: TTY_Deinit\n"))); return bRet; } jc/md/lp-01/05 Driver UART en polling : corrigé
26
Driver UART en polling : corrigé
B-205 CE4.2 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; } jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
27
Driver UART en polling : corrigé
Driver : TTY_Close BOOL TTY_Close(DWORD hOpenContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("SERIAL: TTY_Close\n"))); return bRet; } jc/md/lp-01/05 Driver 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) jc/md/lp-01/05 Driver UART en polling : corrigé
29
Driver : TTY_IOControl (IOCTL_PUTC)
B-205 CE4.2 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; jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
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; jc/md/lp-01/05 Driver 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; jc/md/lp-01/05 Driver UART en polling : corrigé
32
Driver : TTY_IOControl (fin)
} // Fin du switch *pdwActualOut = 1; return TRUE; } // Fin de IOControl jc/md/lp-01/05 Driver UART en polling : corrigé
33
Driver UART en polling : corrigé
Compilation du driver jc/md/lp-01/05 Driver UART en polling : corrigé
34
Driver UART en polling : corrigé
Création de l’image jc/md/lp-01/05 Driver UART en polling : corrigé
35
Driver UART en polling : corrigé
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 d’un 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 jc/md/lp-01/05 Driver UART en polling : corrigé
36
File → New Project or File
jc/md/lp-01/05 Driver UART en polling : corrigé
37
Driver UART en polling : corrigé
Choix du projet jc/md/lp-01/05 Driver UART en polling : corrigé
38
Driver UART en polling : corrigé
Projet obtenu jc/md/lp-01/05 Driver UART en polling : corrigé
39
Driver UART en polling : corrigé
Platform→Settings jc/md/lp-01/05 Driver 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 d’entête Header Files Dans le menu déroulant, choisir Add Files to Folder Sélectionner dans la fenêtre qui s’ouvre le répertoire à visiter Sélectionner le fichier à insérer TTYpoll.h Valider jc/md/lp-01/05 Driver UART en polling : corrigé
41
Ajout de TTYpoll.h au projet (2)
B-205 CE4.2 Ajout de TTYpoll.h au projet (2) Choix du répertoire Choix du fichier Valider On peut aussi copier physiquement le fichier TTYpoll.h pris dans le répertoire …\WINCE420\PUBLIC\z_cible_CEPC\TTYpoll_DRV dans le répertoire …\WINCE420\PUBLIC\z_cible_CEPC\TTYpoll_APP L’inconvénient de ce procédé est qu’il existe deux fichiers TTYpoll.h. Les modifications de l’un ne sont pas automatiquement reportées dans l’autre. Avec la méthode choisie, il n’y a qu’un seul fichier physique placé dans …\WINCE420\PUBLIC\z_cible_CEPC\TTYpoll_DRV. Par contre dans la directive include du fichier TTYpollAPP.cpp il faudra préciser le chemin pour atteindre le fichier. #include "../TTYpoll_DRV/TTYpoll.h" jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
42
Driver UART en polling : corrigé
Projet obtenu jc/md/lp-01/05 Driver UART en polling : corrigé
43
Driver UART en polling : corrigé
Platform→Settings jc/md/lp-01/05 Driver UART en polling : corrigé
44
Driver UART en polling : corrigé
Choix du type d’image Dérouler Choisir Choisir Dérouler Valider jc/md/lp-01/05 Driver UART en polling : corrigé
45
Schéma d’utilisation 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 l’application devrait fermer avant de se terminer jc/md/lp-01/05 Driver UART en polling : corrigé
46
Application : includes
#include "stdafx.h" #include "../TTYpoll_DRV/TTYpoll.h" #include <windev.h> jc/md/lp-01/05 Driver UART en polling : corrigé
47
Driver UART en polling : corrigé
B-205 CE4.2 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; jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
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); jc/md/lp-01/05 Driver 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; } jc/md/lp-01/05 Driver UART en polling : corrigé
50
Application : boucle de réception
// Boucle d'émission et de réception d’un 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 jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
51
Application : fermetures
// Fermeture du driver CloseHandle(hTTY); // Déchargement du driver DeregisterDevice(hDevice); CloseHandle(hDevice); return 0; } jc/md/lp-01/05 Driver UART en polling : corrigé
52
Génération de l’application
jc/md/lp-01/05 Driver 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 d’application Target → Run Program Sélection de TTYpoll_APP jc/md/lp-01/05 Driver UART en polling : corrigé
54
Driver UART en polling : corrigé
Essai jc/md/lp-01/05 Driver UART en polling : corrigé
55
Sélection de TTYpoll_APP
Valider jc/md/lp-01/05 Driver UART en polling : corrigé
56
Driver UART en polling : corrigé
B-205 CE4.2 Cible On observe un $ sur l’écran, puis l’écho de tous les caractères tapés Le programme se termine lorsqu’on tape le caractère ESCAPE On ne peut pas montrer d’image de l’écran obtenu puisque cela se passe sur l’écran de la cible et non sur celui du PC hôte ; on ne peut donc pas faire de capture d’image. jc/md/lp-01/05 Driver UART en polling : corrigé UART_polling_corrigé_V1.0.ppt
57
Driver UART en polling : corrigé
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é l’application dans la cible TODO Saisir une chaîne de caractères jc/md/lp-01/05 Driver UART en polling : corrigé
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.