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 :)
main.c@0:b5453be5ad07, 2010-06-01 (annotated)
- Committer:
- shintamainjp
- Date:
- Tue Jun 01 12:23:29 2010 +0000
- Revision:
- 0:b5453be5ad07
Who changed what in which revision?
User | Revision | Line number | New 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 |