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 = i; 00051 debug_if(FFS_DBG, "Mounting [%s] on ffs drive [%d]\n", _name, _fsid); 00052 f_mount(i, &_fs); 00053 return; 00054 } 00055 } 00056 error("Couldn't create %s in FATFileSystem::FATFileSystem\n", n); 00057 } 00058 00059 FATFileSystem::~FATFileSystem() { 00060 for (int i=0; i<_VOLUMES; i++) { 00061 if (_ffs[i] == this) { 00062 _ffs[i] = 0; 00063 f_mount(i, NULL); 00064 } 00065 } 00066 } 00067 00068 FileHandle *FATFileSystem::open(const char* name, int flags) { 00069 debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%d]\n", name, _name, _fsid); 00070 char n[64]; 00071 sprintf(n, "%d:/%s", _fsid, name); 00072 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::stat(const char * name, FILINFO * info) 00103 { 00104 char n[64]; 00105 sprintf(n, "%d:/%s", _fsid, name); 00106 00107 FRESULT res = f_stat(n, info); 00108 if (res) 00109 { 00110 debug_if(FFS_DBG, "f_stat() failed: %d\n", res); 00111 return -1; 00112 } 00113 00114 return 0; 00115 } 00116 00117 int FATFileSystem::remove(const char *filename) { 00118 FRESULT res = f_unlink(filename); 00119 if (res) { 00120 debug_if(FFS_DBG, "f_unlink() failed: %d\n", res); 00121 return -1; 00122 } 00123 return 0; 00124 } 00125 00126 int FATFileSystem::format() { 00127 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster) 00128 if (res) { 00129 debug_if(FFS_DBG, "f_mkfs() failed: %d\n", res); 00130 return -1; 00131 } 00132 return 0; 00133 } 00134 00135 DirHandle *FATFileSystem::opendir(const char *name) { 00136 FATFS_DIR dir; 00137 FRESULT res = f_opendir(&dir, name); 00138 if (res != 0) { 00139 return NULL; 00140 } 00141 return new FATDirHandle(dir); 00142 } 00143 00144 int FATFileSystem::mkdir(const char *name, mode_t mode) { 00145 FRESULT res = f_mkdir(name); 00146 return res == 0 ? 0 : -1; 00147 } 00148
Generated on Tue Jul 12 2022 18:55:01 by
1.7.2