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 Semaphore media_remove_event(0, 1);
kenjiArai 1:7a568319eeb7 52 static volatile bool msd_process_done = 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 void msd_process(USBMSD *msd);
kenjiArai 1:7a568319eeb7 60 void run_processing(Semaphore *sem);
kenjiArai 1:7a568319eeb7 61 template <typename ... Args>
kenjiArai 1:7a568319eeb7 62 void printf_usb(const char *format, Args const & ... args);
kenjiArai 1:7a568319eeb7 63 char usb_ser_readable(void);
kenjiArai 1:7a568319eeb7 64 char usb_ser_get_c(void);
kenjiArai 1:7a568319eeb7 65 void usb_ser_put_c(char c);
kenjiArai 1:7a568319eeb7 66
kenjiArai 1:7a568319eeb7 67 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 68 // Control Program
kenjiArai 1:7a568319eeb7 69 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 70 int main()
kenjiArai 1:7a568319eeb7 71 {
kenjiArai 1:7a568319eeb7 72 char buf[128];
kenjiArai 1:7a568319eeb7 73 uint32_t step = 0;
kenjiArai 1:7a568319eeb7 74
kenjiArai 1:7a568319eeb7 75 usb_ser = new USBSerial;
kenjiArai 1:7a568319eeb7 76 printf_usb(
kenjiArai 1:7a568319eeb7 77 "\r\n\r\nConnect the USB which is embedded on F446 CPU to your PC\r\n"
kenjiArai 1:7a568319eeb7 78 );
kenjiArai 1:7a568319eeb7 79 printf_usb("-----STEP%d------> Start\r\n", step++);
kenjiArai 1:7a568319eeb7 80 while(true) {
kenjiArai 1:7a568319eeb7 81 printf_usb("Please see your new strage using the Explorer\r\n");
kenjiArai 1:7a568319eeb7 82 printf_usb("-----STEP%d------> Create USB MSD\r\n", step++);
kenjiArai 1:7a568319eeb7 83 printf_usb(
kenjiArai 1:7a568319eeb7 84 "If you want to disconnect the strage, please enter usr button\r\n"
kenjiArai 1:7a568319eeb7 85 );
kenjiArai 1:7a568319eeb7 86 ThisThread::sleep_for(100);
kenjiArai 1:7a568319eeb7 87 // we cannot use both MSD & Serial simultaneously!!
kenjiArai 1:7a568319eeb7 88 delete usb_ser;
kenjiArai 1:7a568319eeb7 89
kenjiArai 1:7a568319eeb7 90 Thread msd_thread(osPriorityHigh);
kenjiArai 1:7a568319eeb7 91 usb_msd = new USBMSD(&sd);
kenjiArai 1:7a568319eeb7 92 msd_thread.start(callback(msd_process, usb_msd));
kenjiArai 1:7a568319eeb7 93 while(true) {
kenjiArai 1:7a568319eeb7 94 media_remove_event.try_acquire_for(1000);
kenjiArai 1:7a568319eeb7 95 if (disconnect_sw == 0) {
kenjiArai 1:7a568319eeb7 96 break;
kenjiArai 1:7a568319eeb7 97 }
kenjiArai 1:7a568319eeb7 98 }
kenjiArai 1:7a568319eeb7 99
kenjiArai 1:7a568319eeb7 100 // Terminate MSD
kenjiArai 1:7a568319eeb7 101 msd_process_done = true;
kenjiArai 1:7a568319eeb7 102 ThisThread::sleep_for(100);
kenjiArai 1:7a568319eeb7 103 delete usb_msd;
kenjiArai 1:7a568319eeb7 104 // Restart Serial
kenjiArai 1:7a568319eeb7 105 usb_ser = new USBSerial;
kenjiArai 1:7a568319eeb7 106 printf("line:%d\r\n", __LINE__);
kenjiArai 1:7a568319eeb7 107 printf_usb("You cannot see F446 SD strage!\r\n Now open SD strage\r\n");
kenjiArai 1:7a568319eeb7 108 printf_usb("-----STEP%d------> Disconnect USB MSD\r\n", step++);
kenjiArai 1:7a568319eeb7 109 // Init SD CARD reader
kenjiArai 1:7a568319eeb7 110 sd.init();
kenjiArai 1:7a568319eeb7 111 fs = new FATFileSystem("fs");
kenjiArai 1:7a568319eeb7 112 fs->mount(&sd);
kenjiArai 1:7a568319eeb7 113 printf_usb("-----STEP%d------> Create microSD file system\r\n", step++);
kenjiArai 1:7a568319eeb7 114 // Get date & time
kenjiArai 1:7a568319eeb7 115 time_t seconds = time(NULL);
kenjiArai 1:7a568319eeb7 116 strftime(buf, 64, "DATE %H:%M:%S,%Y/%m/%d\r\n", localtime(&seconds));
kenjiArai 1:7a568319eeb7 117 // write data into SD
kenjiArai 1:7a568319eeb7 118 FILE* fp = fopen("/fs/mydata.txt", "a");
kenjiArai 1:7a568319eeb7 119 if (fp != 0) {
kenjiArai 1:7a568319eeb7 120 usb_ser->printf("%s%s", opening_msg0, opening_msg1);
kenjiArai 1:7a568319eeb7 121 fprintf(fp,"%s%s", opening_msg0, opening_msg1);
kenjiArai 1:7a568319eeb7 122 usb_ser->printf("%s", buf); // buf = date & time
kenjiArai 1:7a568319eeb7 123 fprintf(fp, "%s", buf);
kenjiArai 1:7a568319eeb7 124 fflush(fp);
kenjiArai 1:7a568319eeb7 125 fclose(fp);
kenjiArai 1:7a568319eeb7 126 } else {
kenjiArai 1:7a568319eeb7 127 printf_usb("ERROR\r\n");
kenjiArai 1:7a568319eeb7 128 }
kenjiArai 1:7a568319eeb7 129 printf_usb("-----STEP%d------> Start file monitor\r\n", step++);
kenjiArai 1:7a568319eeb7 130 mon();
kenjiArai 1:7a568319eeb7 131 fs->remove("fs");
kenjiArai 1:7a568319eeb7 132 fs->unmount();
kenjiArai 1:7a568319eeb7 133 printf_usb("-----STEP%d------> Terminate microSD\r\n", step++);
kenjiArai 1:7a568319eeb7 134 while(true) {
kenjiArai 1:7a568319eeb7 135 printf_usb("-----STEP%d------> Waiting restart\r\n", step);
kenjiArai 1:7a568319eeb7 136 printf_usb("If you want to connect again, please enter 'y'\r\n>> ");
kenjiArai 1:7a568319eeb7 137 while (usb_ser_readable() == 0) {
kenjiArai 1:7a568319eeb7 138 ThisThread::sleep_for(100);
kenjiArai 1:7a568319eeb7 139 }
kenjiArai 1:7a568319eeb7 140 char c = usb_ser_get_c();
kenjiArai 1:7a568319eeb7 141 printf_usb("%c\r\n", c);
kenjiArai 1:7a568319eeb7 142 if (c == 'y') {
kenjiArai 1:7a568319eeb7 143 break;
kenjiArai 1:7a568319eeb7 144 }
kenjiArai 1:7a568319eeb7 145 }
kenjiArai 1:7a568319eeb7 146 step = 1;
kenjiArai 1:7a568319eeb7 147 }
kenjiArai 1:7a568319eeb7 148 }
kenjiArai 1:7a568319eeb7 149
kenjiArai 1:7a568319eeb7 150 void run_processing(Semaphore *sem)
kenjiArai 1:7a568319eeb7 151 {
kenjiArai 1:7a568319eeb7 152 sem->release();
kenjiArai 1:7a568319eeb7 153 }
kenjiArai 1:7a568319eeb7 154
kenjiArai 1:7a568319eeb7 155 void msd_process(USBMSD *msd)
kenjiArai 1:7a568319eeb7 156 {
kenjiArai 1:7a568319eeb7 157 printf("line:%d\r\n", __LINE__);
kenjiArai 1:7a568319eeb7 158 usb_msd->connect();
kenjiArai 1:7a568319eeb7 159 Semaphore proc;
kenjiArai 1:7a568319eeb7 160 msd->attach(callback(run_processing, &proc));
kenjiArai 1:7a568319eeb7 161 printf("line:%d\r\n", __LINE__);
kenjiArai 1:7a568319eeb7 162 while (!msd_process_done) {
kenjiArai 1:7a568319eeb7 163 proc.try_acquire_for(100);
kenjiArai 1:7a568319eeb7 164 msd->process();
kenjiArai 1:7a568319eeb7 165 }
kenjiArai 1:7a568319eeb7 166 msd->attach(NULL);
kenjiArai 1:7a568319eeb7 167 }
kenjiArai 1:7a568319eeb7 168
kenjiArai 1:7a568319eeb7 169 template <typename ... Args>
kenjiArai 1:7a568319eeb7 170 void printf_usb(const char *format, Args const & ... args)
kenjiArai 1:7a568319eeb7 171 {
kenjiArai 1:7a568319eeb7 172 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 173 return;
kenjiArai 1:7a568319eeb7 174 } else {
kenjiArai 1:7a568319eeb7 175 pc.printf(format, args ...);
kenjiArai 1:7a568319eeb7 176 if (usb_ser->connected() == true) {
kenjiArai 1:7a568319eeb7 177 usb_ser->printf(format, args ...);
kenjiArai 1:7a568319eeb7 178 }
kenjiArai 1:7a568319eeb7 179 }
kenjiArai 1:7a568319eeb7 180 }
kenjiArai 1:7a568319eeb7 181
kenjiArai 1:7a568319eeb7 182 char usb_ser_readable()
kenjiArai 1:7a568319eeb7 183 {
kenjiArai 1:7a568319eeb7 184 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 185 return 0;
kenjiArai 1:7a568319eeb7 186 } else {
kenjiArai 1:7a568319eeb7 187 return usb_ser->readable();
kenjiArai 1:7a568319eeb7 188 }
kenjiArai 1:7a568319eeb7 189 }
kenjiArai 1:7a568319eeb7 190
kenjiArai 1:7a568319eeb7 191 char usb_ser_get_c()
kenjiArai 1:7a568319eeb7 192 {
kenjiArai 1:7a568319eeb7 193 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 194 return ' ';
kenjiArai 1:7a568319eeb7 195 } else {
kenjiArai 1:7a568319eeb7 196 return usb_ser->getc();
kenjiArai 1:7a568319eeb7 197 }
kenjiArai 1:7a568319eeb7 198 }
kenjiArai 1:7a568319eeb7 199
kenjiArai 1:7a568319eeb7 200 void usb_ser_put_c(char c)
kenjiArai 1:7a568319eeb7 201 {
kenjiArai 1:7a568319eeb7 202 if (usb_ser == NULL) {
kenjiArai 1:7a568319eeb7 203 return;
kenjiArai 1:7a568319eeb7 204 } else {
kenjiArai 1:7a568319eeb7 205 usb_ser->putc(c);
kenjiArai 1:7a568319eeb7 206 }
kenjiArai 1:7a568319eeb7 207 }
kenjiArai 1:7a568319eeb7 208
kenjiArai 1:7a568319eeb7 209 #endif