Driver UART en polling : présentation

Slides:



Advertisements
Présentations similaires
Active Directory Windows 2003 Server
Advertisements

Support.ebsco.com Guide dUtilisation Création dune collection locale.
La boucle for : init7.c et init71.c
Génération de plate-forme
Synchronisation des processus père - fils
PROGRAMMATION LOGICIEL PL7 MICRO Consignes
Gestion de FICHIERS.
C.
! ! ! PROCEDURE TYPE POUR ORGANISER L ’ANONYMAT
! 1 CREATION D'UNE MAQUETTE EXPORT / IMPORT
Revision.
Driver de port parallèle
Jc/md/lp-01/05TTY_IT : présentation1 TTY_IT Présentation.
Jc/md/lp-01/06Génération de plate-forme1 Émulateur.
Jc/md/lp-01/05Essai ligne série COM1 : présentation1 Essai ligne série CEPC Application écho sur COM1 Présentation.
Gestion mémoire : présentation
Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé
Driver de port parallèle
Jc/md/lp-01/06Kernel Tracker1 Debugging Kernel Tracker.
Jc/md/lp-01/05Principe des drivers1 Généralités sur les drivers Présentation.
Jc/md/lp-01/05TTY_IT : corrigé1 TTY_IT Corrigé. jc/md/lp-01/05TTY_IT : corrigé2 Objectif du chapitre Proposer une solution pour les exercices suggérés.
Driver UART en polling : corrigé
Jc/md/lp-01/05Driver élémentaire : corrigé1 Driver élémentaire Émulateur Corrigé
Jc/md/lp-01/05Trains_presentation1 Threads et Synchronisation Application train Présentation.
Jc/md/lp-01/05Boot Loader1 BOOT LOADER. jc/md/lp-01/05Boot Loader2 Objectif du chapitre Introduire la notion de Boot Loader Donner un aperçu de lorganisation.
Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.
FLSI602 Génie Informatique et Réseaux
Systèmes d’exploitation
Système d’exploitation : Assembleur
Parallel Programming in C with MPI and OpenMP
Active Directory Windows 2003 Server
Page 1 Introduction à ATEasy 3.0 Page 2 Quest ce quATEasy 3.0? n Ensemble de développement très simple demploi n Conçu pour développer des bancs de test.
Labview Programmation réseau Communication par sockets
Création d’un programme :
NOTE : Pour faire évoluer le diaporama, si le clic de souris ne fait rien utilisez les touches du clavier : Pg up Pg down.
TRANSMISSION DES DONNEES.
TRANSMISSION SÉRIE ASYNCHRONE Février 2008 JF VIENNE.
Fonction COMMUNIQUER les liaisons série
1 CLUB DES UTILISATEURS SAS DE QUÉBEC COMMENT TRANSFORMER UN PROGRAMME SAS EN TÂCHE PLANIFIÉE SOUS WINDOWS Présentation de Jacques Pagé STRiCT Technologies.
FICHIERS : Définition : Algorithme général:
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
IFT 6800 Atelier en Technologies d’information
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Plan cours La notion de pointeur et d’adresse mémoire.
Prélude 7 ERP Module Supply Chain Initiation au travail en réseau
Microcontrôleurs et Langage C Les Interruptions diapo 1
Programmation événementielle
Créer des packages.
 Objet window, la fenêtre du navigateur
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Introduction à Visual Studio C++ (VC++)
Tutorat en bio-informatique
Programmation Système et Réseau
Sif Cours 9 n 7. Communication série u Concepts généraux u Programmation des ports séries n Le matériel u Chapitre 10 CSA u Article dans MSDN: F.
La programmation de l’interface FischerTechnik
Les sockets.
COURS_1 JC LP MD.
La programmation de l’interface FischerTechnik
Création d’un domaine Il faut :
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Les variables fichiers. Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique.
 Formulaires HTML : traiter les entrées utilisateur
Les bases du protocole Modbus
Cours Système LI324 Les Interruptions Cours Système LI324
Création d’un projet (10) Cadepa 6-12 pour API TSX-37
Conception des pages Web avec
13/08/2013JC/LP/MD1 TP2 Enoncé. 13/08/2013JC/LP/MD2 Objectif Gérer la liaison série en polling Envoi d’un caractère § au démarrage Faire l’écho des caractères.
14/08/2013JC/LP/MD1 TP3 Enoncé. 14/08/2013JC/LP/MD2 Objectif Gérer la liaison série avec la réception en interruption On utilisera le Hardware Vector.
Scénario Les scénarios permettent de modifier la position, taille … des calques au cours du temps. Son fonctionnement est très proche de celui de Macromedia.
Abes agence bibliographique de l’enseignement supérieur Les scripts.
Transcription de la présentation:

Driver UART en polling : présentation B-205 CE4.2 DRIVER UART EN POLLING Présentation jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation B-205 CE4.2 Objectif du chapitre Écrire un driver rudimentaire et l’intégrer dans Windows CE pour prendre connaissance des mécanismes Le driver choisi est le gestionnaire d’une liaison série classique dans le monde PC à base de l’UART 16550 Ce composant présent dans la cible même s’il est utilisé de la façon la plus simple, en polling, nous permettra d’essayer notre driver Un driver ou pilote est le logiciel qui met en correspondance les fonctionnalités offertes par le « Système » et les organes qui en assurent la réalisation . En général, le driver correspond à un organe physique, driver d ’écran, driver d’imprimante, etc. mais ce n’est pas une obligation ; on peut avoir un driver pour des entités immatérielles, driver de messages ou un mélange des deux concepts, un driver éthernet gère le contrôleur physique éthernet aussi bien que le protocole associé. UART : Universal Asynchronous Receiver/Transmitter Lorsqu’un organe physique (ceci peut d’ailleurs s’étendre à un composant logiciel) est susceptible d’effectuer sa tâche pour le compte d’un CPU, deux façons radicalement différentes se présentent pour organiser la gestion. Dans un cas, le composant est passif : il sera interrogé régulièrement, c’est la méthode du polling, par le CPU qui déterminera par l’examen d’une information d’état (un « status ») s’il y a lieu ou non d’exécuter un traitement. Dans notre cas, le status nous indiquera si un caractère a été reçu et/ou si le contrôleur est prêt à envoyer un caractère. Suivant la réponse, le CPU récupère le caractère reçu par le Receiver et/ou fournit un caractère au Transmitter. Dans l’autre cas, le composant est actif : quand il désire une intervention du CPU il envoie à celui-ci un signal d’interruption. Le CPU réceptionne cette interruption, la traite, c’est-à-dire détermine la source de l’interruption et les traitements complémentaires à effectuer, puis l’acquitte pour permettre au composant de travailler à nouveau. Dans notre cas, en simplifiant, ce serait une interruption émise par le Transmitter pour indiquer au CPU qu’il peut envoyer un nouveau caractère en vue de sa transmission, et/ou une interruption émise par le Receiver pour indiquer qu’il a réceptionné un caractère et qu’il le tient à la disposition du CPU. Cette gestion par interruption est plus complexe à mettre en œuvre et nous l’utiliserons dans un deuxième temps. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation 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 à lire et à écrire dans les registres du contrôleur IOCTL : Input Ouput Control. Il s’agit du moyen de communication entre un programme et le device driver. La commande IOCTL reçue du programme est interprétée par le device driver qui la traduit en ordres adressés au contrôleur physique, ici par l’écriture ou la lecture des registres internes du 16550. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation B-205 CE4.2 Contrôleur 16550 Contrôlé par douze registres internes Registres sélectionnés par une combinaison Des adresses A2, A1 et A0 D’un complément fourni par le signal Read/Write D’un second complément fourni par le bit « DLAB » poids fort du registre Line Control Register Nota : Nous n’utiliserons pas la FIFO intégrée Les registres Interrupt Register et Interrupt Status Register seront présentés dans le prochain chapitre DLAB : Divisor Latch Access Bit, ce bit poids fort du « Line Control Register » permet lorsqu’il est à 1 d’accéder aux adresses 000 et 001 aux deux registres qui contiennent le diviseur utilisé pour déterminer la vitesse de la transmission série. Ce bit est obligatoirement utilisé dans la phase d’initialisation, avant que l’on ait besoin des registres visibles normalement aux adresses 000 Receive Buffer Register ou Transmit Buffer Register suivant le signal Read/Write, et 001 Interrupt Register. On peut éventuellement utiliser dans un programme le bit DLAB à 1 pour lire les registres Divisor Latches afin de connaître la vitesse de fonctionnement utilisée à un instant donné ; ceci semble peu utile et devra se faire interruptions fermées ; de plus il faudra immédiatement remettre le bit DLAB à 0. Initialisation Écriture d’un bit DLAB à 1 dans le Line Control Register (adresse 011, R/W en écriture) Écriture dans les registres Divisor Latch LSB (adresse 000, R/W en écriture) et Divisor Latch MSB (adresse 001, R/W en écriture) Écriture d’un bit DLAB à 0 dans le Line Control Register (adresse 011, R/W en écriture) Écriture de l’Interrupt Register (adresse 001, R/W en écriture) Écriture du FIFO Control Register (adresse 010, R/W en écriture) Autres initialisations Utilisation normale, en dehors de la phase d’initialisation (DLAB à 0) Lecture d’une donnée reçue dans le Receive Buffer Register (adresse 000, R/W en lecture) Écriture d’une donnée à transmettre dans le Transmit Buffer Register (adresse 000, R/W en écriture) Lecture ou écriture de l’Interrupt Register (adresse 001, R/W en lecture ou en écriture) Lecture de l’Interrupt Status Register (adresse 010, R/W en lecture) Etc. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

Adressage des registres du 16550 B-205 CE4.2 Adressage des registres du 16550 DLAB A2 A1 A0 R/W Register R Receive Buffer Register W Transmit Buffer Register 1 Interrupt Register x Interrupt Status Register FIFO Control Register Line Control Register Modem Control Register Line Status Register Modem Status Register Scratch Register Divisor Latch (LSB) Divisor Latch (MSB) jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

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 à l’adresse 000, en fonctionnement normal (DLAB = 0) Dans le cas d’utilisation des FIFOs, ce registre fournit successivement les données disponibles dans la FIFO de réception jc/md/lp-01/05 Driver UART en polling : présentation

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 à l’adresse 000, en fonctionnement normal (DLAB = 0), après l’initialisation du Baud Rate Generator Dans le cas d’utilisation des FIFOs, ce registre introduit successivement les données fournies par le CPU dans la FIFO d’émission jc/md/lp-01/05 Driver UART en polling : présentation

Driver UART en polling : présentation B-205 CE4.2 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 FIFO : First In First Out. Il s’agit de deux buffers internes du circuit 16550 capables de contenir 16 octets à émettre vers l’extérieur ou à recevoir de l’extérieur. Le circuit 16550 dérive d’un circuit 16450 plus simple dans lequel il n’y avait pas de FIFO ; pour des raisons de compatibilité des logiciels le 16550 peut ne pas utiliser les FIFOs et fonctionne alors comme un 16450. En fait l’utilisation des FIFOs n’a de sens que dans un fonctionnement utilisant le mode DMA, de sorte que le 16550 fonctionnera avec les FIFOs lorsque les deux bits 0 et 3 seront positionnés à 1. Pour obtenir un fonctionnement harmonieux du contrôleur, il est souhaitable de prévenir le CPU avant que la FIFO de réception ne soit pleine puisque cela bloquerait la réception ; c’est le rôle des bits 6 et 7 qui indiquent au CPU par le déclenchement d’une interruption que la FIFO de réception contient 1, 4, 8 ou 14 octets. La FIFO d’émission gérée en fonction de la périphérie n’a pas ce dispositif. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation B-205 CE4.2 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 d’un break Bit 7 : DLAB, 1 sélection Divisor Latch Ex : codage nombre de bits 11 → 8 bits de data En fait, il y a un bit de stop quand le bit 2 est à 0 ; quand ce bit est à 1, la longueur du signal de stop diffère suivant que la donnée contient 5 bits ou plus. Pour 5 bits, la longueur du stop correspond à un bit et demi (telex) ; pour des données de 6, 7 ou 8 bits le signal de stop correspond à 2 bits. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

MODEM Control Register B-205 CE4.2 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 Les bits 0 et 1 correspondent aux signaux classiques de gestion d’un MODEM, Data Terminal Ready et Request To Send. Les bits 2 et 3 sont à la disposition du programmeur pour positionner les broches du boîtier à 1 ou à 0. Ils sont particulièrement utiles dans le mode Loopback. Dans les derniers chipsets et à la différence du composant d’origine, le bit 3 sert aussi à autoriser les interruptions EI (Enable Interrupt) ou à les interdire DI (Disable Interrupt). Le mode Loopback introduit un fonctionnement avec rebouclage interne de la sortie d’information sur l’entrée ce qui aide à vérifier le bon fonctionnement de la liaison série. Dans ce mode, les interruptions associées aux données fonctionnent normalement mais les bits 0 à 3 du registre sont substitués aux informations produites par les interruptions normalement émises par le MODEM. Ceci permet d’introduire la gestion du MODEM dans les programmes de test de la liaison. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

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

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

Driver UART en polling : présentation Autres registres D’autres 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 16550 est à la disposition des programmeurs jc/md/lp-01/05 Driver UART en polling : présentation

Driver UART en polling : présentation Baud Rate Generator La vitesse de transmission est fixée à partir de l’horloge 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 bauds 1047 1200 bauds 96 9600 bauds 12 38400 bauds 3 jc/md/lp-01/05 Driver UART en polling : présentation

Lecture et écriture des registres B-205 CE4.2 Lecture et écriture des registres Windows CE nous propose deux fonctions pour écrire ou lire les registres du 16550 Dans l’architecture 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 l’espace mémoire habituel. Dans cet espace, on parle plutôt d’un port que d’une adresse mémoire. La distinction entre les deux espaces est réalisée par le hardware jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation B-205 CE4.2 Lecture d’un 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. En fait, READ_PORT_UCHAR n’est pas une fonction mais une macro. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation B-205 CE4.2 É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. En fait, WRITE_PORT_UCHAR n’est pas une fonction mais une macro. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation 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 : présentation

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

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

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

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

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, PowerDown, 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 : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation 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 : présentation

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

Driver UART en polling : présentation 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 : présentation

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

Driver UART en polling : présentation 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 : présentation

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

Driver UART en polling : présentation 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 : présentation Driver_UART_polling_V1.0.ppt

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

Driver UART en polling : présentation 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 avec des parties à compléter Code des IOCTL PUTC, GETC et GET_RX_STATUS avec des parties à compléter jc/md/lp-01/05 Driver UART en polling : présentation

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 : présentation

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 : présentation

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 : présentation

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 : présentation

Driver UART en polling : présentation Driver : TTY_Init 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 // TODO return dwRet; } jc/md/lp-01/05 Driver UART en polling : présentation

Driver UART en polling : présentation 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 : présentation

Driver UART en polling : présentation 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; } jc/md/lp-01/05 Driver UART en polling : présentation

Driver UART en polling : présentation 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 : présentation

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 : présentation

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

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

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

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

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

Driver UART en polling : présentation Création de l’image jc/md/lp-01/05 Driver UART en polling : présentation

Driver UART en polling : présentation 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 : présentation

File → New Project or File Choisir Nommer Valider jc/md/lp-01/05 Driver UART en polling : présentation

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

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

Driver UART en polling : présentation Platform→Settings Choisir Choisir Valider jc/md/lp-01/05 Driver UART en polling : présentation

Ajout de TTYpoll.h au projet (1) B-205 CE4.2 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 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 : présentation Driver_UART_polling_V1.0.ppt

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

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

Driver UART en polling : présentation Choix du type d’image Dérouler Choisir Choisir Dérouler Valider jc/md/lp-01/05 Driver UART en polling : présentation

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 : présentation

Lancement d’un driver (1) B-205 CE4.2 Lancement d’un 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 Cette fonction est maintenant remplacée par la fonction ActivateDeviceEx plus riche mais plus compliquée à utiliser. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

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

Driver UART en polling : présentation B-205 CE4.2 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 d’un appel lié à un device Les autre paramètres seront 0 ou NULL La fonction CreateFile, avec des paramètres très riches, intervient dans des contextes bien plus complexes que notre exemple simpliste. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

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

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

Driver UART en polling : présentation B-205 CE4.2 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 l’opération a réussi ou échoué. jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

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

Driver UART en polling : présentation DeviceIoControl (2) Paramètres hDevice: handle sur le device ou le port dwIoControlCode: IOCTL à exécuter lpInBuffer: adresse du buffer de données d’entrée nInBufferSize: longueur du buffer d’entré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 jc/md/lp-01/05 Driver UART en polling : présentation

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

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

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

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

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

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

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

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

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 // TODO // Lecture du status et attente de récepteur Ready // Acquisition d'un caractère } // Fin de boucle while jc/md/lp-01/05 Driver UART en polling : présentation Driver_UART_polling_V1.0.ppt

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

Génération de l’application jc/md/lp-01/05 Driver UART en polling : présentation

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 : présentation

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

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

Driver UART en polling : présentation 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 : présentation Driver_UART_polling_V1.0.ppt

Driver UART en polling : présentation 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 : présentation