www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

LPC USB MSD DMA problem

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
oversc0re
Član
Član



Pridružen-a: Tor 13 Sep 2005 15:20
Prispevkov: 460
Aktiv.: 1.94
Kraj: Radomlje

PrispevekObjavljeno: Pet Jan 16, 2009 12:34 pm    Naslov sporočila:  LPC USB MSD DMA problem Odgovori s citatom

Zdravo!

Že dobrih 14 dni glodam tale problem, pa se ne premaknem z mesta. Za osnovo sem vzel keilov example za MSD (lpc2368). Za bulk prenos uporablja endpoint 2. Izvedel sem inicializacijo DMA "by the book" (stvar je že implementirana, sem samo vse dodobra preveril) in spisal rutine za nastavitev data descriptorjev. Za začetek sem se lotil predelave OUT endpointa (PC->LPC), IN endpoint pa sem pustil brez DMA prenosa.

Stvar v principu deluje... Ob poslanem paketu iz PCja, se sproži NDDR (new data descriptor request) prekinitev. Nastavi se nov data descriptor (nastavim vedno po enega - sem poskusil tudi z večimi, a potem mi stvar ni več delovala), sproži se EOT (end of transfer) prekinitev, preberem SCSI ukaz in ga interpretiram.... Ko vtaknem kabel, se USB lepo enumerira, odpre se okno in vsebina medija se prikaže.
Ko pa želi PC napisat sektor na "kartico", dobim samo še ustrezen SCSI ukaz potem pa se DMA prekinitve enostavno ne dogajajo več vse do bus reset prekinitve, ki jo pošlje PC po timeoutu.
Preveril sem tudi dogajanje na USB vodilu na PCju (Snoopy) in PC dejansko postavi 512b (sektor) na vodilo, lpc pa ga enostavno ne sprejme.

Zanimivo je še, da se pisanje na določen sektor izvede tudi ko želim obstoječo datoteko odpreti za branje. Enako se zgodi tudi pri originalnem keilovem primeru brez mojih modifikacij, medtem ko se na klasičnem USB ključu pri branju ne zgodi nobeno pisanje. Ampak to niti ni tak problem, če bi pisanje delovalo Smile

Torej... ima kdo kakšen namig, ali naj vržem puško v koruzo Smile

Hvala in lp,
Matic

_________________
The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny ...'
Isaac Asimov (1920 - 1992)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
commander29
Član
Član



Pridružen-a: Pon 20 Nov 2006 15:24
Prispevkov: 47
Aktiv.: 0.21

PrispevekObjavljeno: Pon Jan 19, 2009 12:14 pm    Naslov sporočila:   Odgovori s citatom

Sem imel enake težave in sem stalno dobival DMA Transfer timeout.

DMA deluje samo v USB RAM-u, kar pomeni, da moraš polje v katerega pišeš iz FIFO registra prestaviti na USB RAM lokacijo (0x7FD00000).

Citiram:
U8 Buffer[SIZE] __at(0x7FD00000); /* Block Buffer */


več pa tukaj....

http://www.elektronik.si/phpBB2/viewtopic.php?t=13113
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
oversc0re
Član
Član



Pridružen-a: Tor 13 Sep 2005 15:20
Prispevkov: 460
Aktiv.: 1.94
Kraj: Radomlje

PrispevekObjavljeno: Pon Jan 19, 2009 12:16 pm    Naslov sporočila:   Odgovori s citatom

Hvala za odgovor, a žal imam UDCA, DDje in in-out buffer v USB ramu. Sem ravno v fazi brskanja po ramu, če bi se spotaknil ob kakšno napako, pa nič Sad Tebi potemtakem reč deluje?
_________________
The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny ...'
Isaac Asimov (1920 - 1992)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
commander29
Član
Član



Pridružen-a: Pon 20 Nov 2006 15:24
Prispevkov: 47
Aktiv.: 0.21

PrispevekObjavljeno: Pon Jan 19, 2009 1:36 pm    Naslov sporočila:   Odgovori s citatom

oversc0re je napisal/a:
Hvala za odgovor, a žal imam UDCA, DDje in in-out buffer v USB ramu. Sem ravno v fazi brskanja po ramu, če bi se spotaknil ob kakšno napako, pa nič Sad Tebi potemtakem reč deluje?


Deluje...tako sam Mass storage kot Composit device z CDC-jem v RTOS-u.

Dodati moram še File system za generiranje log datotek in aplikacija bo tako rekoč gotova.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
oversc0re
Član
Član



Pridružen-a: Tor 13 Sep 2005 15:20
Prispevkov: 460
Aktiv.: 1.94
Kraj: Radomlje

PrispevekObjavljeno: Pon Jan 19, 2009 1:42 pm    Naslov sporočila:   Odgovori s citatom

Pa si DMA-USB del napisal sam, ali si vzel kaj že delujočega?
_________________
The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny ...'
Isaac Asimov (1920 - 1992)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
commander29
Član
Član



Pridružen-a: Pon 20 Nov 2006 15:24
Prispevkov: 47
Aktiv.: 0.21

PrispevekObjavljeno: Pon Jan 19, 2009 1:50 pm    Naslov sporočila:   Odgovori s citatom

oversc0re je napisal/a:
Pa si DMA-USB del napisal sam, ali si vzel kaj že delujočega?


glej tukaj, kjer sem dodal souce kodo, sicer z debug komentarji, katere lahko po mili vojli vržeš ven. Sem pa vzel Keilov primer in ga spremenil potrebam primerno.

http://www.elektronik.si/phpBB2/viewtopic.php?t=13113

Koda:
static void mci_dma_start (U32 mode, U8 *buf) {
   /* Configure DMA controller Ch0 for read or write. */

   if (mode == DMA_READ) {
      /* Transfer from MCI-FIFO to memory. */
      GPDMA_CH0_SRC  = (U32)&MCI_FIFO;
      GPDMA_CH0_DEST = (U32)buf;
      /* The burst size set to 8, transfer size 512 bytes. */
      GPDMA_CH0_CTRL = (512 >> 2)   | (0x02 << 12) | (0x02 << 15) |
                       (0x02 << 18) | (0x02 << 21) | (1 << 27)    | (1u << 31);
      GPDMA_CH0_CFG  = 0x10001 | (0x04 << 1) | (0x00 << 6) | (0x06 << 11);
   }
   else {
      /* Transfer from memory to MCI-FIFO. */
      GPDMA_CH0_SRC  = (U32)buf;
      GPDMA_CH0_DEST = (U32)&MCI_FIFO;
      /* The burst size set to 8, transfer size 512 bytes. */
      GPDMA_CH0_CTRL = (512 >> 2)   | (0x02 << 12) | (0x02 << 15) |
                       (0x02 << 18) | (0x02 << 21) | (1 << 26)    | (1u << 31);
      GPDMA_CH0_CFG  = 0x10001 | (0x00 << 1) | (0x04 << 6) | (0x05 << 11);
   }
   /* Enable DMA channels, little endian */
   GPDMA_INT_TCCLR = 0x01;
   GPDMA_CONFIG    = 0x01;
}



Aja pa uporabljam LPC2378 kar sicer nebi smelo biti kaj drugače od LPC2368.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
strobos
Član
Član



Pridružen-a: Sre 24 Sep 2003 12:19
Prispevkov: 726
Aktiv.: 3.06
Kraj: Brežice

PrispevekObjavljeno: Pon Jan 19, 2009 7:58 pm    Naslov sporočila:   Odgovori s citatom

Kakšno hitrost prenosa preko USB si dosegel?

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
oversc0re
Član
Član



Pridružen-a: Tor 13 Sep 2005 15:20
Prispevkov: 460
Aktiv.: 1.94
Kraj: Radomlje

PrispevekObjavljeno: Tor Jan 20, 2009 11:25 am    Naslov sporočila:   Odgovori s citatom

Tale tvoj primer je GPDMA za MCI prenos, na USB pa najbrž pošiljaš s procesorjem (brez DMA) v funkcijah MSC_MemoryRead in MSC_MemoryWrite. Zanima pa tudi mene, kakšne hitrosti dosegaš pri MSD classu?
_________________
The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny ...'
Isaac Asimov (1920 - 1992)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
commander29
Član
Član



Pridružen-a: Pon 20 Nov 2006 15:24
Prispevkov: 47
Aktiv.: 0.21

PrispevekObjavljeno: Sre Jan 21, 2009 10:36 am    Naslov sporočila:   Odgovori s citatom

oversc0re je napisal/a:
Tale tvoj primer je GPDMA za MCI prenos, na USB pa najbrž pošiljaš s procesorjem (brez DMA) v funkcijah MSC_MemoryRead in MSC_MemoryWrite. Zanima pa tudi mene, kakšne hitrosti dosegaš pri MSD classu?


Sicer je prenos dokaj majhno cca 15kb/s a za moj sistem, kjer je MSD samo en od taskov in ne rabim velikih prenosov je to dovolj.

Za dosego večjih prenosov LPC2378 @48Mhz ni kaj prida, vsaj iz mojih izkušenj z njim, a so drugi lahko imeli drugačne izkušnje.

Je pa potrebno poudariti da 15kb/s dosegam z sistemom, ki ima Composit device (MSD + CDC), Grafični display, 2x motor controler, in kup drugih funkcij, ki imajo prioriteto pred MSD-jem.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70645.74

PrispevekObjavljeno: Sre Jan 21, 2009 11:47 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
oversc0re
Član
Član



Pridružen-a: Tor 13 Sep 2005 15:20
Prispevkov: 460
Aktiv.: 1.94
Kraj: Radomlje

PrispevekObjavljeno: Sre Jan 21, 2009 11:50 am    Naslov sporočila:   Odgovori s citatom

Glede na to, da gre brez kakršnega koli DMAja okoli 300k/s, bi verjel, da gre z DMAjem še mnogo hitreje.... Samo kaj, ko mi ne dela Wink
_________________
The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny ...'
Isaac Asimov (1920 - 1992)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 7 dni


Powered by phpBB © 2001, 2005 phpBB Group