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_not_so_good.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 --> 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 |