Demonstration of a very simple unix-like shell. Based on integrating both Klaus Bu\'s SDHCFileSystem and the FATFileSystem library out of Thomas Hamilton\'s SDCard program. Result: you get high capacity + a plethora of filesystem functions.

Dependencies:   mbed

Committer:
shimniok
Date:
Tue Oct 11 15:13:42 2011 +0000
Revision:
0:792bddcf799d
Initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:792bddcf799d 1 /* mbed Microcontroller Library - FATFileSystem
shimniok 0:792bddcf799d 2 Copyright (c) 2008, sford */
shimniok 0:792bddcf799d 3
shimniok 0:792bddcf799d 4 //Modified by Thomas Hamilton, Copyright 2010
shimniok 0:792bddcf799d 5
shimniok 0:792bddcf799d 6 #include "FATFileSystem.h"
shimniok 0:792bddcf799d 7
shimniok 0:792bddcf799d 8 DWORD get_fattime(void)
shimniok 0:792bddcf799d 9 {
shimniok 0:792bddcf799d 10 return 35719201;
shimniok 0:792bddcf799d 11 }
shimniok 0:792bddcf799d 12
shimniok 0:792bddcf799d 13 FATFileSystem* FATFileSystem::DriveArray[_DRIVES] = {0};
shimniok 0:792bddcf799d 14
shimniok 0:792bddcf799d 15 FATFileSystem::FATFileSystem(const char* SystemName) : FileSystemLike(SystemName)
shimniok 0:792bddcf799d 16 {
shimniok 0:792bddcf799d 17 for (unsigned char i = 0; i < _DRIVES; i++)
shimniok 0:792bddcf799d 18 {
shimniok 0:792bddcf799d 19 if(!DriveArray[i])
shimniok 0:792bddcf799d 20 {
shimniok 0:792bddcf799d 21 DriveArray[i] = this;
shimniok 0:792bddcf799d 22 Drive = i;
shimniok 0:792bddcf799d 23 f_mount((BYTE)i, &FileSystemObject);
shimniok 0:792bddcf799d 24 return;
shimniok 0:792bddcf799d 25 }
shimniok 0:792bddcf799d 26 }
shimniok 0:792bddcf799d 27 }
shimniok 0:792bddcf799d 28
shimniok 0:792bddcf799d 29 FATFileSystem::~FATFileSystem()
shimniok 0:792bddcf799d 30 {
shimniok 0:792bddcf799d 31 for (unsigned char i = 0; i < _DRIVES; i++)
shimniok 0:792bddcf799d 32 {
shimniok 0:792bddcf799d 33 if (DriveArray[i] == this)
shimniok 0:792bddcf799d 34 {
shimniok 0:792bddcf799d 35 DriveArray[i] = NULL;
shimniok 0:792bddcf799d 36 f_mount((BYTE)i, NULL);
shimniok 0:792bddcf799d 37 }
shimniok 0:792bddcf799d 38 }
shimniok 0:792bddcf799d 39 delete this;
shimniok 0:792bddcf799d 40 }
shimniok 0:792bddcf799d 41
shimniok 0:792bddcf799d 42 FileHandle* FATFileSystem::open(const char* filename, int flags)
shimniok 0:792bddcf799d 43 {
shimniok 0:792bddcf799d 44 FAT_FIL FileObject;
shimniok 0:792bddcf799d 45 char FileName[64];
shimniok 0:792bddcf799d 46 BYTE ModeFlags = 0;
shimniok 0:792bddcf799d 47
shimniok 0:792bddcf799d 48 sprintf(FileName, "%d:/%s", Drive, filename);
shimniok 0:792bddcf799d 49 switch (flags & 3)
shimniok 0:792bddcf799d 50 {
shimniok 0:792bddcf799d 51 case O_RDONLY: ModeFlags = FA_READ; break;
shimniok 0:792bddcf799d 52 case O_WRONLY: ModeFlags = FA_WRITE; break;
shimniok 0:792bddcf799d 53 case O_RDWR: ModeFlags = FA_READ | FA_WRITE; break;
shimniok 0:792bddcf799d 54 }
shimniok 0:792bddcf799d 55 if(flags & O_CREAT)
shimniok 0:792bddcf799d 56 {
shimniok 0:792bddcf799d 57 if(flags & O_TRUNC)
shimniok 0:792bddcf799d 58 {
shimniok 0:792bddcf799d 59 ModeFlags |= FA_CREATE_ALWAYS;
shimniok 0:792bddcf799d 60 }
shimniok 0:792bddcf799d 61 else
shimniok 0:792bddcf799d 62 {
shimniok 0:792bddcf799d 63 ModeFlags |= FA_OPEN_ALWAYS;
shimniok 0:792bddcf799d 64 }
shimniok 0:792bddcf799d 65 }
shimniok 0:792bddcf799d 66 else
shimniok 0:792bddcf799d 67 {
shimniok 0:792bddcf799d 68 ModeFlags |= FA_OPEN_EXISTING;
shimniok 0:792bddcf799d 69 }
shimniok 0:792bddcf799d 70 if (f_open(&FileObject, (const TCHAR*)FileName, ModeFlags))
shimniok 0:792bddcf799d 71 {
shimniok 0:792bddcf799d 72 return NULL;
shimniok 0:792bddcf799d 73 }
shimniok 0:792bddcf799d 74 else
shimniok 0:792bddcf799d 75 {
shimniok 0:792bddcf799d 76 if (flags & O_APPEND)
shimniok 0:792bddcf799d 77 {
shimniok 0:792bddcf799d 78 f_lseek(&FileObject, (DWORD)FileObject.fsize);
shimniok 0:792bddcf799d 79 }
shimniok 0:792bddcf799d 80 return new FATFileHandle(FileObject);
shimniok 0:792bddcf799d 81 }
shimniok 0:792bddcf799d 82 }
shimniok 0:792bddcf799d 83
shimniok 0:792bddcf799d 84 int FATFileSystem::remove(const char* filename)
shimniok 0:792bddcf799d 85 {
shimniok 0:792bddcf799d 86 char FileName[64];
shimniok 0:792bddcf799d 87
shimniok 0:792bddcf799d 88 sprintf(FileName, "%d:/%s", Drive, filename);
shimniok 0:792bddcf799d 89 if (f_unlink((const TCHAR*)FileName))
shimniok 0:792bddcf799d 90 {
shimniok 0:792bddcf799d 91 return -1;
shimniok 0:792bddcf799d 92 }
shimniok 0:792bddcf799d 93 else
shimniok 0:792bddcf799d 94 {
shimniok 0:792bddcf799d 95 return 0;
shimniok 0:792bddcf799d 96 }
shimniok 0:792bddcf799d 97 }
shimniok 0:792bddcf799d 98
shimniok 0:792bddcf799d 99 int FATFileSystem::rename(const char* oldname, const char* newname)
shimniok 0:792bddcf799d 100 {
shimniok 0:792bddcf799d 101 char OldName[64];
shimniok 0:792bddcf799d 102
shimniok 0:792bddcf799d 103 sprintf(OldName, "%d:/%s", Drive, oldname);
shimniok 0:792bddcf799d 104 if (f_rename((const TCHAR*)OldName, (const TCHAR*)newname))
shimniok 0:792bddcf799d 105 {
shimniok 0:792bddcf799d 106 return -1;
shimniok 0:792bddcf799d 107 }
shimniok 0:792bddcf799d 108 else
shimniok 0:792bddcf799d 109 {
shimniok 0:792bddcf799d 110 return 0;
shimniok 0:792bddcf799d 111 }
shimniok 0:792bddcf799d 112 }
shimniok 0:792bddcf799d 113
shimniok 0:792bddcf799d 114 DirHandle* FATFileSystem::opendir(const char* name)
shimniok 0:792bddcf799d 115 {
shimniok 0:792bddcf799d 116 FAT_DIR DirectoryObject;
shimniok 0:792bddcf799d 117 char DirectoryName[64];
shimniok 0:792bddcf799d 118
shimniok 0:792bddcf799d 119 sprintf(DirectoryName, "%d:%s", Drive, name);
shimniok 0:792bddcf799d 120 if (f_opendir(&DirectoryObject, (const TCHAR*)DirectoryName))
shimniok 0:792bddcf799d 121 {
shimniok 0:792bddcf799d 122 return NULL;
shimniok 0:792bddcf799d 123 }
shimniok 0:792bddcf799d 124 else
shimniok 0:792bddcf799d 125 {
shimniok 0:792bddcf799d 126 return new FATDirHandle(DirectoryObject);
shimniok 0:792bddcf799d 127 }
shimniok 0:792bddcf799d 128 }
shimniok 0:792bddcf799d 129
shimniok 0:792bddcf799d 130 int FATFileSystem::mkdir(const char* name, mode_t mode)
shimniok 0:792bddcf799d 131 {
shimniok 0:792bddcf799d 132 char DirectoryName[64];
shimniok 0:792bddcf799d 133
shimniok 0:792bddcf799d 134 sprintf(DirectoryName, "%d:%s", Drive, name);
shimniok 0:792bddcf799d 135 if (f_mkdir((const TCHAR*)DirectoryName))
shimniok 0:792bddcf799d 136 {
shimniok 0:792bddcf799d 137 return -1;
shimniok 0:792bddcf799d 138 }
shimniok 0:792bddcf799d 139 else
shimniok 0:792bddcf799d 140 {
shimniok 0:792bddcf799d 141 return 0;
shimniok 0:792bddcf799d 142 }
shimniok 0:792bddcf799d 143 }
shimniok 0:792bddcf799d 144
shimniok 0:792bddcf799d 145 int FATFileSystem::format(unsigned int allocationunit)
shimniok 0:792bddcf799d 146 {
shimniok 0:792bddcf799d 147 if (f_mkfs(Drive, 0, allocationunit))
shimniok 0:792bddcf799d 148 {
shimniok 0:792bddcf799d 149 return -1;
shimniok 0:792bddcf799d 150 }
shimniok 0:792bddcf799d 151 else
shimniok 0:792bddcf799d 152 {
shimniok 0:792bddcf799d 153 return 0;
shimniok 0:792bddcf799d 154 }
shimniok 0:792bddcf799d 155 }