function test USBMSD(as external strage for PC USB) and USBSerial. Switching between USBMSD and USBSerial(Not work simultaneously)

see /users/kenjiArai/notebook/usb-interface--usbhost-and-usbdevice/

Committer:
kenjiArai
Date:
Thu Apr 30 23:43:35 2020 +0000
Revision:
1:7a568319eeb7
function test USBMSD(as external strage for PC USB) and USBSerial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 1:7a568319eeb7 1 /*
kenjiArai 1:7a568319eeb7 2 * Mbed Application program
kenjiArai 1:7a568319eeb7 3 * SD Card via USB on Mbed-os5
kenjiArai 1:7a568319eeb7 4 *
kenjiArai 1:7a568319eeb7 5 * Copyright (c) 2019,'20 Kenji Arai / JH1PJL
kenjiArai 1:7a568319eeb7 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 1:7a568319eeb7 7 * https://os.mbed.com/users/kenjiArai/
kenjiArai 1:7a568319eeb7 8 * Created: December 31st, 2019
kenjiArai 1:7a568319eeb7 9 * Revised: May 1st, 2020
kenjiArai 1:7a568319eeb7 10 */
kenjiArai 1:7a568319eeb7 11
kenjiArai 1:7a568319eeb7 12 /*
kenjiArai 1:7a568319eeb7 13 * Tested on:
kenjiArai 1:7a568319eeb7 14 * Nucleo-F446RE
kenjiArai 1:7a568319eeb7 15 * FRDM-K64F --> does NOT work!!
kenjiArai 1:7a568319eeb7 16 * nRF52840-DK --> does NOT work!!
kenjiArai 1:7a568319eeb7 17 * PC: Windows10 64bit + Tera Term
kenjiArai 1:7a568319eeb7 18 */
kenjiArai 1:7a568319eeb7 19
kenjiArai 1:7a568319eeb7 20 #if 0
kenjiArai 1:7a568319eeb7 21
kenjiArai 1:7a568319eeb7 22 // Include --------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 23 #include "mbed.h"
kenjiArai 1:7a568319eeb7 24 #include "USBMSD.h"
kenjiArai 1:7a568319eeb7 25 #include "USBSerial.h"
kenjiArai 1:7a568319eeb7 26 #include "SDBlockDevice.h"
kenjiArai 1:7a568319eeb7 27 #include "FATFileSystem.h"
kenjiArai 1:7a568319eeb7 28 #include "mon.h"
kenjiArai 1:7a568319eeb7 29
kenjiArai 1:7a568319eeb7 30 // Definition -----------------------------------------------------------------
kenjiArai 1:7a568319eeb7 31
kenjiArai 1:7a568319eeb7 32 // Constructor ----------------------------------------------------------------
kenjiArai 1:7a568319eeb7 33 #if defined(TARGET_K64F)
kenjiArai 1:7a568319eeb7 34 DigitalIn disconnect_sw(BUTTON2);
kenjiArai 1:7a568319eeb7 35 SDBlockDevice sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, 20000000);
kenjiArai 1:7a568319eeb7 36 #warning "This program does NOT work!!"
kenjiArai 1:7a568319eeb7 37 #elif defined(TARGET_STM32F4)
kenjiArai 1:7a568319eeb7 38 DigitalIn disconnect_sw(USER_BUTTON);
kenjiArai 1:7a568319eeb7 39 SDBlockDevice sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, 20000000);
kenjiArai 1:7a568319eeb7 40 #elif defined(TARGET_MCU_NRF52840)
kenjiArai 1:7a568319eeb7 41 #warning "This program does NOT work!!"
kenjiArai 1:7a568319eeb7 42 DigitalIn disconnect_sw(BUTTON1);
kenjiArai 1:7a568319eeb7 43 SDBlockDevice sd(D11, D12, D13, D10);
kenjiArai 1:7a568319eeb7 44 #endif
kenjiArai 1:7a568319eeb7 45 Serial pc(USBTX, USBRX, 115200);
kenjiArai 1:7a568319eeb7 46 FATFileSystem *fs = NULL;
kenjiArai 1:7a568319eeb7 47 USBMSD *usb_msd = NULL;
kenjiArai 1:7a568319eeb7 48 USBSerial *usb_ser = NULL;
kenjiArai 1:7a568319eeb7 49
kenjiArai 1:7a568319eeb7 50 // RAM ------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 51
kenjiArai 1:7a568319eeb7 52 // ROM / Constant data --------------------------------------------------------
kenjiArai 1:7a568319eeb7 53 const char *const opening_msg0 = "microSD Card test program";
kenjiArai 1:7a568319eeb7 54 const char *const opening_msg1 = " -> run on Mbed OS-5 multi-thread mode\r\n";
kenjiArai 1:7a568319eeb7 55
kenjiArai 1:7a568319eeb7 56 // Function prototypes --------------------------------------------------------
kenjiArai 1:7a568319eeb7 57 template <typename ... Args>
kenjiArai 1:7a568319eeb7 58 void printf_usb(const char *format, Args const & ... args);
kenjiArai 1:7a568319eeb7 59 char usb_ser_readable(void);
kenjiArai 1:7a568319eeb7 60 char usb_ser_get_c(void);
kenjiArai 1:7a568319eeb7 61 void usb_ser_put_c(char c);
kenjiArai 1:7a568319eeb7 62
kenjiArai 1:7a568319eeb7 63 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 64 // Control Program
kenjiArai 1:7a568319eeb7 65 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 66 int main()
kenjiArai 1:7a568319eeb7 67 {
kenjiArai 1:7a568319eeb7 68 char buf[128];
kenjiArai 1:7a568319eeb7 69 uint32_t step = 0;
kenjiArai 1:7a568319eeb7 70
kenjiArai 1:7a568319eeb7 71 usb_ser = new USBSerial;
kenjiArai 1:7a568319eeb7 72 printf_usb(
kenjiArai 1:7a568319eeb7 73 "\r\n\r\nConnect the USB which is embedded on F446 CPU to your PC\r\n"
kenjiArai 1:7a568319eeb7 74 );
kenjiArai 1:7a568319eeb7 75 printf_usb("-----STEP%d------> Start\r\n", step++);
kenjiArai 1:7a568319eeb7 76 while(true) {
kenjiArai 1:7a568319eeb7 77 printf_usb("Please see your new strage using the Explorer\r\n");
kenjiArai 1:7a568319eeb7 78 printf_usb("-----STEP%d------> Create USB MSD\r\n", step++);
kenjiArai 1:7a568319eeb7 79 printf_usb(
kenjiArai 1:7a568319eeb7 80 "If you want to disconnect the strage, please enter usr button\r\n"
kenjiArai 1:7a568319eeb7 81 );
kenjiArai 1:7a568319eeb7 82 ThisThread::sleep_for(100);
kenjiArai 1:7a568319eeb7 83 // we cannot use both MSD & Serial simultaneously!!
kenjiArai 1:7a568319eeb7 84 delete usb_ser;
kenjiArai 1:7a568319eeb7 85 // Start MSD
kenjiArai 1:7a568319eeb7 86 usb_msd = new USBMSD(&sd);
kenjiArai 1:7a568319eeb7 87 while(true) {
kenjiArai 1:7a568319eeb7 88 usb_msd->process();
kenjiArai 1:7a568319eeb7 89 if (disconnect_sw == 0) {
kenjiArai 1:7a568319eeb7 90 break;
kenjiArai 1:7a568319eeb7 91 }
kenjiArai 1:7a568319eeb7 92 }
kenjiArai 1:7a568319eeb7 93 // Terminate MSD
kenjiArai 1:7a568319eeb7 94 usb_msd->disconnect();
kenjiArai 1:7a568319eeb7 95 delete usb_msd;
kenjiArai 1:7a568319eeb7 96 // Restart Serial
kenjiArai 1:7a568319eeb7 97 usb_ser = new USBSerial;
kenjiArai 1:7a568319eeb7 98 printf("line:%d\r\n", __LINE__);
kenjiArai 1:7a568319eeb7 99 printf_usb("You cannot see F446 SD strage!\r\n Now open SD strage\r\n");
kenjiArai 1:7a568319eeb7 100 printf_usb("-----STEP%d------> Disconnect USB MSD\r\n", step++);
kenjiArai 1:7a568319eeb7 101 // Init SD CARD reader
kenjiArai 1:7a568319eeb7 102 sd.init();
kenjiArai 1:7a568319eeb7 103 fs = new FATFileSystem("fs");
kenjiArai 1:7a568319eeb7 104 fs->mount(&sd);
kenjiArai 1:7a568319eeb7 105 printf_usb("-----STEP%d------> Create microSD file system\r\n", step++);
kenjiArai 1:7a568319eeb7 106 // Get date & time
kenjiArai 1:7a568319eeb7 107 time_t seconds = time(NULL);
kenjiArai 1:7a568319eeb7 108 strftime(buf, 64, "DATE %H:%M:%S,%Y/%m/%d\r\n", localtime(&seconds));
kenjiArai 1:7a568319eeb7 109 // write data into SD
kenjiArai 1:7a568319eeb7 110 FILE* fp = fopen("/fs/mydata.txt", "a");
kenjiArai 1:7a568319eeb7 111 if (fp != 0) {
kenjiArai 1:7a568319eeb7 112 usb_ser->printf("%s%s", opening_msg0, opening_msg1);
kenjiArai 1:7a568319eeb7 113 fprintf(fp,"%s%s", opening_msg0, opening_msg1);
kenjiArai 1:7a568319eeb7 114 usb_ser->printf("%s", buf); // buf = date & time
kenjiArai 1:7a568319eeb7 115 fprintf(fp, "%s", buf);
kenjiArai 1:7a568319eeb7 116 fflush(fp);
kenjiArai 1:7a568319eeb7 117 fclose(fp);
kenjiArai 1:7a568319eeb7 118 } else {
kenjiArai 1:7a568319eeb7 119 printf_usb("ERROR\r\n");
kenjiArai 1:7a568319eeb7 120 }
kenjiArai 1:7a568319eeb7 121 printf_usb("-----STEP%d------> Start file monitor\r\n", step++);
kenjiArai 1:7a568319eeb7 122 // goto monitor program to set date & time and so on
kenjiArai 1:7a568319eeb7 123 mon();
kenjiArai 1:7a568319eeb7 124 fs->remove("fs");
kenjiArai 1:7a568319eeb7 125 fs->unmount();
kenjiArai 1:7a568319eeb7 126 printf_usb("-----STEP%d------> Terminate microSD\r\n", step++);
kenjiArai 1:7a568319eeb7 127 while(true) {
kenjiArai 1:7a568319eeb7 128 printf_usb("-----STEP%d------> Waiting restart\r\n", step);
kenjiArai 1:7a568319eeb7 129 printf_usb("If you want to connect again, please enter 'y'\r\n>> ");
kenjiArai 1:7a568319eeb7 130 while (usb_ser_readable() == 0) {
kenjiArai 1:7a568319eeb7 131 ThisThread::sleep_for(100);
kenjiArai 1:7a568319eeb7 132 }
kenjiArai 1:7a568319eeb7 133 char c = usb_ser_get_c();
kenjiArai 1:7a568319eeb7 134 printf_usb("%c\r\n", c);
kenjiArai 1:7a568319eeb7 135 if (c == 'y') {
kenjiArai 1:7a568319eeb7 136 break;
kenjiArai 1:7a568319eeb7 137 }
kenjiArai 1:7a568319eeb7 138 }
kenjiArai 1:7a568319eeb7 139 step = 1;
kenjiArai 1:7a568319eeb7 140 }
kenjiArai 1:7a568319eeb7 141 }
kenjiArai 1:7a568319eeb7 142
kenjiArai 1:7a568319eeb7 143 template <typename ... Args>
kenjiArai 1:7a568319eeb7 144 void printf_usb(const char *format, Args const & ... args)
kenjiArai 1:7a568319eeb7 145 {
kenjiArai 1:7a568319eeb7 146 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 147 return;
kenjiArai 1:7a568319eeb7 148 } else {
kenjiArai 1:7a568319eeb7 149 pc.printf(format, args ...);
kenjiArai 1:7a568319eeb7 150 if (usb_ser->connected() == true) {
kenjiArai 1:7a568319eeb7 151 usb_ser->printf(format, args ...);
kenjiArai 1:7a568319eeb7 152 }
kenjiArai 1:7a568319eeb7 153 }
kenjiArai 1:7a568319eeb7 154 }
kenjiArai 1:7a568319eeb7 155
kenjiArai 1:7a568319eeb7 156 char usb_ser_readable()
kenjiArai 1:7a568319eeb7 157 {
kenjiArai 1:7a568319eeb7 158 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 159 return 0;
kenjiArai 1:7a568319eeb7 160 } else {
kenjiArai 1:7a568319eeb7 161 return usb_ser->readable();
kenjiArai 1:7a568319eeb7 162 }
kenjiArai 1:7a568319eeb7 163 }
kenjiArai 1:7a568319eeb7 164
kenjiArai 1:7a568319eeb7 165 char usb_ser_get_c()
kenjiArai 1:7a568319eeb7 166 {
kenjiArai 1:7a568319eeb7 167 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 168 return ' ';
kenjiArai 1:7a568319eeb7 169 } else {
kenjiArai 1:7a568319eeb7 170 return usb_ser->getc();
kenjiArai 1:7a568319eeb7 171 }
kenjiArai 1:7a568319eeb7 172 }
kenjiArai 1:7a568319eeb7 173
kenjiArai 1:7a568319eeb7 174 void usb_ser_put_c(char c)
kenjiArai 1:7a568319eeb7 175 {
kenjiArai 1:7a568319eeb7 176 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 177 return;
kenjiArai 1:7a568319eeb7 178 } else {
kenjiArai 1:7a568319eeb7 179 usb_ser->putc(c);
kenjiArai 1:7a568319eeb7 180 }
kenjiArai 1:7a568319eeb7 181 }
kenjiArai 1:7a568319eeb7 182
kenjiArai 1:7a568319eeb7 183 #endif