Département de génie électrique. ELE784 - Ordinateurs et programmation système. Laboratoire #2



Documents pareils
Département de génie électrique. ELE784 - Ordinateurs et programmation système. Laboratoire #1

Programmation impérative

Le langage C. Séance n 4

TP : Gestion d une image au format PGM

Introduction à la Programmation Parallèle: MPI

PROJET 1 : BASE DE DONNÉES REPARTIES

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

FICHE TECHNIQUE. Linux Tutoriel. Installer une imprimante multifonction HP PSC 1315 sous Linux. TUTORIEL Starinux Imprimante multifonction HP PSC 1315

Informations sur l utilisation du webmail du CNRS. Webmail du CNRS. Manuel Utilisateur

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Session 8: Android File System

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Guide d installation logicielle

UE C avancé cours 1: introduction et révisions

Les débordements de tampons et les vulnérabilités de chaîne de format 1

TP1 : Initiation à Java et Eclipse

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Note Technique : Sauvegarder un NAS ND16000 ou ND26000 sur un disque dur externe USB ou esata

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Installation et prise en main

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Premiers Pas en Programmation Objet : les Classes et les Objets

Exécutif temps réel Pierre-Yves Duval (cppm)

Guide d installation de Java et des pilotes de lecture des supports

Particularité supplémentaire à ajouter avec Internet Explorer

Il est courant de souhaiter conserver à

IFT Systèmes d exploitation - TP n 1-20%

IV- Comment fonctionne un ordinateur?

Les structures de données. Rajae El Ouazzani

UE Programmation Impérative Licence 2ème Année

Analyse de sécurité de logiciels système par typage statique

Systèmes d exploitation

Programmation C. Apprendre à développer des programmes simples dans le langage C

Les chaînes de caractères

Guide d installation des licences Solid Edge-NB RB

Mode d emploi pour lire des livres numériques

Canevas théoriques du projet sur le poker Partie A

Projet audio. Analyse des Signaux ELE2700

Cours d initiation à la programmation en C++ Johann Cuenin

Chapitre VI- La validation de la composition.

Mise en place d un projet VDI

Projet gestion d'objets dupliqués

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Cours Programmation Système

Compression de Données - Algorithme de Huffman Document de Conception

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Utilisation d objets : String et ArrayList

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Utilisation de la Kinect

Cours 1: Java et les objets

LOG4430 : Architecture et conception avancée

Introduction au langage C

Je participe à la société branchée

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

L informatique en BCPST

Summary / Sommaire. 1 Install DRIVER SR2 USB01 Windows seven 64 bits / Installation du DRIVER SR2 USB01 Windows seven 64 bits 2

Les structures. Chapitre 3

Introduction à la programmation concurrente

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Vos outils CNED COPIES EN LIGNE GUIDE DE PRISE EN MAIN DU CORRECTEUR. 8 CODA GA WB 01 13

Utilisation et création de la clé USB OSCAR

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Vous allez le voir au cours de ce premier chapitre, 1. Découvrir l ipad

PG208, Projet n 3 : Serveur HTTP évolué

Le système de gestion de version Git et GitHub

PRECAUTIONS DESCRIPTION DU PRODUIT

Rappels Entrées -Sorties

Guide d utilisation de la clé mémoire USB

OS Réseaux et Programmation Système - C5

Le système de gestion des fichiers, les entrées/sorties.

Bases de programmation. Cours 5. Structurer les données

Formations Evolix Catalogue

Cours de Systèmes d Exploitation

Mettre à jour son ordinateur vers Windows 7

Le prototype de la fonction main()

ÉCOLE POLYTECHNIQUE DE MONTRÉAL. Département de Génie Électrique. La technologie de TEXAS INSTRUMENTS DSP pour le cours Analyse des Signaux ELE2700

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

Architecture des ordinateurs

Temps Réel. Jérôme Pouiller Septembre 2011

Conventions d écriture et outils de mise au point

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Menu Fédérateur. Procédure de réinstallation du logiciel EIC Menu Fédérateur d un ancien poste vers un nouveau poste

ACTIVITÉ DE PROGRAMMATION

TP réseaux 4 : Installation et configuration d'un serveur Web Apache

Construire des plug-ins pour SAS Management Console SAS 9.1

Programmation système de commandes en C

Guide d installation des pilotes MF

TP3 : Manipulation et implantation de systèmes de fichiers 1

Comment se connecter au dossier partagé?

Cahier n o 6. Mon ordinateur. Fichiers et dossiers Sauvegarde et classement

Formation Informatique. Utiliser les périphériques informatiques

TRANSFERT DES STANDARDS DANS SOLID 9

Transcription:

Département de génie électrique ELE784 - Ordinateurs et programmation système Laboratoire #2 Développement d un pilote pour une caméra USB sous Linux Partie 3 Description sommaire : Dans ce laboratoire, séparé en trois parties, il vous sera demandez de coder un pilote pour une caméra USB répondant au standard UVC. Dans un premier temps, le squelette du module sera mis en place. Par la suite, certaines fonctions types d un module USB seront ajoutées et finalement le cœur du module sera codé dans la troisième partie. Le résultat final sera un module capable d envoyer des commandes de base à une caméra et un programme écrit en C utilisé pour communiquer avec ce module. Vous serez donc en mesure d obtenir des images de la caméra et ces images seront utilisées dans le cadre du laboratoire #3 afin de mettre en évidence l interaction matériel-logiciel. Professeur : Bruno De Kelper Chargé de laboratoire : Louis-Bernard Lagueux

Objectif... 3 Introduction... 4 La fonction «probe»... 4 La fonction «IOCTL_GRAB»... 4 La fonction Callback pour les URB... 5 La fonction read... 6 Le programme de test... 6 2

Objectif Le but ultime de la série de laboratoire de ce cours est de vous faire configurer un système informatique avec un noyau Linux, d y charger un module (pilote) que vous aurez développé pour contrôler une caméra USB et d utiliser les images générées par cette dernière afin d effectuer certains tests sur le processeur. De cette manière, il vous sera possible d étudier la structure fonctionnelle d un ordinateur et ses différentes composantes avec un intérêt majeur sur l interaction matériel-logiciel 1 (ceci est l un des objectifs principales du cours ELE784). L ensemble du laboratoire sera divisé en trois parties: 1. Développement des composantes logicielles de base d un système informatique. C est dans cette partie que vous allez configurer le système informatique avec le noyau Linux et avec certains outils couramment utilisés. 2. Développement d un pilote pour contrôler une caméra USB sous Linux 3. Traitement des données obtenues avec la caméra pour démontrer l importance de l interaction matériel-logiciel dans un système informatique. Les objectifs du laboratoire #2 sont les suivants : Se familiariser avec la notion de module et de pilote sous Linux Se familiariser avec les différentes commandes utilisées pour travailler avec les modules sous Linux Se familiariser avec les différentes sections dans le code d un module Se familiariser avec la notion de synchronisation dans un pilote Se familiariser avec le transfert de données entre le «user space» et le «kernel space» 1 Adaptation du sommaire du cours que l ont trouve sur le site du département de génie électrique 3

Introduction Dans la première partie du laboratoire il vous a été demandé de coder un pilote de type caractère simple. Par la suite, dans la deuxième partie, vous avez ajouté la couche USB ainsi que quelques fonctions de base servant à contrôler l objectif de la caméra. Dans la troisième partie, vous devrez ajouter la fonction nécessaires pour récupérer des images de la caméra. Ceci complétera le pilote. La fonction «probe» Comme indiqué dans le livre de référence 2, un périphérique peut avoir plusieurs interfaces. De plus, chaque interface peut avoir plusieurs configurations possibles. Nous devrons donc sélectionner correctement la configuration qui nous intéresse afin que notre pilote fonctionne correctement. Pour ce faire, il faut ajouter, à la suite des commandes normales de la fonction probe, la commande usb_set_interface comme suit: interface_to_usbdev( ) usb_get_dev( ) usb_set_intfdata( ) usb_register_dev( ) usb_set_interface(dev, 1, 4); Ceci effectuera la sélection de la configuration #4 de l interface #1. Le choix de cette configuration n est pas arbitraire, il a été trouvé en effectuant du reverse engineering sur le code du module uvc officiel de Linux. De plus, sachez que ce choix est fonction de la grandeur de l image que nous voulons obtenir. Si nous aurions voulue une image de plus grande dimension, une configuration différente aurait été choisie. La fonction «IOCTL_GRAB» En plus des commandes IOCTL déjà implémentées dans votre pilote, vous devrez ajouter la commande suivante : IOCTL_GRAB 0x50 La commande IOCTL_GRAB devra initialiser 5 URB différents qui seront envoyés pour récupérer les données de la caméra. Étant donné que nous voulons utiliser le mode isochronous pour communiquer, nous n avons pas de fonction comme usb_control_msg( ) pour nous aider à effectuer cette étape. Nous devrons donc effectuer cette initialisation à la main. Afin de faciliter la création de cette commande, voici ce que devrait avoir l air l initialisation des URB. Partout où vous voyez «/** */» dans le code, vous devez ajouter des arguments. Faite des recherches dans le livre de référence 3 ou sur Internet pour avoir plus d information sur les arguments à utiliser pour initialiser les URB. Cette partie de code se trouve dans le fichier initurb.c dans le répertoire /home/document sur l ordinateur de compilation. cur_altsetting = intf->cur_altsetting; endpointdesc = cur_altsetting->endpoint[0].desc; 2 Linux Device Drivers, Third Edition, chapitre 13 page 331 3 Linux Device Drivers, Third Edition, chapitre 13 toutes les pages! 4

nbpackets = 40; // The number of isochronous packets this urb should contain mypacketsize = le16_to_cpu(endpointdesc.wmaxpacketsize); size = mypacketsize * nbpackets; nburbs = 5; for (i = 0; i < nburbs; i++) { usb_free_urb(/**... */); // Pour être certain myurb[i] = usb_alloc_urb(/**... */); if (myurb[i] == NULL) { //printk(kern_warning ""); return -ENOMEM; myurb[i]->transfer_buffer = usb_buffer_alloc(/**... */); if (myurb[i]->transfer_buffer == NULL) { //printk(kern_warning ""); usb_free_urb(myurb[i]); return -ENOMEM; myurb[i]->dev = /**... */; myurb[i]->context = dev; myurb[i]->pipe = usb_rcvisocpipe(dev, endpointdesc.bendpointaddress); myurb[i]->transfer_flags = URB_ISO_ASAP URB_NO_TRANSFER_DMA_MAP; myurb[i]->interval = endpointdesc.binterval; myurb[i]->complete = /**... */; myurb[i]->number_of_packets = /**... */; myurb[i]->transfer_buffer_length = /**... */; for (j = 0; j < nbpackets; ++j) { myurb[i]->iso_frame_desc[j].offset = j * mypacketsize; myurb[i]->iso_frame_desc[j].length = mypacketsize; for(i = 0; i < nburbs; i++){ if ((ret = usb_submit_urb(/**... */)) < 0) { //printk(kern_warning ""); return ret; Bien que ce code forme 95 % de la commande, certaines lignes devront être ajoutées afin que le pilote fonctionne convenablement. Continuer la lecture pour avoir plus d information sur ce sujet. La fonction Callback pour les URB Comme indiqué dans le livre de référence 4, un URB nécessite une fonction qui sera appelée lorsque la tâche de ce dernier sera terminée. Dans notre cas, les étapes effectuées par cette fonction sont légèrement compliquées. Pour cette raison, le code de cette fonction vous sera fourni. Vous pouvez le trouver dans le fichier callback.c dans le répertoire /home/document sur l ordinateur de compilation. Par contre, vous devrez ajouter la partie de code nécessaire pour indiquer que vous avez bel et bien reçue toutes les données et que la fonction read peut retourner le résultat obtenu au programme de test. L endroit où vous devez ajouter cette partie de code est clairement indiqué dans le fichier callback.c. La méthode suggérée pour synchroniser la fonction read de votre pilote avec la fonction callback est l interface completion. Vous pouvez obtenir plus d information sur cette interface dans le livre de référence 5. De plus veillez noter que certaines 4 Linux Device Drivers, Third Edition, chapitre 13 page 339 5 Linux Device Drivers, Third Edition, chapitre 5 page 115 5

variables sont utilisées dans cette fonction et sont propre à votre pilote. Vous devez donc les créer et les initialiser. Voici la liste de ces variables : Variable Type Note mystatus unsigned int Doit être initialisé à 0 avant la création des URB mylength unsigned int Ne change jamais et égale à 42666 mylengthused unsigned int Doit être initialisé à 0 avant la création des URB mydata char Tableau de longueur mylength La fonction read La fonction read de votre pilote est utilisée pour retourner les données récupérées sur la caméra à votre programme de test. Cette fonction est relativement simple et ne devrait pas vous poser de problème. Voici les étapes de cette fonction : 1. Récupérer la référence à votre structure usb_device normalement contenue dans le pointeur file->private_data. 2. Attendre que la fonction callback nous indique que tous les URB ont terminés leur tâche avec l interface completion. 3. Copier les données au programme de test de façon sécuritaire. 4. Sur chaque URB envoyé par votre pilote, effectuer les fonctions suivantes : a. usb_kill_urb( ) sur le URB courant b. usb_buffer_free( ) sur le transfer_buffer du URB courant c. usb_free_urb( )sur le URB courant 5. retourner le nombre de données transférées. Le programme de test Dans votre programme de test, vous devrez utiliser la nouvelle commande IOCTL_GRAB de votre pilote pour lancer l acquisition d une image. Les étapes pour obtenir une image sont les suivantes : 1. ouvrir le fichier dans lequel vous enregistrerez l image 2. Effectuer la commande IOCTL_STREAMON 3. Effectuer la commande IOCTL_GRAB 4. Utiliser la commande read du pilote pour récupérer les données de l image 5. Effectuer la commande IOCTL_STREAMOFF 6. Effectuer les modifications sur les données (voir exemple plus bas) 7. Écrire le résultat final dans le fichier ouvert à l étape #1 8. Fermer le fichier ouvert à l étape #1 Afin de faciliter cette étape, voici ce que devrait avoir l air cette partie de code (les étapes 2, 3, 4 et 5 ont été supprimées, vous devez ajouter par vous-même ces parties de code). Notez que vous trouverez la définition des variables HEADERFRAME1, DHT_SIZE et dht_data dans le fichier dht_data.h situé dans le répertoire /home/document de l ordinateur de compilation. De plus, sachez que la variable mysize est égale au nombre de données qui a été retourné par la fonction read du pilote. Finalement, le tampon inbuffer est utilisé pour sauvegarder les données retournées par cette même fonction. FILE *foutput; unsigned char * inbuffer; 6

unsigned char * finalbuf; inbuffer = malloc((42666)* sizeof(unsigned char)); finalbuf = malloc((42666 * 2)* sizeof(unsigned char)); if((inbuffer == NULL) (finalbuf == NULL)){ return -1; foutput = fopen("/lien/vers/fichier.jpg", "wb"); if(foutput!= NULL){ // Etape #2 // Etape #3 // Etape #4 // Etape #5 memcpy (finalbuf, inbuffer, HEADERFRAME1); memcpy (finalbuf + HEADERFRAME1, dht_data, DHT_SIZE); memcpy (finalbuf + HEADERFRAME1 + DHT_SIZE, inbuffer + HEADERFRAME1, (mysize - HEADERFRAME1)); fwrite (finalbuf, mysize + DHT_SIZE, 1, foutput); fclose(foutput); 7