hattori&ide

Dependencies:   mbed

Committer:
hattori_atsushi
Date:
Sun Dec 18 08:16:01 2022 +0000
Revision:
0:f77369cabd75
hattori

Who changed what in which revision?

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