Dependencies:   ChaNFSSD mbed BMP085 SHT2x

Committer:
tosihisa
Date:
Mon Feb 27 16:20:15 2012 +0000
Revision:
9:9ca3db7ed7cb
V0.89.2. GPS recv data is OK.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tosihisa 9:9ca3db7ed7cb 1 /* mbed Microcontroller Library - FATFileSystem
tosihisa 9:9ca3db7ed7cb 2 * Copyright (c) 2008, sford
tosihisa 9:9ca3db7ed7cb 3 */
tosihisa 9:9ca3db7ed7cb 4
tosihisa 9:9ca3db7ed7cb 5 #include "FATFileSystem.h"
tosihisa 9:9ca3db7ed7cb 6
tosihisa 9:9ca3db7ed7cb 7 #include "mbed.h"
tosihisa 9:9ca3db7ed7cb 8
tosihisa 9:9ca3db7ed7cb 9 #include "FileSystemLike.h"
tosihisa 9:9ca3db7ed7cb 10 #include "FATFileHandle.h"
tosihisa 9:9ca3db7ed7cb 11 #include "FATDirHandle.h"
tosihisa 9:9ca3db7ed7cb 12 #include "ff.h"
tosihisa 9:9ca3db7ed7cb 13 //#include "Debug.h"
tosihisa 9:9ca3db7ed7cb 14 #include <stdio.h>
tosihisa 9:9ca3db7ed7cb 15 #include <stdlib.h>
tosihisa 9:9ca3db7ed7cb 16
tosihisa 9:9ca3db7ed7cb 17 DWORD get_fattime (void) {
tosihisa 9:9ca3db7ed7cb 18 DWORD retval = 0;
tosihisa 9:9ca3db7ed7cb 19 time_t seconds = time(NULL); // RTC time.
tosihisa 9:9ca3db7ed7cb 20 if(seconds <= 0)
tosihisa 9:9ca3db7ed7cb 21 seconds = 999;
tosihisa 9:9ca3db7ed7cb 22 struct tm *t = localtime(&seconds);
tosihisa 9:9ca3db7ed7cb 23 retval = 0;
tosihisa 9:9ca3db7ed7cb 24 retval |= (t->tm_year - 80) << 25;
tosihisa 9:9ca3db7ed7cb 25 retval |= (t->tm_mon + 1) << 21;
tosihisa 9:9ca3db7ed7cb 26 retval |= (t->tm_mday) << 16;
tosihisa 9:9ca3db7ed7cb 27 retval |= (t->tm_hour) << 11;
tosihisa 9:9ca3db7ed7cb 28 retval |= (t->tm_min) << 5;
tosihisa 9:9ca3db7ed7cb 29 retval |= (t->tm_sec) << 0;
tosihisa 9:9ca3db7ed7cb 30 return retval;
tosihisa 9:9ca3db7ed7cb 31 }
tosihisa 9:9ca3db7ed7cb 32
tosihisa 9:9ca3db7ed7cb 33 namespace mbed {
tosihisa 9:9ca3db7ed7cb 34
tosihisa 9:9ca3db7ed7cb 35 #if FFSDEBUG_ENABLED
tosihisa 9:9ca3db7ed7cb 36 static const char *FR_ERRORS[] = {
tosihisa 9:9ca3db7ed7cb 37 "FR_OK = 0",
tosihisa 9:9ca3db7ed7cb 38 "FR_NOT_READY",
tosihisa 9:9ca3db7ed7cb 39 "FR_NO_FILE",
tosihisa 9:9ca3db7ed7cb 40 "FR_NO_PATH",
tosihisa 9:9ca3db7ed7cb 41 "FR_INVALID_NAME",
tosihisa 9:9ca3db7ed7cb 42 "FR_INVALID_DRIVE",
tosihisa 9:9ca3db7ed7cb 43 "FR_DENIED",
tosihisa 9:9ca3db7ed7cb 44 "FR_EXIST",
tosihisa 9:9ca3db7ed7cb 45 "FR_RW_ERROR",
tosihisa 9:9ca3db7ed7cb 46 "FR_WRITE_PROTECTED",
tosihisa 9:9ca3db7ed7cb 47 "FR_NOT_ENABLED",
tosihisa 9:9ca3db7ed7cb 48 "FR_NO_FILESYSTEM",
tosihisa 9:9ca3db7ed7cb 49 "FR_INVALID_OBJECT",
tosihisa 9:9ca3db7ed7cb 50 "FR_MKFS_ABORTED"
tosihisa 9:9ca3db7ed7cb 51 };
tosihisa 9:9ca3db7ed7cb 52 #endif
tosihisa 9:9ca3db7ed7cb 53
tosihisa 9:9ca3db7ed7cb 54 FATFileSystem *FATFileSystem::_ffs[_DRIVES] = {0};
tosihisa 9:9ca3db7ed7cb 55
tosihisa 9:9ca3db7ed7cb 56 FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) {
tosihisa 9:9ca3db7ed7cb 57 FFSDEBUG("FATFileSystem(%s)\n", n);
tosihisa 9:9ca3db7ed7cb 58 for(int i=0; i<_DRIVES; i++) {
tosihisa 9:9ca3db7ed7cb 59 if(_ffs[i] == 0) {
tosihisa 9:9ca3db7ed7cb 60 _ffs[i] = this;
tosihisa 9:9ca3db7ed7cb 61 _fsid = i;
tosihisa 9:9ca3db7ed7cb 62 FFSDEBUG("Mounting [%s] on ffs drive [%d]\n", _name, _fsid);
tosihisa 9:9ca3db7ed7cb 63 f_mount(i, &_fs);
tosihisa 9:9ca3db7ed7cb 64 return;
tosihisa 9:9ca3db7ed7cb 65 }
tosihisa 9:9ca3db7ed7cb 66 }
tosihisa 9:9ca3db7ed7cb 67 error("Couldn't create %s in FATFileSystem::FATFileSystem\n",n);
tosihisa 9:9ca3db7ed7cb 68 }
tosihisa 9:9ca3db7ed7cb 69
tosihisa 9:9ca3db7ed7cb 70 FATFileSystem::~FATFileSystem() {
tosihisa 9:9ca3db7ed7cb 71 for(int i=0; i<_DRIVES; i++) {
tosihisa 9:9ca3db7ed7cb 72 if(_ffs[i] == this) {
tosihisa 9:9ca3db7ed7cb 73 _ffs[i] = 0;
tosihisa 9:9ca3db7ed7cb 74 f_mount(i, NULL);
tosihisa 9:9ca3db7ed7cb 75 }
tosihisa 9:9ca3db7ed7cb 76 }
tosihisa 9:9ca3db7ed7cb 77 }
tosihisa 9:9ca3db7ed7cb 78
tosihisa 9:9ca3db7ed7cb 79 FileHandle *FATFileSystem::open(const char* name, int flags) {
tosihisa 9:9ca3db7ed7cb 80 FFSDEBUG("open(%s) on filesystem [%s], drv [%d]\n", name, _name, _fsid);
tosihisa 9:9ca3db7ed7cb 81 char n[64];
tosihisa 9:9ca3db7ed7cb 82 sprintf(n, "%d:/%s", _fsid, name);
tosihisa 9:9ca3db7ed7cb 83
tosihisa 9:9ca3db7ed7cb 84 /* POSIX flags -> FatFS open mode */
tosihisa 9:9ca3db7ed7cb 85 BYTE openmode;
tosihisa 9:9ca3db7ed7cb 86 if(flags & O_RDWR) {
tosihisa 9:9ca3db7ed7cb 87 openmode = FA_READ|FA_WRITE;
tosihisa 9:9ca3db7ed7cb 88 } else if(flags & O_WRONLY) {
tosihisa 9:9ca3db7ed7cb 89 openmode = FA_WRITE;
tosihisa 9:9ca3db7ed7cb 90 } else {
tosihisa 9:9ca3db7ed7cb 91 openmode = FA_READ;
tosihisa 9:9ca3db7ed7cb 92 }
tosihisa 9:9ca3db7ed7cb 93 if(flags & O_CREAT) {
tosihisa 9:9ca3db7ed7cb 94 if(flags & O_TRUNC) {
tosihisa 9:9ca3db7ed7cb 95 openmode |= FA_CREATE_ALWAYS;
tosihisa 9:9ca3db7ed7cb 96 } else {
tosihisa 9:9ca3db7ed7cb 97 openmode |= FA_OPEN_ALWAYS;
tosihisa 9:9ca3db7ed7cb 98 }
tosihisa 9:9ca3db7ed7cb 99 }
tosihisa 9:9ca3db7ed7cb 100
tosihisa 9:9ca3db7ed7cb 101 FIL_t fh;
tosihisa 9:9ca3db7ed7cb 102 FRESULT res = f_open(&fh, n, openmode);
tosihisa 9:9ca3db7ed7cb 103 if(res) {
tosihisa 9:9ca3db7ed7cb 104 FFSDEBUG("f_open('w') failed (%d, %s)\n", res, FR_ERRORS[res]);
tosihisa 9:9ca3db7ed7cb 105 return NULL;
tosihisa 9:9ca3db7ed7cb 106 }
tosihisa 9:9ca3db7ed7cb 107 if(flags & O_APPEND) {
tosihisa 9:9ca3db7ed7cb 108 f_lseek(&fh, fh.fsize);
tosihisa 9:9ca3db7ed7cb 109 }
tosihisa 9:9ca3db7ed7cb 110 return new FATFileHandle(fh);
tosihisa 9:9ca3db7ed7cb 111 }
tosihisa 9:9ca3db7ed7cb 112
tosihisa 9:9ca3db7ed7cb 113 int FATFileSystem::remove(const char *filename) {
tosihisa 9:9ca3db7ed7cb 114 FRESULT res = f_unlink(filename);
tosihisa 9:9ca3db7ed7cb 115 if(res) {
tosihisa 9:9ca3db7ed7cb 116 FFSDEBUG("f_unlink() failed (%d, %s)\n", res, FR_ERRORS[res]);
tosihisa 9:9ca3db7ed7cb 117 return -1;
tosihisa 9:9ca3db7ed7cb 118 }
tosihisa 9:9ca3db7ed7cb 119 return 0;
tosihisa 9:9ca3db7ed7cb 120 }
tosihisa 9:9ca3db7ed7cb 121
tosihisa 9:9ca3db7ed7cb 122 int FATFileSystem::format() {
tosihisa 9:9ca3db7ed7cb 123 FFSDEBUG("format()\n");
tosihisa 9:9ca3db7ed7cb 124 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
tosihisa 9:9ca3db7ed7cb 125 if(res) {
tosihisa 9:9ca3db7ed7cb 126 FFSDEBUG("f_mkfs() failed (%d, %s)\n", res, FR_ERRORS[res]);
tosihisa 9:9ca3db7ed7cb 127 return -1;
tosihisa 9:9ca3db7ed7cb 128 }
tosihisa 9:9ca3db7ed7cb 129 return 0;
tosihisa 9:9ca3db7ed7cb 130 }
tosihisa 9:9ca3db7ed7cb 131
tosihisa 9:9ca3db7ed7cb 132 DirHandle *FATFileSystem::opendir(const char *name) {
tosihisa 9:9ca3db7ed7cb 133 DIR_t dir;
tosihisa 9:9ca3db7ed7cb 134 FRESULT res = f_opendir(&dir, name);
tosihisa 9:9ca3db7ed7cb 135 if(res != 0) {
tosihisa 9:9ca3db7ed7cb 136 return NULL;
tosihisa 9:9ca3db7ed7cb 137 }
tosihisa 9:9ca3db7ed7cb 138 return new FATDirHandle(dir);
tosihisa 9:9ca3db7ed7cb 139 }
tosihisa 9:9ca3db7ed7cb 140
tosihisa 9:9ca3db7ed7cb 141 int FATFileSystem::mkdir(const char *name, mode_t mode) {
tosihisa 9:9ca3db7ed7cb 142 FRESULT res = f_mkdir(name);
tosihisa 9:9ca3db7ed7cb 143 return res == 0 ? 0 : -1;
tosihisa 9:9ca3db7ed7cb 144 }
tosihisa 9:9ca3db7ed7cb 145
tosihisa 9:9ca3db7ed7cb 146 } // namespace mbed