Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of FATFileSystem by
FATFileSystem.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2012 ARM Limited 00003 * 00004 * Permission is hereby granted, free of charge, to any person obtaining a copy 00005 * of this software and associated documentation files (the "Software"), to deal 00006 * in the Software without restriction, including without limitation the rights 00007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00008 * copies of the Software, and to permit persons to whom the Software is 00009 * furnished to do so, subject to the following conditions: 00010 * 00011 * The above copyright notice and this permission notice shall be included in 00012 * all copies or substantial portions of the Software. 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 00020 * SOFTWARE. 00021 */ 00022 #include "mbed.h" 00023 00024 #include "ffconf.h" 00025 #include "mbed_debug.h" 00026 00027 #include "FATFileSystem.h" 00028 #include "FATFileHandle.h" 00029 #include "FATDirHandle.h" 00030 00031 DWORD get_fattime(void) { 00032 time_t rawtime; 00033 time(&rawtime); 00034 struct tm *ptm = localtime(&rawtime); 00035 return (DWORD)(ptm->tm_year - 80) << 25 00036 | (DWORD)(ptm->tm_mon + 1 ) << 21 00037 | (DWORD)(ptm->tm_mday ) << 16 00038 | (DWORD)(ptm->tm_hour ) << 11 00039 | (DWORD)(ptm->tm_min ) << 5 00040 | (DWORD)(ptm->tm_sec/2 ); 00041 } 00042 00043 FATFileSystem *FATFileSystem::_ffs[_VOLUMES] = {0}; 00044 00045 FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) { 00046 debug_if(FFS_DBG, "FATFileSystem(%s)\n", n); 00047 for(int i=0; i<_VOLUMES; i++) { 00048 if(_ffs[i] == 0) { 00049 _ffs[i] = this; 00050 _fsid[0] = '0' + i; 00051 _fsid[1] = '\0'; 00052 debug_if(FFS_DBG, "Mounting [%s] on ffs drive [%s]\n", _name, _fsid); 00053 f_mount(&_fs, _fsid, 0); 00054 return; 00055 } 00056 } 00057 error("Couldn't create %s in FATFileSystem::FATFileSystem\n", n); 00058 } 00059 00060 FATFileSystem::~FATFileSystem() { 00061 for (int i=0; i<_VOLUMES; i++) { 00062 if (_ffs[i] == this) { 00063 _ffs[i] = 0; 00064 f_mount(NULL, _fsid, 0); 00065 } 00066 } 00067 } 00068 00069 FileHandle *FATFileSystem::open(const char* name, int flags) { 00070 debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%s]\n", name, _name, _fsid); 00071 char n[64]; 00072 sprintf(n, "%s:/%s", _fsid, name); 00073 00074 /* POSIX flags -> FatFS open mode */ 00075 BYTE openmode; 00076 if (flags & O_RDWR) { 00077 openmode = FA_READ|FA_WRITE; 00078 } else if(flags & O_WRONLY) { 00079 openmode = FA_WRITE; 00080 } else { 00081 openmode = FA_READ; 00082 } 00083 if(flags & O_CREAT) { 00084 if(flags & O_TRUNC) { 00085 openmode |= FA_CREATE_ALWAYS; 00086 } else { 00087 openmode |= FA_OPEN_ALWAYS; 00088 } 00089 } 00090 00091 FIL fh; 00092 FRESULT res = f_open(&fh, n, openmode); 00093 if (res) { 00094 debug_if(FFS_DBG, "f_open('w') failed: %d\n", res); 00095 return NULL; 00096 } 00097 if (flags & O_APPEND) { 00098 f_lseek(&fh, fh.fsize); 00099 } 00100 return new FATFileHandle(fh); 00101 } 00102 00103 int FATFileSystem::remove(const char *filename) { 00104 FRESULT res = f_unlink(filename); 00105 if (res) { 00106 debug_if(FFS_DBG, "f_unlink() failed: %d\n", res); 00107 return -1; 00108 } 00109 return 0; 00110 } 00111 00112 int FATFileSystem::rename(const char *oldname, const char *newname) { 00113 FRESULT res = f_rename(oldname, newname); 00114 if (res) { 00115 debug_if(FFS_DBG, "f_rename() failed: %d\n", res); 00116 return -1; 00117 } 00118 return 0; 00119 } 00120 00121 int FATFileSystem::format() { 00122 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster) 00123 if (res) { 00124 debug_if(FFS_DBG, "f_mkfs() failed: %d\n", res); 00125 return -1; 00126 } 00127 return 0; 00128 } 00129 00130 DirHandle *FATFileSystem::opendir(const char *name) { 00131 FATFS_DIR dir; 00132 FRESULT res = f_opendir(&dir, name); 00133 if (res != 0) { 00134 return NULL; 00135 } 00136 return new FATDirHandle(dir); 00137 } 00138 00139 int FATFileSystem::mkdir(const char *name, mode_t mode) { 00140 FRESULT res = f_mkdir(name); 00141 return res == 0 ? 0 : -1; 00142 } 00143 00144 int FATFileSystem::mount() { 00145 FRESULT res = f_mount(&_fs, _fsid, 1); 00146 return res == 0 ? 0 : -1; 00147 } 00148 00149 int FATFileSystem::unmount() { 00150 if (disk_sync()) 00151 return -1; 00152 FRESULT res = f_mount(NULL, _fsid, 0); 00153 return res == 0 ? 0 : -1; 00154 }
Generated on Thu Jul 28 2022 16:31:07 by
