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

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Tor Okt 21, 2008 3:36 pm Naslov sporočila: USB[Mass storage] z SD Kartico |
|
|
Pozdravljeni,
Zadnjih nekaj dni se ukvarjam z združitvijo Keil-ovih primerov za USB[Mass Storage] in SD kartico.
Rad bi naredil funkcionalnost podobno USB ključu, kjer naj bi bilo možno dostopati do SD kartice preko USB-ja, ter tako pobirati podatke kreirane v aplikaciji (ta del že deluje v FAT32 sistemu in SD Card Reader vsebino prebere).
Vem, da je potrebno USB[Mass Storage] primer spremeniti, in sicer:
- MSC_MemoryRead
- MSC_MemoryWrite
- MSC_MemoryVerify
- MSC_Inquiry
Aja pozabil povedati za imam Keilov File System Lib.
Poiskusil sem z branjem SD kartice s pomočjo "mci_read_sect" ter pisanjem na ram, vendar ta naveza mi nekako ne dela.
FS_ARM_L.lib sem dal na IRAM2 [0x7FD00000] kot velevajo na Keilovi strani.
Koda: |
/*
* MSC Memory Read Callback
* Called automatically on Memory Read Event
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_MemoryRead (void) {
DWORD n;
if (Length > MSC_MAX_PACKET) {
n = MSC_MAX_PACKET;
} else {
n = Length;
}
//******************************************************
Flash_FreeMemorySize = ffree(""); // check SD card free space
if ((Offset + n) > Flash_FreeMemorySize) { // check if received data can
n = Flash_FreeMemorySize - Offset; // be stored on SD card
BulkStage = MSC_BS_DATA_IN_LAST_STALL; // if not STALL DATA IN EP
}
mci_read_sect((Offset%MSC_BlockSize),Memory,2); // Read Block from SD card to RAM
RAM_Offset = Offset - ((Offset%MSC_BlockSize)*512); // Offset from current block
USB_WriteEP(MSC_EP_IN, &Memory[RAM_Offset], n); // Write from USB to RAM
mci_write_sect((Offset%MSC_BlockSize),(Memory),2); // Write from RAM to SD Card
//********************************************************
Offset += n;
Length -= n;
CSW.dDataResidue -= n;
if (Length == 0) {
BulkStage = MSC_BS_DATA_IN_LAST;
}
if (BulkStage != MSC_BS_DATA_IN) {
CSW.bStatus = CSW_CMD_PASSED;
}
} |
Vnaprej hvala za pomoč. |
|
Nazaj na vrh |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Sre Okt 22, 2008 12:47 pm Naslov sporočila: |
|
|
kot kaže je problem v DMA.
Koda: |
/*
* MSC Memory Read Callback
* Called automatically on Memory Read Event
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_MemoryRead (void) {
DWORD n;
BOOL rtvl;
MMCFG mmcfg;
if (Length > MSC_MAX_PACKET) {
n = MSC_MAX_PACKET;
} else {
n = Length;
}
///* MMC device configuration */
//typedef struct mmcfg {
// U32 sernum;
// U32 blocknr;
// U16 read_blen;
// U16 write_blen;
//} MMCFG;
rtvl = mci_read_config(&mmcfg); // check if memory card configuration is done
#ifdef DIAGO_SERIAL
printf("\n\n\n\n\n\n\n\n\n");
printf("\n\n\rMemory Read: mci_read_config = %d",rtvl);
printf("\n\r-------- Serial Num: 0x%08x",mmcfg.sernum);
printf("\n\r-------- Block Num : 0x%08x",mmcfg.blocknr);
printf("\n\r-------- read_blen : 0x%08x",mmcfg.read_blen);
printf("\n\r-------- write_blen: 0x%08x\n",mmcfg.write_blen);
#endif
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Flash_FreeMemorySize = ffree(""); // check SD card free space
//******************************************************
#ifdef DIAGO_SERIAL
printf("\n\rMemory Read: Free space %10d bytes\r",Flash_FreeMemorySize);
printf("\n\rMCI_STATUS = 0x%08x",MCI_STATUS);
#endif
//******************************************************
if ((Offset + n) > Flash_FreeMemorySize) { // check if received data can
n = Flash_FreeMemorySize - Offset; // be stored on SD card
BulkStage = MSC_BS_DATA_IN_LAST_STALL; // if not STALL DATA IN EP
}
SD_sector = (Offset - (Offset%MSC_BlockSize))/MSC_BlockSize;
rtvl = mci_read_sect(SD_sector,&Memory[0],2); // Read Block from SD card to RAM
//******************************************************
#ifdef DIAGO_SERIAL
printf("\n\rMemory Read: read sector %d from SD to RAM was %d",SD_sector,rtvl);
printf("\n\rMCI_STATUS = 0x%08x",MCI_STATUS);
#endif
//******************************************************
RAM_Offset = Offset - (SD_sector * MSC_BlockSize); // Offset from current block
//******************************************************
#ifdef DIAGO_SERIAL
printf("\n\n\rMemory Read: Offset = %d; Ram Offset = %d",Offset,RAM_Offset);
printf("\n\rMCI_STATUS = 0x%08x",MCI_STATUS);
#endif
//******************************************************
USB_WriteEP(MSC_EP_IN, &Memory[RAM_Offset], n); // Write from USB to RAM
rtvl = mci_write_sect(SD_sector,&Memory[0],2); // Write from RAM to SD Card
//******************************************************
#ifdef DIAGO_SERIAL
printf("\n\n\rMemory Read: write sector %d from RAM to SD was %d\n\n",SD_sector,rtvl);
printf("\n\rMCI_STATUS = 0x%08x",MCI_STATUS);
#endif
//******************************************************
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// if ((Offset + n) > MSC_MemorySize) {
// n = MSC_MemorySize - Offset;
// BulkStage = MSC_BS_DATA_IN_LAST_STALL;
// }
//
// USB_WriteEP(MSC_EP_IN, &Memory[Offset], n);
Offset += n;
Length -= n;
CSW.dDataResidue -= n;
if (Length == 0) {
BulkStage = MSC_BS_DATA_IN_LAST;
}
if (BulkStage != MSC_BS_DATA_IN) {
CSW.bStatus = CSW_CMD_PASSED;
}
} |
Koda: |
/*--------------------------- mci_read_sect ---------------------------------*/
BOOL mci_read_sect (U32 sect, U8 *buf, U32 cnt) {
/* Read one or more 512 byte sectors from Flash Card. */
U32 i;
if (mci_wait_for_tran () == __FALSE) {
/* Card not in TRAN state. */
printf("\n------mci_read_sect() - error: Card not in TRAN state.\r");
return (__FALSE);
}
if (mci_cmd_read_block (sect, cnt) == __FALSE) {
/* Command Failed. */
printf("\n------mci_read_sect() - error: Command %d Failed.\r", cnt);
return (__FALSE);
}
/* Set MCI Transfer registers. */
MCI_DATA_TMR = DATA_RD_TOUT_VALUE;
MCI_DATA_LEN = cnt * 512;
/* Start DMA Peripheral to Memory transfer. */
mci_dma_start (DMA_READ, buf);
MCI_DATA_CTRL = 0x9B; //block size = 512
for (i = DMA_TOUT; i; i--) {
if (GPDMA_RAW_INT_TCSTAT & 0x01) {
/* Data transfer finished. */
break;
}
// printf("\n------mci_read_sect() - Data transfer finished.\r");
}
if (i == 0) {
/* DMA Transfer timeout. */
printf("\n------mci_read_sect() - error: DMA Transfer timeout\r");
return (__FALSE);
}
if (cnt > 1) {
/* Stop reading Multiple sectors. */
mci_send_stop ();
printf("\n------mci_read_sect() - Stop reading Multiple sectors.\r");
}
return (__TRUE);
} |
Saj stalno dobivam DMA Transfer timeout. Pravtako ob spremljanju MCI_STATUS registra se ob branju ali pisanju RX ali TX FIFO zapolni do konca in javlja "Overrun FIFO flag"
Primer izpisa:
Koda: |
Memory Read: mci_read_config = 1
-------- Serial Num: 0xa51af889
-------- Block Num : 0x001e0000
-------- read_blen : 0x00000400
-------- write_blen: 0x00000400
Memory Read: Free space 2012643328 bytes
MCI_STATUS = 0x00000500
------mci_read_sect() - error: DMA Transfer timeout
Memory Read: read sector 0 from SD to RAM was FALSE
MCI_STATUS = 0x0022a020
Memory Read: Offset = 448; Ram Offset = 448
MCI_STATUS = 0x0022a020 |
Kot sem bral forume, DMA deluje samo v USB RAM-u, kar pomeni, da moram polje v katerega pišem iz FIFO registra prestaviti na USB RAM lokacijo (0x7FD00000).
Tu pa nastane problem, ki sem ga v CARM-u reševal z _at_ v RV pa ne vem kako postaviti neko polje na določeno lokacijo. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70645.06
|
Objavljeno: Sre Okt 22, 2008 9:42 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Čet Okt 23, 2008 1:36 pm Naslov sporočila: |
|
|
MarE69 je napisal/a: |
Takole:
Koda: |
U8 Buffer[SIZE] __at(0x7FD00000); /* Block Buffer */ |
|
Hvala.
Sedaj je zadeva zaigrala, sicer ni bilo samo portiranje polja na pravi naslov vendar sedaj lahko rečem da sem si naredil USB ključek
Zdej pa gremo v nadaljni razvoj...
Moram najti rešitev, kako ob prenosu večjih datotek, bi še vedno ostali del kode se izvajal s tako hitrostjo da ne bo opazno s strani uporabnika.
Trenutno sedaj prižigam in ugašam led diodo na vsako sekundo in se ob prenosu, zaradi stalnih interuptov vidi da med prenosom zastanejo.
kot kaže bo potrebno razmisliti o RTOS-u... |
|
Nazaj na vrh |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Čet Okt 30, 2008 12:39 pm Naslov sporočila: |
|
|
Ima kdo izkušnje s composit devices.
Namreč zanima me če je kdo kot eno od funkcij v composit devices uporabljal CDC (Virtual COM).
Če je kak junak med vami, ki mu je to uspelo, bi prosim razložil, kako popraviti "description" CDC naprave, da po ta delal pravilno.
Kaj vem:
- composit naprava ne dovoli dveh "interface-ov" za eno od funkcij, zato moraš CDC, ki ima dva interface-a (Interrupt interface in Data interface) združiti v enega in temu dodeliti 3 "EndPointe" (Interrupt + 2 BULK)
To sem tudi naredil in definiral interface za CDC kot AMC (Abstract Modem communication)
Windows XP SP3, kjer sem to testiral, mi zazna tako composit device, kot Mass storage in VCom. Mass storage dela brezhibno, ampak VCOM pa ne pošilja ali sprejema podatkov.
Naj še povem, da sem oba "stack-a" preveri in testiral najprej posamezno in nato združil v enega. |
|
Nazaj na vrh |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Sob Nov 08, 2008 7:37 pm Naslov sporočila: |
|
|
No pa dela tudi "composit" napravo z CDC in Mass storage funkcijama.
Tale CDC je pa zvit moram reči, še posebej z Windows OS-i. Sicer pri Vista sistemu nisem imel težav, sem jih pa imel pri Windows XP SP2 in nižje.
Težava se pojavi, če želiš uporabljati usbser.sys za Virtual Com.
Sedaj najlažje je posodobiti na SP3 kjer so težavi z CDC-jem v "Composit" napravi odpravljene, saj prejšnje verzije usbser.sys (usbser.sys, v. 5.1.2600.2180) ne dovoli imeti dveh interface opisov za eno funkcijo.
Seveda Misrosoft to ve in popravi šele z SP3 (usbser.sys: 5.1.2600.5508, usbccgp.sys: 5.1.2600.5512). |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70645.06
|
Objavljeno: Čet Nov 13, 2008 2:29 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
commander29 Član

Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.21
|
Objavljeno: Tor Nov 18, 2008 1:37 pm Naslov sporočila: |
|
|
MarE69 je napisal/a: |
Koliko dela bi imel, če bi želel uporabiti SPI flash device namesto MMC ? Seveda tako, da je file system viden tako s PC-ja (MSC), kot iz internega RL-ARM FS? |
Ko bi imel enkrat narejeno:
- SPI_MemoryRead
- SPI_MemoryWrite
- SPI_MemoryVerify
- SPI_Inquiry
Mass storage device za to poskrbi z driverji (disk.sys, PartMgr.sys preko usbsnoop.sys in usbstor.sys). Interno pa je z uporabo RL-ARM FS Library moraš pač zagotoviti funkcije, ki jih boš uporabil in se nanašajo na sam HW popraviti in jih vstaviti v projekt.
Sam se dodal tele, ter jih priredil mojim potrebam (za predstavo):
- mci_init
- mci_set_speed
- mci_bus_mode
- mci_send_acmd
- mci_set_address
- mci_read_cid
- mci_select_card
- mci_set_bus_4bit
- mci_set_block_len
- mci_cmd_read_block
- mci_cmd_write_block
- mci_read_status
- mci_send_stop
- mci_wait_for_tran
- mci_command
- mci_dma_start
- mci_read_sect
- mci_write_sect
- mci_read_config
- time functions (fs_get_date in fs_get_time)
Časovno pa težko reči, lahko nekaj ur, lahko pa par dni, pa saj veste kako je, ko misliš da je vse v redu in stvar ne dela... |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70645.06
|
Objavljeno: Tor Nov 18, 2008 3:55 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
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
|