From 6b8902910592b9759bd0855e7b791d1e9c493d99 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 2 Jun 2009 16:01:35 +0200 Subject: [PATCH] o add ff setup stuff --- snes/fatfstest/ff.h | 2 +- snes/fatfstest/main.c | 106 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 104 insertions(+), 4 deletions(-) diff --git a/snes/fatfstest/ff.h b/snes/fatfstest/ff.h index 3381a2f..57786c9 100644 --- a/snes/fatfstest/ff.h +++ b/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. */ diff --git a/snes/fatfstest/main.c b/snes/fatfstest/main.c index ed35390..1984f4d 100644 --- a/snes/fatfstest/main.c +++ b/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 #include +#include 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){