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
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 1
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 #elif defined(TARGET_STM32F4)
kenjiArai 1:7a568319eeb7 37 DigitalIn disconnect_sw(USER_BUTTON);
kenjiArai 1:7a568319eeb7 38 SDBlockDevice sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, 20000000);
kenjiArai 1:7a568319eeb7 39 #elif defined(TARGET_MCU_NRF52840)
kenjiArai 1:7a568319eeb7 40 #warning "This program does NOT work!!"
kenjiArai 1:7a568319eeb7 41 DigitalIn disconnect_sw(BUTTON1);
kenjiArai 1:7a568319eeb7 42 SDBlockDevice sd(D11, D12, D13, D10);
kenjiArai 1:7a568319eeb7 43 #endif
kenjiArai 1:7a568319eeb7 44 Serial pc(USBTX, USBRX, 115200);
kenjiArai 1:7a568319eeb7 45 FATFileSystem *fs = NULL;
kenjiArai 1:7a568319eeb7 46 USBMSD *usb_msd = NULL;
kenjiArai 1:7a568319eeb7 47 USBSerial *usb_ser = NULL;
kenjiArai 1:7a568319eeb7 48
kenjiArai 1:7a568319eeb7 49 // RAM ------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 50 bool stop_flag = false;
kenjiArai 1:7a568319eeb7 51 bool run_flag = false;
kenjiArai 1:7a568319eeb7 52 bool connected_flag = false;
kenjiArai 1:7a568319eeb7 53
kenjiArai 1:7a568319eeb7 54 // ROM / Constant data --------------------------------------------------------
kenjiArai 1:7a568319eeb7 55 const char *const opening_msg0 = "microSD Card test program";
kenjiArai 1:7a568319eeb7 56 const char *const opening_msg1 = " -> run on Mbed OS-5 multi-thread mode\r\n";
kenjiArai 1:7a568319eeb7 57
kenjiArai 1:7a568319eeb7 58 // Function prototypes --------------------------------------------------------
kenjiArai 1:7a568319eeb7 59 static void tsk_msd(void const *args);
kenjiArai 1:7a568319eeb7 60 template <typename ... Args>
kenjiArai 1:7a568319eeb7 61 void printf_usb(const char *format, Args const & ... args);
kenjiArai 1:7a568319eeb7 62 char usb_ser_readable(void);
kenjiArai 1:7a568319eeb7 63 char usb_ser_get_c(void);
kenjiArai 1:7a568319eeb7 64 void usb_ser_put_c(char c);
kenjiArai 1:7a568319eeb7 65
kenjiArai 1:7a568319eeb7 66 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 67 // Control Program
kenjiArai 1:7a568319eeb7 68 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 69 osThreadDef(tsk_msd, osPriorityNormal,2048);
kenjiArai 1:7a568319eeb7 70
kenjiArai 1:7a568319eeb7 71 int main()
kenjiArai 1:7a568319eeb7 72 {
kenjiArai 1:7a568319eeb7 73 char buf[128];
kenjiArai 1:7a568319eeb7 74 uint32_t step = 0;
kenjiArai 1:7a568319eeb7 75
kenjiArai 1:7a568319eeb7 76 usb_ser = new USBSerial;
kenjiArai 1:7a568319eeb7 77 printf_usb(
kenjiArai 1:7a568319eeb7 78 "\r\n\r\nConnect the USB which is embedded on F446 CPU to your PC\r\n"
kenjiArai 1:7a568319eeb7 79 );
kenjiArai 1:7a568319eeb7 80 printf_usb("-----STEP%d------> Start\r\n", step++);
kenjiArai 1:7a568319eeb7 81 while(true) {
kenjiArai 1:7a568319eeb7 82 printf_usb("Please see your new strage using the Explorer\r\n");
kenjiArai 1:7a568319eeb7 83 printf_usb("-----STEP%d------> Create USB MSD\r\n", step++);
kenjiArai 1:7a568319eeb7 84 printf_usb(
kenjiArai 1:7a568319eeb7 85 "If you want to disconnect the strage, please enter usr button\r\n"
kenjiArai 1:7a568319eeb7 86 );
kenjiArai 1:7a568319eeb7 87 ThisThread::sleep_for(100);
kenjiArai 1:7a568319eeb7 88 // we cannot use both MSD & Serial simultaneously!!
kenjiArai 1:7a568319eeb7 89 delete usb_ser;
kenjiArai 1:7a568319eeb7 90 osThreadId id = osThreadCreate(osThread(tsk_msd), NULL);
kenjiArai 1:7a568319eeb7 91 while(true) {
kenjiArai 1:7a568319eeb7 92 if (disconnect_sw == 0) { break;}
kenjiArai 1:7a568319eeb7 93 //if (stop_flag == true) { break;}
kenjiArai 1:7a568319eeb7 94 }
kenjiArai 1:7a568319eeb7 95 stop_flag = true;
kenjiArai 1:7a568319eeb7 96 while (run_flag == true) {
kenjiArai 1:7a568319eeb7 97 ThisThread::sleep_for(100);
kenjiArai 1:7a568319eeb7 98 }
kenjiArai 1:7a568319eeb7 99 // Terminate MSD
kenjiArai 1:7a568319eeb7 100 osThreadTerminate(id);
kenjiArai 1:7a568319eeb7 101 pc.printf("line:%d\r\n", __LINE__);
kenjiArai 1:7a568319eeb7 102 // Restart Serial
kenjiArai 1:7a568319eeb7 103 usb_ser = new USBSerial;
kenjiArai 1:7a568319eeb7 104 printf("line:%d\r\n", __LINE__);
kenjiArai 1:7a568319eeb7 105 printf_usb("You cannot see F446 SD strage!\r\n Now open SD strage\r\n");
kenjiArai 1:7a568319eeb7 106 printf_usb("-----STEP%d------> Disconnect USB MSD\r\n", step++);
kenjiArai 1:7a568319eeb7 107 // Init SD CARD reader
kenjiArai 1:7a568319eeb7 108 sd.init();
kenjiArai 1:7a568319eeb7 109 fs = new FATFileSystem("fs");
kenjiArai 1:7a568319eeb7 110 fs->mount(&sd);
kenjiArai 1:7a568319eeb7 111 printf_usb("-----STEP%d------> Create microSD file system\r\n", step++);
kenjiArai 1:7a568319eeb7 112 // Get date & time
kenjiArai 1:7a568319eeb7 113 time_t seconds = time(NULL);
kenjiArai 1:7a568319eeb7 114 strftime(buf, 64, "DATE %H:%M:%S,%Y/%m/%d\r\n", localtime(&seconds));
kenjiArai 1:7a568319eeb7 115 // write data into SD
kenjiArai 1:7a568319eeb7 116 FILE* fp = fopen("/fs/mydata.txt", "a");
kenjiArai 1:7a568319eeb7 117 if (fp != 0) {
kenjiArai 1:7a568319eeb7 118 usb_ser->printf("%s%s", opening_msg0, opening_msg1);
kenjiArai 1:7a568319eeb7 119 fprintf(fp,"%s%s", opening_msg0, opening_msg1);
kenjiArai 1:7a568319eeb7 120 usb_ser->printf("%s", buf); // buf = date & time
kenjiArai 1:7a568319eeb7 121 fprintf(fp, "%s", buf);
kenjiArai 1:7a568319eeb7 122 fflush(fp);
kenjiArai 1:7a568319eeb7 123 fclose(fp);
kenjiArai 1:7a568319eeb7 124 } else {
kenjiArai 1:7a568319eeb7 125 printf_usb("ERROR\r\n");
kenjiArai 1:7a568319eeb7 126 }
kenjiArai 1:7a568319eeb7 127 printf_usb("-----STEP%d------> Start file monitor\r\n", step++);
kenjiArai 1:7a568319eeb7 128 mon();
kenjiArai 1:7a568319eeb7 129 fs->remove("fs");
kenjiArai 1:7a568319eeb7 130 fs->unmount();
kenjiArai 1:7a568319eeb7 131 printf_usb("-----STEP%d------> Terminate microSD\r\n", step++);
kenjiArai 1:7a568319eeb7 132 while(true) {
kenjiArai 1:7a568319eeb7 133 printf_usb("-----STEP%d------> Waiting restart\r\n", step);
kenjiArai 1:7a568319eeb7 134 printf_usb("If you want to connect again, please enter 'y'\r\n>> ");
kenjiArai 1:7a568319eeb7 135 while (usb_ser_readable() == 0) {
kenjiArai 1:7a568319eeb7 136 ThisThread::sleep_for(100);
kenjiArai 1:7a568319eeb7 137 }
kenjiArai 1:7a568319eeb7 138 char c = usb_ser_get_c();
kenjiArai 1:7a568319eeb7 139 printf_usb("%c\r\n", c);
kenjiArai 1:7a568319eeb7 140 if (c == 'y') {
kenjiArai 1:7a568319eeb7 141 stop_flag = false;
kenjiArai 1:7a568319eeb7 142 break;
kenjiArai 1:7a568319eeb7 143 }
kenjiArai 1:7a568319eeb7 144 }
kenjiArai 1:7a568319eeb7 145 step = 1;
kenjiArai 1:7a568319eeb7 146 }
kenjiArai 1:7a568319eeb7 147 }
kenjiArai 1:7a568319eeb7 148
kenjiArai 1:7a568319eeb7 149 void tsk_msd(void const *args)
kenjiArai 1:7a568319eeb7 150 {
kenjiArai 1:7a568319eeb7 151 usb_msd = new USBMSD(&sd);
kenjiArai 1:7a568319eeb7 152 while(true) {
kenjiArai 1:7a568319eeb7 153 if (stop_flag == false) {
kenjiArai 1:7a568319eeb7 154 run_flag = true;
kenjiArai 1:7a568319eeb7 155 usb_msd->process();
kenjiArai 1:7a568319eeb7 156 //if (usb_msd->media_removed() == true) {
kenjiArai 1:7a568319eeb7 157 //stop_flag = true;
kenjiArai 1:7a568319eeb7 158 //}
kenjiArai 1:7a568319eeb7 159 } else {
kenjiArai 1:7a568319eeb7 160 usb_msd->disconnect();
kenjiArai 1:7a568319eeb7 161 run_flag = false;
kenjiArai 1:7a568319eeb7 162 }
kenjiArai 1:7a568319eeb7 163 }
kenjiArai 1:7a568319eeb7 164 }
kenjiArai 1:7a568319eeb7 165
kenjiArai 1:7a568319eeb7 166 template <typename ... Args>
kenjiArai 1:7a568319eeb7 167 void printf_usb(const char *format, Args const & ... args)
kenjiArai 1:7a568319eeb7 168 {
kenjiArai 1:7a568319eeb7 169 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 170 return;
kenjiArai 1:7a568319eeb7 171 } else {
kenjiArai 1:7a568319eeb7 172 pc.printf(format, args ...);
kenjiArai 1:7a568319eeb7 173 if (usb_ser->connected() == true) {
kenjiArai 1:7a568319eeb7 174 usb_ser->printf(format, args ...);
kenjiArai 1:7a568319eeb7 175 }
kenjiArai 1:7a568319eeb7 176 }
kenjiArai 1:7a568319eeb7 177 }
kenjiArai 1:7a568319eeb7 178
kenjiArai 1:7a568319eeb7 179 char usb_ser_readable()
kenjiArai 1:7a568319eeb7 180 {
kenjiArai 1:7a568319eeb7 181 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 182 return 0;
kenjiArai 1:7a568319eeb7 183 } else {
kenjiArai 1:7a568319eeb7 184 return usb_ser->readable();
kenjiArai 1:7a568319eeb7 185 }
kenjiArai 1:7a568319eeb7 186 }
kenjiArai 1:7a568319eeb7 187
kenjiArai 1:7a568319eeb7 188 char usb_ser_get_c()
kenjiArai 1:7a568319eeb7 189 {
kenjiArai 1:7a568319eeb7 190 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 191 return ' ';
kenjiArai 1:7a568319eeb7 192 } else {
kenjiArai 1:7a568319eeb7 193 return usb_ser->getc();
kenjiArai 1:7a568319eeb7 194 }
kenjiArai 1:7a568319eeb7 195 }
kenjiArai 1:7a568319eeb7 196
kenjiArai 1:7a568319eeb7 197 void usb_ser_put_c(char c)
kenjiArai 1:7a568319eeb7 198 {
kenjiArai 1:7a568319eeb7 199 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 200 return;
kenjiArai 1:7a568319eeb7 201 } else {
kenjiArai 1:7a568319eeb7 202 usb_ser->putc(c);
kenjiArai 1:7a568319eeb7 203 }
kenjiArai 1:7a568319eeb7 204 }
kenjiArai 1:7a568319eeb7 205
kenjiArai 1:7a568319eeb7 206 #endif