USBMSD SD card Hello World for Mbed platforms

Dependencies:   mbed USBMSD_SD USBDevice

Committer:
samux
Date:
Mon Nov 14 12:08:32 2011 +0000
Revision:
7:6494da2a5c60
will try to use ChaNFSSD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 7:6494da2a5c60 1 /* mbed Microcontroller Library - FATFileSystem
samux 7:6494da2a5c60 2 * Copyright (c) 2008, sford
samux 7:6494da2a5c60 3 */
samux 7:6494da2a5c60 4
samux 7:6494da2a5c60 5 #include "FATFileSystem.h"
samux 7:6494da2a5c60 6
samux 7:6494da2a5c60 7 #include "mbed.h"
samux 7:6494da2a5c60 8
samux 7:6494da2a5c60 9 #include "FileSystemLike.h"
samux 7:6494da2a5c60 10 #include "FATFileHandle.h"
samux 7:6494da2a5c60 11 #include "FATDirHandle.h"
samux 7:6494da2a5c60 12 #include "ff.h"
samux 7:6494da2a5c60 13 //#include "Debug.h"
samux 7:6494da2a5c60 14 #include <stdio.h>
samux 7:6494da2a5c60 15 #include <stdlib.h>
samux 7:6494da2a5c60 16
samux 7:6494da2a5c60 17 DWORD get_fattime (void) {
samux 7:6494da2a5c60 18 return 999;
samux 7:6494da2a5c60 19 }
samux 7:6494da2a5c60 20
samux 7:6494da2a5c60 21 namespace mbed {
samux 7:6494da2a5c60 22
samux 7:6494da2a5c60 23 #if FFSDEBUG_ENABLED
samux 7:6494da2a5c60 24 static const char *FR_ERRORS[] = {
samux 7:6494da2a5c60 25 "FR_OK = 0",
samux 7:6494da2a5c60 26 "FR_NOT_READY",
samux 7:6494da2a5c60 27 "FR_NO_FILE",
samux 7:6494da2a5c60 28 "FR_NO_PATH",
samux 7:6494da2a5c60 29 "FR_INVALID_NAME",
samux 7:6494da2a5c60 30 "FR_INVALID_DRIVE",
samux 7:6494da2a5c60 31 "FR_DENIED",
samux 7:6494da2a5c60 32 "FR_EXIST",
samux 7:6494da2a5c60 33 "FR_RW_ERROR",
samux 7:6494da2a5c60 34 "FR_WRITE_PROTECTED",
samux 7:6494da2a5c60 35 "FR_NOT_ENABLED",
samux 7:6494da2a5c60 36 "FR_NO_FILESYSTEM",
samux 7:6494da2a5c60 37 "FR_INVALID_OBJECT",
samux 7:6494da2a5c60 38 "FR_MKFS_ABORTED"
samux 7:6494da2a5c60 39 };
samux 7:6494da2a5c60 40 #endif
samux 7:6494da2a5c60 41
samux 7:6494da2a5c60 42 FATFileSystem *FATFileSystem::_ffs[_DRIVES] = {0};
samux 7:6494da2a5c60 43
samux 7:6494da2a5c60 44 FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) {
samux 7:6494da2a5c60 45 FFSDEBUG("FATFileSystem(%s)\n", n);
samux 7:6494da2a5c60 46 for(int i=0; i<_DRIVES; i++) {
samux 7:6494da2a5c60 47 if(_ffs[i] == 0) {
samux 7:6494da2a5c60 48 _ffs[i] = this;
samux 7:6494da2a5c60 49 _fsid = i;
samux 7:6494da2a5c60 50 FFSDEBUG("Mounting [%s] on ffs drive [%d]\n", _name, _fsid);
samux 7:6494da2a5c60 51 f_mount(i, &_fs);
samux 7:6494da2a5c60 52 return;
samux 7:6494da2a5c60 53 }
samux 7:6494da2a5c60 54 }
samux 7:6494da2a5c60 55 error("Couldn't create %s in FATFileSystem::FATFileSystem\n",n);
samux 7:6494da2a5c60 56 }
samux 7:6494da2a5c60 57
samux 7:6494da2a5c60 58 FATFileSystem::~FATFileSystem() {
samux 7:6494da2a5c60 59 for(int i=0; i<_DRIVES; i++) {
samux 7:6494da2a5c60 60 if(_ffs[i] == this) {
samux 7:6494da2a5c60 61 _ffs[i] = 0;
samux 7:6494da2a5c60 62 f_mount(i, NULL);
samux 7:6494da2a5c60 63 }
samux 7:6494da2a5c60 64 }
samux 7:6494da2a5c60 65 }
samux 7:6494da2a5c60 66
samux 7:6494da2a5c60 67 FileHandle *FATFileSystem::open(const char* name, int flags) {
samux 7:6494da2a5c60 68 FFSDEBUG("open(%s) on filesystem [%s], drv [%d]\n", name, _name, _fsid);
samux 7:6494da2a5c60 69 char n[64];
samux 7:6494da2a5c60 70 sprintf(n, "%d:/%s", _fsid, name);
samux 7:6494da2a5c60 71
samux 7:6494da2a5c60 72 /* POSIX flags -> FatFS open mode */
samux 7:6494da2a5c60 73 BYTE openmode;
samux 7:6494da2a5c60 74 if(flags & O_RDWR) {
samux 7:6494da2a5c60 75 openmode = FA_READ|FA_WRITE;
samux 7:6494da2a5c60 76 } else if(flags & O_WRONLY) {
samux 7:6494da2a5c60 77 openmode = FA_WRITE;
samux 7:6494da2a5c60 78 } else {
samux 7:6494da2a5c60 79 openmode = FA_READ;
samux 7:6494da2a5c60 80 }
samux 7:6494da2a5c60 81 if(flags & O_CREAT) {
samux 7:6494da2a5c60 82 if(flags & O_TRUNC) {
samux 7:6494da2a5c60 83 openmode |= FA_CREATE_ALWAYS;
samux 7:6494da2a5c60 84 } else {
samux 7:6494da2a5c60 85 openmode |= FA_OPEN_ALWAYS;
samux 7:6494da2a5c60 86 }
samux 7:6494da2a5c60 87 }
samux 7:6494da2a5c60 88
samux 7:6494da2a5c60 89 FIL_t fh;
samux 7:6494da2a5c60 90 FRESULT res = f_open(&fh, n, openmode);
samux 7:6494da2a5c60 91 if(res) {
samux 7:6494da2a5c60 92 FFSDEBUG("f_open('w') failed (%d, %s)\n", res, FR_ERRORS[res]);
samux 7:6494da2a5c60 93 return NULL;
samux 7:6494da2a5c60 94 }
samux 7:6494da2a5c60 95 if(flags & O_APPEND) {
samux 7:6494da2a5c60 96 f_lseek(&fh, fh.fsize);
samux 7:6494da2a5c60 97 }
samux 7:6494da2a5c60 98 return new FATFileHandle(fh);
samux 7:6494da2a5c60 99 }
samux 7:6494da2a5c60 100
samux 7:6494da2a5c60 101 int FATFileSystem::remove(const char *filename) {
samux 7:6494da2a5c60 102 FRESULT res = f_unlink(filename);
samux 7:6494da2a5c60 103 if(res) {
samux 7:6494da2a5c60 104 FFSDEBUG("f_unlink() failed (%d, %s)\n", res, FR_ERRORS[res]);
samux 7:6494da2a5c60 105 return -1;
samux 7:6494da2a5c60 106 }
samux 7:6494da2a5c60 107 return 0;
samux 7:6494da2a5c60 108 }
samux 7:6494da2a5c60 109
samux 7:6494da2a5c60 110 int FATFileSystem::format() {
samux 7:6494da2a5c60 111 FFSDEBUG("format()\n");
samux 7:6494da2a5c60 112 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
samux 7:6494da2a5c60 113 if(res) {
samux 7:6494da2a5c60 114 FFSDEBUG("f_mkfs() failed (%d, %s)\n", res, FR_ERRORS[res]);
samux 7:6494da2a5c60 115 return -1;
samux 7:6494da2a5c60 116 }
samux 7:6494da2a5c60 117 return 0;
samux 7:6494da2a5c60 118 }
samux 7:6494da2a5c60 119
samux 7:6494da2a5c60 120 DirHandle *FATFileSystem::opendir(const char *name) {
samux 7:6494da2a5c60 121 DIR_t dir;
samux 7:6494da2a5c60 122 FRESULT res = f_opendir(&dir, name);
samux 7:6494da2a5c60 123 if(res != 0) {
samux 7:6494da2a5c60 124 return NULL;
samux 7:6494da2a5c60 125 }
samux 7:6494da2a5c60 126 return new FATDirHandle(dir);
samux 7:6494da2a5c60 127 }
samux 7:6494da2a5c60 128
samux 7:6494da2a5c60 129 int FATFileSystem::mkdir(const char *name, mode_t mode) {
samux 7:6494da2a5c60 130 FRESULT res = f_mkdir(name);
samux 7:6494da2a5c60 131 return res == 0 ? 0 : -1;
samux 7:6494da2a5c60 132 }
samux 7:6494da2a5c60 133
samux 7:6494da2a5c60 134 } // namespace mbed