Local copy of the FatFileSystem.

Dependents:   SimpleWaveRecorderPlayer y_CameraC1098_ES_01 _test_SDHCFileSystem Application-SimpleWaveRecorderPlayerGenerator ... more

Committer:
shintamainjp
Date:
Sat Apr 14 02:24:08 2012 +0000
Revision:
0:8c55801ce311
Initial version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:8c55801ce311 1 /* mbed Microcontroller Library - FATFileSystem
shintamainjp 0:8c55801ce311 2 * Copyright (c) 2008, sford
shintamainjp 0:8c55801ce311 3 */
shintamainjp 0:8c55801ce311 4
shintamainjp 0:8c55801ce311 5 #include "FATFileSystem.h"
shintamainjp 0:8c55801ce311 6
shintamainjp 0:8c55801ce311 7 #include "mbed.h"
shintamainjp 0:8c55801ce311 8
shintamainjp 0:8c55801ce311 9 #include "FileSystemLike.h"
shintamainjp 0:8c55801ce311 10 #include "FATFileHandle.h"
shintamainjp 0:8c55801ce311 11 #include "FATDirHandle.h"
shintamainjp 0:8c55801ce311 12 #include "ff.h"
shintamainjp 0:8c55801ce311 13 //#include "Debug.h"
shintamainjp 0:8c55801ce311 14 #include <stdio.h>
shintamainjp 0:8c55801ce311 15 #include <stdlib.h>
shintamainjp 0:8c55801ce311 16 #include <time.h>
shintamainjp 0:8c55801ce311 17
shintamainjp 0:8c55801ce311 18 /*
shintamainjp 0:8c55801ce311 19 Currnet time is returned with packed into a DWORD value. The bit field is as follows:
shintamainjp 0:8c55801ce311 20 bit31:25
shintamainjp 0:8c55801ce311 21 Year from 1980 (0..127)
shintamainjp 0:8c55801ce311 22 bit24:21
shintamainjp 0:8c55801ce311 23 Month (1..12)
shintamainjp 0:8c55801ce311 24 bit20:16
shintamainjp 0:8c55801ce311 25 Day in month(1..31)
shintamainjp 0:8c55801ce311 26 bit15:11
shintamainjp 0:8c55801ce311 27 Hour (0..23)
shintamainjp 0:8c55801ce311 28 bit10:5
shintamainjp 0:8c55801ce311 29 Minute (0..59)
shintamainjp 0:8c55801ce311 30 bit4:0
shintamainjp 0:8c55801ce311 31 Second / 2 (0..29)
shintamainjp 0:8c55801ce311 32
shintamainjp 0:8c55801ce311 33
shintamainjp 0:8c55801ce311 34 int tm_sec;
shintamainjp 0:8c55801ce311 35 int tm_min;
shintamainjp 0:8c55801ce311 36 int tm_hour;
shintamainjp 0:8c55801ce311 37 int tm_mday;
shintamainjp 0:8c55801ce311 38 int tm_mon;
shintamainjp 0:8c55801ce311 39 int tm_year;
shintamainjp 0:8c55801ce311 40 int tm_wday;
shintamainjp 0:8c55801ce311 41 int tm_yday;
shintamainjp 0:8c55801ce311 42 int tm_isdst;
shintamainjp 0:8c55801ce311 43
shintamainjp 0:8c55801ce311 44 */
shintamainjp 0:8c55801ce311 45
shintamainjp 0:8c55801ce311 46 DWORD get_fattime (void) {
shintamainjp 0:8c55801ce311 47 time_t rawtime;
shintamainjp 0:8c55801ce311 48 struct tm *ptm;
shintamainjp 0:8c55801ce311 49 time ( &rawtime );
shintamainjp 0:8c55801ce311 50 ptm = localtime ( &rawtime );
shintamainjp 0:8c55801ce311 51 FFSDEBUG("DTM: %d/%d/%d %d:%d:%d\n",ptm->tm_year,ptm->tm_mon,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
shintamainjp 0:8c55801ce311 52 DWORD fattime = (DWORD)(ptm->tm_year - 80) << 25
shintamainjp 0:8c55801ce311 53 | (DWORD)(ptm->tm_mon + 1) << 21
shintamainjp 0:8c55801ce311 54 | (DWORD)(ptm->tm_mday) << 16
shintamainjp 0:8c55801ce311 55 | (DWORD)(ptm->tm_hour) << 11
shintamainjp 0:8c55801ce311 56 | (DWORD)(ptm->tm_min) << 5
shintamainjp 0:8c55801ce311 57 | (DWORD)(ptm->tm_sec/2);
shintamainjp 0:8c55801ce311 58
shintamainjp 0:8c55801ce311 59 FFSDEBUG("Converted: %x\n",fattime);
shintamainjp 0:8c55801ce311 60 return fattime;
shintamainjp 0:8c55801ce311 61 }
shintamainjp 0:8c55801ce311 62
shintamainjp 0:8c55801ce311 63 namespace mbed {
shintamainjp 0:8c55801ce311 64
shintamainjp 0:8c55801ce311 65 #if FFSDEBUG_ENABLED
shintamainjp 0:8c55801ce311 66 static const char *FR_ERRORS[] = {
shintamainjp 0:8c55801ce311 67 "FR_OK = 0",
shintamainjp 0:8c55801ce311 68 "FR_NOT_READY",
shintamainjp 0:8c55801ce311 69 "FR_NO_FILE",
shintamainjp 0:8c55801ce311 70 "FR_NO_PATH",
shintamainjp 0:8c55801ce311 71 "FR_INVALID_NAME",
shintamainjp 0:8c55801ce311 72 "FR_INVALID_DRIVE",
shintamainjp 0:8c55801ce311 73 "FR_DENIED",
shintamainjp 0:8c55801ce311 74 "FR_EXIST",
shintamainjp 0:8c55801ce311 75 "FR_RW_ERROR",
shintamainjp 0:8c55801ce311 76 "FR_WRITE_PROTECTED",
shintamainjp 0:8c55801ce311 77 "FR_NOT_ENABLED",
shintamainjp 0:8c55801ce311 78 "FR_NO_FILESYSTEM",
shintamainjp 0:8c55801ce311 79 "FR_INVALID_OBJECT",
shintamainjp 0:8c55801ce311 80 "FR_MKFS_ABORTED"
shintamainjp 0:8c55801ce311 81 };
shintamainjp 0:8c55801ce311 82 #endif
shintamainjp 0:8c55801ce311 83
shintamainjp 0:8c55801ce311 84 FATFileSystem *FATFileSystem::_ffs[_VOLUMES] = {0};
shintamainjp 0:8c55801ce311 85
shintamainjp 0:8c55801ce311 86 FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) {
shintamainjp 0:8c55801ce311 87 FFSDEBUG("FATFileSystem(%s)\n", n);
shintamainjp 0:8c55801ce311 88 for(int i=0; i<_VOLUMES; i++) {
shintamainjp 0:8c55801ce311 89 if(_ffs[i] == 0) {
shintamainjp 0:8c55801ce311 90 _ffs[i] = this;
shintamainjp 0:8c55801ce311 91 _fsid = i;
shintamainjp 0:8c55801ce311 92 FFSDEBUG("Mounting [%s] on ffs drive [%d]\n", _name, _fsid);
shintamainjp 0:8c55801ce311 93 f_mount(i, &_fs);
shintamainjp 0:8c55801ce311 94 return;
shintamainjp 0:8c55801ce311 95 }
shintamainjp 0:8c55801ce311 96 }
shintamainjp 0:8c55801ce311 97 error("Couldn't create %s in FATFileSystem::FATFileSystem\n",n);
shintamainjp 0:8c55801ce311 98 }
shintamainjp 0:8c55801ce311 99
shintamainjp 0:8c55801ce311 100 FATFileSystem::~FATFileSystem() {
shintamainjp 0:8c55801ce311 101 for(int i=0; i<_VOLUMES; i++) {
shintamainjp 0:8c55801ce311 102 if(_ffs[i] == this) {
shintamainjp 0:8c55801ce311 103 _ffs[i] = 0;
shintamainjp 0:8c55801ce311 104 f_mount(i, NULL);
shintamainjp 0:8c55801ce311 105 }
shintamainjp 0:8c55801ce311 106 }
shintamainjp 0:8c55801ce311 107 }
shintamainjp 0:8c55801ce311 108
shintamainjp 0:8c55801ce311 109 FileHandle *FATFileSystem::open(const char* name, int flags) {
shintamainjp 0:8c55801ce311 110 FFSDEBUG("open(%s) on filesystem [%s], drv [%d]\n", name, _name, _fsid);
shintamainjp 0:8c55801ce311 111 char n[64];
shintamainjp 0:8c55801ce311 112 sprintf(n, "%d:/%s", _fsid, name);
shintamainjp 0:8c55801ce311 113
shintamainjp 0:8c55801ce311 114 /* POSIX flags -> FatFS open mode */
shintamainjp 0:8c55801ce311 115 BYTE openmode;
shintamainjp 0:8c55801ce311 116 if(flags & O_RDWR) {
shintamainjp 0:8c55801ce311 117 openmode = FA_READ|FA_WRITE;
shintamainjp 0:8c55801ce311 118 } else if(flags & O_WRONLY) {
shintamainjp 0:8c55801ce311 119 openmode = FA_WRITE;
shintamainjp 0:8c55801ce311 120 } else {
shintamainjp 0:8c55801ce311 121 openmode = FA_READ;
shintamainjp 0:8c55801ce311 122 }
shintamainjp 0:8c55801ce311 123 if(flags & O_CREAT) {
shintamainjp 0:8c55801ce311 124 if(flags & O_TRUNC) {
shintamainjp 0:8c55801ce311 125 openmode |= FA_CREATE_ALWAYS;
shintamainjp 0:8c55801ce311 126 } else {
shintamainjp 0:8c55801ce311 127 openmode |= FA_OPEN_ALWAYS;
shintamainjp 0:8c55801ce311 128 }
shintamainjp 0:8c55801ce311 129 }
shintamainjp 0:8c55801ce311 130
shintamainjp 0:8c55801ce311 131 FIL fh;
shintamainjp 0:8c55801ce311 132 FRESULT res = f_open(&fh, n, openmode);
shintamainjp 0:8c55801ce311 133 if(res) {
shintamainjp 0:8c55801ce311 134 FFSDEBUG("f_open('w') failed (%d, %s)\n", res, FR_ERRORS[res]);
shintamainjp 0:8c55801ce311 135 return NULL;
shintamainjp 0:8c55801ce311 136 }
shintamainjp 0:8c55801ce311 137 if(flags & O_APPEND) {
shintamainjp 0:8c55801ce311 138 f_lseek(&fh, fh.fsize);
shintamainjp 0:8c55801ce311 139 }
shintamainjp 0:8c55801ce311 140 return new FATFileHandle(fh);
shintamainjp 0:8c55801ce311 141 }
shintamainjp 0:8c55801ce311 142
shintamainjp 0:8c55801ce311 143 int FATFileSystem::remove(const char *filename) {
shintamainjp 0:8c55801ce311 144 FRESULT res = f_unlink(filename);
shintamainjp 0:8c55801ce311 145 if(res) {
shintamainjp 0:8c55801ce311 146 FFSDEBUG("f_unlink() failed (%d, %s)\n", res, FR_ERRORS[res]);
shintamainjp 0:8c55801ce311 147 return -1;
shintamainjp 0:8c55801ce311 148 }
shintamainjp 0:8c55801ce311 149 return 0;
shintamainjp 0:8c55801ce311 150 }
shintamainjp 0:8c55801ce311 151
shintamainjp 0:8c55801ce311 152 int FATFileSystem::format() {
shintamainjp 0:8c55801ce311 153 FFSDEBUG("format()\n");
shintamainjp 0:8c55801ce311 154 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
shintamainjp 0:8c55801ce311 155 if(res) {
shintamainjp 0:8c55801ce311 156 FFSDEBUG("f_mkfs() failed (%d, %s)\n", res, FR_ERRORS[res]);
shintamainjp 0:8c55801ce311 157 return -1;
shintamainjp 0:8c55801ce311 158 }
shintamainjp 0:8c55801ce311 159 return 0;
shintamainjp 0:8c55801ce311 160 }
shintamainjp 0:8c55801ce311 161
shintamainjp 0:8c55801ce311 162 DirHandle *FATFileSystem::opendir(const char *name) {
shintamainjp 0:8c55801ce311 163 FATFS_DIR dir;
shintamainjp 0:8c55801ce311 164 FRESULT res = f_opendir(&dir, name);
shintamainjp 0:8c55801ce311 165 if(res != 0) {
shintamainjp 0:8c55801ce311 166 return NULL;
shintamainjp 0:8c55801ce311 167 }
shintamainjp 0:8c55801ce311 168 return new FATDirHandle(dir);
shintamainjp 0:8c55801ce311 169 }
shintamainjp 0:8c55801ce311 170
shintamainjp 0:8c55801ce311 171 int FATFileSystem::mkdir(const char *name, mode_t mode) {
shintamainjp 0:8c55801ce311 172 FRESULT res = f_mkdir(name);
shintamainjp 0:8c55801ce311 173 return res == 0 ? 0 : -1;
shintamainjp 0:8c55801ce311 174 }
shintamainjp 0:8c55801ce311 175
shintamainjp 0:8c55801ce311 176 } // namespace mbed