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.
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", getName(), _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, getName(), _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::open(FileHandle **file, const char *name, int flags) { 00104 FileHandle *temp = open(name, flags); 00105 if (!temp) { 00106 return -1; 00107 } 00108 00109 *file = temp; 00110 return 0; 00111 } 00112 00113 int FATFileSystem::remove(const char *filename) { 00114 FRESULT res = f_unlink(filename); 00115 if (res) { 00116 debug_if(FFS_DBG, "f_unlink() failed: %d\n", res); 00117 return -1; 00118 } 00119 return 0; 00120 } 00121 00122 int FATFileSystem::rename(const char *oldname, const char *newname) { 00123 FRESULT res = f_rename(oldname, newname); 00124 if (res) { 00125 debug_if(FFS_DBG, "f_rename() failed: %d\n", res); 00126 return -1; 00127 } 00128 return 0; 00129 } 00130 00131 int FATFileSystem::format() { 00132 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster) 00133 if (res) { 00134 debug_if(FFS_DBG, "f_mkfs() failed: %d\n", res); 00135 return -1; 00136 } 00137 return 0; 00138 } 00139 00140 DirHandle *FATFileSystem::opendir(const char *name) { 00141 FATFS_DIR dir; 00142 FRESULT res = f_opendir(&dir, name); 00143 if (res != 0) { 00144 return NULL; 00145 } 00146 return new FATDirHandle(dir); 00147 } 00148 00149 int FATFileSystem::open(DirHandle **dir, const char *name) { 00150 DirHandle *temp = opendir(name); 00151 if (!temp) { 00152 return -1; 00153 } 00154 00155 *dir = temp; 00156 return 0; 00157 } 00158 00159 int FATFileSystem::mkdir(const char *name, mode_t mode) { 00160 FRESULT res = f_mkdir(name); 00161 return res == 0 ? 0 : -1; 00162 } 00163 00164 int FATFileSystem::mount() { 00165 FRESULT res = f_mount(&_fs, _fsid, 1); 00166 return res == 0 ? 0 : -1; 00167 } 00168 00169 int FATFileSystem::unmount() { 00170 if (disk_sync()) 00171 return -1; 00172 FRESULT res = f_mount(NULL, _fsid, 0); 00173 return res == 0 ? 0 : -1; 00174 }
Generated on Sun Jul 17 2022 22:15:02 by
