 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
oversc0re Član

Pridružen-a: Tor 13 Sep 2005 15:20 Prispevkov: 460 Aktiv.: 1.94 Kraj: Radomlje
|
Objavljeno: Pet Jan 16, 2009 12:34 pm Naslov sporočila: LPC USB MSD DMA problem |
|
|
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
Torej... ima kdo kakšen namig, ali naj vržem puško v koruzo
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 |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Pon Jan 19, 2009 12:14 pm Naslov sporočila: |
|
|
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 |
|
 |
oversc0re Član

Pridružen-a: Tor 13 Sep 2005 15:20 Prispevkov: 460 Aktiv.: 1.94 Kraj: Radomlje
|
Objavljeno: Pon Jan 19, 2009 12:16 pm Naslov sporočila: |
|
|
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č 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 |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Pon Jan 19, 2009 1:36 pm Naslov sporočila: |
|
|
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č 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 |
|
 |
oversc0re Član

Pridružen-a: Tor 13 Sep 2005 15:20 Prispevkov: 460 Aktiv.: 1.94 Kraj: Radomlje
|
Objavljeno: Pon Jan 19, 2009 1:42 pm Naslov sporočila: |
|
|
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 |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Pon Jan 19, 2009 1:50 pm Naslov sporočila: |
|
|
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 |
|
 |
strobos Član

Pridružen-a: Sre 24 Sep 2003 12:19 Prispevkov: 726 Aktiv.: 3.06 Kraj: Brežice
|
Objavljeno: Pon Jan 19, 2009 7:58 pm Naslov sporočila: |
|
|
Kakšno hitrost prenosa preko USB si dosegel?
Lp |
|
Nazaj na vrh |
|
 |
oversc0re Član

Pridružen-a: Tor 13 Sep 2005 15:20 Prispevkov: 460 Aktiv.: 1.94 Kraj: Radomlje
|
Objavljeno: Tor Jan 20, 2009 11:25 am Naslov sporočila: |
|
|
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 |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Sre Jan 21, 2009 10:36 am Naslov sporočila: |
|
|
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 |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70644.93
|
Objavljeno: Sre Jan 21, 2009 11:47 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
oversc0re Član

Pridružen-a: Tor 13 Sep 2005 15:20 Prispevkov: 460 Aktiv.: 1.94 Kraj: Radomlje
|
Objavljeno: Sre Jan 21, 2009 11:50 am Naslov sporočila: |
|
|
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  _________________ 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 |
|
 |
|
|
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
|