修复mico-sdk错误

This commit is contained in:
nhkefus
2025-03-11 15:54:45 +08:00
parent 3422912129
commit 2ccb892a1c
2152 changed files with 664341 additions and 702636 deletions

View File

@@ -1,239 +1,239 @@
#ifndef __FAT_FILE_H__
#define __FAT_FILE_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "fs_config.h"
#include "folder.h"
#include "fsinfo.h"
//open mode
#define FA_READ 0x01
#define FA_WRITE 0x02
#define FA_CREATE_NEW 0x04
#define FA_CREATE_ALWAYS 0x08
//file status
//#define FA__WRITTEN 0x20
//#define FA__DIRTY 0x40
//#define FA__ERROR 0x80
//define file seek position.
#define SEEK_FILE_SET 0 //seek file from the first sector of file
#define SEEK_FILE_CUR 1 //seek file from the current sector of file
#define SEEK_FILE_END 2 //seek file from the last sector of file
typedef enum _FILE_TYPE
{
FILE_TYPE_MP3,
FILE_TYPE_WMA,
FILE_TYPE_WAV,
FILE_TYPE_SBC,
FILE_TYPE_FLAC,
FILE_TYPE_AAC,
FILE_TYPE_AIF,
FILE_TYPE_AMR,
FILE_TYPE_UNKNOWN = 0xFF
} FILE_TYPE;
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct _FAT_FILE
{
uint16_t FileNumInDisk; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>ļ<EFBFBD><C4BC><EFBFBD>
uint16_t FileNumInFolder; //<2F>ڵ<EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD>
uint16_t FolderNum; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>еı<D0B5><C4B1><EFBFBD>
// uint16_t ValidFolderNum; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD><D0B5><EFBFBD>Ч<EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD><D0B1><EFBFBD>
uint32_t ParentFoldStartSecNum; //<2F><>Ŀ¼<C4BF><C2BC>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t DirSecNum; //FDI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t DirOffset; //FDI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint8_t ShortName[11]; //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
#if FAT_USE_LFN == 1
//uint8_t LongName[FAT_NAME_MAX]; //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
#endif
uint8_t FileType; //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t Size; //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint32_t FptrIndex;
uint32_t FptrCluster;
uint32_t StartClusNum; //<2F>ļ<EFBFBD><C4BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
uint32_t SecterOffset; // Sector offset in the cluster
uint32_t Fptr; //<2F><>ǰλ<C7B0><CEBB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
//uint32_t DataSec; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//uint8_t* IOBuffer; //<2F>ļ<EFBFBD><C4BC><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t Flag; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>״̬
FS_CONTEXT* FsContext;
} FAT_FILE;
//<2F><><EFBFBD>á<EFBFBD><C3A1><EFBFBD>ȡ<EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ľṹ<C4BD><E1B9B9>
typedef struct _FILE_TIME
{
uint16_t Year; //1980<38><30>2107
uint8_t Month; //1<><31>12
uint8_t Date; //1<><31>31
uint8_t Hour; //0<><30>23
uint8_t Min; //0<><30>59
uint8_t Sec; //0<><30>59
} FILE_TIME;
//
// @brief Open a file
// @param file_name file name forexample: \\mp3\\short.mp3,\\mp3\\short.mp3
// @param mode open mode FA_READ<41><44>FA_WRITE<54><45>FA_CREATE_NEW<45><57>FA_CREATE_ALWAYS
// @return File Handle
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>л<EFBFBD><D0BB>ļ<EFBFBD>
// ֧<>ֳ<EFBFBD><D6B3>ļ<EFBFBD><C4BC><EFBFBD>
bool FileOpen(FAT_FILE* File, const uint8_t* FileName, const uint8_t Mode);
//<2F>ж<EFBFBD><D0B6>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD>
uint8_t FileGetType(FS_CONTEXT* FsContext);
//
// @brief Check End-of-File indicator.
// @param File Pointer to a FILE object that specifies stream.
// @return The feof function returns a nonzero value if a read operation has attempted to read past the end of the file; it returns 0 otherwise.
//
int32_t FileEOF(FAT_FILE* File);
//<2F><><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>ͷ
void FileRewind(FAT_FILE* File);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD>ļ<EFBFBD>
//<2F>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
//Folder == NULL: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵĵ<CFB5>FileNum<75><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//Folder != NULL: <20><><EFBFBD><EFBFBD>Folder<65>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>еĵ<D0B5>FileNum<75><6D><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
bool FileOpenByNum(FAT_FILE* File, FOLDER* Folder, uint16_t FileNum);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD>
//<2F>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
//Folderָ<72><EFBFBD><EBB2BB>Ϊ<EFBFBD><CEAA>ָ<EFBFBD>
bool FileOpenByName(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD>
//<2F>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
//Folder<65><72><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>FileNameΪUnicode 16<31><36><EFBFBD><EFBFBD>
bool FileOpenByLfName(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName, uint8_t Len);
//
// @brief Moves the file pointer to a specified location.
// @param File Pointer to a FILE object that specifies stream.
// @param Offset Number of bytes from origin.
// @param Base Initial position.
// @return If successful, the function returns a zero value. Otherwise, it returns nonzero value.
//
int32_t FileSeek(FAT_FILE* File, int32_t Offset, uint8_t Base);
//
// @brief Read data from stream
// @param buffer Pointer to a block of buffer with a minimum size of (size*count) bytes.
// @param size Size in bytes of each element to be read.
// @param count Number of elements, each one with a size of size bytes.
// @param File Pointer to a FILE object that specifies an input stream.
// @return The total number of elements successfully read.
//
uint32_t FileRead(void* buffer, uint32_t size, uint32_t count, FAT_FILE* File);
//
// @brief Write data to stream
// @param buffer Pointer to a block of buffer with a minimum size of (size*count) bytes.
// @param size Size in bytes of each element to be write.
// @param count Number of elements, each one with a size of size bytes.
// @param File Pointer to a FILE object that specifies an output stream.
// @return The total number of elements successfully write.
//
uint32_t FileWrite(const void* buffer, uint32_t size, uint32_t count, FAT_FILE* File);
//
// @brief Get size of the opened file.
// @param File Pointer to a FILE object that specifies an output stream.
// @return size of the opened file.
//
int32_t FileSof(FAT_FILE* File);
//
// @brief Gets the current position of a file pointer.
// @param File Pointer to a FILE object that specifies stream.
// @return code
//
int32_t FileTell(FAT_FILE* File);
//
// @brief File save Fat and Dir
// @param File Pointer to a FILE object that specifies an output stream.
// @return fclose returns 0 if the stream is successfully closed.
//
int32_t FileSave(FAT_FILE* File);
//
// @brief Closes a stream.
// @param File Pointer to a FILE object that specifies an output stream.
// @return fclose returns 0 if the stream is successfully closed.
//
int32_t FileClose(FAT_FILE* File);
//<2F><>ȡָ<C8A1><D6B8><EFBFBD>ļ<EFBFBD><C4BC>ij<EFBFBD><C4B3>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>LongFileName<6D><65><EFBFBD><EFBFBD>С<EFBFBD><D0A1>GetMaxLength
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>
//<2F>޳<EFBFBD><DEB3>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
bool FileGetLongName(FAT_FILE* File, uint8_t* LongFileName, uint8_t GetMaxLength);
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ա<EFBFBD>
//<2F>ɹ<EFBFBD>:<3A><><EFBFBD><EFBFBD>TRUE<55><45>ʧ<EFBFBD><CAA7>:<3A><><EFBFBD><EFBFBD>FALSE<53><45>
bool FileFlush(FAT_FILE* File);
//<2F>ļ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>:<3A><><EFBFBD><EFBFBD>TRUE<55><45>ʧ<EFBFBD><CAA7>:<3A><><EFBFBD><EFBFBD>FALSE<53><45>
bool FileDelete(FAT_FILE* File);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//Ŀ<><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//FileName[]Ϊ<><CEAA><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磺"123.TXT", "ABC123.MP3"<22><>
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>8+3<>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD>ִ<EFBFBD>Сд<D0A1><D0B4>ĸ<EFBFBD><C4B8>
bool FileCreate(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//Ŀ<><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//FileName[]Ϊ<><CEAA><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//Folder <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>FileNameΪUnicode 16<31><36><EFBFBD>룬LongFileName<6D><65>Ϊ128 <20>ֽڿ<D6BD><DABF><EFBFBD>λ<EFBFBD><CEBB>Ϊ0xFF
bool FileCreateByLfName(FAT_FILE* File, FOLDER* Folder, uint8_t* LongFileName, uint8_t Len);
bool FSFormat(void);
//<2F>޸<EFBFBD><DEB8>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
//CreateTime: <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ1<CEAA><31>
//ModifyTime: <20><><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ2<CEAA><32>
//AccessTime: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬ֻ<E4A3AC><D6BB><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䲿<EFBFBD><E4B2BF>
//<2F><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ΪNULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
//<2F>ɹ<EFBFBD>:<3A><><EFBFBD><EFBFBD>TRUE<55><45> ʧ<><CAA7>:<3A><><EFBFBD><EFBFBD>FALSE<53><45>
bool FileSetTime(FAT_FILE* File, FILE_TIME* CreateTime, FILE_TIME* ModifyTime, FILE_TIME* AccessTime);
//<2F><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
//CreateTime: <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ1<CEAA><31>
//ModifyTime: <20><><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ2<CEAA><32>
//AccessTime: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬ֻ<E4A3AC><D6BB><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䲿<EFBFBD><E4B2BF>
//<2F><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ΪNULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
//<2F>ɹ<EFBFBD>:<3A><><EFBFBD><EFBFBD>TRUE<55><45> ʧ<><CAA7>:<3A><><EFBFBD><EFBFBD>FALSE<53><45>
bool FileGetTime(FAT_FILE* File, FILE_TIME* CreateTime, FILE_TIME* ModifyTime, FILE_TIME* AccessTime);
void SetFsTerminateFuc(TerminateFunc func);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //_FAT_FILE_H_
#ifndef __FAT_FILE_H__
#define __FAT_FILE_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "fs_config.h"
#include "folder.h"
#include "fsinfo.h"
//open mode
#define FA_READ 0x01
#define FA_WRITE 0x02
#define FA_CREATE_NEW 0x04
#define FA_CREATE_ALWAYS 0x08
//file status
//#define FA__WRITTEN 0x20
//#define FA__DIRTY 0x40
//#define FA__ERROR 0x80
//define file seek position.
#define SEEK_FILE_SET 0 //seek file from the first sector of file
#define SEEK_FILE_CUR 1 //seek file from the current sector of file
#define SEEK_FILE_END 2 //seek file from the last sector of file
typedef enum _FILE_TYPE
{
FILE_TYPE_MP3,
FILE_TYPE_WMA,
FILE_TYPE_WAV,
FILE_TYPE_SBC,
FILE_TYPE_FLAC,
FILE_TYPE_AAC,
FILE_TYPE_AIF,
FILE_TYPE_AMR,
FILE_TYPE_UNKNOWN = 0xFF
} FILE_TYPE;
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct _FAT_FILE
{
uint16_t FileNumInDisk; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>ļ<EFBFBD><C4BC><EFBFBD>
uint16_t FileNumInFolder; //<2F>ڵ<EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD>
uint16_t FolderNum; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>еı<D0B5><C4B1><EFBFBD>
// uint16_t ValidFolderNum; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD><D0B5><EFBFBD>Ч<EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD><D0B1><EFBFBD>
uint32_t ParentFoldStartSecNum; //<2F><>Ŀ¼<C4BF><C2BC>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t DirSecNum; //FDI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t DirOffset; //FDI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint8_t ShortName[11]; //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
#if FAT_USE_LFN == 1
//uint8_t LongName[FAT_NAME_MAX]; //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
#endif
uint8_t FileType; //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t Size; //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint32_t FptrIndex;
uint32_t FptrCluster;
uint32_t StartClusNum; //<2F>ļ<EFBFBD><C4BC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>غ<EFBFBD>
uint32_t SecterOffset; // Sector offset in the cluster
uint32_t Fptr; //<2F><>ǰλ<C7B0><CEBB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
//uint32_t DataSec; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//uint8_t* IOBuffer; //<2F>ļ<EFBFBD><C4BC><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t Flag; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>״̬
FS_CONTEXT* FsContext;
} FAT_FILE;
//<2F><><EFBFBD>á<EFBFBD><C3A1><EFBFBD>ȡ<EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ľṹ<C4BD><E1B9B9>
typedef struct _FILE_TIME
{
uint16_t Year; //1980<38><30>2107
uint8_t Month; //1<><31>12
uint8_t Date; //1<><31>31
uint8_t Hour; //0<><30>23
uint8_t Min; //0<><30>59
uint8_t Sec; //0<><30>59
} FILE_TIME;
//
// @brief Open a file
// @param file_name file name forexample: \\mp3\\short.mp3,\\mp3\\short.mp3
// @param mode open mode FA_READ<41><44>FA_WRITE<54><45>FA_CREATE_NEW<45><57>FA_CREATE_ALWAYS
// @return File Handle
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>л<EFBFBD><D0BB>ļ<EFBFBD>
// ֧<>ֳ<EFBFBD><D6B3>ļ<EFBFBD><C4BC><EFBFBD>
bool FileOpen(FAT_FILE* File, const uint8_t* FileName, const uint8_t Mode);
//<2F>ж<EFBFBD><D0B6>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD>
uint8_t FileGetType(FS_CONTEXT* FsContext);
//
// @brief Check End-of-File indicator.
// @param File Pointer to a FILE object that specifies stream.
// @return The feof function returns a nonzero value if a read operation has attempted to read past the end of the file; it returns 0 otherwise.
//
int32_t FileEOF(FAT_FILE* File);
//<2F><><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>ͷ
void FileRewind(FAT_FILE* File);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD>ļ<EFBFBD>
//<2F>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
//Folder == NULL: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵĵ<CFB5>FileNum<75><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//Folder != NULL: <20><><EFBFBD><EFBFBD>Folder<65>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>еĵ<D0B5>FileNum<75><6D><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
bool FileOpenByNum(FAT_FILE* File, FOLDER* Folder, uint16_t FileNum);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD>
//<2F>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
//Folderָ<72><EFBFBD><EBB2BB>Ϊ<EFBFBD><CEAA>ָ<EFBFBD>
bool FileOpenByName(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD>
//<2F>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
//Folder<65><72><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>FileNameΪUnicode 16<31><36><EFBFBD><EFBFBD>
bool FileOpenByLfName(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName, uint8_t Len);
//
// @brief Moves the file pointer to a specified location.
// @param File Pointer to a FILE object that specifies stream.
// @param Offset Number of bytes from origin.
// @param Base Initial position.
// @return If successful, the function returns a zero value. Otherwise, it returns nonzero value.
//
int32_t FileSeek(FAT_FILE* File, int32_t Offset, uint8_t Base);
//
// @brief Read data from stream
// @param buffer Pointer to a block of buffer with a minimum size of (size*count) bytes.
// @param size Size in bytes of each element to be read.
// @param count Number of elements, each one with a size of size bytes.
// @param File Pointer to a FILE object that specifies an input stream.
// @return The total number of elements successfully read.
//
uint32_t FileRead(void* buffer, uint32_t size, uint32_t count, FAT_FILE* File);
//
// @brief Write data to stream
// @param buffer Pointer to a block of buffer with a minimum size of (size*count) bytes.
// @param size Size in bytes of each element to be write.
// @param count Number of elements, each one with a size of size bytes.
// @param File Pointer to a FILE object that specifies an output stream.
// @return The total number of elements successfully write.
//
uint32_t FileWrite(const void* buffer, uint32_t size, uint32_t count, FAT_FILE* File);
//
// @brief Get size of the opened file.
// @param File Pointer to a FILE object that specifies an output stream.
// @return size of the opened file.
//
int32_t FileSof(FAT_FILE* File);
//
// @brief Gets the current position of a file pointer.
// @param File Pointer to a FILE object that specifies stream.
// @return code
//
int32_t FileTell(FAT_FILE* File);
//
// @brief File save Fat and Dir
// @param File Pointer to a FILE object that specifies an output stream.
// @return fclose returns 0 if the stream is successfully closed.
//
int32_t FileSave(FAT_FILE* File);
//
// @brief Closes a stream.
// @param File Pointer to a FILE object that specifies an output stream.
// @return fclose returns 0 if the stream is successfully closed.
//
int32_t FileClose(FAT_FILE* File);
//<2F><>ȡָ<C8A1><D6B8><EFBFBD>ļ<EFBFBD><C4BC>ij<EFBFBD><C4B3>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>LongFileName<6D><65><EFBFBD><EFBFBD>С<EFBFBD><D0A1>GetMaxLength
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>
//<2F>޳<EFBFBD><DEB3>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
bool FileGetLongName(FAT_FILE* File, uint8_t* LongFileName, uint8_t GetMaxLength);
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ա<EFBFBD>
//<2F>ɹ<EFBFBD>:<3A><><EFBFBD><EFBFBD>TRUE<55><45>ʧ<EFBFBD><CAA7>:<3A><><EFBFBD><EFBFBD>FALSE<53><45>
bool FileFlush(FAT_FILE* File);
//<2F>ļ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>:<3A><><EFBFBD><EFBFBD>TRUE<55><45>ʧ<EFBFBD><CAA7>:<3A><><EFBFBD><EFBFBD>FALSE<53><45>
bool FileDelete(FAT_FILE* File);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//Ŀ<><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//FileName[]Ϊ<><CEAA><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磺"123.TXT", "ABC123.MP3"<22><>
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>8+3<>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD>ִ<EFBFBD>Сд<D0A1><D0B4>ĸ<EFBFBD><C4B8>
bool FileCreate(FAT_FILE* File, FOLDER* Folder, uint8_t* FileName);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//Ŀ<><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽File<6C><65>ָ<EFBFBD>Ľṹ<C4BD>
//FileName[]Ϊ<><CEAA><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//Folder <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>FileNameΪUnicode 16<31><36><EFBFBD>룬LongFileName<6D><65>Ϊ128 <20>ֽڿ<D6BD><DABF><EFBFBD>λ<EFBFBD><CEBB>Ϊ0xFF
bool FileCreateByLfName(FAT_FILE* File, FOLDER* Folder, uint8_t* LongFileName, uint8_t Len);
bool FSFormat(void);
//<2F>޸<EFBFBD><DEB8>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
//CreateTime: <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ1<CEAA><31>
//ModifyTime: <20><><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ2<CEAA><32>
//AccessTime: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬ֻ<E4A3AC><D6BB><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䲿<EFBFBD><E4B2BF>
//<2F><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ΪNULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
//<2F>ɹ<EFBFBD>:<3A><><EFBFBD><EFBFBD>TRUE<55><45> ʧ<><CAA7>:<3A><><EFBFBD><EFBFBD>FALSE<53><45>
bool FileSetTime(FAT_FILE* File, FILE_TIME* CreateTime, FILE_TIME* ModifyTime, FILE_TIME* AccessTime);
//<2F><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
//CreateTime: <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ1<CEAA><31>
//ModifyTime: <20><><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ2<CEAA><32>
//AccessTime: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬ֻ<E4A3AC><D6BB><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䲿<EFBFBD><E4B2BF>
//<2F><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ΪNULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
//<2F>ɹ<EFBFBD>:<3A><><EFBFBD><EFBFBD>TRUE<55><45> ʧ<><CAA7>:<3A><><EFBFBD><EFBFBD>FALSE<53><45>
bool FileGetTime(FAT_FILE* File, FILE_TIME* CreateTime, FILE_TIME* ModifyTime, FILE_TIME* AccessTime);
void SetFsTerminateFuc(TerminateFunc func);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //_FAT_FILE_H_