Browse Source

o add ff setup stuff

david 15 years ago
parent
commit
6b89029105
2 changed files with 104 additions and 4 deletions
  1. 1 1
      snes/fatfstest/ff.h
  2. 103 3
      snes/fatfstest/main.c

+ 1 - 1
snes/fatfstest/ff.h

@@ -38,7 +38,7 @@
 /  performance and code efficiency. */
 
 
-#define _FS_READONLY	1
+#define _FS_READONLY	0
 /* Setting _FS_READONLY to 1 defines read only configuration. This removes
 /  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
 /  f_truncate and useless f_getfree. */

+ 103 - 3
snes/fatfstest/main.c

@@ -1,3 +1,4 @@
+
 #include "data.h";
 #include "pad.h";
 #include "event.h";
@@ -5,12 +6,34 @@
 #include "ressource.h";
 #include "PPU.h"
 #include "debug.h"
+#include "integer.h"
+#include "ff.h"
 
 
+#include <time.h>
 #include <stdlib.h>
+#include <string.h>
 
 padStatus pad1;
 
+DWORD acc_size;             /* Work register for fs command */
+WORD acc_files, acc_dirs;
+
+FILINFO finfo;
+FATFS fatfs[2];             /* File system object for each logical drive */
+BYTE Buff[512];            /* Working buffer */
+
+DWORD p1, p2, p3;
+BYTE res;
+WORD w1;
+UINT s1, s2, cnt;
+
+FATFS *fs;
+DIR dir;                /* Directory object */
+FIL file1, file2;       /* File object */
+
+
+
 void initInternalRegisters(void) {
 	characterLocation[0] = 0x0000;
 	characterLocation[1] = 0x0000;
@@ -24,6 +47,61 @@ void preInit(void) {
 	// Insert code here to be executed before register init
 }
 
+DWORD get_fattime ()
+{
+  time_t rawtime;
+  struct tm * ptm;
+  //time ( &rawtime );
+  ptm = gmtime ( &rawtime );
+
+  return      ((DWORD)(ptm->tm_year - 80) << 25)
+            | ((DWORD)(ptm->tm_mon +1) << 21)
+            | ((DWORD)ptm->tm_mday << 16)
+            | ((DWORD)ptm->tm_hour << 11)
+            | ((DWORD)ptm->tm_min << 5)
+            | ((DWORD)ptm->tm_sec >> 1);
+}
+
+
+
+void put_rc (FRESULT rc){
+    const char *p;
+    static const char str[] =
+        "OK\0" "NOT_READY\0" "NO_FILE\0" "FR_NO_PATH\0" "INVALID_NAME\0" "INVALID_DRIVE\0"
+        "DENIED\0" "EXIST\0" "RW_ERROR\0" "WRITE_PROTECTED\0" "NOT_ENABLED\0"
+        "NO_FILESYSTEM\0" "INVALID_OBJECT\0" "MKFS_ABORTED\0";
+    FRESULT i;
+
+    for (p = str, i = 0; i != rc && *p; i++) {
+        while(*p++);
+    }
+    printfc("rc=%u FR_%s\n", (WORD)rc, p);
+}
+
+
+FRESULT scan_files (char* path){
+    DIR dirs;
+    FRESULT res;
+    int i;
+
+    if ((res = f_opendir(&dirs, path)) == FR_OK) {
+        i = strlen(path);
+        while (((res = f_readdir(&dirs, &finfo)) == FR_OK) && finfo.fname[0]) {
+            if (finfo.fattrib & AM_DIR) {
+                acc_dirs++;
+                *(path+i) = '/'; strcpy(path+i+1, &finfo.fname[0]);
+                res = scan_files(path);
+                *(path+i) = '\0';
+                if (res != FR_OK) break;
+            } else {
+                acc_files++;
+                acc_size += finfo.fsize;
+            }
+        }
+    }
+    return res;
+}
+
 void main(void) {
 	word i,j;
 	word crc01;
@@ -38,9 +116,31 @@ void main(void) {
 	*(byte*) 0x2100 = 0x0f; // enable background
 
     debug_enable();
-    printfs(0,"FATFS TEST %i",10);
-    printfc("Test me\n");
-    printfc("Test me %i\n",10);
+    printfs(0,"FATFS ");
+
+    printfc("Try to init disk\n");
+    put_rc(f_mount(0, &fatfs[p1]));
+
+    res = f_getfree("/", &p2, &fs);
+    if (res)
+        put_rc(res);
+
+    printfc("FAT type = %u\nBytes/Cluster = %lu\nNumber of FATs = %u\n"
+            "Root DIR entries = %u\nSectors/FAT = %lu\nNumber of clusters = %lu\n"
+            "FAT start (lba) = %lu\nDIR start (lba,clustor) = %lu\nData start (lba) = %lu\n",
+            (WORD)fs->fs_type, (DWORD)fs->csize * 512, (WORD)fs->n_fats,
+            fs->n_rootdir, (DWORD)fs->sects_fat, (DWORD)fs->max_clust - 2,
+            fs->fatbase, fs->dirbase, fs->database
+    );
+    acc_size = acc_files = acc_dirs = 0;
+    res = scan_files("/");
+    if (res)
+        put_rc(res);
+    printfc("%u files, %lu bytes.\n%u folders.\n"
+           "%lu KB total disk space.\n%lu KB available.\n",
+           acc_files, acc_size, acc_dirs,
+           (fs->max_clust - 2) * (fs->csize / 2), p2 * (fs->csize / 2)
+    );
 
   
 	while(1){