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 16:37:58 2011 +0000
Revision:
2:5db90410bb90
Parent:
1:bb08a84162b7

        

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