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

Dependencies:   ChaNFSSD mbed ChaNFS

Committer:
okini3939
Date:
Fri Dec 23 15:39:13 2011 +0000
Revision:
1:bb08a84162b7
Parent:
0:9b1d17d54055
Child:
2:5db90410bb90

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:9b1d17d54055 1 #include "mbed.h"
okini3939 1:bb08a84162b7 2 #include "USBCDCMSC.h"
okini3939 1:bb08a84162b7 3 #include "SDFileSystem.h"
okini3939 1:bb08a84162b7 4 #include <new>
okini3939 0:9b1d17d54055 5
okini3939 0:9b1d17d54055 6 Serial pc(USBTX, USBRX);
okini3939 1:bb08a84162b7 7 SDFileSystem sd(p5, p6, p7, p8, "sd");
okini3939 1:bb08a84162b7 8 USBCDCMSC cdcmsc(&sd);
okini3939 0:9b1d17d54055 9
okini3939 1:bb08a84162b7 10 extern "C"
okini3939 1:bb08a84162b7 11 void HardFault_Handler() {
okini3939 1:bb08a84162b7 12 printf("Hard Fault!\n");
okini3939 1:bb08a84162b7 13 exit(-1);
okini3939 1:bb08a84162b7 14 }
okini3939 1:bb08a84162b7 15
okini3939 1:bb08a84162b7 16 void no_memory () {
okini3939 1:bb08a84162b7 17 printf("panic: can't allocate to memory!\r\n");
okini3939 1:bb08a84162b7 18 exit(-1);
okini3939 1:bb08a84162b7 19 }
okini3939 1:bb08a84162b7 20
okini3939 1:bb08a84162b7 21 void listdir (Stream *st) {
okini3939 1:bb08a84162b7 22 #if 0
okini3939 1:bb08a84162b7 23 // probrem: readdir() Hard Fault
okini3939 1:bb08a84162b7 24 DIR *dir;
okini3939 1:bb08a84162b7 25 struct dirent *ent;
okini3939 1:bb08a84162b7 26
okini3939 1:bb08a84162b7 27 if ((dir = opendir("/sd")) != NULL) {
okini3939 1:bb08a84162b7 28 st->printf("dir opened\r\n");
okini3939 1:bb08a84162b7 29 while ((ent = readdir(dir)) != NULL) {
okini3939 1:bb08a84162b7 30 st->printf("%s\r\n", ent->d_name);
okini3939 1:bb08a84162b7 31 }
okini3939 1:bb08a84162b7 32 } else {
okini3939 1:bb08a84162b7 33 st->printf("dir open error\r\n");
okini3939 1:bb08a84162b7 34 }
okini3939 1:bb08a84162b7 35 closedir(dir);
okini3939 1:bb08a84162b7 36 #else
okini3939 1:bb08a84162b7 37 // direct FatFs
okini3939 1:bb08a84162b7 38 FILINFO fno;
okini3939 1:bb08a84162b7 39 DIR_t dir;
okini3939 1:bb08a84162b7 40 char *fn;
okini3939 1:bb08a84162b7 41 #if _USE_LFN
okini3939 1:bb08a84162b7 42 static char lfn[_MAX_LFN + 1];
okini3939 1:bb08a84162b7 43 fno.lfname = lfn;
okini3939 1:bb08a84162b7 44 fno.lfsize = sizeof(lfn);
okini3939 1:bb08a84162b7 45 #endif
okini3939 1:bb08a84162b7 46
okini3939 1:bb08a84162b7 47 if (f_opendir(&dir, "") == FR_OK) {
okini3939 1:bb08a84162b7 48 for (;;) {
okini3939 1:bb08a84162b7 49 if (f_readdir(&dir, &fno) != FR_OK) break;
okini3939 1:bb08a84162b7 50 if (fno.fname[0] == 0) break;
okini3939 1:bb08a84162b7 51 #if _USE_LFN
okini3939 1:bb08a84162b7 52 fn = *fno.lfname ? fno.lfname : fno.fname;
okini3939 1:bb08a84162b7 53 #else
okini3939 1:bb08a84162b7 54 fn = fno.fname;
okini3939 1:bb08a84162b7 55 #endif
okini3939 1:bb08a84162b7 56 st->printf("%s\r\n", fn);
okini3939 1:bb08a84162b7 57 }
okini3939 1:bb08a84162b7 58 }
okini3939 1:bb08a84162b7 59 #endif
okini3939 1:bb08a84162b7 60 }
okini3939 1:bb08a84162b7 61
okini3939 1:bb08a84162b7 62 void readfile (char *filename) {
okini3939 1:bb08a84162b7 63 FILE *fp = fopen(filename, "r");
okini3939 1:bb08a84162b7 64 if (fp) {
okini3939 1:bb08a84162b7 65 int c;
okini3939 1:bb08a84162b7 66 pc.printf("file: ");
okini3939 1:bb08a84162b7 67 for (;;) {
okini3939 1:bb08a84162b7 68 c = fgetc(fp);
okini3939 1:bb08a84162b7 69 if (feof(fp)) break;
okini3939 1:bb08a84162b7 70 pc.printf("%c", c);
okini3939 1:bb08a84162b7 71 }
okini3939 1:bb08a84162b7 72 pc.printf("\r\n");
okini3939 1:bb08a84162b7 73 fclose(fp);
okini3939 1:bb08a84162b7 74 }
okini3939 1:bb08a84162b7 75 }
okini3939 0:9b1d17d54055 76
okini3939 0:9b1d17d54055 77 int main() {
okini3939 1:bb08a84162b7 78 int c;
okini3939 1:bb08a84162b7 79
okini3939 1:bb08a84162b7 80 set_new_handler(no_memory); // new handler function
okini3939 1:bb08a84162b7 81
okini3939 1:bb08a84162b7 82 readfile("/sd/test.txt");
okini3939 1:bb08a84162b7 83
okini3939 0:9b1d17d54055 84 while(1) {
okini3939 1:bb08a84162b7 85 if (cdcmsc.available()) {
okini3939 1:bb08a84162b7 86 // CDC -> pc serial
okini3939 1:bb08a84162b7 87 c = cdcmsc.getc();
okini3939 1:bb08a84162b7 88 pc.putc(c);
okini3939 1:bb08a84162b7 89 if (c == '?') {
okini3939 1:bb08a84162b7 90 listdir(&cdcmsc);
okini3939 1:bb08a84162b7 91 }
okini3939 0:9b1d17d54055 92 }
okini3939 0:9b1d17d54055 93 if (pc.readable()) {
okini3939 1:bb08a84162b7 94 // PC serial -> CDC
okini3939 1:bb08a84162b7 95 c = pc.getc();
okini3939 1:bb08a84162b7 96 cdcmsc.putc(c);
okini3939 1:bb08a84162b7 97 if (c == '?') {
okini3939 1:bb08a84162b7 98 listdir(&pc);
okini3939 1:bb08a84162b7 99 }
okini3939 0:9b1d17d54055 100 }
okini3939 0:9b1d17d54055 101 }
okini3939 0:9b1d17d54055 102 }