You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
4.0 KiB
137 lines
4.0 KiB
/* |
|
(c) 2017 night_ghost@ykoctpa.ru |
|
|
|
|
|
intermediate layer for FatFs |
|
|
|
*/ |
|
|
|
|
|
|
|
#include "SdFatFs.h" |
|
|
|
#if defined(BOARD_SDCARD_CS_PIN) || defined(BOARD_DATAFLASH_FATFS) |
|
|
|
FRESULT SdFatFs::init(Sd2Card *card) { |
|
|
|
_card=card; |
|
|
|
_SDPath[0] = '0'; |
|
_SDPath[1] = ':'; |
|
_SDPath[2] = '/'; |
|
_SDPath[3] = 0; |
|
|
|
FRESULT res = f_mount(&_SDFatFs, (TCHAR const*)_SDPath, 1); |
|
|
|
/*##-2- Register the file system object to the FatFs module ##############*/ |
|
if(res == FR_OK) { |
|
/* FatFs Initialization done */ |
|
return res; |
|
} |
|
|
|
#if defined(BOARD_DATAFLASH_FATFS) // in DataFlash |
|
// always reformat internal flash |
|
|
|
printf("Formatting DataFlash to FAT..."); |
|
|
|
#else |
|
// reformat SD card in case of filesystem error |
|
if(res!=FR_NO_FILESYSTEM) return res; |
|
|
|
|
|
printf("Formatting SD to FAT..."); |
|
#endif |
|
|
|
res = format((TCHAR const*)_SDPath, card); |
|
|
|
if( res == FR_OK){ |
|
printf(" OK!\n"); |
|
} else { |
|
printf(" Error: %s!\n", strError(res)); |
|
} |
|
|
|
|
|
return res; |
|
} |
|
|
|
|
|
FRESULT SdFatFs::format(const char *filepath, Sd2Card *card){ |
|
#if defined(BOARD_DATAFLASH_FATFS) // in DataFlash |
|
|
|
_card->ioctl(CTRL_FORMAT,0); // clear chip |
|
|
|
#endif |
|
FRESULT res = f_mkfs(filepath, 1 /* unpartitioned */, card->blockSize() /* cluster in sectors */); |
|
|
|
if(res == FR_OK){ |
|
res = f_mount(&_SDFatFs, filepath, 1); |
|
} |
|
|
|
return res; |
|
} |
|
|
|
uint8_t SdFatFs::fatType(void) |
|
{ |
|
switch (_SDFatFs.fs_type) |
|
{ |
|
case FS_FAT12: |
|
return 12; |
|
case FS_FAT16: |
|
return 16; |
|
case FS_FAT32: |
|
return 32; |
|
default: |
|
return 0; |
|
} |
|
} |
|
|
|
const char *SdFatFs::strError(FRESULT err){ |
|
switch(err){ |
|
case FR_OK: /* (0) Succeeded */ |
|
return "no error"; |
|
case FR_DISK_ERR: /* (1) A hard error occurred in the low level disk I/O layer */ |
|
return "Disk error"; |
|
case FR_INT_ERR: /* (2) Assertion failed */ |
|
return "internal error"; |
|
case FR_NOT_READY: /* (3) The physical drive cannot work */ |
|
return "drive not ready"; |
|
case FR_NO_FILE: /* (4) Could not find the file */ |
|
return "no file"; |
|
case FR_NO_PATH: /* (5) Could not find the path */ |
|
return "no path"; |
|
case FR_INVALID_NAME: /* (6) The path name format is invalid */ |
|
return "invalid name"; |
|
case FR_DENIED: /* (7) Access denied due to prohibited access or directory full */ |
|
return "access denied"; |
|
case FR_EXIST: /* (8) Access denied due to prohibited access */ |
|
return "file exists"; |
|
case FR_INVALID_OBJECT: /* (9) The file/directory object is invalid */ |
|
return "invalid object"; |
|
case FR_WRITE_PROTECTED: /* (10) The physical drive is write protected */ |
|
return "write protected"; |
|
case FR_INVALID_DRIVE: /* (11) The logical drive number is invalid */ |
|
return "invalid drive"; |
|
case FR_NOT_ENABLED: /* (12) The volume has no work area */ |
|
return "not enabled"; |
|
case FR_NO_FILESYSTEM: /* (13) There is no valid FAT volume */ |
|
return "no filesystem"; |
|
case FR_MKFS_ABORTED: /* (14) The f_mkfs() aborted due to any parameter error */ |
|
return "MKFS aborted"; |
|
case FR_TIMEOUT: /* (15) Could not get a grant to access the volume within defined period */ |
|
return "timeout"; |
|
case FR_LOCKED: /* (16) The operation is rejected according to the file sharing policy */ |
|
return "locked"; |
|
case FR_NOT_ENOUGH_CORE: /* (17) LFN working buffer could not be allocated */ |
|
return "not enough memory"; |
|
case FR_TOO_MANY_OPEN_FILES: /* (18) Number of open files > _FS_SHARE */ |
|
return "too many files"; |
|
case FR_INVALID_PARAMETER: /* (19) Given parameter is invalid */ |
|
return "invalid parameter"; |
|
case FR_IS_DIR: |
|
return "is directory"; |
|
} |
|
return ""; |
|
} |
|
|
|
#endif |
|
|
|
|