Some library needed for things? Licence unknown

Dependents:   LEDSign_SimpleSD

Committer:
TBSliver
Date:
Sun Jul 29 10:07:38 2012 +0000
Revision:
0:e4324838bc6f
[mbed] converted /LEDSign_SimpleSD/FatFileSystem

Who changed what in which revision?

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