EMMC和SD卡切换逻辑代码实现

This commit is contained in:
sober.song 2023-12-23 16:51:21 +08:00
parent c924d94dc7
commit 85230bb460
9 changed files with 702 additions and 39 deletions

View File

@ -0,0 +1,82 @@
/**************************************************************************
*
* Copyright (c) 2015-2021 by WuYuan Technology, Inc.
*
* This software is copyrighted by and is the property of SiFar
* Technology, Inc.. All rights are reserved by SiFar Technology, Inc..
* This software may only be used in accordance with the corresponding
* license agreement. Any unauthorized use, duplication, distribution,
* or disclosure of this software is expressly forbidden.
*
* This Copyright notice MUST not be removed or modified without prior
* written consent of SiFar Technology, Inc..
*
* WuYuan Technology, Inc. reserves the right to modify this software without notice.
*
* Author: Sober
* Ver: 1.0.0 2023.12.23
* Description: Creat
**************************************************************************/
#ifndef _SF_MMC_DEV_H_
#define _SF_MMC_DEV_H_
#include "sf_type.h"
#include "sf_param_common.h"
#define MMC_DEV_MAX_NUM (2)
#define SD_NODES_NAME "/dev/mmcblk0"
#define SD_DEVICE_NAME "/dev/mmcblk0p1"
#define SD_MOUNT_ROOT "/mnt/sd"
#define EMMC_NODES_NAME "/dev/mmcblk1"
#define EMMC_DEVICE_NAME "/dev/mmcblk1p1"
#define EMMC_MOUNT_ROOT "/mnt/sd2"
typedef enum
{
MMC_DEV_SD = 0,
MMC_DEV_EMMC = 1,
MMC_DEV_NO = 2,
}MMC_DEV_TYPE;
typedef enum
{
MMC_DEV_NODE_STATE_NO = 0,
MMC_DEV_NODE_STATE_EXIST = 1,
MMC_DEV_NODE_STATE_NO_EXIST = 2,
}MMC_DEV_NODE_STATE;
typedef enum
{
MMC_DEV_MOUNT_STATE_NO = 0,
MMC_DEV_MOUNT_STATE_MOUNTED = 1,
MMC_DEV_MOUNT_STATE_UNMOUNTED = 2,
}MMC_DEV_MOUNT_STATE;
typedef enum
{
MMC_DEV_SPACE_STATE_NO = 0,
MMC_DEV_SPACE_STATE_ENOUGH = 1,
MMC_DEV_SPACE_STATE_NO_ENOUGH = 2,
}MMC_DEV_SPACE_STATE;
typedef enum
{
MMC_DEV_LOOP_STATE_NO = 0,
MMC_DEV_LOOP_STATE_ON = 1,
MMC_DEV_LOOP_STATE_OFF = 2,
}MMC_DEV_LOOP_STATE;
typedef struct
{
MMC_DEV_NODE_STATE node;
MMC_DEV_MOUNT_STATE moumted_state;
MMC_DEV_SPACE_STATE space_state;
MMC_DEV_LOOP_STATE loop_state;
}SF_ST_MMC_DEV;
#endif

View File

@ -596,6 +596,9 @@ static SINT32 sf_app_process_cmd_SD(SF_MESSAGE_BUF_S *pMessageBuf)
SINT16 startup = sf_poweron_type_get(); SINT16 startup = sf_poweron_type_get();
MLOGD("[%d,%s]\n",pMessageBuf->arg1,app_process_SD_getstatusstring(pMessageBuf->arg1)); MLOGD("[%d,%s]\n",pMessageBuf->arg1,app_process_SD_getstatusstring(pMessageBuf->arg1));
sf_mmc_dev_register(pMessageBuf);
switch(pMessageBuf->arg1) switch(pMessageBuf->arg1)
{ {
case CMD_SD_STRG_CB_UNKNOWN: case CMD_SD_STRG_CB_UNKNOWN:

View File

@ -0,0 +1,277 @@
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/vfs.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <ctype.h>
#include <dirent.h>
#include <memory.h>
#include "DCF.h"
#include "sf_type.h"
#include "sf_log.h"
#include "sf_fileMng.h"
#include "sf_storeMng.h"
typedef struct
{
int event;
int dev_id;
int mounted_status;
}STRG_CB_PARAM;
static SF_ST_MMC_DEV sf_mmc_dev[SF_ST_MMC_DEV] = {0};
SINT32 sf_mmc_dev_space_check_full(const char *mountPath, SF_STORE_ATTR_S *pstoreattrs)
{
SF_COMM_CHECK_POINTER(pstoreattrs,SF_FAILURE);
SINT32 fd = -1;
UINT32 Isfull = 0;
fd = open(mountPath, O_RDONLY,0);
if(fd >= 0)
{
struct statfs diskInfo;
statfs(mountPath, &diskInfo);
if(diskInfo.f_bsize > 1024)
{
pstoreattrs->SDTotalSize = (diskInfo.f_blocks * (diskInfo.f_bsize >> 10)) >> 10 ; //blocks * 4096 / 1024 /1024 = MB
pstoreattrs->SDFree = (diskInfo.f_bavail * (diskInfo.f_bsize >> 10)) >> 10 ;
}
else
{
pstoreattrs->SDTotalSize = (diskInfo.f_blocks * diskInfo.f_bsize) >> 10 ; //blocks * 4096 / 1024 /1024 = MB
pstoreattrs->SDFree = (diskInfo.f_bavail * diskInfo.f_bsize) >> 10 ;
}
close(fd);
if(pstoreattrs->SDTotalSize > 0)
pstoreattrs->SDStatus = 0; //SD card SUCESS
else
pstoreattrs->SDStatus = 2; //SD card ERROR
}
else
{
pstoreattrs->SDStatus = 1; //SD card not insert
pstoreattrs->SDFree = 0;
pstoreattrs->SDTotalSize = 0;
return SF_FAILURE;
}
MLOGD("SDStatus = %d,SDFree = %d MB,SDTotalSize = %d MB\n", pstoreattrs->SDStatus, pstoreattrs->SDFree,pstoreattrs->SDTotalSize);
if(pstoreattrs.SDStatus != 0)
return pstoreattrs.SDStatus;
Isfull = (pstoreattrs.SDFree <= SD_WARNING_SPACE)?1:0;
return Isfull;
}
static int sf_mmc_dev_node_check(const char *devName)
{
int tryCnt = 200;
int ret = access(devName, F_OK);
while (ret != 0 && tryCnt--)
{
usleep(10*1000);
ret = access(devName, F_OK);
}
if (tryCnt < 0)
{
HAL_MMC_LOG("no found %s\n", devName);
return -1;
}
return ret;
}
void sf_mmc_dev_register(SF_MESSAGE_BUF_S *pMessageBuf)
{
STRG_CB_PARAM strg_cb_param;
UIMenuStoreInfo *puiPara = sf_ui_para_get();
strg_cb_param.event = pMessageBuf->arg1;
strg_cb_param.dev_id = pMessageBuf->arg2;
strg_cb_param.mounted_status = pMessageBuf->arg3;
if(strg_cb_param.dev_id == MMC_DEV_SD)
{
if(strg_cb_param.event == CMD_SD_STRG_CB_INSERTED)
{
sf_mmc_dev[MMC_DEV_SD].node == MMC_DEV_NODE_STATE_EXIST;
}
else if(strg_cb_param.event == CMD_SD_STRG_CB_REMOVED)
{
sf_mmc_dev[MMC_DEV_SD].node == MMC_DEV_NODE_STATE_NO_EXIST;
}
else if(strg_cb_param.event == CMD_SD_STRG_CB_MOUNT_FINISH)
{
sf_mmc_dev[MMC_DEV_SD].moumted_state = MMC_DEV_MOUNT_STATE_MOUNTED;
}
else if(strg_cb_param.event == CMD_SD_STRG_CB_UNMOUNT_FINISH)
{
sf_mmc_dev[MMC_DEV_SD].moumted_state = MMC_DEV_MOUNT_STATE_UNMOUNTED;
}
UINT32 isfull = sf_mmc_dev_space_check_full(SD_MOUNT_ROOT);
if(isfull == 1)
{
sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_NO_ENOUGH;
}
else if(isfull == 0)
{
sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH;
}
if(puiPara->SdLoopSwitch == 1)
{
sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON;
}
else if(puiPara->SdLoopSwitch == 0)
{
sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_OFF;
}
}
else if(strg_cb_param.dev_id == MMC_DEV_EMMC)
{
if(sf_mmc_dev_node_check(EMMC_DEVICE_NAME) == 0)
{
sf_mmc_dev[MMC_DEV_EMMC].node == MMC_DEV_NODE_STATE_EXIST;
}
else
{
sf_mmc_dev[MMC_DEV_EMMC].node == MMC_DEV_NODE_STATE_NO_EXIST;
}
if(strg_cb_param.event == CMD_SD_STRG_CB_MOUNT_FINISH)
{
sf_mmc_dev[MMC_DEV_EMMC].moumted_state = MMC_DEV_MOUNT_STATE_MOUNTED;
}
else if(strg_cb_param.event == CMD_SD_STRG_CB_UNMOUNT_FINISH)
{
sf_mmc_dev[MMC_DEV_EMMC].moumted_state = MMC_DEV_MOUNT_STATE_UNMOUNTED;
}
UINT32 isfull = sf_mmc_dev_space_check_full(EMMC_MOUNT_ROOT);
if(isfull == 1)
{
sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_NO_ENOUGH;
}
else if(isfull == 0)
{
sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH;
}
if(puiPara->SdLoopSwitch == 1)
{
sf_mmc_dev[MMC_DEV_EMMC].loop_state == MMC_DEV_LOOP_STATE_ON;
}
else if(puiPara->SdLoopSwitch == 0)
{
sf_mmc_dev[MMC_DEV_EMMC].loop_state == MMC_DEV_LOOP_STATE_OFF;
}
}
}
MMC_DEV_TYPE sf_mmc_check_workable_dev(void)
{
MMC_DEV_TYPE workable_dev = MMC_DEV_NO;
if(sf_mmc_dev[MMC_DEV_EMMC].node == MMC_DEV_NODE_STATE_NO_EXIST) //EMMC节点不存在
{
if(sf_mmc_dev[MMC_DEV_EMMC].moumted_state == MMC_DEV_MOUNT_STATE_MOUNTED)
{
if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_EMMC;
}
else if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_NO_ENOUGH)
{
if(sf_mmc_dev[MMC_DEV_EMMC].loop_state == MMC_DEV_LOOP_STATE_ON)
{
workable_dev = MMC_DEV_EMMC;
}
}
}
}
else if(sf_mmc_dev[MMC_DEV_SD].node == MMC_DEV_NODE_STATE_NO_EXIST) //SD节点不存在
{
if(sf_mmc_dev[MMC_DEV_SD].moumted_state == MMC_DEV_MOUNT_STATE_MOUNTED)
{
if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_SD;
}
else if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_NO_ENOUGH)
{
if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON)
{
workable_dev = MMC_DEV_SD;
}
}
}
}
else //MMC节点都存在
{
if(sf_mmc_dev[MMC_DEV_SD].moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED)
{
if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_EMMC;
}
else
{
if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON)
{
workable_dev = MMC_DEV_EMMC;
}
}
}
else if(sf_mmc_dev[MMC_DEV_EMMC].moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED)
{
if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_SD;
}
else
{
if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON)
{
workable_dev = MMC_DEV_SD;
}
}
}
else
{
if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH &&
sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_EMMC;
}
else if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_EMMC;
}
else if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_SD;
}
else
{
if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON)
{
workable_dev = MMC_DEV_EMMC;
}
}
}
}
return workable_dev;
}

View File

@ -105,18 +105,20 @@ static void card_insert_job(void)
// call the function to wait init finish // call the function to wait init finish
FileSys_WaitFinishEx('A'); FileSys_WaitFinishEx('A');
FileSys_SetParamEx('A', FST_PARM_UPDATE_FSINFO , TRUE); FileSys_SetParamEx('A', FST_PARM_UPDATE_FSINFO , TRUE);
sf_rtos_mmc_dev_register(0, ret);
#if HUNTING_CAMERA_MCU == ENABLE #if HUNTING_CAMERA_MCU == ENABLE
if(TRUE == sf_check_card_full()) //if(TRUE == sf_check_card_full())
{ //{
DBG_WRN("ERR card full\r\n"); //DBG_WRN("ERR card full\r\n");
fastboot_set_done(BOOT_INIT_FILESYSOK); //fastboot_set_done(BOOT_INIT_FILESYSOK);
} //}
else //else
{ //{
fastboot_set_done(BOOT_INIT_FILESYSOK);
// sf_log_confg(); // sf_log_confg();
// sf_log_open(); // sf_log_open();
} //}
#endif #endif
#if FS_MULTI_STRG_FUNC #if FS_MULTI_STRG_FUNC
@ -139,10 +141,11 @@ static void card_insert_job(void)
} }
// call the function to wait init finish // call the function to wait init finish
FileSys_WaitFinishEx('B'); FileSys_WaitFinishEx('B');
sf_rtos_mmc_dev_register(1, ret);
// FileSys_SetParamEx('B', FST_PARM_UPDATE_FSINFO , TRUE); // FileSys_SetParamEx('B', FST_PARM_UPDATE_FSINFO , TRUE);
#endif #endif
//fastboot_set_done(BOOT_INIT_FILESYSOK); fastboot_set_done(BOOT_INIT_FILESYSOK);
DBG_WRN("filesys_init e\r\n"); DBG_WRN("filesys_init e\r\n");
} }

View File

@ -102,6 +102,7 @@ static lfqueue_t write_queue = {0};
//local variable //local variable
static DCF_HANDLE g_dcf_hdl = 0; static DCF_HANDLE g_dcf_hdl = 0;
static DCF_HANDLE g_dcf_hdl2 = 0;
static ID MOVIEFAST_FLG_ID = 0; static ID MOVIEFAST_FLG_ID = 0;
static UINT32 g_moviefast_tsk_run = 1; static UINT32 g_moviefast_tsk_run = 1;
static UINT32 g_moviefast_poweroff_tsk_run = 1; static UINT32 g_moviefast_poweroff_tsk_run = 1;
@ -119,6 +120,11 @@ static VOS_TICK g_vprc_trigger_frm_time= 0;
static UINT32 g_vprc_trigger_frm_count= 0; static UINT32 g_vprc_trigger_frm_count= 0;
UINT32 Movie2_nextFolderID = 0, Movie2_nextFileID = 0; UINT32 Movie2_nextFolderID = 0, Movie2_nextFileID = 0;
#if FS_MULTI_STRG_FUNC
CHAR FilePath2[NMC_TOTALFILEPATH_MAX_LEN];
#endif
//local function //local function
static void MovieFast_OnRecStart(void); static void MovieFast_OnRecStart(void);
static void MovieFast_OnRecStop(void); static void MovieFast_OnRecStop(void);
@ -308,6 +314,7 @@ static void MovieFast_ShutDown(void)
fastboot_msg_en(ENABLE); fastboot_msg_en(ENABLE);
#endif #endif
sf_file_thumb_cfg_sava(); sf_file_thumb_cfg_sava();
printf("%s %d\n", __FUNCTION__, __LINE__);
sf_para_print(); sf_para_print();
#if (LOGFILE_FUNC==ENABLE) #if (LOGFILE_FUNC==ENABLE)
UIMenuStoreInfo *puiPara = sf_ui_para_get(); UIMenuStoreInfo *puiPara = sf_ui_para_get();
@ -859,6 +866,8 @@ static void MovieFast_FileNamingCB(MOVIE_CFG_REC_ID id, char *pFileName)
//3. If the working mode is normal and it is cyclic recording, please judge the DirID and FileID by yourself before enering next new file recording. //3. If the working mode is normal and it is cyclic recording, please judge the DirID and FileID by yourself before enering next new file recording.
UINT32 nextFolderID = 0, nextFileID = 0; UINT32 nextFolderID = 0, nextFileID = 0;
UINT32 max_cnt = 0; UINT32 max_cnt = 0;
if (DCF_GetDBInfo(DCF_INFO_IS_9999)) { if (DCF_GetDBInfo(DCF_INFO_IS_9999)) {
DBG_ERR("Exceed max dcf file!\r\n"); DBG_ERR("Exceed max dcf file!\r\n");
pFileName[0] = '\0'; pFileName[0] = '\0';
@ -903,6 +912,20 @@ static void MovieFast_FileNamingCB(MOVIE_CFG_REC_ID id, char *pFileName)
DCF_MakeObjPath(nextFolderID, nextFileID, DCF_FILE_TYPE_MP4, pFileName); DCF_MakeObjPath(nextFolderID, nextFileID, DCF_FILE_TYPE_MP4, pFileName);
DCF_AddDBfile(pFileName); DCF_AddDBfile(pFileName);
DBG_DUMP("%s added to DCF\r\n", pFileName); DBG_DUMP("%s added to DCF\r\n", pFileName);
#if FS_MULTI_STRG_FUNC
printf("%s %d\n", __FUNCTION__, __LINE__);
if (DCF_GetDBInfoEx(g_dcf_hdl2, DCF_INFO_IS_9999)) {
printf("Exceed max dcf file!\r\n");
}
else {
//DCF_GetNextIDEx(g_dcf_hdl2, &nextFolderID,&nextFileID);
DCF_MakeObjPathEx(g_dcf_hdl2, nextFolderID, nextFileID, DCF_FILE_TYPE_MP4, FilePath2);
DCF_AddDBfileEx(g_dcf_hdl2, FilePath2);
printf("%s added to DCF2\r\n", FilePath2);
}
#endif
#if HUNTING_CAMERA_MCU == ENABLE #if HUNTING_CAMERA_MCU == ENABLE
char tmp[NMC_TOTALFILEPATH_MAX_LEN] = {'\0'}; char tmp[NMC_TOTALFILEPATH_MAX_LEN] = {'\0'};
sprintf(tmp, "S%03ld%04ld.JPG", nextFolderID, nextFileID); sprintf(tmp, "S%03ld%04ld.JPG", nextFolderID, nextFileID);
@ -992,10 +1015,14 @@ static void MovieFast_WriteFile_Task(void* arg)
{ {
lfqueue_t* queue = (lfqueue_t*)arg; lfqueue_t* queue = (lfqueue_t*)arg;
MOVIEFAST_WRITE_QUEUE_PARAM* param; MOVIEFAST_WRITE_QUEUE_PARAM* param;
INT32 rt;
printf("%s %d\n", __FUNCTION__, __LINE__);
fastboot_wait_done(BOOT_INIT_FILESYSOK); fastboot_wait_done(BOOT_INIT_FILESYSOK);
#if HUNTING_CAMERA_MCU == ENABLE #if HUNTING_CAMERA_MCU == ENABLE
if(TRUE == sf_is_card_full()) //if(TRUE == sf_is_card_full())
MMC_DEV_TYPE mmc_dev = sf_rtos_mmc_check_workable_dev();
if(mmc_dev == MMC_DEV_NO)
{ {
DBG_ERR("ERR card full\r\n"); DBG_ERR("ERR card full\r\n");
//return ; //return ;
@ -1012,26 +1039,71 @@ static void MovieFast_WriteFile_Task(void* arg)
if(param->va){ if(param->va){
DBG_DUMP("Write %s\n", param->path); DBG_DUMP("Write %s\n", param->path);
#if HUNTING_CAMERA_MCU == ENABLE #if HUNTING_CAMERA_MCU == ENABLE
if(TRUE != sf_is_card_full()) //if(TRUE != sf_is_card_full())
if(mmc_dev == MMC_DEV_SD)
#endif #endif
{ {
FST_FILE fp = FileSys_OpenFile(param->path, FST_OPEN_ALWAYS | FST_OPEN_WRITE); FST_FILE fp = FileSys_OpenFile(param->path, FST_OPEN_ALWAYS | FST_OPEN_WRITE);
FileSys_WriteFile(fp, (UINT8*)param->va, &param->size, 0, NULL); FileSys_WriteFile(fp, (UINT8*)param->va, &param->size, 0, NULL);
FileSys_CloseFile(fp); FileSys_CloseFile(fp);
} }
#if FS_MULTI_STRG_FUNC
if(mmc_dev == MMC_DEV_EMMC)
{
DBG_WRN("write %s\n", FilePath2);
FST_FILE fp = FileSys_OpenFile(FilePath2, FST_OPEN_ALWAYS | FST_OPEN_WRITE);
if ((fp != NULL)) {
rt = FileSys_WriteFile(fp, (UINT8*)param->va, &param->size, 0, NULL);
//FileSys_FlushFile(fp);
FileSys_CloseFile(fp);
if (rt == FST_STA_OK) {
// DCF_AddDBfile(FilePath);
// DBG_DUMP("%s added to DCF\r\n", FilePath);
} else {
DBG_ERR("Addr=0x%x,Size=0x%x\r\n", (UINT8*)param->va, &param->size);
}
}
else {
DBG_ERR("FileSys_OpenFile fail\r\n");
}
}
#endif
free(param->va); free(param->va);
} }
else if(param->frame.phy_addr[0]){ else if(param->frame.phy_addr[0]){
DBG_DUMP("Write %s\n", param->path); DBG_DUMP("Write %s\n", param->path);
#if HUNTING_CAMERA_MCU == ENABLE #if HUNTING_CAMERA_MCU == ENABLE
if(TRUE != sf_is_card_full()) //if(TRUE != sf_is_card_full())
if(mmc_dev == MMC_DEV_SD)
#endif #endif
{ {
FST_FILE fp = FileSys_OpenFile(param->path, FST_OPEN_ALWAYS | FST_OPEN_WRITE); FST_FILE fp = FileSys_OpenFile(param->path, FST_OPEN_ALWAYS | FST_OPEN_WRITE);
FileSys_WriteFile(fp, (UINT8*)param->frame.phy_addr[0], &param->size, 0, NULL); FileSys_WriteFile(fp, (UINT8*)param->frame.phy_addr[0], &param->size, 0, NULL);
FileSys_CloseFile(fp); FileSys_CloseFile(fp);
} }
#if FS_MULTI_STRG_FUNC
if(mmc_dev == MMC_DEV_EMMC)
{
DBG_WRN("write %s\n", FilePath2);
FST_FILE fp = FileSys_OpenFile(FilePath2, FST_OPEN_ALWAYS | FST_OPEN_WRITE);
if ((fp != NULL)) {
rt = FileSys_WriteFile(fp, (UINT8*)param->frame.phy_addr[0], &param->size, 0, NULL);
//FileSys_FlushFile(fp);
FileSys_CloseFile(fp);
if (rt == FST_STA_OK) {
// DCF_AddDBfile(FilePath);
// DBG_DUMP("%s added to DCF\r\n", FilePath);
} else {
DBG_ERR("Addr=0x%x,Size=0x%x\r\n", (UINT8*)param->frame.phy_addr[0], &param->size);
}
}
else {
DBG_ERR("FileSys_OpenFile fail\r\n");
}
}
#endif
hd_videoproc_release_out_buf(param->vprc_path_id, &param->frame); hd_videoproc_release_out_buf(param->vprc_path_id, &param->frame);
} }
@ -1198,6 +1270,31 @@ THREAD_RETTYPE MovieFast_InitFileNamingThread(void *arg)
DCF_SetDirFreeChars(DCF_DIR_NAME); DCF_SetDirFreeChars(DCF_DIR_NAME);
DCF_SetFileFreeChars(DCF_FILE_TYPE_ANYFORMAT, DCF_FILE_NAME); DCF_SetFileFreeChars(DCF_FILE_TYPE_ANYFORMAT, DCF_FILE_NAME);
DCF_ScanObj(); DCF_ScanObj();
#if (FS_MULTI_STRG_FUNC)
{
DCF_OPEN_PARM dcfParm = {
.Drive = 'B',
.WorkbuffAddr = mempool_dcf + POOL_SIZE_DCF_BUFFER,
.WorkbuffSize = POOL_SIZE_DCF_BUFFER,
};
g_dcf_hdl2 = DCF_Open(&dcfParm);
if(g_dcf_hdl2 < 0){
DBG_ERR("get dcf handle error!\n");
}
printf("DCF_ScanObjEx emmc handle=%d\n", g_dcf_hdl2);
// DCF_SetParm(DCF_PRMID_REMOVE_DUPLICATE_FOLDER, TRUE);
// DCF_SetParm(DCF_PRMID_REMOVE_DUPLICATE_FILE, TRUE);
// DCF_SetParm(DCF_PRMID_SET_VALID_FILE_FMT, DCF_FILE_TYPE_JPG|DCF_FILE_TYPE_MP4|DCF_FILE_TYPE_MOV);
// DCF_SetParm(DCF_PRMID_SET_DEP_FILE_FMT, DCF_FILE_TYPE_JPG|DCF_FILE_TYPE_WAV|DCF_FILE_TYPE_MPO);
// DCF_SetDirFreeChars(DCF_DIR_NAME);
// DCF_SetFileFreeChars(DCF_FILE_TYPE_ANYFORMAT, DCF_FILE_NAME);
DCF_ScanObjEx(g_dcf_hdl2);
}
#endif
#if HUNTING_CAMERA_MCU == ENABLE #if HUNTING_CAMERA_MCU == ENABLE
if(TRUE != sf_is_card_full()) if(TRUE != sf_is_card_full())
#endif #endif
@ -1894,6 +1991,12 @@ static void MovieFast_Close(void)
EXIT: EXIT:
DCF_Close(g_dcf_hdl); DCF_Close(g_dcf_hdl);
g_dcf_hdl = -1;
#if (FS_MULTI_STRG_FUNC)
DCF_Close(g_dcf_hdl2);
g_dcf_hdl2 = -1;
#endif
DCF_UnInstallID(); DCF_UnInstallID();
vos_flag_destroy(MOVIEFAST_FLG_ID); vos_flag_destroy(MOVIEFAST_FLG_ID);

View File

@ -938,7 +938,7 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId,
DBG_DUMP("%s added to DCF\r\n", FilePath); DBG_DUMP("%s added to DCF\r\n", FilePath);
} }
#if 0//FS_MULTI_STRG_FUNC #if FS_MULTI_STRG_FUNC
if (DCF_GetDBInfoEx(g_dcf_hdl2, DCF_INFO_IS_9999)) { if (DCF_GetDBInfoEx(g_dcf_hdl2, DCF_INFO_IS_9999)) {
DBG_ERR("Exceed max dcf file!\r\n"); DBG_ERR("Exceed max dcf file!\r\n");
@ -973,7 +973,9 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId,
//sprintf(tmp, "W%03ld%04ld.JPG", nextFolderID, nextFileID); //sprintf(tmp, "W%03ld%04ld.JPG", nextFolderID, nextFileID);
strncpy(g_photo_fast_write_file_Path, tmp, sizeof(g_photo_fast_write_file_Path) - 1); strncpy(g_photo_fast_write_file_Path, tmp, sizeof(g_photo_fast_write_file_Path) - 1);
DBG_IND("last send file:%s\r\n", tmp); DBG_IND("last send file:%s\r\n", tmp);
if(TRUE == sf_is_card_full()) //if(TRUE == sf_is_card_full())
MMC_DEV_TYPE mmc_dev = sf_rtos_mmc_check_workable_dev();
if(mmc_dev == MMC_DEV_NO)
{ {
DBG_ERR("ERR Addr=0x%x,Size=0x%x,Fmt=%d card full\r\n", Addr, Size, Fmt); DBG_ERR("ERR Addr=0x%x,Size=0x%x,Fmt=%d card full\r\n", Addr, Size, Fmt);
rt =FST_STA_ERROR; rt =FST_STA_ERROR;
@ -988,7 +990,9 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId,
open_flag = FST_CREATE_ALWAYS | FST_OPEN_WRITE; open_flag = FST_CREATE_ALWAYS | FST_OPEN_WRITE;
if ((fp = FileSys_OpenFile(FilePath, open_flag)) != NULL) { if(mmc_dev == MMC_DEV_SD)
{
if ((fp = FileSys_OpenFile(FilePath, open_flag)) != NULL) {
Length = Size; Length = Size;
rt = FileSys_WriteFile(fp, (UINT8 *)Addr, &Length, 0, NULL); rt = FileSys_WriteFile(fp, (UINT8 *)Addr, &Length, 0, NULL);
@ -1000,34 +1004,34 @@ INT32 PhotoFast_WriteFile(UINT32 Addr, UINT32 Size, UINT32 Fmt, UINT32 uiPathId,
} else { } else {
DBG_ERR("Addr=0x%x,Size=0x%x,Fmt=%d\r\n", Addr, Size, Fmt); DBG_ERR("Addr=0x%x,Size=0x%x,Fmt=%d\r\n", Addr, Size, Fmt);
} }
}else{ }else{
DBG_ERR("FileSys_OpenFile fail\r\n"); DBG_ERR("FileSys_OpenFile fail\r\n");
rt =FST_STA_ERROR; rt =FST_STA_ERROR;
}
} }
#if FS_MULTI_STRG_FUNC #if FS_MULTI_STRG_FUNC
if(mmc_dev == MMC_DEV_EMMC)
{
DBG_WRN("write %s\n", FilePath2);
if ((fp = FileSys_OpenFile(FilePath2, open_flag)) != NULL) {
Length = Size;
DBG_WRN("write %s\n", FilePath2); rt = FileSys_WriteFile(fp, (UINT8 *)Addr, &Length, 0, NULL);
if ((fp = FileSys_OpenFile(FilePath2, open_flag)) != NULL) { FileSys_FlushFile(fp);
Length = Size; FileSys_CloseFile(fp);
if (rt == FST_STA_OK) {
rt = FileSys_WriteFile(fp, (UINT8 *)Addr, &Length, 0, NULL); // DCF_AddDBfile(FilePath);
FileSys_FlushFile(fp); // DBG_DUMP("%s added to DCF\r\n", FilePath);
FileSys_CloseFile(fp); } else {
if (rt == FST_STA_OK) { DBG_ERR("Addr=0x%x,Size=0x%x,Fmt=%d\r\n", Addr, Size, Fmt);
// DCF_AddDBfile(FilePath); }
// DBG_DUMP("%s added to DCF\r\n", FilePath); }else{
} else { DBG_ERR("FileSys_OpenFile fail\r\n");
DBG_ERR("Addr=0x%x,Size=0x%x,Fmt=%d\r\n", Addr, Size, Fmt); rt =FST_STA_ERROR;
} }
}else{
DBG_ERR("FileSys_OpenFile fail\r\n");
rt =FST_STA_ERROR;
} }
#endif #endif
return rt; return rt;
} }

View File

@ -0,0 +1,66 @@
/**************************************************************************
*
* Copyright (c) 2015-2021 by WuYuan Technology, Inc.
*
* This software is copyrighted by and is the property of SiFar
* Technology, Inc.. All rights are reserved by SiFar Technology, Inc..
* This software may only be used in accordance with the corresponding
* license agreement. Any unauthorized use, duplication, distribution,
* or disclosure of this software is expressly forbidden.
*
* This Copyright notice MUST not be removed or modified without prior
* written consent of SiFar Technology, Inc..
*
* WuYuan Technology, Inc. reserves the right to modify this software without notice.
*
* Author: Sober
* Ver: 1.0.0 2023.12.23
* Description: Creat
**************************************************************************/
#ifndef _SF_SD_COMM_H_
#define _SF_SD_COMM_H_
typedef enum
{
MMC_DEV_SD = 0,
MMC_DEV_EMMC = 1,
MMC_DEV_NO = 2,
}MMC_DEV_TYPE;
typedef enum
{
MMC_DEV_NODE_STATE_NO = 0,
MMC_DEV_NODE_STATE_EXIST = 1,
MMC_DEV_NODE_STATE_NO_EXIST = 2,
}MMC_DEV_NODE_STATE;
typedef enum
{
MMC_DEV_MOUNT_STATE_NO = 0,
MMC_DEV_MOUNT_STATE_MOUNTED = 1,
MMC_DEV_MOUNT_STATE_UNMOUNTED = 2,
}MMC_DEV_MOUNT_STATE;
typedef enum
{
MMC_DEV_SPACE_STATE_NO = 0,
MMC_DEV_SPACE_STATE_ENOUGH = 1,
MMC_DEV_SPACE_STATE_NO_ENOUGH = 2,
}MMC_DEV_SPACE_STATE;
typedef enum
{
MMC_DEV_LOOP_STATE_NO = 0,
MMC_DEV_LOOP_STATE_ON = 1,
MMC_DEV_LOOP_STATE_OFF = 2,
}MMC_DEV_LOOP_STATE;
typedef struct
{
//MMC_DEV_NODE_STATE node;
MMC_DEV_MOUNT_STATE moumted_state;
MMC_DEV_SPACE_STATE space_state;
//MMC_DEV_LOOP_STATE loop_state;
}SF_RTOS_ST_MMC_DEV;
#endif

View File

@ -90,6 +90,49 @@ UINT32 sf_check_card_full(void)
return ret; return ret;
} }
static UINT32 sf_mmc_dev_space_check_full(MMC_DEV_TYPE mmc_dev)
{
UINT64 diskFree = 0;
UINT32 ret = 0;
//UIMenuStoreInfo *puiPara = sf_ui_para_get();
if(!sf_in_card_exist())
{
return 1;
}
/*check disk free size*/
if(mmc_dev == MMC_DEV_SD)
{
diskFree = FileSys_GetDiskInfo(FST_INFO_FREE_SPACE);
}
else
{
diskFree = FileSys_GetEMMCDiskInfo(FST_INFO_FREE_SPACE);
}
diskFree = diskFree/1024/1024;
if(diskFree < 30) /* 30MB */
{
ret = TRUE;
//if(0 == puiPara->SdLoopSwitch)
{
IsCardFull = TRUE;
}
//printf("%s:%d sd card is full diskFree=%lu",__FUNCTION__,__LINE__,diskFree);
}
else
{
ret = FALSE;
}
printf("[%s:%d]sd card diskFree=%lluM\n", __FUNCTION__, __LINE__, diskFree);
return ret;
}
void sf_sd_exist_reg_cb(SF_CALLBACK_SD_CMD fpCB) void sf_sd_exist_reg_cb(SF_CALLBACK_SD_CMD fpCB)
{ {
g_fpSd_Exist_CB = fpCB; g_fpSd_Exist_CB = fpCB;
@ -110,6 +153,84 @@ BOOL sf_in_card_exist(void)
} }
int sf_rtos_mmc_dev_register(int devid, int mounted_state)
{
if(mounted_state == FST_STA_OK)
{
sf_mmc_dev[devid].moumted_state = MMC_DEV_MOUNT_STATE_MOUNTED;
}
else
{
sf_mmc_dev[devid].moumted_state = MMC_DEV_MOUNT_STATE_UNMOUNTED;
}
int isfull = sf_mmc_dev_space_check_full(devid);
if(isfull)
{
sf_mmc_dev[devid].space_state = MMC_DEV_SPACE_STATE_ENOUGH;
}
else{
sf_mmc_dev[devid].space_state = MMC_DEV_SPACE_STATE_NO_ENOUGH;
}
}
MMC_DEV_TYPE sf_rtos_mmc_check_workable_dev(void)
{
MMC_DEV_TYPE workable_dev = MMC_DEV_NO;
if(sf_mmc_dev[MMC_DEV_SD].moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED)
{
if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_EMMC;
}
else
{
if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON)
{
workable_dev = MMC_DEV_EMMC;
}
}
}
else if(sf_mmc_dev[MMC_DEV_EMMC].moumted_state == MMC_DEV_MOUNT_STATE_UNMOUNTED)
{
if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_SD;
}
else
{
if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON)
{
workable_dev = MMC_DEV_SD;
}
}
}
else
{
if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH &&
sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_EMMC;
}
else if(sf_mmc_dev[MMC_DEV_EMMC].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_EMMC;
}
else if(sf_mmc_dev[MMC_DEV_SD].space_state == MMC_DEV_SPACE_STATE_ENOUGH)
{
workable_dev = MMC_DEV_SD;
}
else
{
if(sf_mmc_dev[MMC_DEV_SD].loop_state == MMC_DEV_LOOP_STATE_ON)
{
workable_dev = MMC_DEV_EMMC;
}
}
}
return workable_dev;
}

View File

@ -1722,5 +1722,9 @@ extern int FileSys_SearchFileRewind(FS_SEARCH_HDL pSearch);
#define fs_SearchFile FileSys_SearchFile #define fs_SearchFile FileSys_SearchFile
#define fs_SearchFileClose FileSys_SearchFileClose #define fs_SearchFileClose FileSys_SearchFileClose
#define fs_SearchFileRewind FileSys_SearchFileRewind #define fs_SearchFileRewind FileSys_SearchFileRewind
#define FileSys_GetEMMCDiskInfo(parm1) FileSys_GetDiskInfoEx('B', parm1)
//@} //@}
#endif #endif