修改了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,148 @@
/////////////////////////////////////////////////////////////////////////
// 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"
//
// 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

View File

@@ -0,0 +1,283 @@
/////////////////////////////////////////////////////////////////////////
// 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"
#define SIGNATURE_OFFSET 0x01fe // will contain 0x55AA
#define PARTITION_OFFSET 0x01be // will contain partition table
#define COMMON_SIGNATURE 0xAA55
//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;
}
// mx1101_fs_log("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))
{
mx1101_fs_log("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;
// mx1101_fs_log("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;
// mx1101_fs_log("temp2:%ld\n", (uint32_t)temp2);
if(temp2 < 4085)
{
mx1101_fs_log("FAT12\n");
FsContext->gFsInfo.IsCpatFS = FALSE; //FAT12
return TRUE;
}
else if(temp2 < 65525)
{
mx1101_fs_log("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>
mx1101_fs_log("FAT16\n");
FsContext->gFsInfo.FAT32 = 0;
}
else
{
mx1101_fs_log("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;
// mx1101_fs_log("*************UDisk virtual params******************\n");
// mx1101_fs_log("ClusterSize:%ld\n", (uint32_t)FsContext->gFsInfo.ClusterSize);
// mx1101_fs_log("RootDirSectors:%ld\n", (uint32_t)RootDirSectors);
// mx1101_fs_log("FatStart:%ld\n", (uint32_t)FsContext->gFsInfo.FatStart);
// mx1101_fs_log("RootStart:%ld\n", (uint32_t)FsContext->gFsInfo.RootStart);
// mx1101_fs_log("DataStart:%ld\n", (uint32_t)FsContext->gFsInfo.DataStart);
// mx1101_fs_log("MaxCluster:%ld\n", (uint32_t)FsContext->gFsInfo.MaxCluster);
// mx1101_fs_log("*****************************************************\n\n");
return TRUE;
}

View File

@@ -0,0 +1,406 @@
/////////////////////////////////////////////////////////////////////////
// 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"
#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
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
mx1101_fs_log("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);
//mx1101_fs_log("fcount:%d\n",++fcount);
if(FsContext->gEntryOffset == 0)
{
FSINFO_SaveFdi(FsContext);
}
switch(EntryType)
{
case ENTRY_FILE: //<2F>Ǹ<EFBFBD><C7B8><EFBFBD>
//mx1101_fs_log("fcount:%d\n",++fcount);
if(FileGetType(FsContext) != FILE_TYPE_UNKNOWN)
{
//mx1101_fs_log("<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++;
//mx1101_fs_log("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++;
//mx1101_fs_log("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>
//mx1101_fs_log("<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))
{
//mx1101_fs_log("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>
{
//mx1101_fs_log("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))
{
//mx1101_fs_log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>\n");
FsContext->gFsInfo.FolderSum--;
}
//mx1101_fs_log("<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())
{
mx1101_fs_log("disk not ready!\n");
LEAVE_FAT(Fs_Context, FALSE);
}
if(Fs_Context->gPreSearchStatus != PRESEARCH_STATUS_NONE)
{
mx1101_fs_log("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))
{
mx1101_fs_log("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);
}
mx1101_fs_log("PartitionLoad() OK!\n");
{
if(!PreSearch(FsGetCurContext()))
{
mx1101_fs_log("PreSearch() error!\n");
//return FALSE;
LEAVE_FAT(Fs_Context, FALSE);
}
//end = OSSysTickGet();
//mx1101_fs_log("PreSearch() End:%d\n", end - begin);
}
Fs_Context->gPreSearchStatus = PRESEARCH_STATUS_SEARCHED;
mx1101_fs_log("PreSearch() OK\n");
mx1101_fs_log("Song sum in disk: %d\n", FsGetCurContext()->gFsInfo.FileSum);
mx1101_fs_log("Folder sum in disk: %d\n", FsGetCurContext()->gFsInfo.FolderSum);
mx1101_fs_log("Valid folder sum in disk: %d\n", FsGetCurContext()->gFsInfo.ValidFolderSum);
mx1101_fs_log("***********************************************\n");
mx1101_fs_log("\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;
}