1st version for FatFs monitor

Dependents:   DISCO-F469NI_USB_Disk

Committer:
kenjiArai
Date:
Mon Apr 30 05:20:42 2018 +0000
Revision:
0:6f52c89729de
1st version for FatFs monitor

Who changed what in which revision?

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