Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Initial commit.

Who changed what in which revision?

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