Hallo, mir zerspringt wieder die Birne... Also, ich möchte DDR2 auslesen und die Daten dann Byte-weise in eine FSL stecken. Jetzt ist die Frage, lasse ich mir die Daten über PLB von xps-DMA übergeben, oder soll ich sie selber mittels PIM vom DDR2 holen? Irgendwie scheint mir DMA die sauberere Methode zu sein. Nur wie ist das, wenn meine FSL nun voll ist, und ich somit keine DMA Daten mehr annehmen kann? DMA hat zwar eine kleine FIFO, aber wartet der auch wirklich bis ich fertig bin, oder fallen dann Daten unter den Tisch, wenn ich nicht schnell genug bin? Braucht mein Custom IP wirklich Burst unterstützung für DMA? Ich bin für jeden Kommentar oder Gedanken dankbar.
Wenn ich das richtig verstanden habe, sind doch FSL und DMA over PLB zwei verschiedene Paar Schuhe. Wenn die Daten nicht zwingend per FSL in den Prozessor kommen müssen, wäre ein DDR2-Memorycontroller (der am PLB hängt) das einfachste. Wenn der Daten-Cache im Prozessor aktiviert wird, dürfte auch die Datenrate akzeptabel sein. Duke
Doch, in meinem Design ist es schöner, wenn die Daten per FSL in den Prozessor kommen. Egal, ich habe noch ein paar Fragen zu DMA: 1.) Kann ich irgendwie den DMA-Aufruf puffern. Sprich, gibt es eine Daten-In-FIFO?
1 | Dma_Transfer( pointer_1, length_1); |
2 | Dma_Transfer( pointer_2, length_2); |
Geht das, ohne zu warten, ob Transfer_1 fertig ist? 2.) Die PLB_DWidth ist ja 32b, also 4 Byte = 1 word. Der Aufruf Dma_Transfer nimmt als Parameter den Pointer und die Länge des Objekt in Byte(!). Was passiert wenn die Länge kein volles Wort ergibt? Bsp. length = 5. Wird dann im PLB Byte-Enable eingesetzt?
olpo schrieb: > 1.) Kann ich irgendwie den DMA-Aufruf puffern. Sprich, gibt es eine > Daten-In-FIFO? ??? Mir scheint, Dir ist noch nicht ganz klar, wie das mit dem DMA überhaupt funktioniert. Der DMA-Controller ist ein Busmaster, der im Prinzip ein schnelles memcpy macht. Du kannst natrürlich auch mehrere Master einsetzen. Oder einen der mehrere Channel unterstüzt. Wenn die alle auf dem selben Bus hantieren, bremsen die sich aber gegenseitig aus. > 2.) Die PLB_DWidth ist ja 32b, also 4 Byte = 1 word. Der Aufruf > Dma_Transfer nimmt als Parameter den Pointer und die Länge des Objekt in > Byte(!). Was passiert wenn die Länge kein volles Wort ergibt? Bsp. > length = 5. Wird dann im PLB Byte-Enable eingesetzt? Vermutlich. Über den Bus wandern aber so oder so 8 Byte. Im Zweifelsfall simuliert man das und guckt nach. Duke
Nochmal zu 1.) Es geht darum, daß ich eine Datenkette habe.
1 | struct pbuf{ |
2 | (void *) pointer; |
3 | (void *) length; |
4 | pbuf next; |
Und hatte jetzt gehofft, die gesammte Kette auf einmal aufzurufen.
1 | while (pbuf has_next()){ |
2 | Dma_Transfer( pointer, length); |
3 | pbuf = pbuf->next; |
4 | } |
Will ich nicht, daß Dma_Transfer(...) Aufrufe ständig die DMA-Register überschreiben, bräuchte ich so'ne Art Aufruf-FIFO. Geht sowas? Ansonsten müsste ich immer wieder nachfragen:
1 | while (pbuf has_next()){ |
2 | Dma_Transfer( pointer, length); |
3 | do { |
4 | /* |
5 | * Poll DMA status register. |
6 | */ |
7 | RegValue = XDmaCentral_GetStatus(InstancePtr); |
8 | } |
9 | while ((RegValue & XDMC_DMASR_BUSY_MASK) == XDMC_DMASR_BUSY_MASK); |
10 | pbuf = pbuf->next; |
11 | } |
olpo schrieb: > Und hatte jetzt gehofft, die gesammte Kette auf einmal aufzurufen. Das nennt sich Scatter-Gather-DMA. Das muß der verwendete DMA Controller unterstützen. Duke
Duke Scarring schrieb: > olpo schrieb: >> Und hatte jetzt gehofft, die gesammte Kette auf einmal aufzurufen. > Das nennt sich Scatter-Gather-DMA. Das muß der verwendete DMA Controller > unterstützen. > > Duke Der MPMC kann das zumindest. Allerdings wird der FSL die ganze Sache ausbremsen. Soweit ich weiß, ist der nicht DMA fähig. Wir wollten damals auch eine eigene Peripherie an den MPMC anschließen, das geht nur über NPI oder LocalLink.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.