nt9856x/rtos/code/application/source/cardv/SrcCode/System/sys_filesys.c
2024-01-19 18:37:25 +08:00

261 lines
6.4 KiB
C
Executable File

#include <string.h>
#include <plat/sdio.h>
#include <plat/strg_def.h>
#include <hdal.h>
#include <FileSysTsk.h>
#include "sys_filesys.h"
#include "sys_mempool.h"
#include "FileDB.h"
#include "gpio.h"
#include <FreeRTOS.h>
#include <task.h>
#include "sys_fastboot.h"
#include "PrjCfg.h"
#include "DxHunting.h"
#include <kwrap/debug.h>
#if HUNTING_CAMERA_MCU == ENABLE
#include "PrjInc.h"
#include "wdt.h"
#include <sf_mcu.h>
#endif
#if (HUNTING_CAMERA_MODEL == ENABLE)
#include "IOCfg.h"
#include "sf_sd_common.h"
#define GPIO_CARD_INSERT_LEVEL (FALSE) // low active
#define MAX_OPENED_FILE_NUM 10
static THREAD_HANDLE task_hdl, task_hdl2;
int FileInitFalg = 0;
static void card_insert_job(void)
{
UINT32 uiPoolAddr;
int ret;
FILE_TSK_INIT_PARAM Param = {0};
FS_HANDLE StrgDXH;
printf("filesys_init b\r\n");
memset(&Param, 0, sizeof(FILE_TSK_INIT_PARAM));
#if defined(_EMBMEM_EMMC_)
StrgDXH = (FS_HANDLE)sdio3_getStorageObject(STRG_OBJ_FAT1);
#else
StrgDXH = (FS_HANDLE)sdio_getStorageObject(STRG_OBJ_FAT1);
#endif
uiPoolAddr = mempool_filesys;
Param.FSParam.WorkBuf = uiPoolAddr;
Param.FSParam.WorkBufSize = (POOL_SIZE_FILESYS);
// support exFAT
Param.FSParam.bSupportExFAT = TRUE;
//Param.pDiskErrCB = (FileSys_CB)Card_InitCB;
strncpy(Param.FSParam.szMountPath, "/mnt/sd", sizeof(Param.FSParam.szMountPath) - 1); //only used by FsLinux
Param.FSParam.szMountPath[sizeof(Param.FSParam.szMountPath) - 1] = '\0';
Param.FSParam.MaxOpenedFileNum = MAX_OPENED_FILE_NUM;
if(!FileInitFalg)
{
if (FST_STA_OK != FileSys_Init(FileSys_GetOPS_uITRON())) {
DBG_WRN("FileSys_Init failed\r\n");
}
else {
FileInitFalg = 0;
}
}
ret = FileSys_OpenEx('A', StrgDXH, &Param);
if (FST_STA_OK != ret) {
DBG_WRN("FileSys_Open err %d\r\n", ret);
}
// call the function to wait init finish
FileSys_WaitFinishEx('A');
FileSys_SetParamEx('A', FST_PARM_UPDATE_FSINFO , TRUE);
#if USE_RTOS_MMC_CHECK
SF_RtosStrgRegister(0, ret);
#endif
#if HUNTING_CAMERA_MCU == ENABLE
sf_check_card_full();
fastboot_set_done(BOOT_INIT_FILESYSOK);
#endif
printf("filesys_init e\r\n");
}
static void card_insert_job2(void)
{
#if FS_MULTI_STRG_FUNC
UINT32 uiPoolAddr;
int ret;
FILE_TSK_INIT_PARAM Param = {0};
FS_HANDLE StrgDXH2;
UINT32 start_sector = 16 ; /* linux cmd fdisk can list partition info */
UINT32 totoal_sectors = 0;
StrgDXH2 = (FS_HANDLE)sdio2_getStorageObject(STRG_OBJ_FAT1);
STORAGE_OBJ* pStrg = sdio2_getStorageObject(STRG_OBJ_FAT1);
printf("filesys2_init b\r\n");
memset(&Param, 0, sizeof(FILE_TSK_INIT_PARAM));
pStrg->Open();
pStrg->GetParam(STRG_GET_DEVICE_PHY_SECTORS, (UINT32)&totoal_sectors, 0);
if (totoal_sectors == 0) {
DBG_WRN("totoal_sectors couldn't be zero\n");
}
pStrg->SetParam(STRG_SET_PARTITION_SECTORS, start_sector, totoal_sectors - start_sector);
uiPoolAddr = mempool_filesys + POOL_SIZE_FILESYS;
Param.FSParam.WorkBuf = uiPoolAddr;
Param.FSParam.WorkBufSize = (POOL_SIZE_FILESYS);
// support exFAT
Param.FSParam.bSupportExFAT = FALSE;
//Param.pDiskErrCB = (FileSys_CB)Card_InitCB;
strncpy(Param.FSParam.szMountPath, "/mnt/sd2", sizeof(Param.FSParam.szMountPath) - 1); //only used by FsLinux
Param.FSParam.szMountPath[sizeof(Param.FSParam.szMountPath) - 1] = '\0';
Param.FSParam.MaxOpenedFileNum = MAX_OPENED_FILE_NUM;
if(!FileInitFalg)
{
if (FST_STA_OK != FileSys_Init(FileSys_GetOPS_uITRON())) {
DBG_WRN("FileSys_Init failed\r\n");
}
else {
FileInitFalg = 0;
}
}
DBG_WRN("Open B:\n");
ret = FileSys_OpenEx('B', StrgDXH2, &Param);
if (FST_STA_OK != ret) {
printf("FileSys_Open err %d\r\n", ret);
}
FileSys_WaitFinishEx('B');
FileSys_SetParamEx('B', FST_PARM_UPDATE_FSINFO , TRUE);
#if USE_RTOS_MMC_CHECK
SF_RtosStrgRegister(1, ret);
#endif
sf_check_emmc_full();
fastboot_set_done(BOOT_INIT_FILESYSOK_2);
printf("filesys2_init e\r\n");
#endif
}
#if !defined(_EMBMEM_EMMC_)
static void card_remove_job(void)
{
FileSys_WaitFinishEx('A');
FileSys_CloseEx('A', FST_TIME_INFINITE);
}
#endif
static void sys_detect_card_task(void)
{
#if defined(_EMBMEM_EMMC_)
THREAD_ENTRY();
card_insert_job();
THREAD_RETURN(0);
#else
UINT32 old_detect;
UINT32 card_det_tsk_run = 1;
THREAD_ENTRY();
// force 1st time card detect
old_detect = !GPIO_CARD_INSERT_LEVEL;
//coverity[no_escape]
while (card_det_tsk_run) {
UINT32 curr_detect;
curr_detect= gpio_getPin(GPIO_CARD_DETECT);
if (old_detect != curr_detect) {
if (curr_detect == GPIO_CARD_INSERT_LEVEL) {
printf("%s: Card Insert\r\n", __func__);
card_insert_job();
card_det_tsk_run = 0;
} else {
printf("%s: Card Remove\r\n", __func__);
card_remove_job();
}
}
old_detect = curr_detect;
vTaskDelay(pdMS_TO_TICKS(1000));
}
//#if USE_RTOS_MMC_CHECK
//SF_RtosStrgUnInit();
//#endif
THREAD_RETURN(0);
#endif
}
static void sys_detect_card_task2(void)
{
THREAD_ENTRY();
card_insert_job2();
THREAD_RETURN(0);
}
#endif
void filesys_init(void)
{
#if 0
UINT32 uiPoolAddr;
int ret;
FILE_TSK_INIT_PARAM Param = {0};
FS_HANDLE StrgDXH;
printf("filesys_init b\r\n");
memset(&Param, 0, sizeof(FILE_TSK_INIT_PARAM));
StrgDXH = (FS_HANDLE)sdio_getStorageObject(STRG_OBJ_FAT1);
uiPoolAddr = mempool_filesys;
Param.FSParam.WorkBuf = uiPoolAddr;
Param.FSParam.WorkBufSize = (POOL_SIZE_FILESYS);
// support exFAT
Param.FSParam.bSupportExFAT = TRUE;
//Param.pDiskErrCB = (FileSys_CB)Card_InitCB;
strncpy(Param.FSParam.szMountPath, "/mnt/sd", sizeof(Param.FSParam.szMountPath) - 1); //only used by FsLinux
Param.FSParam.szMountPath[sizeof(Param.FSParam.szMountPath) - 1] = '\0';
#endif
FileSys_InstallID(FileSys_GetOPS_uITRON());
#if (HUNTING_CAMERA_MODEL == ENABLE)
if(DrvGPIO_GetHuntingWorkMode() != HUNTING_NORMAL_MODE){
task_hdl = vos_task_create(sys_detect_card_task, 0, "SysDetectCard", 12, 4096);
vos_task_resume(task_hdl);
task_hdl2 = vos_task_create(sys_detect_card_task2, 0, "SysDetectCard2", 12, 4096);
vos_task_resume(task_hdl2);
}
#endif
#if USE_RTOS_MMC_CHECK
SF_RtosStrgInit();
#endif
#if 0
if (FST_STA_OK != FileSys_Init(FileSys_GetOPS_uITRON())) {
printf("FileSys_Init failed\r\n");
}
ret = FileSys_OpenEx('A', StrgDXH, &Param);
if (FST_STA_OK != ret) {
printf("FileSys_Open err %d\r\n", ret);
}
// call the function to wait init finish
FileSys_WaitFinishEx('A');
printf("filesys_init e\r\n");
#endif
FileDB_InstallID();
}