IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration système Discussion :

Driver - Programmation Bas niveau


Sujet :

Administration système

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut Driver - Programmation Bas niveau
    Bonjour,
    J'écris actuellement une application pour une carte Axis composée :
    - d'un processeur Etrax 100 , Linux embarqué
    - d'un circuit programmable (FPGA)
    - d'une FIFO

    Mon application consiste en la mise en oeuvre d'un transfert DMA entre la FIFO et une mémoire qui se trouve également sur la carte.
    J'utilise donc un pilote DMA, dans lequel sont définies plusieurs file_operations : dma_open, dma_release, dma_read, dma_write, dma_poll, etc...
    Dans mon application, j'appelle donc la fonction read ; cette fonction, losqu'elle est appelée, endort le processus, et attend d'être réveillée par une requête DMA pour se réveiller et lire effectivement les données

    Il y a pour cela dans le pilote une fonction rx_interrupt() , qui est censée être appelée dès que la FIFO commence à se remplir... en gros, quand la FIFO est remplie à un certain seuil, elle émet une requête DMA au processeur, et le processeur doit alors appeler la fonction rx_interrupt, qui réveille la fonction read, et la fonction read lit alors les données.

    Mon problème est le suivant : comment "expliquer" au processeur que lorsqu'il reçoit le signal physique correspondant à la requête DMA, il doit alors appeller la fonction rx_interrupt() .......
    Ca serait tres gentil si on pouvait me filer un coup de main...

  2. #2
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Salut,

    Je suis loin d'etre un pro des drivers linux, j'en ai fais un pour l'école il'y a 2 ans et c'était un driver pour carte ISA. Bref j'ai pas réellement compris ce que tu veux que l'on t'explique ? Tu veux récupérer l'interruption généré par ta carte ?

  3. #3
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Bon voila ce que j'ai trouvé pour les interruptions ISA je suppose que c'est plus compliqué en DMA.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /*attribution des interruptions */
    result = request_irq(5,gestionnaire,SA_INTERRUPT,"Decor", NULL);
        if (result) 
            printk(KERN_INFO "decor: Ne peut traiter l'interruption 5\n");
    Donc l'interruption IRQ 5 est associé a une fonction nommé gestionnaire. SA_INTERRUPT, je crois que c'est le type d'interruption et "Decor" c'est le nom que je lui donne a cette interruption.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    freak@Qouark /opt/coloration $ cat /proc/interrupts
              CPU0
      0:    6630946          XT-PIC  timer
      1:      37538          XT-PIC  i8042
      2:          0          XT-PIC  cascade
      5:    2158704          XT-PIC  EMU10K1
      9:          0          XT-PIC  acpi
     10:    2252832          XT-PIC  fglrx
     11:    1484240          XT-PIC  ohci_hcd:usb1, ohci_hcd:usb2, ra0
     12:    1486838          XT-PIC  i8042
     14:     145954          XT-PIC  ide0
     15:     470786          XT-PIC  ide1
    NMI:          0
    ERR:          0
    si j'avais eut la carte ISA j'aurais eut

    où 5 indique le numéro de l'interruption 0 le nombre d'interruption déclenché XT-PIC je ne sais pas depuis le 2.6 et enfin le nom que j'ai donné a l'interruption.

    sinon il te reste le pdf du oreilly traitant des drivers sous linux
    Linux Device Drivers, Third Edition

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    Excellent c'est nickel, ca me met vraiment sur la piste, parce qu'en farfouillant j'ai vu des choses équivalentes y a quelques temps, genre une fonction
    request_dma() et d'autres ds le genre, ds un fichier dma.h
    merci bcp

  5. #5
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 55
    Par défaut
    En fait, je suis embetté, je m'en sors pas
    J'ai trouvé dans un fichier include/asm/dma.h une méthode request_dma()
    qui est implémentée dans kernel/dma.c

    là voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int request_dma(unsigned int dmanr, const char * device_id)
    {
    	if (dmanr >= MAX_DMA_CHANNELS)
    		return -EINVAL;
     
    	if (xchg(&dma_chan_busy[dmanr].lock, 1) != 0)
    		return -EBUSY;
     
    	dma_chan_busy[dmanr].device_id = device_id;
     
    	/* old flag was 0, now contains 1 to indicate busy */
    	return 0;
    } /* request_dma */
    si je comprends bien, l'argument dmanr correspond au numéro du canal que je veux réserver, et device_id... à l'adresse du périphérique?
    en tout cas j'aurais vraiment aimé avoir un argument correspondant à la "routine d'interruption", c'est à dire là où je mettrai l'adresse de ma fonction rx_interrupt()
    ma fonction rx_interrupt() est la suivante , je rappelle qu'elle est définie dans le pilote
    si t'as une idée, je suis très preneur
    merci d'avance



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    static void rx_interrupt(int irq, void *dev_id, struct pt_regs * regs)
    {
    	etrax_dma_descr* dma_d;
    	unsigned long ireg = *R_IRQ_MASK2_RD;
    	int i;
     
    	DIRQ(printk("RX IRQ\n"));
     
    	for (i = 0; i < NBR_OF_PORTS; i++)
    	{
    		ext_dma_port* port = &ports[i];
    		if (ireg & (1 << port->input_dma_descr_bit))
    		{
    			dma_d = (etrax_dma_descr*)phys_to_virt(*port->input_dma_descr);
    			if (!dma_d)
    				dma_d = port->prev_in_descr;
     
    			while (port->next_in_descr != dma_d) {
    				port->writep += TRANSFER_SIZE;
    				port->next_in_descr = phys_to_virt(port->next_in_descr->next);
    			}
    			wake_up_interruptible(&port->in_wait_q);
    			*port->output_dma_clr_irq = IO_STATE(R_DMA_CH0_CLR_INTR, clr_descr, do);
    		}
    	}
     
    }

  6. #6
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Alors la mon doute s'est réveillé DMA Direct Memory Access c'est une méthode pour accéder a la mémoire. Maintenant ta carte est soit PCI ou ISA. Je ne pense pas que le DMA existe en USB

    Si c'est une interruption PCI
    page 17

Discussions similaires

  1. Programme d'étude sur le C++ bas niveau
    Par Bousk dans le forum C++
    Réponses: 24
    Dernier message: 21/12/2014, 20h23
  2. Terra : le nouveau langage de programmation bas niveau sort
    Par Cedric Chevalier dans le forum Autres langages
    Réponses: 1
    Dernier message: 24/05/2013, 12h43
  3. C et programmation bas niveau
    Par ledawa dans le forum Windows
    Réponses: 4
    Dernier message: 24/09/2007, 20h45
  4. Programmation bas niveau de la carte vidéo !!
    Par Invité dans le forum Assembleur
    Réponses: 3
    Dernier message: 03/03/2005, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo