修改了Web后台的部分界面,增加了HAmqtt中的总电量传感器,后台新增mqtt上报频率设置

This commit is contained in:
OOP
2025-03-03 21:49:41 +08:00
parent e1e00b60ce
commit 9f9d4c7a56
4468 changed files with 1473046 additions and 10728 deletions

View File

@@ -0,0 +1,149 @@
/////////////////////////////////////////////////////////////////////////
// Mountain View Silicon Tech. Inc.
// Copyright 2012, Mountain View Silicon Tech. Inc.,ShangHai,China
// All rights reserved
// Filename:diskio.c
/////////////////////////////////////////////////////////////////////////
//#include "app_config.h"
#include "fs_config.h"
#include "diskio.h"
#include "fsinfo.h"
#include "host_stor.h"
#include "sd_card.h"
#include "platform.h"
//
// Inidialize a Drive
//
DSTATUS disk_initialize(
uint8_t drv /* Physical drive nmuber (0..) */
)
{
DSTATUS res = RES_ERROR;
switch(drv)
{
#ifdef FUNC_CARD_EN
case DEV_ID_SD:
//res = MMC_disk_initialize();
break;
#endif //FUNC_CARD_EN
#ifdef FUNC_USB_EN
case DEV_ID_USB:
// res = USB_disk_initialize(drv);
break;
#endif //FUNC_CARD_EN
default:
break;
}
return res;
}
//
// Return Disk Status
//
DSTATUS disk_status(
uint8_t drv /* Physical drive nmuber (0..) */
)
{
DSTATUS res = RES_ERROR;
switch(drv)
{
#ifdef FUNC_CARD_EN
case DEV_ID_SD :
//res = MMC_disk_status();
break;
#endif //FUNC_CARD_EN
#ifdef FUNC_USB_EN
case DEV_ID_USB :
// res = USB_disk_status(drv);
break;
#endif //FUNC_USB_EN
default:
break;
}
return res;
}
//
//Read Sector(s)
//
DRESULT disk_read(
uint8_t drv, /* Physical drive nmuber (0..) */
uint8_t* buff, /* Data buffer to store read data */
uint32_t sector, /* Sector address (LBA) */
uint8_t count /* Number of sectors to read (1..255) */
)
{
DRESULT res = RES_ERROR;
switch(drv)
{
#ifdef FUNC_CARD_EN
case DEV_ID_SD :
if(!SdReadBlock(sector, buff, count))
{
res = RES_OK;
}
break;
#endif //FUNC_CARD_EN
#ifdef FUNC_USB_EN
case DEV_ID_USB :
if(HostStorReadBlock(sector, buff, count))
{
res = RES_OK;
}
#endif //FUNC_USB_EN
default:
break;
}
return res;
}
//
// Write Sector(s)
//
DRESULT disk_write(
uint8_t drv, /* Physical drive nmuber (0..) */
const uint8_t* buff, /* Data to be written */
uint32_t sector, /* Sector address (LBA) */
uint8_t count /* Number of sectors to write (1..255) */
)
{
DRESULT res = RES_ERROR;
switch(drv)
{
#ifdef FUNC_CARD_EN
case DEV_ID_SD :
if(!SdWriteBlock(sector, buff, count))
{
res = RES_OK;
}
break;
#endif //FUNC_CARD_EN
#ifdef FUNC_USB_EN
case DEV_ID_USB :
res = HostStorWriteBlock(sector, (void*)buff, count) ? RES_OK : RES_ERROR;
break;
#endif //FUNC_USB_EN
default:
break;
}
return res;
}

View File

@@ -0,0 +1,303 @@
/////////////////////////////////////////////////////////////////////////
// Mountain View Silicon Tech. Inc.
// Copyright 2012, Mountain View Silicon Tech. Inc.,ShangHai,China
// All rights reserved
// Filename:filesort.c
/////////////////////////////////////////////////////////////////////////
#include "fs_config.h"
#include "folder.h"
#include "fat_file.h"
#include "fsinfo.h"
#include "diskio.h"
#include "presearch.h"
#include "fs_filesort.h"
#if FS_FILE_SORT_EN == 1
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ֧<D6BB><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ǰ2048<34><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD>Χ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>Բ<EFBFBD><D4B2>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD><D9B0><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣬶<EFBFBD><F2A3ACB6>ǰ<EFBFBD><C7B0>ո<EFBFBD><D5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>2048<34><38><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>С<EFBFBD><D0A1><EFBFBD>Լ<EFBFBD>СSRAM<41><4D>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>12bit<69><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>2048<34><38><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><CAB1>ҪSRAM 1.5KB<EFBFBD><EFBFBD>
//<2F>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>FS_FILE_SORT_EN<45><4E><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܡ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>̬<EFBFBD><CCAC>ֹ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ֻ<EFBFBD><D6BB>Ҫ<EFBFBD><D2AA><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>FALSE
bool gFileSortEnable = TRUE;
/////////////<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//////////////////////////////////////////
//<2F><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF>ÿ<EEA3AC><C3BF><EFBFBD>ļ<EFBFBD>ռ<EFBFBD><D5BC>11<31>ֽ<EFBFBD>
typedef uint8_t FILE_NAME_TYPE[9]; //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB6A8><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
FILE_NAME_TYPE FileNameTable[FS_MAX_FILE_SORT_NUM]__ATTRIBUTE__(AT(VMEM_ADDR + 2048));
//<2F><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飬ÿ<E9A3AC><C3BF><EFBFBD>ļ<EFBFBD>ռ<EFBFBD><D5BC>2<EFBFBD>ֽ<EFBFBD>
uint16_t FileSortTableTemp[FS_MAX_FILE_SORT_NUM]__ATTRIBUTE__(AT(VMEM_ADDR + FS_MAX_FILE_SORT_NUM * 9 + 2048));
//<2F><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飬ÿ<E9A3AC><C3BF><EFBFBD>ļ<EFBFBD>ռ<EFBFBD><D5BC>1.5<EFBFBD>ֽ<EFBFBD>
//FileSortTable[]<5D><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>m<EFBFBD><6D><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>m<EFBFBD><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC><EFBFBD>
//<2F><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
// ---------------------------------------
// | FileNum1[11:4] | +0
// ---------------------------------------
// | FileNum2[11:8] | FileNum1[3:0] | +1
// ---------------------------------------
// | FileNum2[7:0] | +2
// ---------------------------------------
// | ... ... | +3
// ---------------------------------------
static uint8_t FileSortTable[(FS_MAX_FILE_SORT_NUM * 3) / 2 + 1];
//////////////////////////////////////////////////////////////////////////////////////////
//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µĸ<C2B5><C4B8><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>PreSearch()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FileSortSearchNewFile(FS_CONTEXT* FsContext)
{
if(FsContext->gFsInfo.FileSum <= FS_MAX_FILE_SORT_NUM)
{
memcpy(FileNameTable[FsContext->gFsInfo.FileSum - 1], &FsContext->gCurrentEntry->FileName[0], 11);
}
}
//<2F>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ɨ<EFBFBD><C9A8>һ<EFBFBD><EFBFBD><E9A3AC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>ת<EFBFBD>ɿɱȽϴ<C8BD>С<EFBFBD><D0A1>ѹ<EFBFBD><D1B9>BCD<43><44>ʽ<EFBFBD><CABD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽھ<D6BD><DABE>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD>ֵ0--9
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>Ǹ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>0x0A<30><41>ʾ<32><CEBB><EFBFBD><EFBFBD>0x0B<30><42>ʾ<33><CEBB><EFBFBD><EFBFBD>...
//<2F>ӵڶ<D3B5><DAB6><EFBFBD><EFBFBD>ֽڿ<D6BD>ʼ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>ѹ<EFBFBD><D1B9>BCD<43><44>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>0x00
//<2F><>1: 4D 50 33 5F 30 34 XX XX: 4D 50 03 5F 04 00 XX XX
//<2F><>2: 4D 50 33 5F 30 30 35 XX: 4D 50 03 5F 05 00 00 XX
//<2F><>3: 41 30 42 30 30 43 30 35: 41 00 42 00 00 43 05 00
static void FileSortConvertName(FS_CONTEXT* FsContext)
{
uint16_t Cnt = (FsContext->gFsInfo.FileSum > FS_MAX_FILE_SORT_NUM) ? FS_MAX_FILE_SORT_NUM : FsContext->gFsInfo.FileSum;
uint16_t i;
uint8_t j;
uint8_t k;
uint8_t * p;
uint8_t NumCnt;
uint8_t ZeroCnt;
uint8_t Temp;
for(i = 0; i < Cnt; i++)
{
p = FileNameTable[i];
for(j = 0; j < 8; j++)
{
if((p[j] < '0') || (p[j] > '9'))
{
continue; //<2F><>ǰλ<C7B0>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>
}
//<2F>ҵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>ͷ<EFBFBD><CDB7>'0'<27><><EFBFBD><EFBFBD>
for(ZeroCnt = 0; j + ZeroCnt < 8; ZeroCnt++)
{
if(p[j + ZeroCnt] != '0')
{
break;
}
p[j + ZeroCnt] = 0x00;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>
for(NumCnt = 0; j + ZeroCnt + NumCnt < 8; NumCnt++)
{
if((p[j + ZeroCnt + NumCnt] < '0') || (p[j + ZeroCnt + NumCnt] > '9'))
{
break;
}
Temp = p[j + ZeroCnt + NumCnt];
p[j + ZeroCnt + NumCnt] = 0x00;
p[j + NumCnt] = Temp - '0';
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><32><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>BCD<43><44>ʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>ʽ
if(NumCnt > 1)
{
for(k = 0; k < (NumCnt + 1) / 2; k++)
{
if(2 * k + 1 == NumCnt) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><33><CEBB><EFBFBD><EFBFBD><35><CEBB><EFBFBD><EFBFBD><37><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һλ<D2BB><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻȡ1<C8A1><31><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD>ȡ2<C8A1><32><EFBFBD>ֽ<EFBFBD>
{
Temp = (p[j + 2 * k] << 4);
p[j + 2 * k] = 0;
p[j + k + 1] = Temp;
}
else
{
Temp = (p[j + 2 * k] << 4) | p[j + 2 * k + 1];
p[j + 2 * k] = 0;
p[j + 2 * k + 1] = 0;
p[j + k + 1] = Temp;
}
}
p[j] = NumCnt + 8; //<2F><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ĵ<EFBFBD>1<EFBFBD><31><EFBFBD>ֽڱ<D6BD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><31><CEBB><EFBFBD><EFBFBD>00H-09H<39><48><32><CEBB><EFBFBD><EFBFBD>0AH<41><48><33><CEBB><EFBFBD><EFBFBD>0BH<42><48><38><CEBB><EFBFBD><EFBFBD>10H
}
j += (NumCnt + ZeroCnt);
}
}
}
//<2F><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>(n*logn)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void FileSortByName(FS_CONTEXT* FsContext)
{
uint16_t Cnt = (FsContext->gFsInfo.FileSum > FS_MAX_FILE_SORT_NUM) ? FS_MAX_FILE_SORT_NUM : FsContext->gFsInfo.FileSum;
uint16_t i;
uint16_t j;
int16_t Start;
int16_t End;
int16_t Cur;
for(i = 0; i < Cnt; i++)
{
Start = -1;
End = i;
//<2F><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
while(Start + 1 < End)
{
Cur = (Start + End) / 2;
if(memcmp(FileNameTable[i], FileNameTable[FileSortTableTemp[Cur]], 9) < 0)
{
End = Cur;
}
else
{
Start = Cur;
}
}
//<2F><><EFBFBD>½ڵ<C2BD><DAB5><EFBFBD><EFBFBD>뵽Endλ<64>ã<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>нڵ<D0BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
for(j = i; j > End; j--)
{
FileSortTableTemp[j] = FileSortTableTemp[j - 1];
}
FileSortTableTemp[End] = i;
}
}
static void FileSortSaveResult(FS_CONTEXT* FsContext)
{
uint16_t Cnt = (FsContext->gFsInfo.FileSum > FS_MAX_FILE_SORT_NUM) ? FS_MAX_FILE_SORT_NUM : FsContext->gFsInfo.FileSum;
uint16_t i;
uint16_t Temp;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>FileSortTable[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i = 1; i <= Cnt; i++)
{
Temp = ((i - 1) / 2) * 3;
FileSortTableTemp[i - 1]++;
if(i % 2) //<2F><><EFBFBD><EFBFBD>
{
FileSortTable[Temp + 0] = (uint8_t)(FileSortTableTemp[i - 1] >> 4);
FileSortTable[Temp + 1] = (uint8_t)(FileSortTableTemp[i - 1] & 0x0F);
}
else //ż<><C5BC>
{
FileSortTable[Temp + 1] |= (uint8_t)((FileSortTableTemp[i - 1] >> 4) & 0xF0);
FileSortTable[Temp + 2] = (uint8_t)FileSortTableTemp[i - 1];
}
}
}
//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>FileNameTable[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FileSortTableTemp[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Ȼ<><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FileSortTable[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>PreSearch()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FileSortSearchEnd(FS_CONTEXT* FsContext)
{
TIMER TestTimer; //<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʱͳ<CAB1><CDB3>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1>
// DBG("FileSortSearchEnd()\n");
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// gFsInfo.FileSum = 10;
// memcpy(FileNameTable[0], "1 M", 9);
TimeOutSet(&TestTimer, 0);
FileSortConvertName(FsContext);
DBG("time1: %d ms\n", (uint16_t)PastTimeGet(&TestTimer));
TimeOutSet(&TestTimer, 0);
FileSortByName(FsContext);
DBG("time2: %d ms\n", (uint16_t)PastTimeGet(&TestTimer));
TimeOutSet(&TestTimer, 0);
FileSortSaveResult(FsContext);
DBG("time3: %d ms\n", (uint16_t)PastTimeGet(&TestTimer));
}
//<2F>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>FileOpenByNum()<29><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>FileSortNum<75><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC>Ų<EFBFBD><C5B2><EFBFBD>[StartFileNum + 1, EndFileNum]<5D><>Χ<EFBFBD>ڵ<EFBFBD><DAB5>ļ<EFBFBD>
//1.<2E><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>m<EFBFBD><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC>ţ<EFBFBD>
// GetFileNumInDisk(FsContext, m, 0, 0xFFFF)<29><><EFBFBD>õ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ӧ<EFBFBD><D3A6>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//2.<2E><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>m<EFBFBD><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC>ţ<EFBFBD>
// GetFileNumInDisk(FsContext, m, Folder->StartFileNum, Folder->StartFileNum + Folder->IncFileCnt)<29><>
uint16_t GetFileNumInDisk(FS_CONTEXT* FsContext, uint16_t FileSortNum, uint16_t StartFileNum, uint16_t EndFileNum)
{
uint16_t i;
uint16_t FileNumInDisk;
uint16_t Index;
//<2F><>ǰΪ<C7B0><CEAA>ֹ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!gFileSortEnable)
{
return (StartFileNum + FileSortNum);
}
//<2F><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ʹ<EFBFBD><CAB9>ԭʼ<D4AD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if(FileSortNum + StartFileNum > FS_MAX_FILE_SORT_NUM)
{
return (StartFileNum + FileSortNum);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ΪĿ<CEAA><C4BF><EFBFBD>ļ<EFBFBD>
for(i = 1; i <= FS_MAX_FILE_SORT_NUM; i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>i<EFBFBD><69><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ӧ<EFBFBD><D3A6>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
Index = ((i - 1) / 2) * 3;
if(i % 2) //<2F><><EFBFBD><EFBFBD>
{
FileNumInDisk = ((FileSortTable[Index] << 4) + (FileSortTable[Index + 1] & 0x0F));
}
else //ż<><C5BC>
{
FileNumInDisk = (((FileSortTable[Index + 1] & 0xF0) << 4) + FileSortTable[Index + 2]); //(FileSortTable[Index + 1] & 0xF0)<29><><EFBFBD><EFBFBD><34><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//<2F>ж<EFBFBD><D0B6>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>Χ<EAB7B6><CEA7>
if((FileNumInDisk > StartFileNum) && (FileNumInDisk <= EndFileNum))
{
FileSortNum--;
if(FileSortNum == 0)
{
//<2F>ҵ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD>
return FileNumInDisk;
}
}
}
}
#endif//FS_FILE_SORT_EN

Binary file not shown.

View File

@@ -0,0 +1,44 @@
--------------------------------------------------------------------------------------
RELEASE NOTES
Shanghai Mountain View Silicon Co. Ltd. Copyright 2014, All rights reserved.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>Ϻ<EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>·<EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾(<28><><EFBFBD><EFBFBD><><C9BD>")<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDK<44><4B><EFBFBD><EFBFBD>
Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD>SDK<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD>ȷ<EFBFBD>ԣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>°汾Ϊ׼<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ʹ<EFBFBD>ñ<EFBFBD>SDK<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD>޹ء<EFBFBD>
ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD>ڿɿ<EFBFBD><EFBFBD>ԡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸĽ<EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD>ɱ<EFBFBD>SDKϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ρ<EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>Ʒ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ά<EFBFBD>ֺ<EFBFBD><EFBFBD>κ<EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD>Ĺ<EFBFBD><EFBFBD>ϻ<EFBFBD><EFBFBD>Ը<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>ƷӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣬼<EFBFBD>ʹ<EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>Ʒ<EFBFBD><EFBFBD>
<EFBFBD>ƺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>û<EFBFBD>ҲӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD>á<EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ֱ<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʦ<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>֤ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD>˾<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹ء<EFBFBD>
<EFBFBD>κ<EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>ʽ (<28><EFBFBD><E7A3BA><EFBFBD>ӵġ<D3B5><C4A1><EFBFBD>е<EFBFBD>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1><EFBFBD>ѧ<EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>) <20><><EFBFBD>ơ<EFBFBD><C6A1><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><E6B4A2><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ǵõ<C7B5>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ͬ<EFBFBD>
ע<EFBFBD><EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>á<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>벻Ҫ<EFBFBD><EFBFBD><EFBFBD>׸Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뼰ʱ
<EFBFBD><EFBFBD>ϵɽ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD>лл<EFBFBD><EFBFBD>
--------------------------------------------------------------------------------------
*2014-12-29 <20><>1.3.3 build @ Dec 29 2014 13:30:12<31><32>
size<EFBFBD><EFBFBD>104,390
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
1<><31><EFBFBD>޸<EFBFBD><DEB8>ļ<EFBFBD><C4BC>رա<D8B1><D5A1>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>δ<EFBFBD>޸ĵ<DEB8><C4B5>ļ<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>д<EFBFBD>̵IJ<CCB5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*2014-11-28 <20><>1.3.2 build @ Dec 11 2014 15:39:01<30><31>
size<EFBFBD><EFBFBD>104,342
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
1<><31><EFBFBD><EFBFBD>FileRead()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>void FileReadCallBack(void* buffer, uint32_t size)<29>ص<EFBFBD>
2<><32><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>SetFsTerminateFuc()<29><>Ŀǰֻ<C7B0><D6BB><EFBFBD><EFBFBD>FileSeek<65><6B><EFBFBD>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>Ӧ
*2014-11-28 <20><>1.3.1<EFBFBD><EFBFBD>
size<EFBFBD><EFBFBD>102,802
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
1<><31><EFBFBD><EFBFBD><E6B1BE>ʹ<EFBFBD><CAB9>const<73><74><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>50<35><30><EFBFBD>ֽ<EFBFBD>MEM
2<><32><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>FS<46><53><EFBFBD><EFBFBD><EFBFBD>Ŀɿ<C4BF><C9BF>ԣ<EFBFBD><D4A3>޸<EFBFBD><DEB8>˶<EFBFBD>FS<46><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɳ<EFBFBD><C9B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -0,0 +1,73 @@
#ifndef __DIR_H__
#define __DIR_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "fsinfo.h"
//file attributes define
#define ATTR_READ_ONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLUME_ID 0x08
#define ATTR_DIRECTORY 0x10
#define ATTR_ARCHIVE 0x20
#define ATTR_LONG_NAME 0x0f //ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID
#define ATTR_LONG_NAME_MASK 0x3f //ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID | ATTR_DIRECTORY | ATTR_ARCHIVE
#define ATTR_RECYCLED_MASK 0x16 //ATTR_DIRECTORY | ATTR_HIDDEN | ATTR_SYSTEM
typedef enum _ENTRY_TYPE
{
ENTRY_FILE,
ENTRY_FOLDER, //<2F>ļ<EFBFBD><C4BC><EFBFBD>Ŀ¼<C4BF><EFBFBD><EEA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
ENTRY_END, //<2F><>ǰĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ENTRY_RECYCLED,
ENTRY_DOT,
ENTRY_LONG_NAME,
ENTRY_DELETED_FILE,
ENTRY_UNKNOWN
} ENTRY_TYPE;
void DirSetStartEntry(FS_CONTEXT* FsContext, uint32_t StartSecNum, uint8_t Offset, bool InitFlag);
uint32_t DirGetSonClusNum(FS_CONTEXT* FsContext);
uint32_t DirGetSonSecNum(FS_CONTEXT* FsContext);
void DirSetSonClusNum(FS_CONTEXT* FsContext, uint32_t ClusNum);
//<2F>ڵ<EFBFBD>ǰĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>
uint8_t DirGetNextEntry(FS_CONTEXT* FsContext);
bool DirFindNextFolder(FS_CONTEXT* FsContext);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
bool DirEnterSonFolder(FS_CONTEXT* FsContext);
//<2F><><EFBFBD>ظ<EFBFBD>Ŀ¼
bool DirEnterParentFolder(FS_CONTEXT* FsContext);
void RewindFolderStart(FS_CONTEXT* FsContext);
bool DirNameConvert(uint8_t* DstFileName, uint8_t* SrcFileName);
void DirGenItem(FS_CONTEXT* FsContext, uint8_t* DirName, uint32_t StartClusNum, uint32_t Size, uint8_t Attribute);
void DirGenLongItem(FS_CONTEXT* FsContext, uint8_t* longName, uint8_t* shortName, uint8_t Len);
// Load file/folder long name.
bool GetLongName(FS_CONTEXT* FsContext, uint32_t ParentFoldSect, uint32_t SectorNum, uint8_t Offset, uint8_t* LongFileName, uint8_t GetMaxLength);
bool FindNextFolder(FS_CONTEXT* FsContext);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif

View File

@@ -0,0 +1,42 @@
/*-----------------------------------------------------------------------
/ Low level disk interface modlue include file R0.07 (C)ChaN, 2009
/-----------------------------------------------------------------------*/
#ifndef __DISKIO__
#define __DISKIO__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "type.h"
/* Status of Disk Functions */
typedef uint8_t DSTATUS;
/* Results of Disk Functions */
typedef enum
{
RES_OK = 0, /* 0: Successful */
RES_ERROR, /* 1: R/W Error */
RES_WRPRT, /* 2: Write Protected */
RES_NOTRDY, /* 3: Not Ready */
RES_PARERR, /* 4: Invalid Parameter */
RES_TIMEOUT /* 5: Time Out */
} DRESULT;
/*---------------------------------------*/
/* Prototypes for disk control functions */
DSTATUS disk_initialize(uint8_t);
DSTATUS disk_status(uint8_t);
DRESULT disk_read(uint8_t, uint8_t*, uint32_t, uint8_t);
DRESULT disk_write(uint8_t, const uint8_t*, uint32_t, uint8_t);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif

View File

@@ -0,0 +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_

View File

@@ -0,0 +1,87 @@
#ifndef __FOLDER_H__
#define __FOLDER_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "fsinfo.h"
// Folder info structure define.
typedef struct _FOLDER
{
uint16_t FolderNum; //<2F>ļ<EFBFBD><C4BC>к<EFBFBD>
uint16_t ValidFolderNum; //<2F><>Ч<EFBFBD>ļ<EFBFBD><C4BC>к<EFBFBD>
uint32_t ParentFoldStartSecNum; //<2F><>Ŀ¼<C4BF><C2BC>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t DirSecNum; //FDI<44><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t DirOffset; //FDI<44><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint32_t EndDirSecNum; //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t EndDirOffset; //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint32_t StartSecNum;
uint8_t ShortName[9]; //folder short name
uint16_t StartFileNum; //for calculate absolute file number in whole partition.
uint16_t IncFileCnt; //include file sum of the folder, not recursion
uint16_t IncFolderCnt;
uint16_t RecFileCnt; //recursion file sum of the current folder
uint16_t RecFolderCnt;
FS_CONTEXT* FsContext;
} FOLDER;
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//<2F>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽Folder<65><72>ָ<EFBFBD>Ľṹ<C4BD>
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
//ParentFolder == NULL: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵĵ<CFB5>FolderNum<75><6D><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
//ParentFolder != NULL: <20><><EFBFBD><EFBFBD>ParentFolder<65>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>еĵ<D0B5>FolderNum<75><6D><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
bool FolderOpenByNum(FOLDER* Folder, FOLDER* ParentFolder, uint16_t FolderNum);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ţ<EFBFBD><C5A3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FolderOpenByNum()<29><>
bool FolderOpenByValidNum(FOLDER* Folder, FOLDER* ParentFolder, uint16_t ValidFolderNum);
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
//<2F>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<55><45>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽Folder<65><72>ָ<EFBFBD>Ľṹ<C4BD>
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>FALSE<53><45>
//ParentFolder == NULL: <20>򿪸<EFBFBD>Ŀ¼<C4BF>е<EFBFBD>FolderName<6D>ļ<EFBFBD><C4BC>С<EFBFBD>
//ParentFolder != NULL: <20><><EFBFBD><EFBFBD>ParentFolder<65>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD>FolderName<6D>ļ<EFBFBD><C4BC>С<EFBFBD>
//FolderName[]<5D><><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>Ϊ"\\"
bool FolderOpenByName(FOLDER* Folder, FOLDER* ParentFolder, uint8_t* FolderName);
//
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ļ<EFBFBD>
//<2F><>Ҫջ<D2AA>ռ<EFBFBD><D5BC>ϴ<EFBFBD> FAT_NAME_MAX *2
//
bool FolderOpenByLfName(FOLDER* Folder, FOLDER* ParentFolder, uint8_t* FolderName, uint8_t Len);
//<2F><>ȡָ<C8A1><D6B8><EFBFBD>ļ<EFBFBD><C4BC>еij<D0B5><C4B3>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ϊ66<36><36><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD>LongFileName[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>66<36><36><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>򽫻ᵼ<F2BDABBB>²<EFBFBD><C2B2><EFBFBD>Ԥ<EFBFBD>ϵĴ<CFB5><C4B4><EFBFBD><EFBFBD><EFBFBD>
//<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 FolderGetLongName(FOLDER* Folder, uint8_t* LongFileName, uint8_t GetMaxLength); //LongFileName[]: 66 Bytes
//<2F>½<EFBFBD><C2BD>ļ<EFBFBD><C4BC>С<EFBFBD>
//<2F><>ParentFolder<65>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFolderName[]<5D><><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
//ParentFolder<65><72><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ָ<EFBFBD><EFBFBD><EBB2BB>ΪNULL<4C><4C>
//<2F><><EFBFBD><EFBFBD>TRUE<55><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽Folder<65><72>ָ<EFBFBD><EFBFBD><E1B9B9><EFBFBD>С<EFBFBD>
//<2F><><EFBFBD><EFBFBD>FALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>
bool FolderCreate(FOLDER* Folder, FOLDER* ParentFolder, uint8_t* FolderName);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><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><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>䵽Folder<65><72>ָ<EFBFBD>Ľṹ<C4BD>
//FolderLongName[64]Ϊ<><CEAA><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,Unicode 16<31><36><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD>Ϊ128Byte <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ϊ0xFF
//FolderShortName[11]Ϊ<><CEAA><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,Utf-8<><38><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD>Ϊ11Byte <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ϊ<EFBFBD>ո<EFBFBD>"0x20"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ϊ0x20
//ParentFolder <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
//Len Ϊ<><CEAA><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʳ<EFBFBD><CAB3>ȣ<EFBFBD><C8A3><EFBFBD>λΪuint16_t
bool FolderCreateByLongName(FOLDER* Folder, FOLDER* ParentFolder, uint16_t* FolderLongName, uint8_t* FolderShortName, uint8_t Len);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif

View File

@@ -0,0 +1,36 @@
/////////////////////////////////////////////////////////////////////////
// Mountain View Silicon Tech. Inc.
// Copyright 2012, Mountain View Silicon Tech. Inc.,ShangHai,China
// All rights reserved
// Filename:fs_config.h
/////////////////////////////////////////////////////////////////////////
#ifndef __FS_CONFIG_H__
#define __FS_CONFIG_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "type.h"
///////////////////////////////////////<2F><><EFBFBD><EFBFBD>Ϊֻ<CEAA><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
#define FAT_USE_LFN 1 //read only
#define FAT_NAME_MAX 128 //read only
#define MAX_FS_CONTEXT_COUNT 1 //֧<><D6A7>ͬʱmount<6E>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD> read only
///////////////////////////////////////ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
///////////////////////////////////////<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
#define FS_FILE_SORT_EN 0 //<2F>Ƿ<EFBFBD>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define FS_MAX_FILE_SORT_NUM 1024 //֧<>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2048
///////////////////////////////////////<2F><><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //_FS_CONFIG_H_

View File

@@ -0,0 +1,43 @@
/////////////////////////////////////////////////////////////////////////
// Mountain View Silicon Tech. Inc.
// Copyright 2012, Mountain View Silicon Tech. Inc.,ShangHai,China
// All rights reserved
// Filename:filesort.h
/////////////////////////////////////////////////////////////////////////
#ifndef __FS_FILESORT_H__
#define __FS_FILESORT_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "fs_config.h"
#if FS_FILE_SORT_EN == 1
//
//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µĸ<C2B5><C4B8><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>PreSearch()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FileSortSearchNewFile(FS_CONTEXT* FsContext);
//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Ȼ<><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FileSortTable[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>PreSearch()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FileSortSearchEnd(FS_CONTEXT* FsContext);
//<2F>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>FileOpenByNum()<29><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>FileSortNum<75><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC>Ų<EFBFBD><C5B2><EFBFBD>[StartFileNum + 1, EndFileNum]<5D><>Χ<EFBFBD>ڵ<EFBFBD><DAB5>ļ<EFBFBD>
//1.<2E><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>m<EFBFBD><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC>ţ<EFBFBD>
// GetFileNumInDisk(FsContext, m, 0, 0xFFFF)<29><><EFBFBD>õ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ӧ<EFBFBD><D3A6>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//2.<2E><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>m<EFBFBD><6D><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ԭʼȫ<CABC><C8AB><EFBFBD>ļ<EFBFBD><C4BC>ţ<EFBFBD>
// GetFileNumInDisk(FsContext, m, Folder->StartFileNum, Folder->StartFileNum + Folder->IncFileCnt)
uint16_t GetFileNumInDisk(FS_CONTEXT* FsContext, uint16_t FileSortNum, uint16_t StartFileNum, uint16_t EndFileNum);
#endif //FS_FILE_SORT_EN
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //__FS_FILESORT_H__

View File

@@ -0,0 +1,39 @@
#ifndef __FS_MOUNT_H__
#define __FS_MOUNT_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
//
//<2F><>ҪĿ<D2AA><C4BF>Ϊʵ<CEAA>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>
//
#define CONF_DRIVES (2)
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ
extern uint8_t FsMount(uint8_t LogicId, FS_CONTEXT * fs);
//<2F>л<EFBFBD><D0BB><EFBFBD>ǰĬ<C7B0>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern uint8_t FsChDrive(uint8_t LogicId);
//<2F><>ȡ<EFBFBD><C8A1>ǰĬ<C7B0>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
extern uint8_t FsGetDriveType(void);
//<2F><>ȡ<EFBFBD>ɹ<EFBFBD><C9B9>ص<EFBFBD><D8B5>߼<EFBFBD><DFBC><EFBFBD><E8B1B8>
extern int8_t FsGetAvailableLogicId(void);
//<2F><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ
extern FS_CONTEXT* FsGetCurContext(void);
//ͨ<><CDA8><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ͻ<EFBFBD>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ
extern FS_CONTEXT* FsGetContextByDeviceType(uint8_t DeviceType);
//ͨ<><CDA8><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ͻ<EFBFBD>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5>߼<EFBFBD><DFBC><EFBFBD>
extern int8_t FsGetLogicIdByDeviceType(uint8_t DeviceType);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //_FS_MOUNT_H_

View File

@@ -0,0 +1,41 @@
#ifndef __FS_SYNC_H__
#define __FS_SYNC_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "fsinfo.h"
//
//<2F><>ҪĿ<D2AA><C4BF>Ϊʵ<CEAA><CAB5><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5>Ķ<EFBFBD><C4B6>߳<EFBFBD>ͬ<EFBFBD><CDAC>
//
//
// init sync semaphore
//
uint8_t FsSyncInit(void* FsContext);
//
// lock
//
void FsLock(void* FsContext);
//
// unlock
//
void FsUnLock(void* FsContext);
#define ENTER_FAT(fs) FsLock(fs)
#define LEAVE_FAT(fs, res) \
{ \
FsUnLock(fs); \
return res; \
}
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //_FS_SYNC_H_

View File

@@ -0,0 +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

View File

@@ -0,0 +1,47 @@
#ifndef __FSMOUNT_BUFFERMANAGER_H__
#define __FSMOUNT_BUFFERMANAGER_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
#include "fs_config.h"
#include "fsinfo.h"
//
//<2F><>ҪĿ<D2AA><C4BF>Ϊʵ<CEAA>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5>ռ<EFBFBD>
//
typedef struct _FSCONTEXT_BUFFER //Fs buffer
{
FS_CONTEXT FSContext[MAX_FS_CONTEXT_COUNT];
uint8_t DeviceID[MAX_FS_CONTEXT_COUNT];
} FSCONTEXT_BUFFER;
typedef struct _FSCONTEXT_BUFFER_MANAGER //Fs context buffer manager
{
FSCONTEXT_BUFFER FSContextBuffer;
//
//A pointer to the function to alloc a buffer.
//
FS_CONTEXT* (*pfnAllocFSContextBuffer)(FSCONTEXT_BUFFER* FSContextBufferp, uint8_t DeviceID);
//
//A pointer to the function to free a buffer.
//
bool (*pfnFreeFSContextBuffer)(FSCONTEXT_BUFFER* FSContextBufferp, uint8_t DeviceID);
} FSCONTEXT_BUFFER_MANAGER;
extern FSCONTEXT_BUFFER_MANAGER gFSContextBufferManager;
extern FS_CONTEXT* FSContextBufferAlloc(FSCONTEXT_BUFFER* FSContextBufferp, uint8_t DeviceID);
extern bool FSContextBufferFree(FSCONTEXT_BUFFER* FSContextBufferp, uint8_t DeviceID);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif //_FSMOUNT_BUFFERMANAGER_H_

View File

@@ -0,0 +1,15 @@
#ifndef __PARTITION_H__
#define __PARTITION_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
bool PartitionLoad(FS_CONTEXT* FsContext, uint8_t DrverId);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif

View File

@@ -0,0 +1,20 @@
#ifndef __PRESEARCH_H__
#define __PRESEARCH_H__
#ifdef __cplusplus
extern "C" {
#endif//__cplusplus
bool FSInit(uint8_t DeviceID);
bool FSDeInit(uint8_t DeviceID);
extern bool IsFsInited(void);
#ifdef __cplusplus
}
#endif//__cplusplus
#endif

View File

@@ -0,0 +1,286 @@
/////////////////////////////////////////////////////////////////////////
// Mountain View Silicon Tech. Inc.
// Copyright 2012, Mountain View Silicon Tech. Inc.,ShangHai,China
// All rights reserved
// Filename:partition.c
/////////////////////////////////////////////////////////////////////////
//#include "app_config.h"
#include "fs_config.h"
#include "folder.h"
#include "fat_file.h"
#include "fsinfo.h"
#include "diskio.h"
#include "presearch.h"
#include "host_stor.h"
#include "Debug.h"
#define SIGNATURE_OFFSET 0x01fe // will contain 0x55AA
#define PARTITION_OFFSET 0x01be // will contain partition table
#define COMMON_SIGNATURE 0xAA55
#define FS_DBG(M, ...)
//define partition structure
#pragma pack(1)
typedef struct _PARTITION // Partition Entries definition
{
uint8_t Active;
uint8_t StartHead;
uint8_t StartSector;
uint8_t StartCylinder;
uint8_t PartitionType;
uint8_t EndHead;
uint8_t EndSector;
uint8_t EndCylinder;
uint32_t FirstSectorNum;
uint32_t SectorCount;
} PARTITION;
#pragma pack()
//define BPB structe
#pragma pack(1)
typedef struct
{
uint8_t BS_jmpBoot[3]; // 0-2
uint8_t BS_OEMName[8]; // 3-10
uint16_t BPB_BytsPerSec; // 11-12
uint8_t BPB_SecPerClus; // 13
uint16_t BPB_RsvdSecCnt; // 14-15
uint8_t BPB_NumFATs; // 16
uint16_t BPB_RootEntCnt; // 17-18
uint16_t BPB_TotSec16; // 19-20
uint8_t BPB_Media; // 21
uint16_t BPB_FATSz16; // 22-23
uint16_t BPB_SecPerTrk; // 24-25
uint16_t BPB_NumHeads; // 26-27
uint32_t BPB_HiddSec; // 28-31
uint32_t BPB_TotSec32; // 32-35
uint32_t BPB_FATSz32; // 36-39
uint16_t BPB_ExtFlags; // 40-41
uint16_t BPB_FSVer; // 42-43
uint32_t BPB_RootClus; // 44-47
uint16_t BPB_FSInfo; // 48-49
uint16_t BPB_BkBootSec; // 50-51
} BOOT_SECTOR;
#pragma pack()
#define CANCEL_COMMON_SIGNATURE_JUDGMENT
// Load partition information from storage device.
bool PartitionLoad(FS_CONTEXT* FsContext, uint8_t DriverId)
{
uint32_t RootDirSectors;
uint32_t BootSecNum = 0;
uint32_t FatSize;
uint32_t TotalSectors;
uint8_t IndexPtb;
uint8_t SectorSizeMul;
uint32_t temp2;
uint8_t ExtBootEntry = 0;
uint16_t BPBRsvSectCnt;
uint8_t LogicDriverId = 1;
uint8_t LoopFlag = 0;
#ifdef FUNC_USB_EN
if(FsContext->gFsInfo.DevID == DEV_ID_USB)
{
SectorSizeMul = (HostStorGetBlockSize() / SECTOR_SIZE);
}
else
#endif
{
SectorSizeMul = 1;
}
// FS_DBG("SectorSizeMul: %d\n", (uint16_t)SectorSizeMul);
while(1)
{
LoopFlag = 0;
//read MBR
//if(!ReadBlock(BootSecNum, (uint8_t*)(FsContext->FAT_BUFFER), 1))
if(RES_OK != disk_read(FsContext->gFsInfo.DevID, (uint8_t*)(FsContext->FAT_BUFFER), BootSecNum, 1))
{
FS_DBG("ReadBlock() error!\n");
return FALSE;
}
FsContext->gFsInfo.CurrFATSecNum = BootSecNum;
#ifndef CANCEL_COMMON_SIGNATURE_JUDGMENT
if(*(uint16_t*)((FsContext->FAT_BUFFER) + SIGNATURE_OFFSET) != COMMON_SIGNATURE) //if 0x55aa
{
return FALSE;
}
#endif
for(IndexPtb = 0; IndexPtb < 4; IndexPtb++)
{
PARTITION* pPart = &((PARTITION*)((FsContext->FAT_BUFFER) + PARTITION_OFFSET))[IndexPtb];
if((pPart->PartitionType == 0x05) //Extended partition
&& ((ExtBootEntry == 0) || (IndexPtb >= ExtBootEntry)))
{
BootSecNum += Le32ToCpu(pPart->FirstSectorNum);
ExtBootEntry = IndexPtb + 1;
// FS_DBG("Extended partition bootSecNum:%ld\n", (uint32_t)BootSecNum);
LoopFlag = 1;
break;
}
//check the partition type and get the boot sector num
if(pPart->PartitionType == 0x04
|| pPart->PartitionType == 0x06
|| pPart->PartitionType == 0x0B
|| pPart->PartitionType == 0x0C
|| pPart->PartitionType == 0x01
|| pPart->PartitionType == 0x0E)
{
if(DriverId <= 1 || LogicDriverId == DriverId)
{
BootSecNum += Le32ToCpu(pPart->FirstSectorNum);
break;
}
LogicDriverId++;
}
}
if(LoopFlag)
{
continue;
}
if((IndexPtb == 4) && ((ExtBootEntry > 0) && (ExtBootEntry < 4)))
{
//if extended parttion failed,try again.
BootSecNum = 0;
continue;//<2F><><EFBFBD>ӶԵ<D3B6>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч<EFBFBD><D0A7>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>֧<EFBFBD><D6A7>
}
break;
}
if((DriverId > 1) && (LogicDriverId != DriverId))
{
return FALSE;
}
//read DBR
//if(!ReadBlock((BootSecNum * SectorSizeMul), (uint8_t*)(FsContext->FAT_BUFFER), 1))
if(RES_OK != disk_read(FsContext->gFsInfo.DevID, (uint8_t*)(FsContext->FAT_BUFFER), (BootSecNum * SectorSizeMul), 1))
{
return FALSE;
}
FsContext->gFsInfo.CurrFATSecNum = (BootSecNum * SectorSizeMul);
#ifndef CANCEL_COMMON_SIGNATURE_JUDGMENT
if(*(uint16_t*)((FsContext->FAT_BUFFER) + SIGNATURE_OFFSET) != COMMON_SIGNATURE) //if 0x55aa
{
return FALSE;
}
#endif
#define pzero_sector ((BOOT_SECTOR*)((FsContext->FAT_BUFFER)))
//updata device information
FsContext->gFsInfo.ClusterSize = pzero_sector->BPB_SecPerClus;
//get first sector of FAT
BPBRsvSectCnt = Le16ToCpu(pzero_sector->BPB_RsvdSecCnt);
FsContext->gFsInfo.FatStart = BPBRsvSectCnt + BootSecNum;
//get sectors of boot dir
if(pzero_sector->BPB_RootEntCnt != 0)
{
RootDirSectors = (Le16ToCpu(pzero_sector->BPB_RootEntCnt) * 32 + SECTOR_SIZE - 1) / SECTOR_SIZE;
}
else
{
RootDirSectors = 0;
}
//get FAT size
if(pzero_sector->BPB_FATSz16 != 0)
{
FatSize = Le16ToCpu(pzero_sector->BPB_FATSz16);
}
else
{
FatSize = Le32ToCpu(pzero_sector->BPB_FATSz32);
}
//get total cluster
if(pzero_sector->BPB_TotSec16 != 0)
{
TotalSectors = Le16ToCpu(pzero_sector->BPB_TotSec16);
}
else
{
TotalSectors = Le32ToCpu(pzero_sector->BPB_TotSec32);
}
temp2 = (TotalSectors - (BPBRsvSectCnt + FatSize * pzero_sector->BPB_NumFATs + RootDirSectors)) / FsContext->gFsInfo.ClusterSize;
// FS_DBG("temp2:%ld\n", (uint32_t)temp2);
if(temp2 < 4085)
{
FS_DBG("FAT12\n");
FsContext->gFsInfo.IsCpatFS = FALSE; //FAT12
return TRUE;
}
else if(temp2 < 65525)
{
FS_DBG("FAT16\n");
FsContext->gFsInfo.FAT32 = 0; //FAT16
FsContext->gFsInfo.IsCpatFS = TRUE;
}
else
{
//FAT32<33>豸BPB_RootEntCnt/BPB_TotSec16/BPB_FATSz16<31><36>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
if(memcmp((uint8_t*)((FsContext->FAT_BUFFER) + 0x36), "FAT16\0\0\0", 8) == 0)
{
//<2F>ͻ<EFBFBD><CDBB><EFBFBD>һ<EFBFBD><D2BB>U<EFBFBD><55>(USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>Ĵ<EFBFBD><C4B4><EFBFBD>ĿӦ<C4BF><D3A6>ΪFAT32<33><32>ʵ<EFBFBD><CAB5>ΪFAT16ϵͳ<CFB5><CDB3>Ϊ֧<CEAA><D6A7><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>
FS_DBG("FAT16\n");
FsContext->gFsInfo.FAT32 = 0;
}
else
{
FS_DBG("FAT32\n");
FsContext->gFsInfo.FAT32 = 1; //FAT32
}
FsContext->gFsInfo.IsCpatFS = TRUE;
}
FsContext->gFsInfo.DataStart = FsContext->gFsInfo.FatStart + (FatSize * pzero_sector->BPB_NumFATs) + RootDirSectors; //the first sector of data
// get max cluster number in this drive.
//FsContext->gFsInfo.MaxCluster = ((TotalSectors - FsContext->gFsInfo.DataStart) / FsContext->gFsInfo.ClusterSize) + 2;
FsContext->gFsInfo.MaxCluster = temp2 + 2;
//get the data start and boot dir start
if(FsContext->gFsInfo.FAT32)
{
FsContext->gFsInfo.RootStart = FsContext->gFsInfo.DataStart + (Le32ToCpu(pzero_sector->BPB_RootClus) - 2) * FsContext->gFsInfo.ClusterSize;
}
else
{
FsContext->gFsInfo.RootStart = FsContext->gFsInfo.FatStart + FatSize * pzero_sector->BPB_NumFATs; //FAT16 the first sector of root dir
}
FsContext->gFsInfo.ClusterSize *= SectorSizeMul;
// RootDirSectors *= SectorSizeMul;
FsContext->gFsInfo.FatStart *= SectorSizeMul;
FsContext->gFsInfo.DataStart *= SectorSizeMul;
FsContext->gFsInfo.MaxSector = (BootSecNum + TotalSectors) * SectorSizeMul;
FsContext->gFsInfo.RootStart *= SectorSizeMul;
// FS_DBG("*************UDisk virtual params******************\n");
// FS_DBG("ClusterSize:%ld\n", (uint32_t)FsContext->gFsInfo.ClusterSize);
// FS_DBG("RootDirSectors:%ld\n", (uint32_t)RootDirSectors);
// FS_DBG("FatStart:%ld\n", (uint32_t)FsContext->gFsInfo.FatStart);
// FS_DBG("RootStart:%ld\n", (uint32_t)FsContext->gFsInfo.RootStart);
// FS_DBG("DataStart:%ld\n", (uint32_t)FsContext->gFsInfo.DataStart);
// FS_DBG("MaxCluster:%ld\n", (uint32_t)FsContext->gFsInfo.MaxCluster);
// FS_DBG("*****************************************************\n\n");
return TRUE;
}

View File

@@ -0,0 +1,409 @@
/////////////////////////////////////////////////////////////////////////
// Mountain View Silicon Tech. Inc.
// Copyright 2012, Mountain View Silicon Tech. Inc.,ShangHai,China
// All rights reserved
// Filename:presearch.c
/////////////////////////////////////////////////////////////////////////
//#include "app_config.h"
#include "dev_detect_driver.h"
#include "fs_config.h"
#include "folder.h"
#include "fat_file.h"
#include "fsinfo.h"
#include "dir.h"
#include "fsmount_buffermanager.h"
#include "fs_mount.h"
#include "fs_sync.h"
#include "fs_filesort.h"
#include "partition.h"
#include "breakpoint.h"
#include "Debug.h"
#define INDEPEND_FREERTOS
#ifndef INDEPEND_FREERTOS
#include "os.h"
#endif
#define FUNC_SPI_UPDATE_EN
#ifdef FUNC_SPI_UPDATE_EN
uint8_t UpgradeFileFound = 0xFF;
#endif// FUNC_SPI_UPDATE_EN
static bool fs_inited_flag = 0;
#ifndef INDEPEND_FREERTOS
SEMAPHORE Sync; // Identifier of sync object
#endif
#define FS_DBG(M, ...)
uint8_t FsSyncInit(void* FsContext)
{
#ifndef INDEPEND_FREERTOS
if(FsContext)
{
SEMA_INIT(Sync, 1)
return 1;
}
#endif
return 0;
}
void FsLock(void* FsContext)
{
#ifndef INDEPEND_FREERTOS
if(FsContext)
{
OSDOWN(Sync);
}
#endif
}
void FsUnLock(void* FsContext)
{
#ifndef INDEPEND_FREERTOS
if(FsContext)
{
OSUP(Sync);
}
#endif
}
////////////////////////////////////////////////////////////////
//
//Ѱ<><D1B0><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
//
void FindSpecialFileCallBack(FS_CONTEXT* FsContext)
{
#ifdef FUNC_SPI_UPDATE_EN //ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ΪSPI FLASH<53><48><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>*.MVA
//ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
if((FsContext->gFsInfo.FolderSum == 1) && (UpgradeFileFound != 1)) //ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(memcmp(FsContext->gCurrentEntry->ExtName, "MVA", 3) == 0)
{
UpgradeFileFound = 1;
}
}
#endif
//<2F><><EFBFBD><EFBFBD>Ϊdemo,<2C>ɸġ<C9B8><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Callһ<6C><D2BB>
#if 0 //demo
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD>Handle <20><><EFBFBD><EFBFBD><E8B6A8>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>磺FAT_FILE SpecialFile<6C><65>
if(FsContext->gFsInfo.FolderSum == 1) //ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(memcmp(FsContext->gCurrentEntry->ExtName, "XYZ", 3) == 0)
{
FileGetInfo(&SpecialFile); //<2F>ҵ<EFBFBD><D2B5>ض<EFBFBD><D8B6>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>SpecialFile<6C><65>Ϣ<EFBFBD><CFA2>
}
}
#endif
}
////////////////////////////////////////////////////////////////
//<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)
{
uint8_t ExtFileName[3];
ExtFileName[0] = FsContext->gCurrentEntry->ExtName[0];
ExtFileName[1] = FsContext->gCurrentEntry->ExtName[1];
ExtFileName[2] = FsContext->gCurrentEntry->ExtName[2];
if((ExtFileName[0] == 'M') && (ExtFileName[1] == 'P') && (ExtFileName[2] == '3' || ExtFileName[2] == '2'))
{
return FILE_TYPE_MP3;
}
else if((ExtFileName[0] == 'W') && (ExtFileName[1] == 'M') && (ExtFileName[2] == 'A'))
{
return FILE_TYPE_WMA;
}
else if((ExtFileName[0] == 'A') && (ExtFileName[1] == 'S') && (ExtFileName[2] == 'F'))
{
return FILE_TYPE_WMA;
}
else if((ExtFileName[0] == 'W') && (ExtFileName[1] == 'M') && (ExtFileName[2] == 'V'))
{
return FILE_TYPE_WMA;
}
else if((ExtFileName[0] == 'A') && (ExtFileName[1] == 'S') && (ExtFileName[2] == 'X'))
{
return FILE_TYPE_WMA;
}
else if((ExtFileName[0] == 'W') && (ExtFileName[1] == 'A') && (ExtFileName[2] == 'V'))
{
return FILE_TYPE_WAV;
}
else if((ExtFileName[0] == 'S') && (ExtFileName[1] == 'B') && (ExtFileName[2] == 'C'))
{
return FILE_TYPE_SBC;
}
else if((ExtFileName[0] == 'F') && (ExtFileName[1] == 'L') && (ExtFileName[2] == 'A'))
{
return FILE_TYPE_FLAC;
}
else if(((ExtFileName[0] == 'A') && (ExtFileName[1] == 'A') && ExtFileName[2] == 'C')
|| ((ExtFileName[0] == 'M') && (ExtFileName[1] == 'P') && ExtFileName[2] == '4')
|| ((ExtFileName[0] == 'M') && (ExtFileName[1] == '4') && ExtFileName[2] == 'A'))
{
return FILE_TYPE_AAC;
}
else if((ExtFileName[0] == 'A') && (ExtFileName[1] == 'I') && (ExtFileName[2] == 'F'))
{
return FILE_TYPE_AIF;
}
else
{
return FILE_TYPE_UNKNOWN;
}
}
// <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
static PLAYER_BP_RET sPlayerBPRet = {-1, 1, 1};
// <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)
{
return &sPlayerBPRet;
}
void SetMatchPlayerBPRet(int8_t BPIndex, uint16_t FileId, uint16_t FolderId)
{
sPlayerBPRet.BPIndex = BPIndex;
sPlayerBPRet.FileId = FileId;
sPlayerBPRet.FolderId = FolderId;
}
#endif
//
//ͳ<><CDB3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
bool PreSearch(FS_CONTEXT* FsContext)
{
ENTRY_TYPE EntryType;
#ifdef FUNC_MATCH_PLAYER_BP
sPlayerBPRet.BPIndex = -1;
#endif
FS_DBG("PreSearch start!\n");
#ifdef FUNC_SPI_UPDATE_EN
UpgradeFileFound = 0;
#endif
DirSetStartEntry(FsContext, FsContext->gFsInfo.RootStart, 0, TRUE);
FSINFO_Init(FsContext);
FsContext->gFolderDirStart = FsContext->gFsInfo.RootStart;
while(1)
{
EntryType = (ENTRY_TYPE)DirGetNextEntry(FsContext);
//FS_DBG("fcount:%d\n",++fcount);
if(FsContext->gEntryOffset == 0)
{
FSINFO_SaveFdi(FsContext);
}
switch(EntryType)
{
case ENTRY_FILE: //<2F>Ǹ<EFBFBD><C7B8><EFBFBD>
//FS_DBG("fcount:%d\n",++fcount);
if(FileGetType(FsContext) != FILE_TYPE_UNKNOWN)
{
//FS_DBG("<22>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%-.8s%-.3s\n", &FsContext->gCurrentEntry->FileName[0], &FsContext->gCurrentEntry->FileName[8]);
if(FsContext->gFsInfo.FileSum >= 65535)
{
return TRUE;
}
FsContext->gFsInfo.FileSum++;
FsContext->gFsInfo.FileSumInFolder++;
//FS_DBG("Find a audio file:%d!\n", fcount);
#if FS_FILE_SORT_EN == 1
FileSortSearchNewFile(FsContext);
#endif
}
FindSpecialFileCallBack(FsContext);
break;
case ENTRY_FOLDER: //<2F><><EFBFBD>ļ<EFBFBD><C4BC>У<EFBFBD><D0A3>´<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
FsContext->gFsInfo.FolderNumInFolder++;
//FS_DBG("ENTRY_FOLDER: %d\n", FsContext->gFsInfo.FolderNumInFolder);
break;
case ENTRY_END: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0>¼<EFBFBD>IJ<EFBFBD><C4B2>ֽڵ<D6BD>
FSINFO_ChangeFileNum(FsContext);
//<2F><>¼<EFBFBD><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
if(FsContext->gFsInfo.FolderSum == 1)
{
FsContext->gFsInfo.RootFileSum = FsContext->gFsInfo.FileSum;
}
//<2F>ص<EFBFBD><D8B5><EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><C4BC>еĿ<D0B5>ͷλ<CDB7><CEBB>
//FS_DBG("<22><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>λ<EFBFBD>ã<EFBFBD>\n");
RewindFolderStart(FsContext);
//<2F>ӵ<EFBFBD>ǰλ<C7B0>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5><CDB3>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if(!FindNextFolder(FsContext))
{
//FS_DBG("PreSearch end! %d ms \n", (uint16_t)PastTimeGet(&Timer));
#if FS_FILE_SORT_EN == 1
FileSortSearchEnd(FsContext);
#endif
return TRUE;
}
else //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC>гɹ<D0B3>
{
//FS_DBG("Into Next Folder%8s\n", &FsContext->gCurrentEntry->FileName[0]);
if(FsContext->gFsInfo.FolderSum >= 65535)
{
#if FS_FILE_SORT_EN == 1
FileSortSearchEnd(FsContext);
#endif
return TRUE;
}
FsContext->gFsInfo.FolderSum++;
FsContext->gFsInfo.FolderNumInFolder = 0;
FsContext->gFsInfo.FileSumInFolder = 0;
if(!DirEnterSonFolder(FsContext))
{
//FS_DBG("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>\n");
FsContext->gFsInfo.FolderSum--;
}
//FS_DBG("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>гɹ<D0B3><C9B9><EFBFBD>\n");
}
break;
default:
break;
}
}
}
//
//<2F>ļ<EFBFBD>ϵͳ<CFB5><CDB3>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5>й<EFBFBD><D0B9><EFBFBD>Ϣ.
//
bool FSInit(uint8_t DeviceID)
{
//get fs memory
FS_CONTEXT* Fs_Context;
Fs_Context = gFSContextBufferManager.pfnAllocFSContextBuffer(&gFSContextBufferManager.FSContextBuffer, DeviceID);
if(Fs_Context == NULL)
{
return FALSE;
}
ENTER_FAT(Fs_Context);
if(!CheckAllDiskLinkFlag())
{
FS_DBG("disk not ready!\n");
LEAVE_FAT(Fs_Context, FALSE);
}
if(Fs_Context->gPreSearchStatus != PRESEARCH_STATUS_NONE)
{
FS_DBG("Mount Already\n");
LEAVE_FAT(Fs_Context, TRUE);
}
Fs_Context->gPreSearchStatus = PRESEARCH_STATUS_SEARCHING;
if(Fs_Context == 0 || FsGetAvailableLogicId() < 0)
{
LEAVE_FAT(Fs_Context, FALSE);
}
//mount fs
FsMount(FsGetAvailableLogicId(), Fs_Context);
FsGetCurContext()->gFsInfo.DevID = (DEV_ID)DeviceID;
FsGetCurContext()->gFsInfo.CurrFATSecNum = -1;
//FsGetCurContext()->gFsInfo.CurrDirSecNum = -1;
FsGetCurContext()->gCurFreeClusNum = 2;
if(!PartitionLoad(FsGetCurContext(), 0))
{
FS_DBG("PartitionLoad() error!\n");
//return FALSE;
FsMount(FsGetLogicIdByDeviceType(DeviceID), 0);
gFSContextBufferManager.pfnFreeFSContextBuffer(&gFSContextBufferManager.FSContextBuffer, DeviceID);
Fs_Context->gPreSearchStatus = PRESEARCH_STATUS_NONE;
LEAVE_FAT(Fs_Context, FALSE);
}
FS_DBG("PartitionLoad() OK!\n");
// {
// if(!PreSearch(FsGetCurContext()))
// {
// FS_DBG("PreSearch() error!\n");
// //return FALSE;
// LEAVE_FAT(Fs_Context, FALSE);
// }
// //end = OSSysTickGet();
// //FS_DBG("PreSearch() End:%d\n", end - begin);
// }
// Fs_Context->gPreSearchStatus = PRESEARCH_STATUS_SEARCHED;
// FS_DBG("PreSearch() OK\n");
// FS_DBG("Song sum in disk: %d\n", FsGetCurContext()->gFsInfo.FileSum);
// FS_DBG("Folder sum in disk: %d\n", FsGetCurContext()->gFsInfo.FolderSum);
// FS_DBG("Valid folder sum in disk: %d\n", FsGetCurContext()->gFsInfo.ValidFolderSum);
// FS_DBG("***********************************************\n");
// FS_DBG("\n");
//return TRUE;
LEAVE_FAT(Fs_Context, TRUE);
// fs_inited_flag = TRUE;
}
//
//<2F>ļ<EFBFBD>ϵͳȥ<CDB3><C8A5>ʼ<EFBFBD><CABC>
//
bool FSDeInit(uint8_t DeviceID)
{
bool res = FALSE;
int8_t LogicId = FsGetLogicIdByDeviceType(DeviceID);
FS_CONTEXT* Fs_Context = FsGetContextByDeviceType(DeviceID);
#ifdef FUNC_MATCH_PLAYER_BP
// sPlayerBPRet.BPIndex = -1;
#endif
ENTER_FAT(Fs_Context);
if(LogicId >= 0)
{
FsMount(LogicId, 0);
res = gFSContextBufferManager.pfnFreeFSContextBuffer(&gFSContextBufferManager.FSContextBuffer, DeviceID);
}
//return res;
LEAVE_FAT(Fs_Context, res);
// fs_inited_flag = FALSE;
}
bool IsFsInited(void)
{
return fs_inited_flag;
}