microSD Card control function for DISCO-F469NI based on BD_SD_DISCO_F746NG library by Roy Krikke

Dependencies:   BSP_DISCO_F469NI_modified BD_SD_DISCO_F469NI

Fork of DISCO-F769NI_BD_SD_Card_Control by Kenji Arai

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

Committer:
kenjiArai
Date:
Thu Jan 14 00:38:59 2021 +0000
Revision:
11:a13b9833d5f4
Parent:
10:b5665028f662
run on mbed-os6.6.0

Who changed what in which revision?

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