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