Skip to content
Snippets Groups Projects
fs_util.c 2.01 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <fs_util.h>
    #include <ff.h>
    #include <stdint.h>
    #include <string.h>
    
    FATFS FatFs;          /* File system object for logical drive */
    FS_USAGE FsUsage;
    
    
    int fs_info(FATFS *fs)
    {
        memcpy(fs, &FatFs, sizeof(FATFS));
        return 0;
    }
    int fs_usage(FATFS *fs, FS_USAGE *fs_usage)
    {
        FRESULT res;
        DWORD tot_clust, fre_clust, sec_size;
    
        res = f_getfree("/", &fre_clust, &fs);
        if(res != FR_OK)
            return -res;
    
        // sectore size = sectors per cluster *  sector size
    #if FF_MAX_SS == FF_MIN_SS
        sec_size = fs->csize * FF_MAX_SS;
    #else
        sec_size = fs->csize * fs.ssize;
    #endif
    
        // total/free sectors * sectore size
        tot_clust = fs->n_fatent - 2;
        fs_usage->total = tot_clust * sec_size; //FatFs.ssize;
        fs_usage->free = fre_clust * sec_size; //FatFs.ssize;
    
        return 0;
    }
    
    int fs_read_file(char * filename, void * data, int len){
        FIL file;
        UINT readbytes;
        int res;
    
        res=f_open(&file, filename, FA_OPEN_EXISTING|FA_READ);
        if(res){
            return -1;
        };
    
        res = f_read(&file, data, len, &readbytes);
        if(res){
            return -1;
        };
    
        f_close(&file);
    
    	return readbytes;
    }
    
    int fs_read_text_file(char * filename, char * data, int len){
        int readbytes;
    
        if(len<1) return -1;
        readbytes=fs_read_file(filename,data,len-1);
        if(readbytes<0){
            data[0]=0;
            return readbytes;
        };
        data[readbytes]=0;
        while(readbytes>0 && data[readbytes-1]<0x20){
            data[--readbytes]=0;
        };
        return readbytes;
    }
    
    
    int fs_write_file(char * filename, const void * data, int len){
        FIL file;
        UINT writebytes;
        int res;
    
    	res=f_open(&file, filename, FA_CREATE_ALWAYS|FA_WRITE);
        if(res){
            return -res;
        };
    
        res = f_write(&file, data, len, &writebytes);
        if(res){
            return -res;
        };
        f_close(&file);
    
    	return writebytes;
    }
    
    int fs_get_file_size(char * filename){
        FILINFO finfo;
        int res;
    
        /// XXX: Untested
        res=f_stat(filename, &finfo);
        if(res){
            return -1;
        }
    
        return finfo.fsize;
    }