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/
main_best.cpp@1:7a568319eeb7, 2020-04-30 (annotated)
- 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?
User | Revision | Line number | New 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 |