USB CDC (serial) and USB MSC (strage) Composite Device. http://mbed.org/users/okini3939/notebook/USB_Device/

Dependencies:   ChaNFSSD mbed ChaNFS

Revision:
1:bb08a84162b7
Parent:
0:9b1d17d54055
Child:
2:5db90410bb90
--- 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);
+            }
         }
     }
 }