This is Petit FAT File System Module for mbed NXP LPC1768. The ported library from http://elm-chan.org/fsw/ff/00index_p.html made by Mr. ChaN. The connection is same as SDCard library here http://mbed.org/projects/cookbook/wiki/SDCard . If you need change a pin, You can find the definition at libpff/connect.h :)

Dependencies:   mbed

Committer:
shintamainjp
Date:
Fri Jun 04 23:49:03 2010 +0000
Revision:
0:a71ab7426128

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:a71ab7426128 1 /*---------------------------------------------------------------*/
shintamainjp 0:a71ab7426128 2 /* Petit FAT file system module test program R0.02 (C)ChaN, 2009 */
shintamainjp 0:a71ab7426128 3 /*---------------------------------------------------------------*/
shintamainjp 0:a71ab7426128 4
shintamainjp 0:a71ab7426128 5 /*
shintamainjp 0:a71ab7426128 6 * Ported by Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:a71ab7426128 7 * http://shinta.main.jp/
shintamainjp 0:a71ab7426128 8 * 2010/06/01
shintamainjp 0:a71ab7426128 9 */
shintamainjp 0:a71ab7426128 10
shintamainjp 0:a71ab7426128 11 #include <string.h>
shintamainjp 0:a71ab7426128 12 #include "mbed.h"
shintamainjp 0:a71ab7426128 13 #include "libpff/diskio.h"
shintamainjp 0:a71ab7426128 14 #include "libpff/pff.h"
shintamainjp 0:a71ab7426128 15
shintamainjp 0:a71ab7426128 16 Serial pc(USBTX, USBRX);
shintamainjp 0:a71ab7426128 17
shintamainjp 0:a71ab7426128 18 char Line[128]; /* Console input buffer */
shintamainjp 0:a71ab7426128 19
shintamainjp 0:a71ab7426128 20 static
shintamainjp 0:a71ab7426128 21 void put_rc (PetitFileSystem::FRESULT rc) {
shintamainjp 0:a71ab7426128 22 const char *p;
shintamainjp 0:a71ab7426128 23 static const char str[] =
shintamainjp 0:a71ab7426128 24 "OK\0" "DISK_ERR\0" "NOT_READY\0" "NO_FILE\0" "NO_PATH\0"
shintamainjp 0:a71ab7426128 25 "NOT_OPENED\0" "NOT_ENABLED\0" "NO_FILE_SYSTEM\0";
shintamainjp 0:a71ab7426128 26 uint8_t i;
shintamainjp 0:a71ab7426128 27
shintamainjp 0:a71ab7426128 28 for (p = str, i = 0; i != (uint8_t)rc && p; i++) {
shintamainjp 0:a71ab7426128 29 while (p++);
shintamainjp 0:a71ab7426128 30 }
shintamainjp 0:a71ab7426128 31 pc.printf("rc=%u FR_%S\n", (WORD)rc, p);
shintamainjp 0:a71ab7426128 32 }
shintamainjp 0:a71ab7426128 33
shintamainjp 0:a71ab7426128 34
shintamainjp 0:a71ab7426128 35
shintamainjp 0:a71ab7426128 36 static
shintamainjp 0:a71ab7426128 37 void put_drc (BYTE res) {
shintamainjp 0:a71ab7426128 38 pc.printf("rc=%d\n", res);
shintamainjp 0:a71ab7426128 39 }
shintamainjp 0:a71ab7426128 40
shintamainjp 0:a71ab7426128 41
shintamainjp 0:a71ab7426128 42
shintamainjp 0:a71ab7426128 43 static
shintamainjp 0:a71ab7426128 44 void get_line (char *buff, BYTE len) {
shintamainjp 0:a71ab7426128 45 BYTE c, i;
shintamainjp 0:a71ab7426128 46
shintamainjp 0:a71ab7426128 47 i = 0;
shintamainjp 0:a71ab7426128 48 for (;;) {
shintamainjp 0:a71ab7426128 49 c = pc.getc();
shintamainjp 0:a71ab7426128 50 if (c == '\r') break;
shintamainjp 0:a71ab7426128 51 if ((c == '\b') && i) {
shintamainjp 0:a71ab7426128 52 i--;
shintamainjp 0:a71ab7426128 53 pc.putc('\b');
shintamainjp 0:a71ab7426128 54 pc.putc(' ');
shintamainjp 0:a71ab7426128 55 pc.putc('\b');
shintamainjp 0:a71ab7426128 56 }
shintamainjp 0:a71ab7426128 57 if ((c >= ' ') && (i < len - 1)) {
shintamainjp 0:a71ab7426128 58 buff[i++] = c;
shintamainjp 0:a71ab7426128 59 pc.putc(c);
shintamainjp 0:a71ab7426128 60 }
shintamainjp 0:a71ab7426128 61 }
shintamainjp 0:a71ab7426128 62 buff[i] = 0;
shintamainjp 0:a71ab7426128 63 pc.putc('\n');
shintamainjp 0:a71ab7426128 64 }
shintamainjp 0:a71ab7426128 65
shintamainjp 0:a71ab7426128 66
shintamainjp 0:a71ab7426128 67
shintamainjp 0:a71ab7426128 68 static
shintamainjp 0:a71ab7426128 69 void put_dump (const BYTE *buff, DWORD ofs, int cnt) {
shintamainjp 0:a71ab7426128 70 BYTE n;
shintamainjp 0:a71ab7426128 71
shintamainjp 0:a71ab7426128 72 pc.printf("%08x", ofs);
shintamainjp 0:a71ab7426128 73 pc.putc(' ');
shintamainjp 0:a71ab7426128 74 for (n = 0; n < cnt; n++) {
shintamainjp 0:a71ab7426128 75 pc.putc(' ');
shintamainjp 0:a71ab7426128 76 pc.printf("%02x", buff[n]);
shintamainjp 0:a71ab7426128 77 }
shintamainjp 0:a71ab7426128 78 pc.printf(" ");
shintamainjp 0:a71ab7426128 79 for (n = 0; n < cnt; n++) {
shintamainjp 0:a71ab7426128 80 pc.putc(((buff[n] < 0x20)||(buff[n] >= 0x7F)) ? '.' : buff[n]);
shintamainjp 0:a71ab7426128 81 }
shintamainjp 0:a71ab7426128 82 pc.putc('\n');
shintamainjp 0:a71ab7426128 83 }
shintamainjp 0:a71ab7426128 84
shintamainjp 0:a71ab7426128 85
shintamainjp 0:a71ab7426128 86
shintamainjp 0:a71ab7426128 87 /*-----------------------------------------------------------------------*/
shintamainjp 0:a71ab7426128 88 /* Main */
shintamainjp 0:a71ab7426128 89
shintamainjp 0:a71ab7426128 90
shintamainjp 0:a71ab7426128 91 int main (void) {
shintamainjp 0:a71ab7426128 92 char *ptr;
shintamainjp 0:a71ab7426128 93 long p1, p2;
shintamainjp 0:a71ab7426128 94 BYTE res;
shintamainjp 0:a71ab7426128 95 WORD s1, s2, s3, ofs, cnt, w;
shintamainjp 0:a71ab7426128 96 PetitFileSystem pfs;
shintamainjp 0:a71ab7426128 97 PetitFileSystem::FILINFO fno;
shintamainjp 0:a71ab7426128 98
shintamainjp 0:a71ab7426128 99 pc.baud(19200);
shintamainjp 0:a71ab7426128 100 pc.printf("\nPFF test monitor\n");
shintamainjp 0:a71ab7426128 101
shintamainjp 0:a71ab7426128 102 for (;;) {
shintamainjp 0:a71ab7426128 103 pc.putc('>');
shintamainjp 0:a71ab7426128 104 get_line(Line, sizeof(Line));
shintamainjp 0:a71ab7426128 105 ptr = Line;
shintamainjp 0:a71ab7426128 106
shintamainjp 0:a71ab7426128 107 switch (*ptr++) {
shintamainjp 0:a71ab7426128 108 case '?' :
shintamainjp 0:a71ab7426128 109 pc.printf("di - Initialize physical drive\n");
shintamainjp 0:a71ab7426128 110 pc.printf("dd <sector> <ofs> - Dump partial secrtor 128 bytes\n");
shintamainjp 0:a71ab7426128 111 pc.printf("fi - Mount the volume\n");
shintamainjp 0:a71ab7426128 112 pc.printf("fo <file> - Open a file\n");
shintamainjp 0:a71ab7426128 113 pc.printf("fd - Read the file 128 bytes and dump it\n");
shintamainjp 0:a71ab7426128 114 pc.printf("fw <len> <val> - Write data to the file\n");
shintamainjp 0:a71ab7426128 115 pc.printf("fp - Write console input to the file\n");
shintamainjp 0:a71ab7426128 116 pc.printf("fe <ofs> - Move file pointer of the file\n");
shintamainjp 0:a71ab7426128 117 pc.printf("fl [<path>] - Directory listing\n");
shintamainjp 0:a71ab7426128 118 break;
shintamainjp 0:a71ab7426128 119 case 'd' :
shintamainjp 0:a71ab7426128 120 switch (*ptr++) {
shintamainjp 0:a71ab7426128 121 case 'i' : /* di - Initialize physical drive */
shintamainjp 0:a71ab7426128 122 res = disk_initialize();
shintamainjp 0:a71ab7426128 123 put_drc(res);
shintamainjp 0:a71ab7426128 124 break;
shintamainjp 0:a71ab7426128 125 case 'd' : /* dd <sector> <ofs> - Dump partial secrtor 128 bytes */
shintamainjp 0:a71ab7426128 126 if (2 != sscanf(ptr, "%x %x", &p1, &p2)) {
shintamainjp 0:a71ab7426128 127 break;
shintamainjp 0:a71ab7426128 128 }
shintamainjp 0:a71ab7426128 129 s2 = p2;
shintamainjp 0:a71ab7426128 130 res = disk_readp((BYTE*)Line, p1, s2, 128);
shintamainjp 0:a71ab7426128 131 if (res) {
shintamainjp 0:a71ab7426128 132 put_drc(res);
shintamainjp 0:a71ab7426128 133 break;
shintamainjp 0:a71ab7426128 134 }
shintamainjp 0:a71ab7426128 135 s3 = s2 + 128;
shintamainjp 0:a71ab7426128 136 for (ptr = Line; s2 < s3; s2 += 16, ptr += 16, ofs += 16) {
shintamainjp 0:a71ab7426128 137 s1 = (s3 - s2 >= 16) ? 16 : s3 - s2;
shintamainjp 0:a71ab7426128 138 put_dump((BYTE*)ptr, s2, s1);
shintamainjp 0:a71ab7426128 139 }
shintamainjp 0:a71ab7426128 140 break;
shintamainjp 0:a71ab7426128 141 }
shintamainjp 0:a71ab7426128 142 break;
shintamainjp 0:a71ab7426128 143 case 'f' :
shintamainjp 0:a71ab7426128 144 switch (*ptr++) {
shintamainjp 0:a71ab7426128 145
shintamainjp 0:a71ab7426128 146 case 'i' : /* fi - Mount the volume */
shintamainjp 0:a71ab7426128 147 put_rc(pfs.mount());
shintamainjp 0:a71ab7426128 148 break;
shintamainjp 0:a71ab7426128 149
shintamainjp 0:a71ab7426128 150 case 'o' : /* fo <file> - Open a file */
shintamainjp 0:a71ab7426128 151 while (*ptr == ' ') ptr++;
shintamainjp 0:a71ab7426128 152 put_rc(pfs.open(ptr));
shintamainjp 0:a71ab7426128 153 break;
shintamainjp 0:a71ab7426128 154 #if _USE_READ
shintamainjp 0:a71ab7426128 155 case 'd' : /* fd - Read the file 128 bytes and dump it */
shintamainjp 0:a71ab7426128 156 ofs = pfs.getofs();
shintamainjp 0:a71ab7426128 157 res = pfs.read(Line, sizeof(Line), &s1);
shintamainjp 0:a71ab7426128 158 if (res != PetitFileSystem::FR_OK) {
shintamainjp 0:a71ab7426128 159 put_rc((PetitFileSystem::FRESULT)res);
shintamainjp 0:a71ab7426128 160 break;
shintamainjp 0:a71ab7426128 161 }
shintamainjp 0:a71ab7426128 162 ptr = Line;
shintamainjp 0:a71ab7426128 163 while (s1) {
shintamainjp 0:a71ab7426128 164 s2 = (s1 >= 16) ? 16 : s1;
shintamainjp 0:a71ab7426128 165 s1 -= s2;
shintamainjp 0:a71ab7426128 166 put_dump((BYTE*)ptr, ofs, s2);
shintamainjp 0:a71ab7426128 167 ptr += 16;
shintamainjp 0:a71ab7426128 168 ofs += 16;
shintamainjp 0:a71ab7426128 169 }
shintamainjp 0:a71ab7426128 170 break;
shintamainjp 0:a71ab7426128 171 #endif
shintamainjp 0:a71ab7426128 172 #if _USE_WRITE
shintamainjp 0:a71ab7426128 173 case 'w' : /* fw <len> <val> - Write data to the file */
shintamainjp 0:a71ab7426128 174 if (2 != sscanf(ptr, "%x %x", &p1, &p2)) {
shintamainjp 0:a71ab7426128 175 break;
shintamainjp 0:a71ab7426128 176 }
shintamainjp 0:a71ab7426128 177 for (s1 = 0; s1 < sizeof(Line); Line[s1++] = (BYTE)p2) ;
shintamainjp 0:a71ab7426128 178 p2 = 0;
shintamainjp 0:a71ab7426128 179 while (p1) {
shintamainjp 0:a71ab7426128 180 if ((UINT)p1 >= sizeof(Line)) {
shintamainjp 0:a71ab7426128 181 cnt = sizeof(Line);
shintamainjp 0:a71ab7426128 182 p1 -= sizeof(Line);
shintamainjp 0:a71ab7426128 183 } else {
shintamainjp 0:a71ab7426128 184 cnt = (WORD)p1;
shintamainjp 0:a71ab7426128 185 p1 = 0;
shintamainjp 0:a71ab7426128 186 }
shintamainjp 0:a71ab7426128 187 res = pfs.write(Line, cnt, &w); /* Write data to the file */
shintamainjp 0:a71ab7426128 188 p2 += w;
shintamainjp 0:a71ab7426128 189 if (res != PetitFileSystem::FR_OK) {
shintamainjp 0:a71ab7426128 190 put_rc((PetitFileSystem::FRESULT)res);
shintamainjp 0:a71ab7426128 191 break;
shintamainjp 0:a71ab7426128 192 }
shintamainjp 0:a71ab7426128 193 if (cnt != w) break;
shintamainjp 0:a71ab7426128 194 }
shintamainjp 0:a71ab7426128 195 res = pfs.write(0, 0, &w); /* Finalize the write process */
shintamainjp 0:a71ab7426128 196 put_rc((PetitFileSystem::FRESULT)res);
shintamainjp 0:a71ab7426128 197 if (res == PetitFileSystem::FR_OK)
shintamainjp 0:a71ab7426128 198 pc.printf("%lu bytes written.\n", p2);
shintamainjp 0:a71ab7426128 199 break;
shintamainjp 0:a71ab7426128 200 case 'p' : /* fp - Write console input to the file */
shintamainjp 0:a71ab7426128 201 pc.printf("Type any line to write. A blank line finalize the write operation.\n");
shintamainjp 0:a71ab7426128 202 for (;;) {
shintamainjp 0:a71ab7426128 203 get_line(Line, sizeof(Line));
shintamainjp 0:a71ab7426128 204 if (!Line[0]) break;
shintamainjp 0:a71ab7426128 205 strcat(Line, "\r\n");
shintamainjp 0:a71ab7426128 206 res = pfs.write(Line, strlen(Line), &w); /* Write a line to the file */
shintamainjp 0:a71ab7426128 207 if (res) break;
shintamainjp 0:a71ab7426128 208 }
shintamainjp 0:a71ab7426128 209 res = pfs.write(0, 0, &w); /* Finalize the write process */
shintamainjp 0:a71ab7426128 210 put_rc((PetitFileSystem::FRESULT)res);
shintamainjp 0:a71ab7426128 211 break;
shintamainjp 0:a71ab7426128 212 #endif
shintamainjp 0:a71ab7426128 213 #if _USE_LSEEK
shintamainjp 0:a71ab7426128 214 case 'e' : /* fe <ofs> - Move file pointer of the file */
shintamainjp 0:a71ab7426128 215 if (1 != sscanf(ptr, "%x", &p1)) {
shintamainjp 0:a71ab7426128 216 break;
shintamainjp 0:a71ab7426128 217 }
shintamainjp 0:a71ab7426128 218 res = pfs.lseek(p1);
shintamainjp 0:a71ab7426128 219 put_rc((PetitFileSystem::FRESULT)res);
shintamainjp 0:a71ab7426128 220 if (res == PetitFileSystem::FR_OK) {
shintamainjp 0:a71ab7426128 221 pc.printf("OK\n");
shintamainjp 0:a71ab7426128 222 } else {
shintamainjp 0:a71ab7426128 223 pc.printf("NG\n");
shintamainjp 0:a71ab7426128 224 }
shintamainjp 0:a71ab7426128 225 break;
shintamainjp 0:a71ab7426128 226 #endif
shintamainjp 0:a71ab7426128 227 #if _USE_DIR
shintamainjp 0:a71ab7426128 228 case 'l' : /* fl [<path>] - Directory listing */
shintamainjp 0:a71ab7426128 229 while (*ptr == ' ') ptr++;
shintamainjp 0:a71ab7426128 230 res = pfs.opendir(ptr);
shintamainjp 0:a71ab7426128 231 if (res) {
shintamainjp 0:a71ab7426128 232 put_rc((PetitFileSystem::FRESULT)res);
shintamainjp 0:a71ab7426128 233 break;
shintamainjp 0:a71ab7426128 234 }
shintamainjp 0:a71ab7426128 235 s1 = 0;
shintamainjp 0:a71ab7426128 236 for (;;) {
shintamainjp 0:a71ab7426128 237 res = pfs.readdir(&fno);
shintamainjp 0:a71ab7426128 238 if (res != PetitFileSystem::FR_OK) {
shintamainjp 0:a71ab7426128 239 put_rc((PetitFileSystem::FRESULT)res);
shintamainjp 0:a71ab7426128 240 break;
shintamainjp 0:a71ab7426128 241 }
shintamainjp 0:a71ab7426128 242 if (!fno.fname[0]) break;
shintamainjp 0:a71ab7426128 243 if (fno.fattrib & AM_DIR)
shintamainjp 0:a71ab7426128 244 pc.printf(" <DIR> %s\n", fno.fname);
shintamainjp 0:a71ab7426128 245 else
shintamainjp 0:a71ab7426128 246 pc.printf("%9lu %s\n", fno.fsize, fno.fname);
shintamainjp 0:a71ab7426128 247 s1++;
shintamainjp 0:a71ab7426128 248 }
shintamainjp 0:a71ab7426128 249 pc.printf("%u item(s)\n", s1);
shintamainjp 0:a71ab7426128 250 break;
shintamainjp 0:a71ab7426128 251 #endif
shintamainjp 0:a71ab7426128 252 }
shintamainjp 0:a71ab7426128 253 break;
shintamainjp 0:a71ab7426128 254 }
shintamainjp 0:a71ab7426128 255 }
shintamainjp 0:a71ab7426128 256
shintamainjp 0:a71ab7426128 257 }
shintamainjp 0:a71ab7426128 258
shintamainjp 0:a71ab7426128 259
shintamainjp 0:a71ab7426128 260