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