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:47:39 2010 +0000
Revision:
1:a24950493dec
Parent:
0:b5453be5ad07

        

Who changed what in which revision?

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