修复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,273 +1,273 @@
/////////////////////////////////////////////////////////////////////////
// Mountain View Silicon Tech. Inc.
// Copyright 2012, Mountain View Silicon Tech. Inc.,ShangHai,China
// All rights reserved
// Filename:fsinfo.h
/////////////////////////////////////////////////////////////////////////
#ifndef __FSINFO_H__
#define __FSINFO_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include <string.h>
#include "fs_config.h"
#define SECTOR_SIZE 512 //bytes per sector
/////////////////////////<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>//////////////////////////////////////////////////////
#define MAX_FOLDER_NUM_SAVE 2048 //save foler 1-2048 empty flag
// Define device ID in system.
typedef enum _DEV_ID
{
DEV_ID_NONE,
DEV_ID_USB,
DEV_ID_SD,
DEV_ID_SPIFS,
DEV_ID_ATA
} DEV_ID;
//<2F><>ȡ<EFBFBD><C8A1>ǰĬ<C7B0>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
extern uint8_t FsGetDriveType(void);
// File system structure
typedef struct _FS_INFO
{
DEV_ID DevID; //device id of this drive
bool FAT32; //is FAT32 file system
bool IsCpatFS; //is compatalbe file system
bool IsFATChange;
//bool IsDIRChange;
int32_t CurrFATSecNum; //current FAT sector number
//int32_t CurrDirSecNum; //current directory sector number
uint8_t ClusterSize; //sector per cluster
uint32_t FatStart; //the sector number of FAT start
uint32_t RootStart; //This is set to the cluster number of the first cluster of the root director.,
uint32_t DataStart; //the first sector of data
uint32_t MaxCluster; //max cluster number in this drive
uint32_t MaxSector; //max sector number in this drive
uint32_t FreeClusNum;
uint16_t FileSum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵĸ<CFB5><C4B8><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
uint16_t FileSumInFolder; //<2F>ļ<EFBFBD>ϵͳ<CFB5>ڲ<EFBFBD>ʹ<EFBFBD><CAB9>
uint16_t FolderSum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t FolderNumInFolder; //<2F>ļ<EFBFBD>ϵͳ<CFB5>ڲ<EFBFBD>ʹ<EFBFBD><CAB9>
uint16_t ValidFolderSum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵķǿ<C4B7><C7BF>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t RootFileSum; //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
} FS_INFO;
#define MAX_STACK_DEPTH 9
typedef struct _LEAD_PATH
{
uint32_t SecNum[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t Offset[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint8_t NodesCnt;
uint32_t FdiSecNum; //ĩ<>˽ڵ<CBBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
uint16_t PreFileNumInDisk; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
uint16_t PreFileNumInFolder; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮ǰͬһ<CDAC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
uint16_t ParentFolderNum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>ļ<EFBFBD><C4BC>к<EFBFBD>
uint16_t PreFolderNumInFolder; //<2F>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮ǰͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>и<EFBFBD><D0B8><EFBFBD>
uint16_t PreFolderNumInDisk; //<2F><><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD><D0B1><EFBFBD>˳<EFBFBD><CBB3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮ǰȫ<C7B0><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>и<EFBFBD><D0B8><EFBFBD>
uint16_t StartFileNumNextFolder; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Լ<EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱʹ<CAB1><CAB9>
uint32_t FolderDirStart;
} LEAD_PATH;
#define MAX_LEAD_PATH_CNT 10 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ㣬<DAB5><E3A3AC>ͬ·<CDAC><C2B7><EFBFBD>ϵĽڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
#define MEMORY_PAGE_CNT 1024
typedef struct _FDI_STATCK
{
uint32_t SecNum[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t Offset[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint16_t FolderNum[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD>ͬһ<CDAC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ڱ<EFBFBD><DAB1>ڵ<EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
uint8_t Depth; //<2F><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>ϵĽڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
} FDI_STATCK;
//define File Description Block
#pragma pack(1)
typedef struct _FDB
{
uint8_t FileName[8];
uint8_t ExtName[3];
uint8_t Attribute;
uint8_t NTRes;
uint8_t CrtTimeTenth;
uint16_t CreateTime;
uint16_t CreateDate;
uint16_t AccessDate;
uint16_t StartHigh; //this entry's first cluster number. High
uint16_t ModifyTime;
uint16_t ModifyDate;
uint16_t StartLow; //this entry's first cluster number. Low
uint32_t Size; //32-bit uint32_t holding this file<6C><65>s size in bytes
} FDB;
#pragma pack()
#pragma pack(1)
// Define long name dirctory entry sturct.
typedef struct _LONG_DIR_ENTRY
{
uint8_t Ord;
uint8_t Name1[10];
uint8_t Attribute;
uint8_t Type;
uint8_t CheckSum;
uint8_t Name2[12];
uint8_t Resv[2];
uint8_t Name3[4];
} LONG_DIR_ENTRY;
#pragma pack()
#define PRESEARCH_STATUS_NONE 0x00
#define PRESEARCH_STATUS_SEARCHING 0x01
#define PRESEARCH_STATUS_SEARCHED 0x02
typedef struct _FS_IO_BUFFER
{
uint8_t Buffer[SECTOR_SIZE];
uint32_t BufferSecNum;
bool IsBufferChange;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Buffer <20><>BufferSecNumͬʱ<CDAC>ı<EFBFBD>
}FS_IO_BUFFER;
// File system context
typedef struct _FS_CONTEXT
{
// File System memory address.
uint8_t CurrentBufferFlag; //ָʾIO_BUFFER<45><52><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
FS_IO_BUFFER IO_BUFFER[2]; //<2F><><EFBFBD><EFBFBD>ԭFileIoBuffer<65><72>DIR_BUFFER<45><52><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD>ʡ<EFBFBD>ڴ<EFBFBD>
//uint8_t DIR_BUFFER[SECTOR_SIZE];
uint8_t FAT_BUFFER[SECTOR_SIZE];
FS_INFO gFsInfo; // File system structure
uint8_t gPreSearchStatus;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD><D0B1>š<EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʵ<EFBFBD>ֿ<EFBFBD><D6BF>ٶ<EFBFBD>λ<EFBFBD><CEBB>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>ļ<EFBFBD><C4BC>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>и<EFBFBD><D0B8><EFBFBD>
LEAD_PATH LeadPaths[MAX_LEAD_PATH_CNT];
uint16_t CurrentInterval;
uint16_t FdiCnt;
uint8_t OutIndex;
//
uint16_t gPreFileNum;
uint16_t gPreFileNumInFolder;
uint16_t gPreFolderNum;
uint16_t gPreFolderNumInFolder;
bool gFindFolderFlag;
uint16_t FolderStartFileNum;
bool gMemoryPageMapValid;
//dir
FDB* gCurrentEntry;
uint32_t gDirSecNum;
uint8_t gEntryOffset;
uint32_t gFolderDirStart;
FDI_STATCK FdiStack;
//bool gExcludeRecycled = FALSE;
//fat_write
uint8_t gMemoryPageMap[MEMORY_PAGE_CNT / 8];
uint32_t gClusStepNum;
//folder
uint16_t IncFileSum;
uint16_t IncFolderSum;
uint8_t gFolderEmpty[MAX_FOLDER_NUM_SAVE / 8]; //one bit per folder
uint32_t gCurFreeClusNum;
} FS_CONTEXT;
extern bool FSInit(uint8_t DeviceID);
extern bool FSDeInit(uint8_t DeviceID);
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><E9BAAF>Ϊ<EFBFBD>ļ<EFBFBD>ϵͳ<CFB5>ڲ<EFBFBD>ʹ<EFBFBD>á<EFBFBD>
void FSINFO_Init(FS_CONTEXT* FsContext);
void FSINFO_SaveFdi(FS_CONTEXT* FsContext);
void FSINFO_ChangeFolderNum(FS_CONTEXT* FsContext);
void FSINFO_ChangeFileNum(FS_CONTEXT* FsContext);
void FSINFO_InitOpenFolder(FS_CONTEXT* FsContext, uint16_t StartFolderNum, uint16_t FolderNum);
bool FSINFO_FindLastNode(FS_CONTEXT* FsContext, uint32_t SecNum, uint8_t Offset, uint8_t Depth, bool RecFlag, bool RootFlag);
void FSINFO_InitOpenFile(FS_CONTEXT* FsContext, uint16_t FileNum);
//<2F><>ij<EFBFBD><C4B3><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>Ϊ<EFBFBD>ǿա<C7BF>
void ClrFolderEmptyFlag(FS_CONTEXT* FsContext, uint16_t FolderNum);
//<2F><>ij<EFBFBD><C4B3><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>Ϊ<EFBFBD>ա<EFBFBD>
void SetFolderEmptyFlag(FS_CONTEXT* FsContext, uint16_t FolderNum);
//<2F>ж<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>ա<EFBFBD>
bool IsFolderEmpty(FS_CONTEXT* FsContext, uint16_t FolderNum);
//<2F><><EFBFBD><EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC>кż<D0BA><C5BC><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ļ<EFBFBD><C4BC>кţ<D0BA><C5A3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>
uint16_t GetValidFolderNum(FS_CONTEXT* FsContext, uint16_t OriginalFolderNum);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ļ<EFBFBD><C4BC>кţ<D0BA><C5A3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC>кš<D0BA>
uint16_t GetOriginalFolderNum(FS_CONTEXT* FsContext, uint16_t ValidFolderNum);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ŀ
//uint16_t GetValidFolderSum();
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>ѳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
DEV_ID GetCurFsDevType(void);
// <20><>ȡFSɨ<53><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB2A5>ģʽ<C4A3>ϵ<EFBFBD><CFB5><EFBFBD>Ϣ<EFBFBD><CFA2>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ID<49><44>
#ifdef FUNC_MATCH_PLAYER_BP
typedef struct __PLAYER_BP_RET_
{
int8_t BPIndex; // <20><>ƥ<EFBFBD><C6A5><EFBFBD>IJ<EFBFBD><C4B2>Ŷϵ<C5B6><CFB5><EFBFBD><EFBFBD><EFBFBD>(0~2), -1 -- not found
uint16_t FileId; // <20><><EFBFBD>Ŷϵ<C5B6><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ID
uint16_t FolderId; // <20><><EFBFBD>Ŷϵ<C5B6><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ID
} PLAYER_BP_RET;
typedef struct _PLAYER_BP_INFO_ // <20><><EFBFBD><EFBFBD>ģʽ <20>ϵ<EFBFBD><CFB5><EFBFBD>Ϣ
{
uint32_t FileAddr;
uint8_t CRC8;
} PLAYER_BP_INFO;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>Ŷϵ<C5B6>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>FS<46><53>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PLAYER_BP_RET* GetMatchPlayerBPRet(void);
void SetMatchPlayerBPRet(int8_t BPIndex, uint16_t FileId, uint16_t FolderId);
#endif
const unsigned char *GetLibVersionFs(void);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif
/////////////////////////////////////////////////////////////////////////
// Mountain View Silicon Tech. Inc.
// Copyright 2012, Mountain View Silicon Tech. Inc.,ShangHai,China
// All rights reserved
// Filename:fsinfo.h
/////////////////////////////////////////////////////////////////////////
#ifndef __FSINFO_H__
#define __FSINFO_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include <string.h>
#include "fs_config.h"
#define SECTOR_SIZE 512 //bytes per sector
/////////////////////////<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>//////////////////////////////////////////////////////
#define MAX_FOLDER_NUM_SAVE 2048 //save foler 1-2048 empty flag
// Define device ID in system.
typedef enum _DEV_ID
{
DEV_ID_NONE,
DEV_ID_USB,
DEV_ID_SD,
DEV_ID_SPIFS,
DEV_ID_ATA
} DEV_ID;
//<2F><>ȡ<EFBFBD><C8A1>ǰĬ<C7B0>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
extern uint8_t FsGetDriveType(void);
// File system structure
typedef struct _FS_INFO
{
DEV_ID DevID; //device id of this drive
bool FAT32; //is FAT32 file system
bool IsCpatFS; //is compatalbe file system
bool IsFATChange;
//bool IsDIRChange;
int32_t CurrFATSecNum; //current FAT sector number
//int32_t CurrDirSecNum; //current directory sector number
uint8_t ClusterSize; //sector per cluster
uint32_t FatStart; //the sector number of FAT start
uint32_t RootStart; //This is set to the cluster number of the first cluster of the root director.,
uint32_t DataStart; //the first sector of data
uint32_t MaxCluster; //max cluster number in this drive
uint32_t MaxSector; //max sector number in this drive
uint32_t FreeClusNum;
uint16_t FileSum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵĸ<CFB5><C4B8><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
uint16_t FileSumInFolder; //<2F>ļ<EFBFBD>ϵͳ<CFB5>ڲ<EFBFBD>ʹ<EFBFBD><CAB9>
uint16_t FolderSum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t FolderNumInFolder; //<2F>ļ<EFBFBD>ϵͳ<CFB5>ڲ<EFBFBD>ʹ<EFBFBD><CAB9>
uint16_t ValidFolderSum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵķǿ<C4B7><C7BF>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t RootFileSum; //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
} FS_INFO;
#define MAX_STACK_DEPTH 9
typedef struct _LEAD_PATH
{
uint32_t SecNum[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t Offset[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint8_t NodesCnt;
uint32_t FdiSecNum; //ĩ<>˽ڵ<CBBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
uint16_t PreFileNumInDisk; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
uint16_t PreFileNumInFolder; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮ǰͬһ<CDAC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
uint16_t ParentFolderNum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>ļ<EFBFBD><C4BC>к<EFBFBD>
uint16_t PreFolderNumInFolder; //<2F>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮ǰͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>и<EFBFBD><D0B8><EFBFBD>
uint16_t PreFolderNumInDisk; //<2F><><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD><D0B1><EFBFBD>˳<EFBFBD><CBB3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮ǰȫ<C7B0><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>и<EFBFBD><D0B8><EFBFBD>
uint16_t StartFileNumNextFolder; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Լ<EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱʹ<CAB1><CAB9>
uint32_t FolderDirStart;
} LEAD_PATH;
#define MAX_LEAD_PATH_CNT 10 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ㣬<DAB5><E3A3AC>ͬ·<CDAC><C2B7><EFBFBD>ϵĽڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
#define MEMORY_PAGE_CNT 1024
typedef struct _FDI_STATCK
{
uint32_t SecNum[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t Offset[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint16_t FolderNum[MAX_STACK_DEPTH]; //<2F><><EFBFBD>ڵ<EFBFBD>ͬһ<CDAC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ڱ<EFBFBD><DAB1>ڵ<EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
uint8_t Depth; //<2F><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>ϵĽڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
} FDI_STATCK;
//define File Description Block
#pragma pack(1)
typedef struct _FDB
{
uint8_t FileName[8];
uint8_t ExtName[3];
uint8_t Attribute;
uint8_t NTRes;
uint8_t CrtTimeTenth;
uint16_t CreateTime;
uint16_t CreateDate;
uint16_t AccessDate;
uint16_t StartHigh; //this entry's first cluster number. High
uint16_t ModifyTime;
uint16_t ModifyDate;
uint16_t StartLow; //this entry's first cluster number. Low
uint32_t Size; //32-bit uint32_t holding this file<6C><65>s size in bytes
} FDB;
#pragma pack()
#pragma pack(1)
// Define long name dirctory entry sturct.
typedef struct _LONG_DIR_ENTRY
{
uint8_t Ord;
uint8_t Name1[10];
uint8_t Attribute;
uint8_t Type;
uint8_t CheckSum;
uint8_t Name2[12];
uint8_t Resv[2];
uint8_t Name3[4];
} LONG_DIR_ENTRY;
#pragma pack()
#define PRESEARCH_STATUS_NONE 0x00
#define PRESEARCH_STATUS_SEARCHING 0x01
#define PRESEARCH_STATUS_SEARCHED 0x02
typedef struct _FS_IO_BUFFER
{
uint8_t Buffer[SECTOR_SIZE];
uint32_t BufferSecNum;
bool IsBufferChange;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Buffer <20><>BufferSecNumͬʱ<CDAC>ı<EFBFBD>
}FS_IO_BUFFER;
// File system context
typedef struct _FS_CONTEXT
{
// File System memory address.
uint8_t CurrentBufferFlag; //ָʾIO_BUFFER<45><52><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
FS_IO_BUFFER IO_BUFFER[2]; //<2F><><EFBFBD><EFBFBD>ԭFileIoBuffer<65><72>DIR_BUFFER<45><52><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD>ʡ<EFBFBD>ڴ<EFBFBD>
//uint8_t DIR_BUFFER[SECTOR_SIZE];
uint8_t FAT_BUFFER[SECTOR_SIZE];
FS_INFO gFsInfo; // File system structure
uint8_t gPreSearchStatus;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD><D0B1>š<EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʵ<EFBFBD>ֿ<EFBFBD><D6BF>ٶ<EFBFBD>λ<EFBFBD><CEBB>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>ļ<EFBFBD><C4BC>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>и<EFBFBD><D0B8><EFBFBD>
LEAD_PATH LeadPaths[MAX_LEAD_PATH_CNT];
uint16_t CurrentInterval;
uint16_t FdiCnt;
uint8_t OutIndex;
//
uint16_t gPreFileNum;
uint16_t gPreFileNumInFolder;
uint16_t gPreFolderNum;
uint16_t gPreFolderNumInFolder;
bool gFindFolderFlag;
uint16_t FolderStartFileNum;
bool gMemoryPageMapValid;
//dir
FDB* gCurrentEntry;
uint32_t gDirSecNum;
uint8_t gEntryOffset;
uint32_t gFolderDirStart;
FDI_STATCK FdiStack;
//bool gExcludeRecycled = FALSE;
//fat_write
uint8_t gMemoryPageMap[MEMORY_PAGE_CNT / 8];
uint32_t gClusStepNum;
//folder
uint16_t IncFileSum;
uint16_t IncFolderSum;
uint8_t gFolderEmpty[MAX_FOLDER_NUM_SAVE / 8]; //one bit per folder
uint32_t gCurFreeClusNum;
} FS_CONTEXT;
extern bool FSInit(uint8_t DeviceID);
extern bool FSDeInit(uint8_t DeviceID);
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><E9BAAF>Ϊ<EFBFBD>ļ<EFBFBD>ϵͳ<CFB5>ڲ<EFBFBD>ʹ<EFBFBD>á<EFBFBD>
void FSINFO_Init(FS_CONTEXT* FsContext);
void FSINFO_SaveFdi(FS_CONTEXT* FsContext);
void FSINFO_ChangeFolderNum(FS_CONTEXT* FsContext);
void FSINFO_ChangeFileNum(FS_CONTEXT* FsContext);
void FSINFO_InitOpenFolder(FS_CONTEXT* FsContext, uint16_t StartFolderNum, uint16_t FolderNum);
bool FSINFO_FindLastNode(FS_CONTEXT* FsContext, uint32_t SecNum, uint8_t Offset, uint8_t Depth, bool RecFlag, bool RootFlag);
void FSINFO_InitOpenFile(FS_CONTEXT* FsContext, uint16_t FileNum);
//<2F><>ij<EFBFBD><C4B3><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>Ϊ<EFBFBD>ǿա<C7BF>
void ClrFolderEmptyFlag(FS_CONTEXT* FsContext, uint16_t FolderNum);
//<2F><>ij<EFBFBD><C4B3><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>Ϊ<EFBFBD>ա<EFBFBD>
void SetFolderEmptyFlag(FS_CONTEXT* FsContext, uint16_t FolderNum);
//<2F>ж<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>ա<EFBFBD>
bool IsFolderEmpty(FS_CONTEXT* FsContext, uint16_t FolderNum);
//<2F><><EFBFBD><EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC>кż<D0BA><C5BC><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ļ<EFBFBD><C4BC>кţ<D0BA><C5A3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>
uint16_t GetValidFolderNum(FS_CONTEXT* FsContext, uint16_t OriginalFolderNum);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ļ<EFBFBD><C4BC>кţ<D0BA><C5A3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC>кš<D0BA>
uint16_t GetOriginalFolderNum(FS_CONTEXT* FsContext, uint16_t ValidFolderNum);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ŀ
//uint16_t GetValidFolderSum();
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>ѳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
DEV_ID GetCurFsDevType(void);
// <20><>ȡFSɨ<53><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB2A5>ģʽ<C4A3>ϵ<EFBFBD><CFB5><EFBFBD>Ϣ<EFBFBD><CFA2>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ID<49><44>
#ifdef FUNC_MATCH_PLAYER_BP
typedef struct __PLAYER_BP_RET_
{
int8_t BPIndex; // <20><>ƥ<EFBFBD><C6A5><EFBFBD>IJ<EFBFBD><C4B2>Ŷϵ<C5B6><CFB5><EFBFBD><EFBFBD><EFBFBD>(0~2), -1 -- not found
uint16_t FileId; // <20><><EFBFBD>Ŷϵ<C5B6><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ID
uint16_t FolderId; // <20><><EFBFBD>Ŷϵ<C5B6><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ID
} PLAYER_BP_RET;
typedef struct _PLAYER_BP_INFO_ // <20><><EFBFBD><EFBFBD>ģʽ <20>ϵ<EFBFBD><CFB5><EFBFBD>Ϣ
{
uint32_t FileAddr;
uint8_t CRC8;
} PLAYER_BP_INFO;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>Ŷϵ<C5B6>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>FS<46><53>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PLAYER_BP_RET* GetMatchPlayerBPRet(void);
void SetMatchPlayerBPRet(int8_t BPIndex, uint16_t FileId, uint16_t FolderId);
#endif
const unsigned char *GetLibVersionFs(void);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif