1 #include <string.h>
2 #include <fcntl.h>
3
4
5 #include "libfat_public_api.h"
6 #include "common.h"
7 #include "disc_io.h"
8 #include "fatfile.h"
9
10
11 struct Instance
12 {
13 void* buffer;
14 int size_bytes;
15 struct devoptab_t* devops;
16 };
17
18 struct Instance sInstance;
19 struct Instance* gInstance = NULL;
20
MEDIUM_STARTUP(void)21 bool MEDIUM_STARTUP(void)
22 {
23 return true;
24 }
MEDIUM_ISINSERTED(void)25 bool MEDIUM_ISINSERTED(void)
26 {
27 return true;
28 }
MEDIUM_io(bool write,sec_t sector,sec_t numSectors,void * buffer)29 bool MEDIUM_io(bool write, sec_t sector, sec_t numSectors, void* buffer)
30 {
31 int todo = (int)numSectors*512;
32 int loc = (int)sector*512;
33 int have = gInstance->size_bytes - loc;
34 if(todo>have)
35 return false;
36 if(write)
37 memcpy((uint8_t*)gInstance->buffer + loc,buffer,todo);
38 else
39 memcpy(buffer,(uint8_t*)gInstance->buffer + loc,todo);
40 return true;
41 }
42
MEDIUM_READSECTORS(sec_t sector,sec_t numSectors,void * buffer)43 bool MEDIUM_READSECTORS(sec_t sector, sec_t numSectors, void* buffer)
44 {
45 return MEDIUM_io(false,sector,numSectors,buffer);
46 }
MEDIUM_WRITESECTORS(sec_t sector,sec_t numSectors,const void * buffer)47 bool MEDIUM_WRITESECTORS(sec_t sector, sec_t numSectors, const void* buffer)
48 {
49 return MEDIUM_io(true,sector,numSectors,(void*)buffer);
50 }
MEDIUM_CLEARSTATUS(void)51 bool MEDIUM_CLEARSTATUS(void)
52 {
53 return true;
54 }
MEDIUM_SHUTDOWN(void)55 bool MEDIUM_SHUTDOWN(void)
56 {
57 return true;
58 }
59
60 struct DISC_INTERFACE_STRUCT discio = {
61 0, //unsigned long ioType ;
62 FEATURE_MEDIUM_CANWRITE | FEATURE_MEDIUM_CANREAD, //unsigned long features ;
63 MEDIUM_STARTUP, // FN_MEDIUM_STARTUP startup ;
64 MEDIUM_ISINSERTED, //FN_MEDIUM_ISINSERTED isInserted ;
65 MEDIUM_READSECTORS, //FN_MEDIUM_READSECTORS readSectors ;
66 MEDIUM_WRITESECTORS, //FN_MEDIUM_WRITESECTORS writeSectors ;
67 MEDIUM_CLEARSTATUS, //FN_MEDIUM_CLEARSTATUS clearStatus ;
68 MEDIUM_SHUTDOWN, //FN_MEDIUM_SHUTDOWN shutdown ;
69 } ;
70
71
72 //not declared in any libfat headers...?
73 bool fatMountSimple (const char* name, const DISC_INTERFACE* interface);
74 void fatUnmountDirect (struct devoptab_t *devops);
75
LIBFAT_Init(void * buffer,int size_bytes)76 void LIBFAT_Init(void* buffer, int size_bytes)
77 {
78 gInstance = &sInstance;
79 gInstance->buffer = buffer;
80 gInstance->size_bytes = size_bytes;
81 fatMountSimple("fat",&discio);
82 gInstance->devops = GetDeviceOpTab(NULL);
83
84
85 int zzz=9;
86 }
87
LIBFAT_MkDir(const char * path)88 bool LIBFAT_MkDir(const char *path)
89 {
90 struct _reent r;
91 return gInstance->devops->mkdir_r(&r,path,0) == 0;
92 }
93
LIBFAT_WriteFile(const char * path,const void * data,int len)94 bool LIBFAT_WriteFile(const char *path, const void* data, int len)
95 {
96 struct _reent r;
97 FILE_STRUCT file;
98 intptr_t fd = gInstance->devops->open_r(&r,&file,path,O_CREAT | O_RDWR,0);
99 if(fd != -1)
100 {
101 ssize_t ret = gInstance->devops->write_r(&r, fd, (char*)data, len);
102 gInstance->devops->close_r(&r, fd);
103 if(ret == len)
104 return true;
105 }
106 return false;
107 }
108
LIBFAT_Shutdown(void)109 void LIBFAT_Shutdown(void)
110 {
111 fatUnmountDirect(gInstance->devops);
112 gInstance = NULL;
113 }
114