![](/media/cache/profiles/f095cedd23b99f1696fc8caecbcf257e.jpg.50x50_q85.jpg)
USB CDC (serial) and USB MSC (strage) Composite Device. http://mbed.org/users/okini3939/notebook/USB_Device/
Dependencies: ChaNFSSD mbed ChaNFS
Diff: main.cpp
- Revision:
- 1:bb08a84162b7
- Parent:
- 0:9b1d17d54055
- Child:
- 2:5db90410bb90
diff -r 9b1d17d54055 -r bb08a84162b7 main.cpp --- a/main.cpp Fri Dec 16 15:22:36 2011 +0000 +++ b/main.cpp Fri Dec 23 15:39:13 2011 +0000 @@ -1,17 +1,102 @@ #include "mbed.h" -#include "USBMSD_SD.h" +#include "USBCDCMSC.h" +#include "SDFileSystem.h" +#include <new> Serial pc(USBTX, USBRX); +SDFileSystem sd(p5, p6, p7, p8, "sd"); +USBCDCMSC cdcmsc(&sd); -USBMSD_SD usbmsd(p5, p6, p7, p8); +extern "C" +void HardFault_Handler() { + printf("Hard Fault!\n"); + exit(-1); +} + +void no_memory () { + printf("panic: can't allocate to memory!\r\n"); + exit(-1); +} + +void listdir (Stream *st) { +#if 0 + // probrem: readdir() Hard Fault + DIR *dir; + struct dirent *ent; + + if ((dir = opendir("/sd")) != NULL) { + st->printf("dir opened\r\n"); + while ((ent = readdir(dir)) != NULL) { + st->printf("%s\r\n", ent->d_name); + } + } else { + st->printf("dir open error\r\n"); + } + closedir(dir); +#else + // direct FatFs + FILINFO fno; + DIR_t dir; + char *fn; +#if _USE_LFN + static char lfn[_MAX_LFN + 1]; + fno.lfname = lfn; + fno.lfsize = sizeof(lfn); +#endif + + if (f_opendir(&dir, "") == FR_OK) { + for (;;) { + if (f_readdir(&dir, &fno) != FR_OK) break; + if (fno.fname[0] == 0) break; +#if _USE_LFN + fn = *fno.lfname ? fno.lfname : fno.fname; +#else + fn = fno.fname; +#endif + st->printf("%s\r\n", fn); + } + } +#endif +} + +void readfile (char *filename) { + FILE *fp = fopen(filename, "r"); + if (fp) { + int c; + pc.printf("file: "); + for (;;) { + c = fgetc(fp); + if (feof(fp)) break; + pc.printf("%c", c); + } + pc.printf("\r\n"); + fclose(fp); + } +} int main() { + int c; + + set_new_handler(no_memory); // new handler function + + readfile("/sd/test.txt"); + while(1) { - if (usbmsd.available()) { - pc.putc(usbmsd.getc()); + if (cdcmsc.available()) { + // CDC -> pc serial + c = cdcmsc.getc(); + pc.putc(c); + if (c == '?') { + listdir(&cdcmsc); + } } if (pc.readable()) { - usbmsd.putc(pc.getc()); + // PC serial -> CDC + c = pc.getc(); + cdcmsc.putc(c); + if (c == '?') { + listdir(&pc); + } } } }