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 for the mbed
kenjiArai 1:7a568319eeb7 3 * FatFs Check program / monitor part
kenjiArai 1:7a568319eeb7 4 *
kenjiArai 1:7a568319eeb7 5 * Copyright (c) 2015,'18,'19,'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: May 5th, 2015
kenjiArai 1:7a568319eeb7 9 * Revised: June 14th, 2015
kenjiArai 1:7a568319eeb7 10 * Revised: April 7th, 2018
kenjiArai 1:7a568319eeb7 11 * Revised: April 29th, 2020
kenjiArai 1:7a568319eeb7 12 */
kenjiArai 1:7a568319eeb7 13
kenjiArai 1:7a568319eeb7 14 /*
kenjiArai 1:7a568319eeb7 15 *---------------- REFERENCE ---------------------------------------------------
kenjiArai 1:7a568319eeb7 16 * Original Source Information
kenjiArai 1:7a568319eeb7 17 * FatFs sample program
kenjiArai 1:7a568319eeb7 18 * ChaN FatFs http://elm-chan.org/
kenjiArai 1:7a568319eeb7 19 * http://elm-chan.org/fsw/ff/00index_e.html
kenjiArai 1:7a568319eeb7 20 */
kenjiArai 1:7a568319eeb7 21 /*----------------------------------------------------------------------*/
kenjiArai 1:7a568319eeb7 22 /* FAT file system sample project for FatFs (C)ChaN, 2016 */
kenjiArai 1:7a568319eeb7 23 /*----------------------------------------------------------------------*/
kenjiArai 1:7a568319eeb7 24
kenjiArai 1:7a568319eeb7 25 // Include --------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 26 #include "mbed.h"
kenjiArai 1:7a568319eeb7 27 #if (MBED_MAJOR_VERSION == 2)
kenjiArai 1:7a568319eeb7 28 #include "SDFileSystem.h"
kenjiArai 1:7a568319eeb7 29 #elif (MBED_MAJOR_VERSION == 5)
kenjiArai 1:7a568319eeb7 30 #include "FATFileSystem.h"
kenjiArai 1:7a568319eeb7 31 #endif
kenjiArai 1:7a568319eeb7 32 #include "USBSerial.h"
kenjiArai 1:7a568319eeb7 33 #include "ff.h"
kenjiArai 1:7a568319eeb7 34 #include "ffconf.h"
kenjiArai 1:7a568319eeb7 35 #include "diskio.h"
kenjiArai 1:7a568319eeb7 36 #include "mon.h"
kenjiArai 1:7a568319eeb7 37
kenjiArai 1:7a568319eeb7 38 // Definition -----------------------------------------------------------------
kenjiArai 1:7a568319eeb7 39 #define DO_DEBUG 0
kenjiArai 1:7a568319eeb7 40
kenjiArai 1:7a568319eeb7 41 #if DO_DEBUG
kenjiArai 1:7a568319eeb7 42 #define DEBUG_LINE pc.printf("line:%d\r\n", __LINE__);
kenjiArai 1:7a568319eeb7 43 #else
kenjiArai 1:7a568319eeb7 44 #define DEBUG_LINE {;}
kenjiArai 1:7a568319eeb7 45 #endif
kenjiArai 1:7a568319eeb7 46
kenjiArai 1:7a568319eeb7 47 // Com
kenjiArai 1:7a568319eeb7 48 #if 1
kenjiArai 1:7a568319eeb7 49 # if 1
kenjiArai 1:7a568319eeb7 50 # define BAUD(x) {;}
kenjiArai 1:7a568319eeb7 51 # define GETC(x) usb_ser->getc(x)
kenjiArai 1:7a568319eeb7 52 # define PUTC(x) usb_ser->putc(x)
kenjiArai 1:7a568319eeb7 53 # define PUTS(x) usb_ser->puts(x)
kenjiArai 1:7a568319eeb7 54 # define PRINTF(...) usb_ser->printf(__VA_ARGS__)
kenjiArai 1:7a568319eeb7 55 # define READABLE(x) usb_ser->readable(x)
kenjiArai 1:7a568319eeb7 56 # else
kenjiArai 1:7a568319eeb7 57 # define BAUD(x) pc.baud(x)
kenjiArai 1:7a568319eeb7 58 # define GETC(x) pc.getc(x)
kenjiArai 1:7a568319eeb7 59 # define PUTC(x) pc.putc(x)
kenjiArai 1:7a568319eeb7 60 # define PUTS(x) pc.puts(x)
kenjiArai 1:7a568319eeb7 61 # define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 1:7a568319eeb7 62 # define READABLE(x) pc.readable(x)
kenjiArai 1:7a568319eeb7 63 # endif
kenjiArai 1:7a568319eeb7 64 #else
kenjiArai 1:7a568319eeb7 65 # define BAUD(x) {;}
kenjiArai 1:7a568319eeb7 66 # define GETC(x) {;}
kenjiArai 1:7a568319eeb7 67 # define PUTC(x) {;}
kenjiArai 1:7a568319eeb7 68 # define PRINTF(...) {;}
kenjiArai 1:7a568319eeb7 69 # define READABLE(x) {;}
kenjiArai 1:7a568319eeb7 70 #endif
kenjiArai 1:7a568319eeb7 71
kenjiArai 1:7a568319eeb7 72 #define UTC_JST_OFFSET (32400) // +9 hours
kenjiArai 1:7a568319eeb7 73
kenjiArai 1:7a568319eeb7 74 // from ffconf.h
kenjiArai 1:7a568319eeb7 75 #define _VOLUMES 1
kenjiArai 1:7a568319eeb7 76
kenjiArai 1:7a568319eeb7 77 #if !defined(FF_FS_RPATH)
kenjiArai 1:7a568319eeb7 78 #define FF_FS_RPATH 0
kenjiArai 1:7a568319eeb7 79 #endif
kenjiArai 1:7a568319eeb7 80
kenjiArai 1:7a568319eeb7 81 #define DW_CHAR sizeof(char)
kenjiArai 1:7a568319eeb7 82 #define DW_SHORT sizeof(short)
kenjiArai 1:7a568319eeb7 83 #define DW_LONG sizeof(long)
kenjiArai 1:7a568319eeb7 84
kenjiArai 1:7a568319eeb7 85 /* These types must be 16-bit, 32-bit or larger integer */
kenjiArai 1:7a568319eeb7 86 typedef int INT;
kenjiArai 1:7a568319eeb7 87 typedef unsigned int UINT;
kenjiArai 1:7a568319eeb7 88
kenjiArai 1:7a568319eeb7 89 /* These types must be 8-bit integer */
kenjiArai 1:7a568319eeb7 90 typedef char CHAR;
kenjiArai 1:7a568319eeb7 91 typedef unsigned char UCHAR;
kenjiArai 1:7a568319eeb7 92 typedef unsigned char BYTE;
kenjiArai 1:7a568319eeb7 93
kenjiArai 1:7a568319eeb7 94 /* These types must be 16-bit integer */
kenjiArai 1:7a568319eeb7 95 typedef short SHORT;
kenjiArai 1:7a568319eeb7 96 typedef unsigned short USHORT;
kenjiArai 1:7a568319eeb7 97 typedef unsigned short WORD;
kenjiArai 1:7a568319eeb7 98 typedef unsigned short WCHAR;
kenjiArai 1:7a568319eeb7 99
kenjiArai 1:7a568319eeb7 100 /* These types must be 32-bit integer */
kenjiArai 1:7a568319eeb7 101 typedef long LONG;
kenjiArai 1:7a568319eeb7 102 typedef unsigned long ULONG;
kenjiArai 1:7a568319eeb7 103 typedef unsigned long DWORD;
kenjiArai 1:7a568319eeb7 104 /* by Kenji Arai / JH1PJL September 10th, 2012 */
kenjiArai 1:7a568319eeb7 105 typedef unsigned long long DDWORD;
kenjiArai 1:7a568319eeb7 106
kenjiArai 1:7a568319eeb7 107 // RAM ------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 108 BYTE Buff[4096];
kenjiArai 1:7a568319eeb7 109 char Linebuf[128]; // Console input buffer
kenjiArai 1:7a568319eeb7 110 FATFS Fatfs[_VOLUMES]; // File system object for each logical drive
kenjiArai 1:7a568319eeb7 111 FIL File1, File2; // File objects
kenjiArai 1:7a568319eeb7 112 FATFS_DIR* Dirx;
kenjiArai 1:7a568319eeb7 113 FILINFO Finfo;
kenjiArai 1:7a568319eeb7 114 DWORD AccSize; // Work register for fs command
kenjiArai 1:7a568319eeb7 115 WORD AccFiles, AccDirs;
kenjiArai 1:7a568319eeb7 116
kenjiArai 1:7a568319eeb7 117 // ROM / Constant data --------------------------------------------------------
kenjiArai 1:7a568319eeb7 118 const char *const monmsg0 = "Start monitor program for FatFs File System\r\n";
kenjiArai 1:7a568319eeb7 119 const char *const monmsg1 = " <Please press any key to start the monitor>";
kenjiArai 1:7a568319eeb7 120
kenjiArai 1:7a568319eeb7 121 static const char HelpMsg0[] =
kenjiArai 1:7a568319eeb7 122 "dir <full_pass>\r\n"
kenjiArai 1:7a568319eeb7 123 "type <file_name>\r\n"
kenjiArai 1:7a568319eeb7 124 "vol\r\n"
kenjiArai 1:7a568319eeb7 125 "ren <org_file_name> <new_file_name>\r\n"
kenjiArai 1:7a568319eeb7 126 "copy <file_name> <file_name>\r\n"
kenjiArai 1:7a568319eeb7 127 "mkdir <dir_name>\r\n"
kenjiArai 1:7a568319eeb7 128 "cd <dir_name>\r\n"
kenjiArai 1:7a568319eeb7 129 "x extend commands mode\r\n"
kenjiArai 1:7a568319eeb7 130 "q Return to main\r\n"
kenjiArai 1:7a568319eeb7 131 "t Show current time or Adjust time\r\n"
kenjiArai 1:7a568319eeb7 132 " e.g. t 20 4 29 10 11 12 -> April 29,'20, 10:11:12\r\n"
kenjiArai 1:7a568319eeb7 133 "? Help/You know the command\r\n"
kenjiArai 1:7a568319eeb7 134 "\r\n";
kenjiArai 1:7a568319eeb7 135
kenjiArai 1:7a568319eeb7 136 static const char HelpMsg1[] =
kenjiArai 1:7a568319eeb7 137 "[File system controls]\r\n"
kenjiArai 1:7a568319eeb7 138 " fi <ld#> [<mount>]- Force initialized the volume\r\n"
kenjiArai 1:7a568319eeb7 139 " fs [<path>] - Show volume status\r\n"
kenjiArai 1:7a568319eeb7 140 " fl [<path>] - Show a directory\r\n"
kenjiArai 1:7a568319eeb7 141 " fo <mode> <file> - Open a file\r\n"
kenjiArai 1:7a568319eeb7 142 " <mode> Read=1, Write=2\r\n"
kenjiArai 1:7a568319eeb7 143 " fc - Close the file\r\n"
kenjiArai 1:7a568319eeb7 144 " fe <ofs> - Move fp in normal seek\r\n"
kenjiArai 1:7a568319eeb7 145 " fd <len> - Read and dump the file\r\n"
kenjiArai 1:7a568319eeb7 146 " fr <len> - Read the file\r\n"
kenjiArai 1:7a568319eeb7 147 " fw <len> <val> - Write to the file\r\n"
kenjiArai 1:7a568319eeb7 148 " fn <org.name> <new.name> - Rename an object\r\n"
kenjiArai 1:7a568319eeb7 149 " fu <name> - Unlink an object\r\n"
kenjiArai 1:7a568319eeb7 150 " fv - Truncate the file at current fp\r\n"
kenjiArai 1:7a568319eeb7 151 " fk <name> - Create a directory\r\n"
kenjiArai 1:7a568319eeb7 152 " fa <atrr> <mask> <object name> - Change attribute of an object\r\n"
kenjiArai 1:7a568319eeb7 153 " ft <year> <month> <day> <hour> <min> <sec> <name>"
kenjiArai 1:7a568319eeb7 154 " - Change timestamp of an object\r\n"
kenjiArai 1:7a568319eeb7 155 " fx <src.file> <dst.file> - Copy a file\r\n"
kenjiArai 1:7a568319eeb7 156 " fg <path> - Change current directory\r\n"
kenjiArai 1:7a568319eeb7 157 " fq - Show current directory\r\n"
kenjiArai 1:7a568319eeb7 158 " fb <name> - Set volume label\r\n"
kenjiArai 1:7a568319eeb7 159 " fm <ld#> <type> <csize> - Create file system\r\n"
kenjiArai 1:7a568319eeb7 160 " fz [<len>] - Change/Show R/W length for fr/fw/fx command\r\n"
kenjiArai 1:7a568319eeb7 161 "[Disk contorls]\r\n"
kenjiArai 1:7a568319eeb7 162 " di <pd#> - Initialize disk\r\n"
kenjiArai 1:7a568319eeb7 163 " dd [<pd#> <lba>] - Dump a secrtor\r\n"
kenjiArai 1:7a568319eeb7 164 " ds <pd#> - Show disk status\r\n"
kenjiArai 1:7a568319eeb7 165 "[Buffer controls]\r\n"
kenjiArai 1:7a568319eeb7 166 " bd <ofs> - Dump working buffer\r\n"
kenjiArai 1:7a568319eeb7 167 " be <ofs> [<data>] ... - Edit working buffer\r\n"
kenjiArai 1:7a568319eeb7 168 " br <pd#> <lba> [<count>] - Read disk into working buffer\r\n"
kenjiArai 1:7a568319eeb7 169 " bw <pd#> <lba> [<count>] - Write working buffer into disk\r\n"
kenjiArai 1:7a568319eeb7 170 " bf <val> - Fill working buffer\r\n"
kenjiArai 1:7a568319eeb7 171 "[Misc commands]\r\n"
kenjiArai 1:7a568319eeb7 172 " q Return\r\n"
kenjiArai 1:7a568319eeb7 173 " ? Help\r\n"
kenjiArai 1:7a568319eeb7 174 "\r\n";
kenjiArai 1:7a568319eeb7 175
kenjiArai 1:7a568319eeb7 176 // Function prototypes --------------------------------------------------------
kenjiArai 1:7a568319eeb7 177 #if (MBED_MAJOR_VERSION == 2)
kenjiArai 1:7a568319eeb7 178 extern SDFileSystem fs;
kenjiArai 1:7a568319eeb7 179 #elif (MBED_MAJOR_VERSION == 5)
kenjiArai 1:7a568319eeb7 180 extern USBSerial *usb_ser;
kenjiArai 1:7a568319eeb7 181 extern HeapBlockDevice bd;
kenjiArai 1:7a568319eeb7 182 extern FATFileSystem fs;
kenjiArai 1:7a568319eeb7 183 #endif
kenjiArai 1:7a568319eeb7 184
kenjiArai 1:7a568319eeb7 185 static void extended_mon( char *ptr );
kenjiArai 1:7a568319eeb7 186 static void v_next( char *ptr );
kenjiArai 1:7a568319eeb7 187 static void d_next( char *ptr );
kenjiArai 1:7a568319eeb7 188 static void c_next( char *ptr );
kenjiArai 1:7a568319eeb7 189 static void m_next( char *ptr );
kenjiArai 1:7a568319eeb7 190 static void r_next( char *ptr );
kenjiArai 1:7a568319eeb7 191 static void t_next( char *ptr );
kenjiArai 1:7a568319eeb7 192 static void memory_inf(char *ptr);
kenjiArai 1:7a568319eeb7 193 static void disk_inf(char *ptr);
kenjiArai 1:7a568319eeb7 194
kenjiArai 1:7a568319eeb7 195 static void crlf( void );
kenjiArai 1:7a568319eeb7 196 static FRESULT scan_files( char* path );
kenjiArai 1:7a568319eeb7 197 static void put_rc( FRESULT rc );
kenjiArai 1:7a568319eeb7 198 static void file_inf( char *ptr );
kenjiArai 1:7a568319eeb7 199 static void put_dump( void* buff, unsigned long addr, int len, int width );
kenjiArai 1:7a568319eeb7 200 static void chk_and_set_time(char *ptr);
kenjiArai 1:7a568319eeb7 201 static int xatoi ( char **str, long *res );
kenjiArai 1:7a568319eeb7 202
kenjiArai 1:7a568319eeb7 203 void get_line (char *buff, int len);
kenjiArai 1:7a568319eeb7 204
kenjiArai 1:7a568319eeb7 205 // Object ---------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 206 extern Serial pc;
kenjiArai 1:7a568319eeb7 207 Timer t;
kenjiArai 1:7a568319eeb7 208
kenjiArai 1:7a568319eeb7 209 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 210 // Control Program
kenjiArai 1:7a568319eeb7 211 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 212 // Monitor program for File control
kenjiArai 1:7a568319eeb7 213 void mon ()
kenjiArai 1:7a568319eeb7 214 {
kenjiArai 1:7a568319eeb7 215 char *ptr;
kenjiArai 1:7a568319eeb7 216
kenjiArai 1:7a568319eeb7 217 Dirx = new FATFS_DIR;
kenjiArai 1:7a568319eeb7 218 /* Open Uart to communicate with Host PC */
kenjiArai 1:7a568319eeb7 219 PUTS(monmsg0);
kenjiArai 1:7a568319eeb7 220 PUTS(monmsg1);
kenjiArai 1:7a568319eeb7 221 crlf();
kenjiArai 1:7a568319eeb7 222 for (;;) {
kenjiArai 1:7a568319eeb7 223 DEBUG_LINE
kenjiArai 1:7a568319eeb7 224 PUTC('>');
kenjiArai 1:7a568319eeb7 225 ptr = Linebuf;
kenjiArai 1:7a568319eeb7 226 get_line( ptr, sizeof(Linebuf) );
kenjiArai 1:7a568319eeb7 227 switch ( *ptr++ ) {
kenjiArai 1:7a568319eeb7 228 // vol
kenjiArai 1:7a568319eeb7 229 case 'v' :
kenjiArai 1:7a568319eeb7 230 v_next(ptr);
kenjiArai 1:7a568319eeb7 231 break;
kenjiArai 1:7a568319eeb7 232 // dir
kenjiArai 1:7a568319eeb7 233 case 'd' :
kenjiArai 1:7a568319eeb7 234 d_next(ptr);
kenjiArai 1:7a568319eeb7 235 break;
kenjiArai 1:7a568319eeb7 236 // cd, copy
kenjiArai 1:7a568319eeb7 237 case 'c' :
kenjiArai 1:7a568319eeb7 238 c_next(ptr);
kenjiArai 1:7a568319eeb7 239 break;
kenjiArai 1:7a568319eeb7 240 // mkdir
kenjiArai 1:7a568319eeb7 241 case 'm' :
kenjiArai 1:7a568319eeb7 242 m_next(ptr);
kenjiArai 1:7a568319eeb7 243 break;
kenjiArai 1:7a568319eeb7 244 // ren
kenjiArai 1:7a568319eeb7 245 case 'r' :
kenjiArai 1:7a568319eeb7 246 r_next(ptr);
kenjiArai 1:7a568319eeb7 247 break;
kenjiArai 1:7a568319eeb7 248 case 't' :
kenjiArai 1:7a568319eeb7 249 t_next(ptr);
kenjiArai 1:7a568319eeb7 250 break;
kenjiArai 1:7a568319eeb7 251 case 'x' :
kenjiArai 1:7a568319eeb7 252 // so many bugs in extended monitor
kenjiArai 1:7a568319eeb7 253 //extended_mon(ptr);
kenjiArai 1:7a568319eeb7 254 PRINTF("Not support!\r\n");
kenjiArai 1:7a568319eeb7 255 break;
kenjiArai 1:7a568319eeb7 256 // Help
kenjiArai 1:7a568319eeb7 257 case '?' :
kenjiArai 1:7a568319eeb7 258 PUTS(HelpMsg0);
kenjiArai 1:7a568319eeb7 259 break;
kenjiArai 1:7a568319eeb7 260 // Exit monitor (return to main())
kenjiArai 1:7a568319eeb7 261 case 'q' :
kenjiArai 1:7a568319eeb7 262 PUTS("Return to main\r\n");
kenjiArai 1:7a568319eeb7 263 return;
kenjiArai 1:7a568319eeb7 264 // Not a command
kenjiArai 1:7a568319eeb7 265 default:
kenjiArai 1:7a568319eeb7 266 PUTS("? [HELP]=?");
kenjiArai 1:7a568319eeb7 267 crlf();
kenjiArai 1:7a568319eeb7 268 break;
kenjiArai 1:7a568319eeb7 269 }
kenjiArai 1:7a568319eeb7 270 }
kenjiArai 1:7a568319eeb7 271 }
kenjiArai 1:7a568319eeb7 272
kenjiArai 1:7a568319eeb7 273 uint32_t get_disk_freespace(void)
kenjiArai 1:7a568319eeb7 274 {
kenjiArai 1:7a568319eeb7 275 long p1;
kenjiArai 1:7a568319eeb7 276 UINT s1, s2;
kenjiArai 1:7a568319eeb7 277 FATFS *fs;
kenjiArai 1:7a568319eeb7 278 BYTE res;
kenjiArai 1:7a568319eeb7 279
kenjiArai 1:7a568319eeb7 280 if (Dirx == NULL){
kenjiArai 1:7a568319eeb7 281 Dirx = new FATFS_DIR;
kenjiArai 1:7a568319eeb7 282 }
kenjiArai 1:7a568319eeb7 283 char p = NULL;
kenjiArai 1:7a568319eeb7 284 res = f_opendir(Dirx, &p);
kenjiArai 1:7a568319eeb7 285 if (res) {
kenjiArai 1:7a568319eeb7 286 return 0;
kenjiArai 1:7a568319eeb7 287 }
kenjiArai 1:7a568319eeb7 288 p1 = s1 = s2 = 0;
kenjiArai 1:7a568319eeb7 289 for(;;) {
kenjiArai 1:7a568319eeb7 290 res = f_readdir(Dirx, &Finfo);
kenjiArai 1:7a568319eeb7 291 if ((res != FR_OK) || !Finfo.fname[0]) break;
kenjiArai 1:7a568319eeb7 292 if (Finfo.fattrib & AM_DIR) {
kenjiArai 1:7a568319eeb7 293 s2++;
kenjiArai 1:7a568319eeb7 294 } else {
kenjiArai 1:7a568319eeb7 295 s1++;
kenjiArai 1:7a568319eeb7 296 p1 += Finfo.fsize;
kenjiArai 1:7a568319eeb7 297 }
kenjiArai 1:7a568319eeb7 298 }
kenjiArai 1:7a568319eeb7 299 res = f_getfree(&p, (DWORD*)&p1, &fs);
kenjiArai 1:7a568319eeb7 300 uint32_t size = p1 * fs->csize * 512;
kenjiArai 1:7a568319eeb7 301 if (res == FR_OK) {
kenjiArai 1:7a568319eeb7 302 return size;
kenjiArai 1:7a568319eeb7 303 } else {
kenjiArai 1:7a568319eeb7 304 return 0;
kenjiArai 1:7a568319eeb7 305 }
kenjiArai 1:7a568319eeb7 306 }
kenjiArai 1:7a568319eeb7 307
kenjiArai 1:7a568319eeb7 308 uint32_t get_data_file_size(const char *const file_name)
kenjiArai 1:7a568319eeb7 309 {
kenjiArai 1:7a568319eeb7 310 BYTE res;
kenjiArai 1:7a568319eeb7 311 //const char *file_name ="acc_data.txt";
kenjiArai 1:7a568319eeb7 312
kenjiArai 1:7a568319eeb7 313 if (Dirx == NULL){
kenjiArai 1:7a568319eeb7 314 Dirx = new FATFS_DIR;
kenjiArai 1:7a568319eeb7 315 }
kenjiArai 1:7a568319eeb7 316 char p = NULL;
kenjiArai 1:7a568319eeb7 317 res = f_opendir(Dirx, &p);
kenjiArai 1:7a568319eeb7 318 if (res) {
kenjiArai 1:7a568319eeb7 319 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 320 return 0;
kenjiArai 1:7a568319eeb7 321 }
kenjiArai 1:7a568319eeb7 322 for(;;) {
kenjiArai 1:7a568319eeb7 323 res = f_readdir(Dirx, &Finfo);
kenjiArai 1:7a568319eeb7 324 if ((res != FR_OK) || !Finfo.fname[0]) break;
kenjiArai 1:7a568319eeb7 325 if (strcmp(Finfo.fname, file_name) == 0){
kenjiArai 1:7a568319eeb7 326 return Finfo.fsize;
kenjiArai 1:7a568319eeb7 327 }
kenjiArai 1:7a568319eeb7 328 }
kenjiArai 1:7a568319eeb7 329 return 0;
kenjiArai 1:7a568319eeb7 330 }
kenjiArai 1:7a568319eeb7 331
kenjiArai 1:7a568319eeb7 332 static void extended_mon( char *ptr )
kenjiArai 1:7a568319eeb7 333 {
kenjiArai 1:7a568319eeb7 334 PUTS(HelpMsg1);
kenjiArai 1:7a568319eeb7 335 while(true) {
kenjiArai 1:7a568319eeb7 336 PUTS("e>");
kenjiArai 1:7a568319eeb7 337 ptr = Linebuf;
kenjiArai 1:7a568319eeb7 338 get_line( ptr, sizeof(Linebuf) );
kenjiArai 1:7a568319eeb7 339 switch ( *ptr++ ) {
kenjiArai 1:7a568319eeb7 340 case 'f' :
kenjiArai 1:7a568319eeb7 341 DEBUG_LINE;
kenjiArai 1:7a568319eeb7 342 file_inf(ptr);
kenjiArai 1:7a568319eeb7 343 break;
kenjiArai 1:7a568319eeb7 344 case 'd' :
kenjiArai 1:7a568319eeb7 345 DEBUG_LINE;
kenjiArai 1:7a568319eeb7 346 disk_inf(ptr);
kenjiArai 1:7a568319eeb7 347 break;
kenjiArai 1:7a568319eeb7 348 case 'm' :
kenjiArai 1:7a568319eeb7 349 DEBUG_LINE;
kenjiArai 1:7a568319eeb7 350 memory_inf(ptr);
kenjiArai 1:7a568319eeb7 351 break;
kenjiArai 1:7a568319eeb7 352 case '?' :
kenjiArai 1:7a568319eeb7 353 DEBUG_LINE;
kenjiArai 1:7a568319eeb7 354 PUTS(HelpMsg1);
kenjiArai 1:7a568319eeb7 355 break;
kenjiArai 1:7a568319eeb7 356 case 'q' :
kenjiArai 1:7a568319eeb7 357 DEBUG_LINE;
kenjiArai 1:7a568319eeb7 358 return;
kenjiArai 1:7a568319eeb7 359 default:
kenjiArai 1:7a568319eeb7 360 PUTS( "?\r\n" );
kenjiArai 1:7a568319eeb7 361 }
kenjiArai 1:7a568319eeb7 362 }
kenjiArai 1:7a568319eeb7 363 }
kenjiArai 1:7a568319eeb7 364
kenjiArai 1:7a568319eeb7 365 //------------------------------------------------------------------------------
kenjiArai 1:7a568319eeb7 366 // General monitor functions
kenjiArai 1:7a568319eeb7 367 static void v_next( char *ptr )
kenjiArai 1:7a568319eeb7 368 {
kenjiArai 1:7a568319eeb7 369 switch ( *ptr++ ) {
kenjiArai 1:7a568319eeb7 370 case 'o' :
kenjiArai 1:7a568319eeb7 371 if (*ptr == 'l') {
kenjiArai 1:7a568319eeb7 372 *ptr = 's';
kenjiArai 1:7a568319eeb7 373 file_inf(ptr); // fs [<path>] - Show volume status
kenjiArai 1:7a568319eeb7 374 }
kenjiArai 1:7a568319eeb7 375 break;
kenjiArai 1:7a568319eeb7 376 default:
kenjiArai 1:7a568319eeb7 377 PUTS( "?\r\n" );
kenjiArai 1:7a568319eeb7 378 }
kenjiArai 1:7a568319eeb7 379 }
kenjiArai 1:7a568319eeb7 380
kenjiArai 1:7a568319eeb7 381 static void d_next(char *ptr)
kenjiArai 1:7a568319eeb7 382 {
kenjiArai 1:7a568319eeb7 383 switch ( *ptr++ ) {
kenjiArai 1:7a568319eeb7 384 case 'i' :
kenjiArai 1:7a568319eeb7 385 if (*ptr == 'r') {
kenjiArai 1:7a568319eeb7 386 *ptr = 'l';
kenjiArai 1:7a568319eeb7 387 file_inf(ptr); // fl [<path>] - Directory listing
kenjiArai 1:7a568319eeb7 388 }
kenjiArai 1:7a568319eeb7 389 break;
kenjiArai 1:7a568319eeb7 390 default:
kenjiArai 1:7a568319eeb7 391 PUTS( "?\r\n" );
kenjiArai 1:7a568319eeb7 392 }
kenjiArai 1:7a568319eeb7 393 }
kenjiArai 1:7a568319eeb7 394
kenjiArai 1:7a568319eeb7 395 static void c_next(char *ptr)
kenjiArai 1:7a568319eeb7 396 {
kenjiArai 1:7a568319eeb7 397 switch ( *ptr++ ) {
kenjiArai 1:7a568319eeb7 398 case 'o' :
kenjiArai 1:7a568319eeb7 399 if ((*ptr == 'p') && (*(ptr + 1) == 'y')) {
kenjiArai 1:7a568319eeb7 400 ptr++;
kenjiArai 1:7a568319eeb7 401 *ptr = 'x';
kenjiArai 1:7a568319eeb7 402 file_inf(ptr); // fx <src_name> <dst_name> - Copy file
kenjiArai 1:7a568319eeb7 403 }
kenjiArai 1:7a568319eeb7 404 break;
kenjiArai 1:7a568319eeb7 405 case 'd' :
kenjiArai 1:7a568319eeb7 406 *ptr = 'g';
kenjiArai 1:7a568319eeb7 407 file_inf(ptr); // fx <src_name> <dst_name> - Copy file
kenjiArai 1:7a568319eeb7 408 break;
kenjiArai 1:7a568319eeb7 409 default:
kenjiArai 1:7a568319eeb7 410 PUTS( "?\r\n" );
kenjiArai 1:7a568319eeb7 411 }
kenjiArai 1:7a568319eeb7 412 }
kenjiArai 1:7a568319eeb7 413
kenjiArai 1:7a568319eeb7 414 static void m_next(char *ptr)
kenjiArai 1:7a568319eeb7 415 {
kenjiArai 1:7a568319eeb7 416 switch ( *ptr++ ) {
kenjiArai 1:7a568319eeb7 417 case 'k' :
kenjiArai 1:7a568319eeb7 418 if ((*ptr == 'd') && (*(ptr + 1) == 'i') && (*(ptr + 2) == 'r')) {
kenjiArai 1:7a568319eeb7 419 ptr += 2;
kenjiArai 1:7a568319eeb7 420 *ptr = 'k';
kenjiArai 1:7a568319eeb7 421 file_inf(ptr); // fk <name> - Create a directory
kenjiArai 1:7a568319eeb7 422 }
kenjiArai 1:7a568319eeb7 423 break;
kenjiArai 1:7a568319eeb7 424 default:
kenjiArai 1:7a568319eeb7 425 PUTS("?\r\n");
kenjiArai 1:7a568319eeb7 426 }
kenjiArai 1:7a568319eeb7 427 }
kenjiArai 1:7a568319eeb7 428
kenjiArai 1:7a568319eeb7 429 static void r_next(char *ptr)
kenjiArai 1:7a568319eeb7 430 {
kenjiArai 1:7a568319eeb7 431 switch (*ptr++) {
kenjiArai 1:7a568319eeb7 432 case 'e' :
kenjiArai 1:7a568319eeb7 433 if (*ptr == 'n') {
kenjiArai 1:7a568319eeb7 434 // fn <old_name> <new_name> - Change file/dir name
kenjiArai 1:7a568319eeb7 435 file_inf(ptr);
kenjiArai 1:7a568319eeb7 436 }
kenjiArai 1:7a568319eeb7 437 break;
kenjiArai 1:7a568319eeb7 438 default:
kenjiArai 1:7a568319eeb7 439 PUTS("?\r\n");
kenjiArai 1:7a568319eeb7 440 }
kenjiArai 1:7a568319eeb7 441 }
kenjiArai 1:7a568319eeb7 442
kenjiArai 1:7a568319eeb7 443 static void t_next(char *ptr)
kenjiArai 1:7a568319eeb7 444 {
kenjiArai 1:7a568319eeb7 445 switch (*ptr++) {
kenjiArai 1:7a568319eeb7 446 case ' ' :
kenjiArai 1:7a568319eeb7 447 case 0x0d:
kenjiArai 1:7a568319eeb7 448 chk_and_set_time(ptr);
kenjiArai 1:7a568319eeb7 449 case 'y' :
kenjiArai 1:7a568319eeb7 450 if ((*ptr == 'p') && (*(ptr + 1) == 'e')) {
kenjiArai 1:7a568319eeb7 451 ptr++;
kenjiArai 1:7a568319eeb7 452 *ptr = '&';
kenjiArai 1:7a568319eeb7 453 file_inf(ptr);
kenjiArai 1:7a568319eeb7 454 }
kenjiArai 1:7a568319eeb7 455 break;
kenjiArai 1:7a568319eeb7 456 default:
kenjiArai 1:7a568319eeb7 457 PUTS("?\r\n");
kenjiArai 1:7a568319eeb7 458 }
kenjiArai 1:7a568319eeb7 459 }
kenjiArai 1:7a568319eeb7 460
kenjiArai 1:7a568319eeb7 461 static FRESULT scan_files (
kenjiArai 1:7a568319eeb7 462 char* path /* Pointer to the path name working buffer */
kenjiArai 1:7a568319eeb7 463 )
kenjiArai 1:7a568319eeb7 464 {
kenjiArai 1:7a568319eeb7 465 FATFS_DIR dirs;
kenjiArai 1:7a568319eeb7 466 FRESULT res;
kenjiArai 1:7a568319eeb7 467 BYTE i;
kenjiArai 1:7a568319eeb7 468 char *fn;
kenjiArai 1:7a568319eeb7 469
kenjiArai 1:7a568319eeb7 470 if ((res = f_opendir(&dirs, path)) == FR_OK) {
kenjiArai 1:7a568319eeb7 471 i = strlen(path);
kenjiArai 1:7a568319eeb7 472 PRINTF("path: %s, n=%u\r\n", path, i);
kenjiArai 1:7a568319eeb7 473 while (((res = f_readdir(&dirs, &Finfo)) == FR_OK) && Finfo.fname[0]) {
kenjiArai 1:7a568319eeb7 474 if (FF_FS_RPATH && Finfo.fname[0] == '.') {
kenjiArai 1:7a568319eeb7 475 continue;
kenjiArai 1:7a568319eeb7 476 }
kenjiArai 1:7a568319eeb7 477 fn = Finfo.fname;
kenjiArai 1:7a568319eeb7 478 if (Finfo.fattrib & AM_DIR) {
kenjiArai 1:7a568319eeb7 479 AccDirs++;
kenjiArai 1:7a568319eeb7 480 *(path+i) = '/';
kenjiArai 1:7a568319eeb7 481 strcpy(path+i+1, fn);
kenjiArai 1:7a568319eeb7 482 res = scan_files(path);
kenjiArai 1:7a568319eeb7 483 *(path+i) = '\0';
kenjiArai 1:7a568319eeb7 484 if (res != FR_OK) break;
kenjiArai 1:7a568319eeb7 485 } else {
kenjiArai 1:7a568319eeb7 486 PRINTF("%s/%s\r\n", path, fn);
kenjiArai 1:7a568319eeb7 487 AccFiles++;
kenjiArai 1:7a568319eeb7 488 AccSize += Finfo.fsize;
kenjiArai 1:7a568319eeb7 489 }
kenjiArai 1:7a568319eeb7 490 }
kenjiArai 1:7a568319eeb7 491 }
kenjiArai 1:7a568319eeb7 492 return res;
kenjiArai 1:7a568319eeb7 493 }
kenjiArai 1:7a568319eeb7 494
kenjiArai 1:7a568319eeb7 495 static void put_rc (FRESULT rc)
kenjiArai 1:7a568319eeb7 496 {
kenjiArai 1:7a568319eeb7 497 const char *str =
kenjiArai 1:7a568319eeb7 498 "OK\0" "DISK_ERR\0" "INT_ERR\0" "NOT_READY\0" "NO_FILE\0" "NO_PATH\0"
kenjiArai 1:7a568319eeb7 499 "INVALID_NAME\0" "DENIED\0" "EXIST\0" "INVALID_OBJECT\0"
kenjiArai 1:7a568319eeb7 500 "WRITE_PROTECTED\0" "INVALID_DRIVE\0" "NOT_ENABLED\0"
kenjiArai 1:7a568319eeb7 501 "NO_FILE_SYSTEM\0" "MKFS_ABORTED\0" "TIMEOUT\0"
kenjiArai 1:7a568319eeb7 502 "LOCKED\0" "NOT_ENOUGH_CORE\0" "TOO_MANY_OPEN_FILES\0";
kenjiArai 1:7a568319eeb7 503 int i;
kenjiArai 1:7a568319eeb7 504
kenjiArai 1:7a568319eeb7 505 for ( i = 0; i != rc && *str; i++ ) {
kenjiArai 1:7a568319eeb7 506 while ( *str++ ) {
kenjiArai 1:7a568319eeb7 507 ;
kenjiArai 1:7a568319eeb7 508 }
kenjiArai 1:7a568319eeb7 509 }
kenjiArai 1:7a568319eeb7 510 PRINTF( "rc=%u FR_%s\r\n", (UINT)rc, str );
kenjiArai 1:7a568319eeb7 511 }
kenjiArai 1:7a568319eeb7 512
kenjiArai 1:7a568319eeb7 513 static void file_inf(char *ptr)
kenjiArai 1:7a568319eeb7 514 {
kenjiArai 1:7a568319eeb7 515 long p1, p2, p3;
kenjiArai 1:7a568319eeb7 516 CHAR *ptr2;
kenjiArai 1:7a568319eeb7 517 BYTE f_res;
kenjiArai 1:7a568319eeb7 518 UINT s1, s2, cnt, blen = sizeof Buff;
kenjiArai 1:7a568319eeb7 519 FATFS *fs;
kenjiArai 1:7a568319eeb7 520 static const BYTE ft[] = {0, 12, 16, 32};
kenjiArai 1:7a568319eeb7 521 BYTE res;
kenjiArai 1:7a568319eeb7 522 DWORD ofs = 0;
kenjiArai 1:7a568319eeb7 523 uint32_t tim;
kenjiArai 1:7a568319eeb7 524
kenjiArai 1:7a568319eeb7 525 switch (*ptr++) {
kenjiArai 1:7a568319eeb7 526 case '&' :
kenjiArai 1:7a568319eeb7 527 DEBUG_LINE;
kenjiArai 1:7a568319eeb7 528 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 529 /* Open a file */
kenjiArai 1:7a568319eeb7 530 f_res = f_open(&File1, ptr, FA_READ);
kenjiArai 1:7a568319eeb7 531 if ( f_res ) {
kenjiArai 1:7a568319eeb7 532 put_rc((FRESULT)f_res);
kenjiArai 1:7a568319eeb7 533 break;
kenjiArai 1:7a568319eeb7 534 }
kenjiArai 1:7a568319eeb7 535 DEBUG_LINE;
kenjiArai 1:7a568319eeb7 536 /* Read all lines and display it */
kenjiArai 1:7a568319eeb7 537 while(true) {
kenjiArai 1:7a568319eeb7 538 f_res = f_read(&File1, (TCHAR*)Buff, blen, &cnt);
kenjiArai 1:7a568319eeb7 539 if ( f_res ) {
kenjiArai 1:7a568319eeb7 540 put_rc((FRESULT)f_res);
kenjiArai 1:7a568319eeb7 541 break;
kenjiArai 1:7a568319eeb7 542 }
kenjiArai 1:7a568319eeb7 543 for (s1 = 0; s1 < cnt; s1++) {
kenjiArai 1:7a568319eeb7 544 PUTC(Buff[s1]);
kenjiArai 1:7a568319eeb7 545 }
kenjiArai 1:7a568319eeb7 546 if (cnt != blen) {
kenjiArai 1:7a568319eeb7 547 break;
kenjiArai 1:7a568319eeb7 548 }
kenjiArai 1:7a568319eeb7 549 }
kenjiArai 1:7a568319eeb7 550 DEBUG_LINE;
kenjiArai 1:7a568319eeb7 551 /* Close the file */
kenjiArai 1:7a568319eeb7 552 f_close(&File1);
kenjiArai 1:7a568319eeb7 553 break;
kenjiArai 1:7a568319eeb7 554
kenjiArai 1:7a568319eeb7 555 case 'i' : /* fi [<opt>]- Initialize logical drive */
kenjiArai 1:7a568319eeb7 556 if ( !xatoi(&ptr, &p1) ) {
kenjiArai 1:7a568319eeb7 557 break;
kenjiArai 1:7a568319eeb7 558 }
kenjiArai 1:7a568319eeb7 559 if (!xatoi(&ptr, &p2)) p2 = 0;
kenjiArai 1:7a568319eeb7 560 put_rc(f_mount(&Fatfs[p1], (const TCHAR*)p1, 0));
kenjiArai 1:7a568319eeb7 561 break;
kenjiArai 1:7a568319eeb7 562
kenjiArai 1:7a568319eeb7 563 case 's' : /* fs [<path>] - Show volume status */
kenjiArai 1:7a568319eeb7 564 f_res = f_getfree( ptr, (DWORD*)&p2, &fs );
kenjiArai 1:7a568319eeb7 565 if ( f_res ) {
kenjiArai 1:7a568319eeb7 566 put_rc((FRESULT)f_res);
kenjiArai 1:7a568319eeb7 567 break;
kenjiArai 1:7a568319eeb7 568 }
kenjiArai 1:7a568319eeb7 569 PRINTF
kenjiArai 1:7a568319eeb7 570 (
kenjiArai 1:7a568319eeb7 571 "\rFAT type = FAT%u\r\nBytes/Cluster"
kenjiArai 1:7a568319eeb7 572 " = %lu\r\nNumber of FATs = %u\r\n"
kenjiArai 1:7a568319eeb7 573 "Root DIR entries = %u\r\n"
kenjiArai 1:7a568319eeb7 574 "Sectors/FAT = %lu\r\n"
kenjiArai 1:7a568319eeb7 575 "Number of clusters = %lu\r\n"
kenjiArai 1:7a568319eeb7 576 "FAT start (lba) = %lu\r\n"
kenjiArai 1:7a568319eeb7 577 "DIR start (lba,clustor) = %lu\r\n"
kenjiArai 1:7a568319eeb7 578 "Data start (lba) = %lu\r\n",
kenjiArai 1:7a568319eeb7 579 ft[fs->fs_type & 3], (DWORD)fs->csize * 512, fs->n_fats,
kenjiArai 1:7a568319eeb7 580 fs->n_rootdir, fs->fsize, (DWORD)fs->n_fatent - 2,
kenjiArai 1:7a568319eeb7 581 fs->fatbase, fs->dirbase, fs->database
kenjiArai 1:7a568319eeb7 582 );
kenjiArai 1:7a568319eeb7 583 AccSize = AccFiles = AccDirs = 0;
kenjiArai 1:7a568319eeb7 584 break;
kenjiArai 1:7a568319eeb7 585 case 'l' : /* fl [<path>] - Directory listing */
kenjiArai 1:7a568319eeb7 586 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 587 res = f_opendir(Dirx, ptr);
kenjiArai 1:7a568319eeb7 588 if (res) {
kenjiArai 1:7a568319eeb7 589 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 590 break;
kenjiArai 1:7a568319eeb7 591 }
kenjiArai 1:7a568319eeb7 592 p1 = s1 = s2 = 0;
kenjiArai 1:7a568319eeb7 593 for(;;) {
kenjiArai 1:7a568319eeb7 594 res = f_readdir(Dirx, &Finfo);
kenjiArai 1:7a568319eeb7 595 if ((res != FR_OK) || !Finfo.fname[0]) break;
kenjiArai 1:7a568319eeb7 596 if (Finfo.fattrib & AM_DIR) {
kenjiArai 1:7a568319eeb7 597 s2++;
kenjiArai 1:7a568319eeb7 598 } else {
kenjiArai 1:7a568319eeb7 599 s1++;
kenjiArai 1:7a568319eeb7 600 p1 += Finfo.fsize;
kenjiArai 1:7a568319eeb7 601 }
kenjiArai 1:7a568319eeb7 602 PRINTF("%c%c%c%c%c %u/%02u/%02u %02u:%02u %9lu %s\r\n",
kenjiArai 1:7a568319eeb7 603 (Finfo.fattrib & AM_DIR) ? 'D' : '-',
kenjiArai 1:7a568319eeb7 604 (Finfo.fattrib & AM_RDO) ? 'R' : '-',
kenjiArai 1:7a568319eeb7 605 (Finfo.fattrib & AM_HID) ? 'H' : '-',
kenjiArai 1:7a568319eeb7 606 (Finfo.fattrib & AM_SYS) ? 'S' : '-',
kenjiArai 1:7a568319eeb7 607 (Finfo.fattrib & AM_ARC) ? 'A' : '-',
kenjiArai 1:7a568319eeb7 608 (Finfo.fdate >> 9) + 1980, (Finfo.fdate >> 5) & 15,
kenjiArai 1:7a568319eeb7 609 Finfo.fdate & 31,
kenjiArai 1:7a568319eeb7 610 (Finfo.ftime >> 11), (Finfo.ftime >> 5) & 63,
kenjiArai 1:7a568319eeb7 611 Finfo.fsize, Finfo.fname);
kenjiArai 1:7a568319eeb7 612 }
kenjiArai 1:7a568319eeb7 613 #if 0 // f_getfree cannnot count under Dir, subdirectory area
kenjiArai 1:7a568319eeb7 614 PRINTF("%4u File(s),%10lu bytes total\r\n%4u Dir(s)", s1, p1, s2);
kenjiArai 1:7a568319eeb7 615 res = f_getfree(ptr, (DWORD*)&p1, &fs);
kenjiArai 1:7a568319eeb7 616 if (res == FR_OK)
kenjiArai 1:7a568319eeb7 617 PRINTF(", %10lu bytes free\r\n", p1 * fs->csize * 512);
kenjiArai 1:7a568319eeb7 618 else
kenjiArai 1:7a568319eeb7 619 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 620 #else
kenjiArai 1:7a568319eeb7 621 PRINTF("%4u File(s) = %10lu bytes total, %4u Dir(s)\r\n",
kenjiArai 1:7a568319eeb7 622 s1, p1, s2);
kenjiArai 1:7a568319eeb7 623 #endif
kenjiArai 1:7a568319eeb7 624 break;
kenjiArai 1:7a568319eeb7 625
kenjiArai 1:7a568319eeb7 626 case 'o' : /* fo <mode> <file> - Open a file */
kenjiArai 1:7a568319eeb7 627 if (!xatoi(&ptr, &p1)) break;
kenjiArai 1:7a568319eeb7 628 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 629 put_rc(f_open(&File1, ptr, (BYTE)p1));
kenjiArai 1:7a568319eeb7 630 #if 0
kenjiArai 1:7a568319eeb7 631 put_rc(f_open(&File1, "savedata.txt", 1));
kenjiArai 1:7a568319eeb7 632 PRINTF("Open savedata.txt as read mode\r\n");
kenjiArai 1:7a568319eeb7 633 #endif
kenjiArai 1:7a568319eeb7 634 break;
kenjiArai 1:7a568319eeb7 635
kenjiArai 1:7a568319eeb7 636 case 'c' : /* fc - Close a file */
kenjiArai 1:7a568319eeb7 637 put_rc(f_close(&File1));
kenjiArai 1:7a568319eeb7 638 break;
kenjiArai 1:7a568319eeb7 639
kenjiArai 1:7a568319eeb7 640 case 'e' : /* fe - Seek file pointer */
kenjiArai 1:7a568319eeb7 641 if (!xatoi(&ptr, &p1)) break;
kenjiArai 1:7a568319eeb7 642 res = f_lseek(&File1, p1);
kenjiArai 1:7a568319eeb7 643 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 644 if (res == FR_OK)
kenjiArai 1:7a568319eeb7 645 PRINTF("fptr=%lu(0x%lX)\r\n", File1.fptr, File1.fptr);
kenjiArai 1:7a568319eeb7 646 break;
kenjiArai 1:7a568319eeb7 647
kenjiArai 1:7a568319eeb7 648 case 'd' : /* fd <len> - read and dump file from current fp */
kenjiArai 1:7a568319eeb7 649 if (!xatoi(&ptr, &p1)) break;
kenjiArai 1:7a568319eeb7 650 ofs = File1.fptr;
kenjiArai 1:7a568319eeb7 651 while (p1) {
kenjiArai 1:7a568319eeb7 652 if ((UINT)p1 >= 16) {
kenjiArai 1:7a568319eeb7 653 cnt = 16;
kenjiArai 1:7a568319eeb7 654 p1 -= 16;
kenjiArai 1:7a568319eeb7 655 } else {
kenjiArai 1:7a568319eeb7 656 cnt = p1;
kenjiArai 1:7a568319eeb7 657 p1 = 0;
kenjiArai 1:7a568319eeb7 658 }
kenjiArai 1:7a568319eeb7 659 res = f_read(&File1, Buff, cnt, &cnt);
kenjiArai 1:7a568319eeb7 660 if (res != FR_OK) {
kenjiArai 1:7a568319eeb7 661 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 662 break;
kenjiArai 1:7a568319eeb7 663 }
kenjiArai 1:7a568319eeb7 664 if (!cnt) break;
kenjiArai 1:7a568319eeb7 665 put_dump(Buff, ofs, cnt, DW_CHAR);
kenjiArai 1:7a568319eeb7 666 ofs += 16;
kenjiArai 1:7a568319eeb7 667 }
kenjiArai 1:7a568319eeb7 668 break;
kenjiArai 1:7a568319eeb7 669
kenjiArai 1:7a568319eeb7 670 case 'r' : /* fr <len> - read file */
kenjiArai 1:7a568319eeb7 671 if (!xatoi(&ptr, &p1)) break;
kenjiArai 1:7a568319eeb7 672 p2 = 0;
kenjiArai 1:7a568319eeb7 673 t.reset();
kenjiArai 1:7a568319eeb7 674 t.start();
kenjiArai 1:7a568319eeb7 675 while (p1) {
kenjiArai 1:7a568319eeb7 676 if ((UINT)p1 >= blen) {
kenjiArai 1:7a568319eeb7 677 cnt = blen;
kenjiArai 1:7a568319eeb7 678 p1 -= blen;
kenjiArai 1:7a568319eeb7 679 } else {
kenjiArai 1:7a568319eeb7 680 cnt = p1;
kenjiArai 1:7a568319eeb7 681 p1 = 0;
kenjiArai 1:7a568319eeb7 682 }
kenjiArai 1:7a568319eeb7 683 res = f_read(&File1, Buff, cnt, &s2);
kenjiArai 1:7a568319eeb7 684 if (res != FR_OK) {
kenjiArai 1:7a568319eeb7 685 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 686 break;
kenjiArai 1:7a568319eeb7 687 }
kenjiArai 1:7a568319eeb7 688 p2 += s2;
kenjiArai 1:7a568319eeb7 689 if (cnt != s2) break;
kenjiArai 1:7a568319eeb7 690 }
kenjiArai 1:7a568319eeb7 691 tim = t.read_ms();
kenjiArai 1:7a568319eeb7 692 PRINTF("%lu bytes read with %lu kB/sec.\r\n",
kenjiArai 1:7a568319eeb7 693 p2, tim ? (p2 / tim) : 0);
kenjiArai 1:7a568319eeb7 694 break;
kenjiArai 1:7a568319eeb7 695
kenjiArai 1:7a568319eeb7 696 case 'w' : /* fw <len> <val> - write file */
kenjiArai 1:7a568319eeb7 697 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2)) break;
kenjiArai 1:7a568319eeb7 698 memset(Buff, (BYTE)p2, blen);
kenjiArai 1:7a568319eeb7 699 p2 = 0;
kenjiArai 1:7a568319eeb7 700 t.reset();
kenjiArai 1:7a568319eeb7 701 t.start();
kenjiArai 1:7a568319eeb7 702 while (p1) {
kenjiArai 1:7a568319eeb7 703 if ((UINT)p1 >= blen) {
kenjiArai 1:7a568319eeb7 704 cnt = blen;
kenjiArai 1:7a568319eeb7 705 p1 -= blen;
kenjiArai 1:7a568319eeb7 706 } else {
kenjiArai 1:7a568319eeb7 707 cnt = p1;
kenjiArai 1:7a568319eeb7 708 p1 = 0;
kenjiArai 1:7a568319eeb7 709 }
kenjiArai 1:7a568319eeb7 710 res = f_write(&File1, Buff, cnt, &s2);
kenjiArai 1:7a568319eeb7 711 if (res != FR_OK) {
kenjiArai 1:7a568319eeb7 712 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 713 break;
kenjiArai 1:7a568319eeb7 714 }
kenjiArai 1:7a568319eeb7 715 p2 += s2;
kenjiArai 1:7a568319eeb7 716 if (cnt != s2) break;
kenjiArai 1:7a568319eeb7 717 }
kenjiArai 1:7a568319eeb7 718 tim = t.read_ms();
kenjiArai 1:7a568319eeb7 719 PRINTF("%lu bytes written with %lu kB/sec.\r\n",
kenjiArai 1:7a568319eeb7 720 p2, tim ? (p2 / tim) : 0);
kenjiArai 1:7a568319eeb7 721 break;
kenjiArai 1:7a568319eeb7 722
kenjiArai 1:7a568319eeb7 723 case 'n' : /* fn <org.name> <new.name> - Change name of an object */
kenjiArai 1:7a568319eeb7 724 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 725 ptr2 = strchr(ptr, ' ');
kenjiArai 1:7a568319eeb7 726 if (!ptr2) break;
kenjiArai 1:7a568319eeb7 727 *ptr2++ = 0;
kenjiArai 1:7a568319eeb7 728 while (*ptr2 == ' ') ptr2++;
kenjiArai 1:7a568319eeb7 729 put_rc(f_rename(ptr, ptr2));
kenjiArai 1:7a568319eeb7 730 break;
kenjiArai 1:7a568319eeb7 731
kenjiArai 1:7a568319eeb7 732 case 'u' : /* fu <name> - Unlink an object */
kenjiArai 1:7a568319eeb7 733 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 734 put_rc(f_unlink(ptr));
kenjiArai 1:7a568319eeb7 735 break;
kenjiArai 1:7a568319eeb7 736
kenjiArai 1:7a568319eeb7 737 case 'v' : /* fv - Truncate file */
kenjiArai 1:7a568319eeb7 738 put_rc(f_truncate(&File1));
kenjiArai 1:7a568319eeb7 739 break;
kenjiArai 1:7a568319eeb7 740
kenjiArai 1:7a568319eeb7 741 case 'k' : /* fk <name> - Create a directory */
kenjiArai 1:7a568319eeb7 742 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 743 put_rc(f_mkdir(ptr));
kenjiArai 1:7a568319eeb7 744 break;
kenjiArai 1:7a568319eeb7 745 #if 0
kenjiArai 1:7a568319eeb7 746 case 'a' : /* fa <atrr> <mask> <name> - Change attribute of an object */
kenjiArai 1:7a568319eeb7 747 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2)) break;
kenjiArai 1:7a568319eeb7 748 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 749 put_rc(f_chmod(ptr, p1, p2));
kenjiArai 1:7a568319eeb7 750 break;
kenjiArai 1:7a568319eeb7 751 #endif
kenjiArai 1:7a568319eeb7 752 #if 0
kenjiArai 1:7a568319eeb7 753 /* ft <year> <month> <day> <hour> <min> <sec> <name>
kenjiArai 1:7a568319eeb7 754 - Change timestamp of an object */
kenjiArai 1:7a568319eeb7 755 case 't' :
kenjiArai 1:7a568319eeb7 756 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2) || !xatoi(&ptr, &p3)) {
kenjiArai 1:7a568319eeb7 757 break;
kenjiArai 1:7a568319eeb7 758 }
kenjiArai 1:7a568319eeb7 759 Finfo.fdate = ((p1 - 1980) << 9) | ((p2 & 15) << 5) | (p3 & 31);
kenjiArai 1:7a568319eeb7 760 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2) || !xatoi(&ptr, &p3)) {
kenjiArai 1:7a568319eeb7 761 break;
kenjiArai 1:7a568319eeb7 762 }
kenjiArai 1:7a568319eeb7 763 Finfo.ftime =
kenjiArai 1:7a568319eeb7 764 ((p1 & 31) << 11) | ((p2 & 63) << 5) | ((p3 >> 1) & 31);
kenjiArai 1:7a568319eeb7 765 put_rc(f_utime(ptr, &Finfo));
kenjiArai 1:7a568319eeb7 766 break;
kenjiArai 1:7a568319eeb7 767 #endif
kenjiArai 1:7a568319eeb7 768 #if FILCPY_NOTUSE == 0
kenjiArai 1:7a568319eeb7 769 case 'x' : /* fx <src_name> <dst_name> - Copy file */
kenjiArai 1:7a568319eeb7 770 while ( *ptr == ' ' ) {
kenjiArai 1:7a568319eeb7 771 ptr++;
kenjiArai 1:7a568319eeb7 772 }
kenjiArai 1:7a568319eeb7 773 ptr2 = strchr( ptr, ' ' );
kenjiArai 1:7a568319eeb7 774 if ( !ptr2 ) {
kenjiArai 1:7a568319eeb7 775 break;
kenjiArai 1:7a568319eeb7 776 }
kenjiArai 1:7a568319eeb7 777 *ptr2++ = 0;
kenjiArai 1:7a568319eeb7 778 while ( *ptr2 == ' ' ) {
kenjiArai 1:7a568319eeb7 779 ptr2++;
kenjiArai 1:7a568319eeb7 780 }
kenjiArai 1:7a568319eeb7 781 f_res = f_open( &File1, ptr, FA_OPEN_EXISTING | FA_READ );
kenjiArai 1:7a568319eeb7 782 PRINTF("Opening %s \r\n", ptr);
kenjiArai 1:7a568319eeb7 783 if ( f_res ) {
kenjiArai 1:7a568319eeb7 784 put_rc( (FRESULT)f_res );
kenjiArai 1:7a568319eeb7 785 break;
kenjiArai 1:7a568319eeb7 786 }
kenjiArai 1:7a568319eeb7 787 f_res = f_open( &File2, ptr2, FA_CREATE_ALWAYS | FA_WRITE );
kenjiArai 1:7a568319eeb7 788 PRINTF(" Creating %s \r\n", ptr2);
kenjiArai 1:7a568319eeb7 789 if ( f_res ) {
kenjiArai 1:7a568319eeb7 790 put_rc( (FRESULT)f_res );
kenjiArai 1:7a568319eeb7 791 f_close( &File1 );
kenjiArai 1:7a568319eeb7 792 break;
kenjiArai 1:7a568319eeb7 793 }
kenjiArai 1:7a568319eeb7 794 PRINTF("Copying file...");
kenjiArai 1:7a568319eeb7 795 p1 = 0;
kenjiArai 1:7a568319eeb7 796 for ( ;; ) {
kenjiArai 1:7a568319eeb7 797 f_res = f_read( &File1, Buff, blen, &s1 );
kenjiArai 1:7a568319eeb7 798 if ( f_res || s1 == 0 ) {
kenjiArai 1:7a568319eeb7 799 break; /* error or eof */
kenjiArai 1:7a568319eeb7 800 }
kenjiArai 1:7a568319eeb7 801 f_res = f_write( &File2, Buff, s1, &s2 );
kenjiArai 1:7a568319eeb7 802 p1 += s2;
kenjiArai 1:7a568319eeb7 803 if ( f_res || s2 < s1 ) {
kenjiArai 1:7a568319eeb7 804 break; /* error or disk full */
kenjiArai 1:7a568319eeb7 805 }
kenjiArai 1:7a568319eeb7 806 }
kenjiArai 1:7a568319eeb7 807 f_close( &File1 );
kenjiArai 1:7a568319eeb7 808 f_close( &File2 );
kenjiArai 1:7a568319eeb7 809 crlf();
kenjiArai 1:7a568319eeb7 810 break;
kenjiArai 1:7a568319eeb7 811 #endif
kenjiArai 1:7a568319eeb7 812 #if 0
kenjiArai 1:7a568319eeb7 813 case 'x' : /* fx <src.name> <dst.name> - Copy a file */
kenjiArai 1:7a568319eeb7 814 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 815 ptr2 = strchr(ptr, ' ');
kenjiArai 1:7a568319eeb7 816 if (!ptr2) break;
kenjiArai 1:7a568319eeb7 817 *ptr2++ = 0;
kenjiArai 1:7a568319eeb7 818 while (*ptr2 == ' ') ptr2++;
kenjiArai 1:7a568319eeb7 819 PRINTF("Opening \"%s\"", ptr);
kenjiArai 1:7a568319eeb7 820 res = f_open(&File1, ptr, FA_OPEN_EXISTING | FA_READ);
kenjiArai 1:7a568319eeb7 821 PUTS("\r\n");
kenjiArai 1:7a568319eeb7 822 if (res) {
kenjiArai 1:7a568319eeb7 823 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 824 break;
kenjiArai 1:7a568319eeb7 825 }
kenjiArai 1:7a568319eeb7 826 PRINTF("Creating \"%s\"", ptr2);
kenjiArai 1:7a568319eeb7 827 res = f_open(&File1, ptr2, FA_CREATE_ALWAYS | FA_WRITE);
kenjiArai 1:7a568319eeb7 828 PUTS("\r\n");
kenjiArai 1:7a568319eeb7 829 if (res) {
kenjiArai 1:7a568319eeb7 830 put_rc((FRESULT)res);
kenjiArai 1:7a568319eeb7 831 f_close(&File1);
kenjiArai 1:7a568319eeb7 832 break;
kenjiArai 1:7a568319eeb7 833 }
kenjiArai 1:7a568319eeb7 834 PRINTF("Copying file...");
kenjiArai 1:7a568319eeb7 835 t.reset();
kenjiArai 1:7a568319eeb7 836 t.start();
kenjiArai 1:7a568319eeb7 837 p1 = 0;
kenjiArai 1:7a568319eeb7 838 for (;;) {
kenjiArai 1:7a568319eeb7 839 res = f_read(&File1, Buff, blen, &s1);
kenjiArai 1:7a568319eeb7 840 if (res || s1 == 0) break; /* error or eof */
kenjiArai 1:7a568319eeb7 841 res = f_write(&File2, Buff, s1, &s2);
kenjiArai 1:7a568319eeb7 842 p1 += s2;
kenjiArai 1:7a568319eeb7 843 if (res || s2 < s1) break; /* error or disk full */
kenjiArai 1:7a568319eeb7 844 }
kenjiArai 1:7a568319eeb7 845 tim = t.read_ms();
kenjiArai 1:7a568319eeb7 846 PRINTF("\r\n%lu bytes copied with %lu kB/sec.\r\n",
kenjiArai 1:7a568319eeb7 847 p1, tim ? (p1 / tim) : 0);
kenjiArai 1:7a568319eeb7 848 f_close(&File1);
kenjiArai 1:7a568319eeb7 849 f_close(&File2);
kenjiArai 1:7a568319eeb7 850 break;
kenjiArai 1:7a568319eeb7 851 #endif
kenjiArai 1:7a568319eeb7 852 #if FF_FS_RPATH
kenjiArai 1:7a568319eeb7 853 case 'g' : /* fg <path> - Change current directory */
kenjiArai 1:7a568319eeb7 854 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 855 put_rc(f_chdir(ptr));
kenjiArai 1:7a568319eeb7 856 break;
kenjiArai 1:7a568319eeb7 857 #if FF_FS_RPATH >= 2
kenjiArai 1:7a568319eeb7 858 case 'q' : /* fq - Show current dir path */
kenjiArai 1:7a568319eeb7 859 res = f_getcwd(Linebuf, sizeof Linebuf);
kenjiArai 1:7a568319eeb7 860 if (res)
kenjiArai 1:7a568319eeb7 861 put_rc(res);
kenjiArai 1:7a568319eeb7 862 else
kenjiArai 1:7a568319eeb7 863 PRINTF("%s\r\n", Linebuf);
kenjiArai 1:7a568319eeb7 864 break;
kenjiArai 1:7a568319eeb7 865 #endif
kenjiArai 1:7a568319eeb7 866 #endif
kenjiArai 1:7a568319eeb7 867 #if FF_USE_LABEL
kenjiArai 1:7a568319eeb7 868 case 'b' : /* fb <name> - Set volume label */
kenjiArai 1:7a568319eeb7 869 while (*ptr == ' ') ptr++;
kenjiArai 1:7a568319eeb7 870 put_rc(f_setlabel(ptr));
kenjiArai 1:7a568319eeb7 871 break;
kenjiArai 1:7a568319eeb7 872 #endif /* FF_USE_LABEL */
kenjiArai 1:7a568319eeb7 873 #if FF_USE_MKFS
kenjiArai 1:7a568319eeb7 874 case 'm' : /* fm <type> <csize> - Create file system */
kenjiArai 1:7a568319eeb7 875 if (!xatoi(&ptr, &p2) || !xatoi(&ptr, &p3)) break;
kenjiArai 1:7a568319eeb7 876 PRINTF("The volume will be formatted. Are you sure? (Y/n)=");
kenjiArai 1:7a568319eeb7 877 get_line(Linebuf, sizeof Linebuf);
kenjiArai 1:7a568319eeb7 878 if (Linebuf[0] == 'Y')
kenjiArai 1:7a568319eeb7 879 put_rc(f_mkfs("", (BYTE)p2, (DWORD)p3, Buff, sizeof Buff));
kenjiArai 1:7a568319eeb7 880 break;
kenjiArai 1:7a568319eeb7 881 #endif /* FF_USE_MKFS */
kenjiArai 1:7a568319eeb7 882 /* fz [<size>] - Change/Show R/W length for fr/fw/fx command */
kenjiArai 1:7a568319eeb7 883 case 'z' :
kenjiArai 1:7a568319eeb7 884 if (xatoi(&ptr, &p1) && p1 >= 1 && p1 <= (long)sizeof Buff)
kenjiArai 1:7a568319eeb7 885 blen = p1;
kenjiArai 1:7a568319eeb7 886 PRINTF("blen=%u\r\n", blen);
kenjiArai 1:7a568319eeb7 887 break;
kenjiArai 1:7a568319eeb7 888 }
kenjiArai 1:7a568319eeb7 889 }
kenjiArai 1:7a568319eeb7 890
kenjiArai 1:7a568319eeb7 891 static void memory_inf(char *ptr)
kenjiArai 1:7a568319eeb7 892 {
kenjiArai 1:7a568319eeb7 893 long p1, p2, p3;
kenjiArai 1:7a568319eeb7 894
kenjiArai 1:7a568319eeb7 895 switch (*ptr++) {
kenjiArai 1:7a568319eeb7 896 case 'd' : /* md[b|h|w] <address> [<count>] - Dump memory */
kenjiArai 1:7a568319eeb7 897 switch (*ptr++) {
kenjiArai 1:7a568319eeb7 898 case 'w':
kenjiArai 1:7a568319eeb7 899 p3 = DW_LONG;
kenjiArai 1:7a568319eeb7 900 break;
kenjiArai 1:7a568319eeb7 901 case 'h':
kenjiArai 1:7a568319eeb7 902 p3 = DW_SHORT;
kenjiArai 1:7a568319eeb7 903 break;
kenjiArai 1:7a568319eeb7 904 default:
kenjiArai 1:7a568319eeb7 905 p3 = DW_CHAR;
kenjiArai 1:7a568319eeb7 906 }
kenjiArai 1:7a568319eeb7 907 if (!xatoi(&ptr, &p1)) break;
kenjiArai 1:7a568319eeb7 908 if (!xatoi(&ptr, &p2)) p2 = 128 / p3;
kenjiArai 1:7a568319eeb7 909 for (ptr = (char*)p1; p2 >= 16 / p3; ptr += 16, p2 -= 16 / p3)
kenjiArai 1:7a568319eeb7 910 put_dump(ptr, (DWORD)ptr, 16 / p3, p3);
kenjiArai 1:7a568319eeb7 911 if (p2) put_dump((BYTE*)ptr, (UINT)ptr, p2, p3);
kenjiArai 1:7a568319eeb7 912 break;
kenjiArai 1:7a568319eeb7 913 case 'f' : /* mf <address> <value> <count> - Fill memory */
kenjiArai 1:7a568319eeb7 914 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2) || !xatoi(&ptr, &p3)) {
kenjiArai 1:7a568319eeb7 915 break;
kenjiArai 1:7a568319eeb7 916 }
kenjiArai 1:7a568319eeb7 917 while (p3--) {
kenjiArai 1:7a568319eeb7 918 *(BYTE*)p1 = (BYTE)p2;
kenjiArai 1:7a568319eeb7 919 p1++;
kenjiArai 1:7a568319eeb7 920 }
kenjiArai 1:7a568319eeb7 921 break;
kenjiArai 1:7a568319eeb7 922 case 'e' : /* me[b|h|w] <address> [<value> ...] - Edit memory */
kenjiArai 1:7a568319eeb7 923 switch (*ptr++) { /* Get data width */
kenjiArai 1:7a568319eeb7 924 case 'w':
kenjiArai 1:7a568319eeb7 925 p3 = DW_LONG;
kenjiArai 1:7a568319eeb7 926 break;
kenjiArai 1:7a568319eeb7 927 case 'h':
kenjiArai 1:7a568319eeb7 928 p3 = DW_SHORT;
kenjiArai 1:7a568319eeb7 929 break;
kenjiArai 1:7a568319eeb7 930 default:
kenjiArai 1:7a568319eeb7 931 p3 = DW_CHAR;
kenjiArai 1:7a568319eeb7 932 }
kenjiArai 1:7a568319eeb7 933 if (!xatoi(&ptr, &p1)) break; /* Get start address */
kenjiArai 1:7a568319eeb7 934 if (xatoi(&ptr, &p2)) { /* 2nd parameter is given (direct mode) */
kenjiArai 1:7a568319eeb7 935 do {
kenjiArai 1:7a568319eeb7 936 switch (p3) {
kenjiArai 1:7a568319eeb7 937 case DW_LONG:
kenjiArai 1:7a568319eeb7 938 *(DWORD*)p1 = (DWORD)p2;
kenjiArai 1:7a568319eeb7 939 break;
kenjiArai 1:7a568319eeb7 940 case DW_SHORT:
kenjiArai 1:7a568319eeb7 941 *(WORD*)p1 = (WORD)p2;
kenjiArai 1:7a568319eeb7 942 break;
kenjiArai 1:7a568319eeb7 943 default:
kenjiArai 1:7a568319eeb7 944 *(BYTE*)p1 = (BYTE)p2;
kenjiArai 1:7a568319eeb7 945 }
kenjiArai 1:7a568319eeb7 946 p1 += p3;
kenjiArai 1:7a568319eeb7 947 } while (xatoi(&ptr, &p2)); /* Get next value */
kenjiArai 1:7a568319eeb7 948 break;
kenjiArai 1:7a568319eeb7 949 }
kenjiArai 1:7a568319eeb7 950 for (;;) { /* 2nd parameter is not given (interactive mode) */
kenjiArai 1:7a568319eeb7 951 switch (p3) {
kenjiArai 1:7a568319eeb7 952 case DW_LONG:
kenjiArai 1:7a568319eeb7 953 PRINTF("%08X 0x%08X-", (unsigned int)p1, *(unsigned int*)p1);
kenjiArai 1:7a568319eeb7 954 break;
kenjiArai 1:7a568319eeb7 955 case DW_SHORT:
kenjiArai 1:7a568319eeb7 956 PRINTF("%08X 0x%04X-", (unsigned int)p1, *(WORD*)p1);
kenjiArai 1:7a568319eeb7 957 break;
kenjiArai 1:7a568319eeb7 958 default:
kenjiArai 1:7a568319eeb7 959 PRINTF("%08X 0x%02X-", (unsigned int)p1, *(BYTE*)p1);
kenjiArai 1:7a568319eeb7 960 }
kenjiArai 1:7a568319eeb7 961 ptr = Linebuf;
kenjiArai 1:7a568319eeb7 962 get_line(ptr, sizeof Linebuf);
kenjiArai 1:7a568319eeb7 963 if (*ptr == '.') break;
kenjiArai 1:7a568319eeb7 964 if ((BYTE)*ptr >= ' ') {
kenjiArai 1:7a568319eeb7 965 if (!xatoi(&ptr, &p2)) continue;
kenjiArai 1:7a568319eeb7 966 switch (p3) {
kenjiArai 1:7a568319eeb7 967 case DW_LONG:
kenjiArai 1:7a568319eeb7 968 *(DWORD*)p1 = (DWORD)p2;
kenjiArai 1:7a568319eeb7 969 break;
kenjiArai 1:7a568319eeb7 970 case DW_SHORT:
kenjiArai 1:7a568319eeb7 971 *(WORD*)p1 = (WORD)p2;
kenjiArai 1:7a568319eeb7 972 break;
kenjiArai 1:7a568319eeb7 973 default:
kenjiArai 1:7a568319eeb7 974 *(BYTE*)p1 = (BYTE)p2;
kenjiArai 1:7a568319eeb7 975 }
kenjiArai 1:7a568319eeb7 976 }
kenjiArai 1:7a568319eeb7 977 p1 += p3;
kenjiArai 1:7a568319eeb7 978 }
kenjiArai 1:7a568319eeb7 979 }
kenjiArai 1:7a568319eeb7 980 }
kenjiArai 1:7a568319eeb7 981
kenjiArai 1:7a568319eeb7 982 static void disk_inf(char *ptr)
kenjiArai 1:7a568319eeb7 983 {
kenjiArai 1:7a568319eeb7 984 long p1, p2;
kenjiArai 1:7a568319eeb7 985 UINT s1;
kenjiArai 1:7a568319eeb7 986 BYTE res, b, drv = 0;
kenjiArai 1:7a568319eeb7 987 DWORD ofs = 0, sect = 0, blk[2];
kenjiArai 1:7a568319eeb7 988
kenjiArai 1:7a568319eeb7 989 switch (*ptr++) {
kenjiArai 1:7a568319eeb7 990 case 'd' : /* dd [<pd#> <sect>] - Dump secrtor */
kenjiArai 1:7a568319eeb7 991 if (!xatoi(&ptr, &p1)) {
kenjiArai 1:7a568319eeb7 992 p1 = drv;
kenjiArai 1:7a568319eeb7 993 p2 = sect;
kenjiArai 1:7a568319eeb7 994 } else {
kenjiArai 1:7a568319eeb7 995 if (!xatoi(&ptr, &p2)) break;
kenjiArai 1:7a568319eeb7 996 }
kenjiArai 1:7a568319eeb7 997 drv = (BYTE)p1;
kenjiArai 1:7a568319eeb7 998 sect = p2;
kenjiArai 1:7a568319eeb7 999 res = disk_read(drv, Buff, sect, 1);
kenjiArai 1:7a568319eeb7 1000 if (res) {
kenjiArai 1:7a568319eeb7 1001 PRINTF("rc=%d\r\n", (WORD)res);
kenjiArai 1:7a568319eeb7 1002 break;
kenjiArai 1:7a568319eeb7 1003 }
kenjiArai 1:7a568319eeb7 1004 PRINTF("PD#:%u LBA:%lu\r\n", drv, sect++);
kenjiArai 1:7a568319eeb7 1005 for (ptr=(char*)Buff, ofs = 0; ofs < 0x200; ptr += 16, ofs += 16)
kenjiArai 1:7a568319eeb7 1006 put_dump((BYTE*)ptr, ofs, 16, DW_CHAR);
kenjiArai 1:7a568319eeb7 1007 break;
kenjiArai 1:7a568319eeb7 1008
kenjiArai 1:7a568319eeb7 1009 case 'i' : /* di <pd#> - Initialize disk */
kenjiArai 1:7a568319eeb7 1010 if (!xatoi(&ptr, &p1)) break;
kenjiArai 1:7a568319eeb7 1011 PRINTF("rc=%d\r\n", (WORD)disk_initialize((BYTE)p1));
kenjiArai 1:7a568319eeb7 1012 break;
kenjiArai 1:7a568319eeb7 1013
kenjiArai 1:7a568319eeb7 1014 case 's' : /* ds <pd#> - Show disk status */
kenjiArai 1:7a568319eeb7 1015 if (!xatoi(&ptr, &p1)) break;
kenjiArai 1:7a568319eeb7 1016 if (disk_ioctl((BYTE)p1, GET_SECTOR_COUNT, &p2) == RES_OK) {
kenjiArai 1:7a568319eeb7 1017 PRINTF("Drive size: %lu sectors\r\n", p2);
kenjiArai 1:7a568319eeb7 1018 }
kenjiArai 1:7a568319eeb7 1019 if (disk_ioctl((BYTE)p1, GET_BLOCK_SIZE, &p2) == RES_OK) {
kenjiArai 1:7a568319eeb7 1020 PRINTF("Block size: %lu sectors\r\n", p2);
kenjiArai 1:7a568319eeb7 1021 }
kenjiArai 1:7a568319eeb7 1022 if (disk_ioctl((BYTE)p1, MMC_GET_TYPE, &b) == RES_OK) {
kenjiArai 1:7a568319eeb7 1023 PRINTF("Media type: %u\r\n", b);
kenjiArai 1:7a568319eeb7 1024 }
kenjiArai 1:7a568319eeb7 1025 if (disk_ioctl((BYTE)p1, MMC_GET_CSD, Buff) == RES_OK) {
kenjiArai 1:7a568319eeb7 1026 PUTS("CSD:\r\n");
kenjiArai 1:7a568319eeb7 1027 put_dump(Buff, 0, 16, DW_CHAR);
kenjiArai 1:7a568319eeb7 1028 }
kenjiArai 1:7a568319eeb7 1029 if (disk_ioctl((BYTE)p1, MMC_GET_CID, Buff) == RES_OK) {
kenjiArai 1:7a568319eeb7 1030 PUTS("CID:\r\n");
kenjiArai 1:7a568319eeb7 1031 put_dump(Buff, 0, 16, DW_CHAR);
kenjiArai 1:7a568319eeb7 1032 }
kenjiArai 1:7a568319eeb7 1033 if (disk_ioctl((BYTE)p1, MMC_GET_OCR, Buff) == RES_OK) {
kenjiArai 1:7a568319eeb7 1034 PUTS("OCR:\r\n");
kenjiArai 1:7a568319eeb7 1035 put_dump(Buff, 0, 4, DW_CHAR);
kenjiArai 1:7a568319eeb7 1036 }
kenjiArai 1:7a568319eeb7 1037 if (disk_ioctl((BYTE)p1, MMC_GET_SDSTAT, Buff) == RES_OK) {
kenjiArai 1:7a568319eeb7 1038 PUTS("SD Status:\r\n");
kenjiArai 1:7a568319eeb7 1039 for (s1 = 0; s1 < 64; s1 += 16) {
kenjiArai 1:7a568319eeb7 1040 put_dump(Buff+s1, s1, 16, DW_CHAR);
kenjiArai 1:7a568319eeb7 1041 }
kenjiArai 1:7a568319eeb7 1042 }
kenjiArai 1:7a568319eeb7 1043 break;
kenjiArai 1:7a568319eeb7 1044
kenjiArai 1:7a568319eeb7 1045 case 'c' : /* Disk ioctl */
kenjiArai 1:7a568319eeb7 1046 switch (*ptr++) {
kenjiArai 1:7a568319eeb7 1047 case 's' : /* dcs <pd#> - CTRL_SYNC */
kenjiArai 1:7a568319eeb7 1048 if (!xatoi(&ptr, &p1)) break;
kenjiArai 1:7a568319eeb7 1049 PRINTF("rc=%d\r\n", disk_ioctl((BYTE)p1, CTRL_SYNC, 0));
kenjiArai 1:7a568319eeb7 1050 break;
kenjiArai 1:7a568319eeb7 1051 case 'e' : /* dce <pd#> <s.lba> <e.lba> - CTRL_TRIM */
kenjiArai 1:7a568319eeb7 1052 if (!xatoi(&ptr, &p1) ||
kenjiArai 1:7a568319eeb7 1053 !xatoi(&ptr, (long*)&blk[0]) ||
kenjiArai 1:7a568319eeb7 1054 !xatoi(&ptr, (long*)&blk[1])) {
kenjiArai 1:7a568319eeb7 1055 break;
kenjiArai 1:7a568319eeb7 1056 }
kenjiArai 1:7a568319eeb7 1057 PRINTF("rc=%d\r\n", disk_ioctl((BYTE)p1, CTRL_TRIM, blk));
kenjiArai 1:7a568319eeb7 1058 break;
kenjiArai 1:7a568319eeb7 1059 }
kenjiArai 1:7a568319eeb7 1060 }
kenjiArai 1:7a568319eeb7 1061 }
kenjiArai 1:7a568319eeb7 1062
kenjiArai 1:7a568319eeb7 1063 void put_dump (
kenjiArai 1:7a568319eeb7 1064 void* buff, /* Pointer to the array to be dumped */
kenjiArai 1:7a568319eeb7 1065 unsigned long addr, /* Heading address value */
kenjiArai 1:7a568319eeb7 1066 int len, /* Number of items to be dumped */
kenjiArai 1:7a568319eeb7 1067 int width /* Size of the items (DW_CHAR, DW_SHORT, DW_LONG) */
kenjiArai 1:7a568319eeb7 1068 )
kenjiArai 1:7a568319eeb7 1069 {
kenjiArai 1:7a568319eeb7 1070 int i;
kenjiArai 1:7a568319eeb7 1071 unsigned char *bp;
kenjiArai 1:7a568319eeb7 1072 unsigned short *sp;
kenjiArai 1:7a568319eeb7 1073 unsigned long *lp;
kenjiArai 1:7a568319eeb7 1074
kenjiArai 1:7a568319eeb7 1075 PRINTF( "%08lx ", addr ); /* address */
kenjiArai 1:7a568319eeb7 1076 switch ( width ) {
kenjiArai 1:7a568319eeb7 1077 case DW_CHAR:
kenjiArai 1:7a568319eeb7 1078 bp = (unsigned char *)buff;
kenjiArai 1:7a568319eeb7 1079 for ( i = 0; i < len; i++ ) { /* Hexdecimal dump */
kenjiArai 1:7a568319eeb7 1080 PRINTF( " %02x", bp[i] );
kenjiArai 1:7a568319eeb7 1081 }
kenjiArai 1:7a568319eeb7 1082 PUTC(' ');
kenjiArai 1:7a568319eeb7 1083 for ( i = 0; i < len; i++ ) { /* ASCII dump */
kenjiArai 1:7a568319eeb7 1084 PUTC( (bp[i] >= ' ' && bp[i] <= '~') ? bp[i] : '.' );
kenjiArai 1:7a568319eeb7 1085 }
kenjiArai 1:7a568319eeb7 1086 break;
kenjiArai 1:7a568319eeb7 1087 case DW_SHORT:
kenjiArai 1:7a568319eeb7 1088 sp = (unsigned short *)buff;
kenjiArai 1:7a568319eeb7 1089 do { /* Hexdecimal dump */
kenjiArai 1:7a568319eeb7 1090 PRINTF( " %04x", *sp++ );
kenjiArai 1:7a568319eeb7 1091 } while ( --len );
kenjiArai 1:7a568319eeb7 1092 break;
kenjiArai 1:7a568319eeb7 1093 case DW_LONG:
kenjiArai 1:7a568319eeb7 1094 lp = (unsigned long *)buff;
kenjiArai 1:7a568319eeb7 1095 do { /* Hexdecimal dump */
kenjiArai 1:7a568319eeb7 1096 PRINTF( " %08lx", *lp++ );
kenjiArai 1:7a568319eeb7 1097 } while ( --len );
kenjiArai 1:7a568319eeb7 1098 break;
kenjiArai 1:7a568319eeb7 1099 }
kenjiArai 1:7a568319eeb7 1100 PUTS( "\r\n" );
kenjiArai 1:7a568319eeb7 1101 }
kenjiArai 1:7a568319eeb7 1102
kenjiArai 1:7a568319eeb7 1103 // RTC related subroutines
kenjiArai 1:7a568319eeb7 1104 void chk_and_set_time(char *ptr)
kenjiArai 1:7a568319eeb7 1105 {
kenjiArai 1:7a568319eeb7 1106 char buf[64];
kenjiArai 1:7a568319eeb7 1107
kenjiArai 1:7a568319eeb7 1108 long p1;
kenjiArai 1:7a568319eeb7 1109 struct tm t;
kenjiArai 1:7a568319eeb7 1110 time_t seconds;
kenjiArai 1:7a568319eeb7 1111
kenjiArai 1:7a568319eeb7 1112 if (xatoi(&ptr, &p1)) {
kenjiArai 1:7a568319eeb7 1113 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 1:7a568319eeb7 1114 PRINTF("Year:%ld ",p1);
kenjiArai 1:7a568319eeb7 1115 xatoi( &ptr, &p1 );
kenjiArai 1:7a568319eeb7 1116 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 1:7a568319eeb7 1117 PRINTF("Month:%ld ",p1);
kenjiArai 1:7a568319eeb7 1118 xatoi( &ptr, &p1 );
kenjiArai 1:7a568319eeb7 1119 t.tm_mday = (uint8_t)p1;
kenjiArai 1:7a568319eeb7 1120 PRINTF("Day:%ld ",p1);
kenjiArai 1:7a568319eeb7 1121 xatoi( &ptr, &p1 );
kenjiArai 1:7a568319eeb7 1122 t.tm_hour = (uint8_t)p1;
kenjiArai 1:7a568319eeb7 1123 PRINTF("Hour:%ld ",p1);
kenjiArai 1:7a568319eeb7 1124 xatoi( &ptr, &p1 );
kenjiArai 1:7a568319eeb7 1125 t.tm_min = (uint8_t)p1;
kenjiArai 1:7a568319eeb7 1126 PRINTF("Min:%ld ",p1);
kenjiArai 1:7a568319eeb7 1127 xatoi( &ptr, &p1 );
kenjiArai 1:7a568319eeb7 1128 t.tm_sec = (uint8_t)p1;
kenjiArai 1:7a568319eeb7 1129 PRINTF("Sec: %ld \r\n",p1);
kenjiArai 1:7a568319eeb7 1130 seconds = mktime(&t);
kenjiArai 1:7a568319eeb7 1131 set_time(seconds);
kenjiArai 1:7a568319eeb7 1132 } else {
kenjiArai 1:7a568319eeb7 1133 seconds = time(NULL);
kenjiArai 1:7a568319eeb7 1134 }
kenjiArai 1:7a568319eeb7 1135 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 1:7a568319eeb7 1136 PRINTF("[Time] %s", buf);
kenjiArai 1:7a568319eeb7 1137 }
kenjiArai 1:7a568319eeb7 1138
kenjiArai 1:7a568319eeb7 1139 // Get key input data
kenjiArai 1:7a568319eeb7 1140 void get_line (char *buff, int len)
kenjiArai 1:7a568319eeb7 1141 {
kenjiArai 1:7a568319eeb7 1142 char c;
kenjiArai 1:7a568319eeb7 1143 int idx = 0;
kenjiArai 1:7a568319eeb7 1144
kenjiArai 1:7a568319eeb7 1145 for (;;) {
kenjiArai 1:7a568319eeb7 1146 c = GETC();
kenjiArai 1:7a568319eeb7 1147 // Added by Kenji Arai / JH1PJL May 9th, 2010
kenjiArai 1:7a568319eeb7 1148 if (c == '\r') {
kenjiArai 1:7a568319eeb7 1149 buff[idx++] = c;
kenjiArai 1:7a568319eeb7 1150 break;
kenjiArai 1:7a568319eeb7 1151 }
kenjiArai 1:7a568319eeb7 1152 if ((c == '\b') && idx) {
kenjiArai 1:7a568319eeb7 1153 idx--;
kenjiArai 1:7a568319eeb7 1154 PUTC(c);
kenjiArai 1:7a568319eeb7 1155 PUTC(' ');
kenjiArai 1:7a568319eeb7 1156 PUTC(c);
kenjiArai 1:7a568319eeb7 1157 }
kenjiArai 1:7a568319eeb7 1158 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 1:7a568319eeb7 1159 buff[idx++] = c;
kenjiArai 1:7a568319eeb7 1160 PUTC(c);
kenjiArai 1:7a568319eeb7 1161 }
kenjiArai 1:7a568319eeb7 1162 }
kenjiArai 1:7a568319eeb7 1163 buff[idx] = 0;
kenjiArai 1:7a568319eeb7 1164 PUTS("\r\n");
kenjiArai 1:7a568319eeb7 1165 }
kenjiArai 1:7a568319eeb7 1166
kenjiArai 1:7a568319eeb7 1167 /* Outpur LF & CR */
kenjiArai 1:7a568319eeb7 1168 void crlf( void )
kenjiArai 1:7a568319eeb7 1169 {
kenjiArai 1:7a568319eeb7 1170 PRINTF( "\r\n" );
kenjiArai 1:7a568319eeb7 1171 }
kenjiArai 1:7a568319eeb7 1172
kenjiArai 1:7a568319eeb7 1173 /* Check key input */
kenjiArai 1:7a568319eeb7 1174 unsigned int check_hit_key (void)
kenjiArai 1:7a568319eeb7 1175 {
kenjiArai 1:7a568319eeb7 1176 return ( READABLE() );
kenjiArai 1:7a568319eeb7 1177 }
kenjiArai 1:7a568319eeb7 1178
kenjiArai 1:7a568319eeb7 1179 /*----------------------------------------------*/
kenjiArai 1:7a568319eeb7 1180 /* Get a value of the string */
kenjiArai 1:7a568319eeb7 1181 /*----------------------------------------------*/
kenjiArai 1:7a568319eeb7 1182 /* "123 -5 0x3ff 0b1111 0377 w "
kenjiArai 1:7a568319eeb7 1183 ^ 1st call returns 123 and next ptr
kenjiArai 1:7a568319eeb7 1184 ^ 2nd call returns -5 and next ptr
kenjiArai 1:7a568319eeb7 1185 ^ 3rd call returns 1023 and next ptr
kenjiArai 1:7a568319eeb7 1186 ^ 4th call returns 15 and next ptr
kenjiArai 1:7a568319eeb7 1187 ^ 5th call returns 255 and next ptr
kenjiArai 1:7a568319eeb7 1188 ^ 6th call fails and returns 0
kenjiArai 1:7a568319eeb7 1189 */
kenjiArai 1:7a568319eeb7 1190 int xatoi ( /* 0:Failed, 1:Successful */
kenjiArai 1:7a568319eeb7 1191 char **str, /* Pointer to pointer to the string */
kenjiArai 1:7a568319eeb7 1192 long *res /* Pointer to the valiable to store the value */
kenjiArai 1:7a568319eeb7 1193 )
kenjiArai 1:7a568319eeb7 1194 {
kenjiArai 1:7a568319eeb7 1195 unsigned long val;
kenjiArai 1:7a568319eeb7 1196 unsigned char c, r, s = 0;
kenjiArai 1:7a568319eeb7 1197
kenjiArai 1:7a568319eeb7 1198 *res = 0;
kenjiArai 1:7a568319eeb7 1199 while ( (c = **str) == ' ' ) {
kenjiArai 1:7a568319eeb7 1200 (*str)++; /* Skip leading spaces */
kenjiArai 1:7a568319eeb7 1201 }
kenjiArai 1:7a568319eeb7 1202 if ( c == '-' ) { /* negative? */
kenjiArai 1:7a568319eeb7 1203 s = 1;
kenjiArai 1:7a568319eeb7 1204 c = *(++(*str));
kenjiArai 1:7a568319eeb7 1205 }
kenjiArai 1:7a568319eeb7 1206 if ( c == '0' ) {
kenjiArai 1:7a568319eeb7 1207 c = *(++(*str));
kenjiArai 1:7a568319eeb7 1208 switch (c) {
kenjiArai 1:7a568319eeb7 1209 case 'x': /* hexdecimal */
kenjiArai 1:7a568319eeb7 1210 r = 16;
kenjiArai 1:7a568319eeb7 1211 c = *(++(*str));
kenjiArai 1:7a568319eeb7 1212 break;
kenjiArai 1:7a568319eeb7 1213 case 'b': /* binary */
kenjiArai 1:7a568319eeb7 1214 r = 2;
kenjiArai 1:7a568319eeb7 1215 c = *(++(*str));
kenjiArai 1:7a568319eeb7 1216 break;
kenjiArai 1:7a568319eeb7 1217 default:
kenjiArai 1:7a568319eeb7 1218 if ( c <= ' ' ) return 1; /* single zero */
kenjiArai 1:7a568319eeb7 1219 if ( c < '0' || c > '9' ) return 0; /* invalid char */
kenjiArai 1:7a568319eeb7 1220 r = 8; /* octal */
kenjiArai 1:7a568319eeb7 1221 }
kenjiArai 1:7a568319eeb7 1222 } else {
kenjiArai 1:7a568319eeb7 1223 if ( c < '0' || c > '9' ) return 0; /* EOL or invalid char */
kenjiArai 1:7a568319eeb7 1224 r = 10; /* decimal */
kenjiArai 1:7a568319eeb7 1225 }
kenjiArai 1:7a568319eeb7 1226 val = 0;
kenjiArai 1:7a568319eeb7 1227 while ( c > ' ' ) {
kenjiArai 1:7a568319eeb7 1228 if ( c >= 'a' ) {
kenjiArai 1:7a568319eeb7 1229 c -= 0x20;
kenjiArai 1:7a568319eeb7 1230 }
kenjiArai 1:7a568319eeb7 1231 c -= '0';
kenjiArai 1:7a568319eeb7 1232 if ( c >= 17 ) {
kenjiArai 1:7a568319eeb7 1233 c -= 7;
kenjiArai 1:7a568319eeb7 1234 if ( c <= 9 ) {
kenjiArai 1:7a568319eeb7 1235 return 0; /* invalid char */
kenjiArai 1:7a568319eeb7 1236 }
kenjiArai 1:7a568319eeb7 1237 }
kenjiArai 1:7a568319eeb7 1238 if ( c >= r ) {
kenjiArai 1:7a568319eeb7 1239 return 0; /* invalid char for current radix */
kenjiArai 1:7a568319eeb7 1240 }
kenjiArai 1:7a568319eeb7 1241 val = val * r + c;
kenjiArai 1:7a568319eeb7 1242 c = *(++(*str));
kenjiArai 1:7a568319eeb7 1243 }
kenjiArai 1:7a568319eeb7 1244 if (s) val = 0 - val; /* apply sign if needed */
kenjiArai 1:7a568319eeb7 1245 *res = val;
kenjiArai 1:7a568319eeb7 1246 return 1;
kenjiArai 1:7a568319eeb7 1247 }