1 /* mbed Microcontroller Library - FATFileSystem
2 * Copyright (c) 2008, sford
5 #include "FATFileSystem.h"
9 #include "FileSystemLike.h"
10 #include "FATFileHandle.h"
11 #include "FATDirHandle.h"
17 DWORD
get_fattime (void) {
24 static const char *FR_ERRORS
[] = {
42 FATFileSystem
*FATFileSystem::_ffs
[_DRIVES
] = {0};
44 FATFileSystem::FATFileSystem(const char* n
) : FileSystemLike(n
) {
45 FFSDEBUG("FATFileSystem(%s)\n", n
);
46 for(int i
=0; i
<_DRIVES
; i
++) {
50 FFSDEBUG("Mounting [%s] on ffs drive [%d]\n", _name
, _fsid
);
55 error("Couldn't create %s in FATFileSystem::FATFileSystem\n",n
);
58 FATFileSystem::~FATFileSystem() {
59 for(int i
=0; i
<_DRIVES
; i
++) {
67 FileHandle
*FATFileSystem::open(const char* name
, int flags
) {
68 FFSDEBUG("open(%s) on filesystem [%s], drv [%d]\n", name
, _name
, _fsid
);
70 sprintf(n
, "%d:/%s", _fsid
, name
);
72 /* POSIX flags -> FatFS open mode */
75 openmode
= FA_READ
|FA_WRITE
;
76 } else if(flags
& O_WRONLY
) {
83 openmode
|= FA_CREATE_ALWAYS
;
85 openmode
|= FA_OPEN_ALWAYS
;
90 FRESULT res
= f_open(&fh
, n
, openmode
);
92 FFSDEBUG("f_open('w') failed (%d, %s)\n", res
, FR_ERRORS
[res
]);
95 if(flags
& O_APPEND
) {
96 f_lseek(&fh
, fh
.fsize
);
98 return new FATFileHandle(fh
);
101 int FATFileSystem::remove(const char *filename
) {
102 FRESULT res
= f_unlink(filename
);
104 FFSDEBUG("f_unlink() failed (%d, %s)\n", res
, FR_ERRORS
[res
]);
110 int FATFileSystem::rename(const char *filename1
, const char *filename2
) {
111 FRESULT res
= f_rename(filename1
, filename2
);
113 FFSDEBUG("f_rename() failed (%d, %s)\n", res
, FR_ERRORS
[res
]);
119 int FATFileSystem::format() {
120 FFSDEBUG("format()\n");
121 FRESULT res
= f_mkfs(_fsid
, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
123 FFSDEBUG("f_mkfs() failed (%d, %s)\n", res
, FR_ERRORS
[res
]);
129 DirHandle
*FATFileSystem::opendir(const char *name
) {
131 sprintf(n
, "%d:/%s", _fsid
, name
);
133 FRESULT res
= f_opendir(&dir
, n
);
137 return new FATDirHandle(dir
);
140 int FATFileSystem::mkdir(const char *name
, mode_t mode
) {
141 FRESULT res
= f_mkdir(name
);
142 return res
== 0 ? 0 : -1;