|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 55 ![]() |
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... |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Consultant informatique Inscription : janvier 2006 Messages : 910 ![]() |
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 ?
__________________
Gentoo/FreeBSD l'amitié Linuxo-Unix |
|
|
00
|
|
|
#3 | ||||
|
Membre Expert
![]() Consultant informatique Inscription : janvier 2006 Messages : 910 ![]() |
Bon voila ce que j'ai trouvé pour les interruptions ISA je suppose que c'est plus compliqué en DMA.
Code :
Code :
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
__________________
Gentoo/FreeBSD l'amitié Linuxo-Unix |
||||
|
|
00
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 55 ![]() |
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 |
|
|
00
|
|
|
#5 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 55 ![]() |
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 :
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 :
|
||||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Consultant informatique Inscription : janvier 2006 Messages : 910 ![]() |
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
__________________
Gentoo/FreeBSD l'amitié Linuxo-Unix |
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 55 ![]() |
j'ai que le 2nd Edition
il est consultable sur le net le third edition ? ou alors faut l'acheter ? |
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 55 ![]() |
ah c'est bon, j'ai trouvé
merci |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Consultant informatique Inscription : janvier 2006 Messages : 910 ![]() |
Ta carte c'est bien une carte PCI ?
__________________
Gentoo/FreeBSD l'amitié Linuxo-Unix |
|
|
00
|
|
|
#10 | |
![]() ![]() Inscription : juin 2004 Messages : 5 850 ![]() |
Citation:
__________________
gege2061's blog |
|
|
00
|
|
|
#11 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 55 ![]() |
c ni une isa ni une pci
c pas une carte pour pc mais dis,est ce qu'il suffit pas tt simplement d'utiliser sigaction() pour associer mon signal à ma fonction rx_interrupt() ? le probleme qui se pose alors, c'est comment connaitre le numéro du signal de la requête DMA ? sachant que cette requête DMA, a été programmée physiquement par mon tuteur de stage (actuellement en vacances) pr se déclencher quand la fifo se remplit jusqu'à un certain seuil |
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() Consultant informatique Inscription : janvier 2006 Messages : 910 ![]() |
Citation:
DMA ca veux bien dire Direct Memory Access nan ? Citation:
C'est quoi ce périphérique ? c'est monté sur une architecture PC ? Un Chassis VME ?
__________________
Gentoo/FreeBSD l'amitié Linuxo-Unix |
||
|
|
00
|
|
|
#13 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 55 ![]() |
je ne passe pas par le processeur pour ce qui est du transfert de données en lui-même (qui se fait DIRECTement)
mais je passe quand même par le processeur pour lui envoyer une sorte d'interruption spéciale, un signal qui d'appres ma doc s'appelle DREQ (pour DMA Request) , et il me renvoie un signal DACK (pour DMA Acknowledge) ; à partir de là le transfert de données commence et le processeur n'intervient plus quant à la carte... je t'avoue que j'ai un peu de mal avec tout ce qui est hardware... en fait c apparemment une puce, qui contient processeur et mémoires ( http://developer.axis.com/products/mcm/index.html ) et cette meme puce se trouve sur une carte ( http://developer.axis.com/products/axis_82/index.html ) là je commence vraiment à bloquer, chais plus quelle piste explorer |
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Consultant informatique Inscription : janvier 2006 Messages : 910 ![]() |
OK, j'avais une mauvaise interprétation du mot "device".
La c'est une carte avec un linux embarqué. Citation:
ethernet vers série ? éthernet vers usb ?
__________________
Gentoo/FreeBSD l'amitié Linuxo-Unix |
|
|
|
00
|
|
|
#15 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 55 ![]() |
mon transfert de données se fait de la FIFO vers l'une des 2 mémoires dont est muni le processeur
peu importe ici le traitement qui en est fait par la suite (ethernet, port série, port usb ... ) le transfert qui m'intéresse ici se fait au sein même de la carte, entre la FIFO et le processeur, sur un bus de données appelé canal DMA, dont la largeur peut être configurée à 8, 16 ou 32 bits le rôle total de l'application pourrait se diviser en ces étapes : 1) Génération continue de données dans la FIFO, par une source externe 2) Quand la FIFO atteint un certain seuil de remplissage, elle envoie une requête DMA (signal DREQ) au processeur. 3) Le processeur renvoie un signal DACK, et "autorise" le transfert DMA à démarrer. Pour cela, il est nécessaire d'appeler une fonction rx_interrupt() définie dans mon driver. 4) Le processeur ne se soucie plus de rien et peut reprendre son activité pendant que le transfert DMA entre la fifo et la mémoire se fait. Dans tout ça, tout est OK, tout marche, sauf un seul truc : comment spécifier au processeur : "Quand tu reçois le signal DREQ , tu appelles la fonction rx_interrupt() " C'est le seul truc que j'arrive pas à faire. Si j'arrive à faire ça, c'est gagné. |
|
|
00
|
|
|
#16 | ||
|
Membre Expert
![]() Consultant informatique Inscription : janvier 2006 Messages : 910 ![]() |
Code :
http://www.nc-orc.lkams.kernel.org/p...ync_serial.c,v voila la page ou je l'ai trouvé havin' fun
__________________
Gentoo/FreeBSD l'amitié Linuxo-Unix |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com