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 /* POSIX flags -> FatFS open mode */ 00074 BYTE openmode; 00075 if (flags & O_RDWR) { 00076 openmode = FA_READ|FA_WRITE; 00077 } else if(flags & O_WRONLY) { 00078 openmode = FA_WRITE; 00079 } else { 00080 openmode = FA_READ; 00081 } 00082 if(flags & O_CREAT) { 00083 if(flags & O_TRUNC) { 00084 openmode |= FA_CREATE_ALWAYS; 00085 } else { 00086 openmode |= FA_OPEN_ALWAYS; 00087 } 00088 } 00089 00090 FIL fh; 00091 FRESULT res = f_open(&fh, n, openmode); 00092 //if (res) { 00093 // debug_if(FFS_DBG, "f_open('w') failed: %d\n", res); 00094 // return NULL; 00095 // } 00096 if (flags & O_APPEND) { 00097 f_lseek(&fh, fh.fsize); 00098 } 00099 return new FATFileHandle(fh); 00100 } 00101 00102 int FATFileSystem::open(FileHandle **file, const char *name, int flags) { 00103 FileHandle *temp = open(name, flags); 00104 if (!temp) { 00105 return -1; 00106 } 00107 00108 *file = temp; 00109 return 0; 00110 } 00111 00112 int FATFileSystem::remove(const char *filename) { 00113 FRESULT res = f_unlink(filename); 00114 if (res) { 00115 debug_if(FFS_DBG, "f_unlink() failed: %d\n", res); 00116 return -1; 00117 } 00118 return 0; 00119 } 00120 00121 int FATFileSystem::rename(const char *oldname, const char *newname) { 00122 FRESULT res = f_rename(oldname, newname); 00123 if (res) { 00124 debug_if(FFS_DBG, "f_rename() failed: %d\n", res); 00125 return -1; 00126 } 00127 return 0; 00128 } 00129 00130 int FATFileSystem::format() { 00131 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster) 00132 if (res) { 00133 debug_if(FFS_DBG, "f_mkfs() failed: %d\n", res); 00134 return -1; 00135 } 00136 return 0; 00137 } 00138 00139 DirHandle *FATFileSystem::opendir(const char *name) { 00140 FATFS_DIR dir; 00141 FRESULT res = f_opendir(&dir, name); 00142 if (res != 0) { 00143 return NULL; 00144 } 00145 return new FATDirHandle(dir); 00146 } 00147 00148 int FATFileSystem::open(DirHandle **dir, const char *name) { 00149 DirHandle *temp = opendir(name); 00150 if (!temp) { 00151 return -1; 00152 } 00153 00154 *dir = temp; 00155 return 0; 00156 } 00157 00158 int FATFileSystem::mkdir(const char *name, mode_t mode) { 00159 FRESULT res = f_mkdir(name); 00160 return res == 0 ? 0 : -1; 00161 } 00162 00163 int FATFileSystem::mount() { 00164 FRESULT res = f_mount(&_fs, _fsid, 1); 00165 return res == 0 ? 0 : -1; 00166 } 00167 00168 int FATFileSystem::unmount() { 00169 if (disk_sync()) 00170 return -1; 00171 FRESULT res = f_mount(NULL, _fsid, 0); 00172 return res == 0 ? 0 : -1; 00173 } 00174
Generated on Tue Jul 12 2022 17:55:35 by
