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