SD-Card Control Program / Using Micro-SD / based on SDCardTest Program (http://mbed.org/users/simon/programs/SDCardTest/gpdz4x/)

Dependencies:   mbed SDFileSystem

Please refer following my Notebook page.
/users/kenjiArai/notebook/sd-card-control-new/#

Committer:
kenjiArai
Date:
Sat Aug 17 03:28:33 2019 +0000
Revision:
4:fc36c8ec2966
Parent:
2:1397a54382ec
Child:
5:e222c59853e2
modified main.cpp. added check_revision.cpp. run on latest revision.

Who changed what in which revision?

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