sdk-hwV1.3/lichee/xr806/appos/project/common/framework/fs_ctrl.c

269 lines
6.8 KiB
C
Executable File

/*
* Copyright (C) 2017 XRADIO TECHNOLOGY CO., LTD. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
* 3. Neither the name of XRADIO TECHNOLOGY CO., LTD. nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include "sys/xr_debug.h"
#include "fs_ctrl.h"
#include "fs/vfs.h"
#include "fs/littlefs/vfs_lfs.h"
#include "fs/fatfs/vfs_fatfs.h"
#include "common/framework/sys_ctrl/sys_ctrl.h"
#include "fs/spiffs/vfs_spiffs.h"
#define FS_DBG_ON 0
#define FS_INF_ON 1
#define FS_WRN_ON 1
#define FS_ERR_ON 1
#define FS_LOG(flags, fmt, arg...) \
do { \
if (flags) \
printf(fmt, ##arg); \
} while (0)
#define FS_DBG(fmt, arg...) FS_LOG(FS_DBG_ON, "[FS DBG] "fmt, ##arg)
#define FS_INF(fmt, arg...) FS_LOG(FS_INF_ON, "[FS INF] "fmt, ##arg)
#define FS_WRN(fmt, arg...) FS_LOG(FS_WRN_ON, "[FS WRN] "fmt, ##arg)
#define FS_ERR(fmt, arg...) \
do { \
FS_LOG(FS_ERR_ON, "[FS ERR] %s():%d, "fmt, \
__func__, __LINE__, ##arg); \
} while (0)
int fs_ctrl_mount(enum fs_mnt_dev_type dev_type, uint32_t dev_id)
{
int ret = 0;
#if PRJCONF_SYS_CTRL_EN
enum fs_mnt_status status = FS_MNT_STATUS_MOUNT_FAIL;
#endif
#ifdef CONFIG_LITTLE_FS
struct vfs_lfs_config config_lfs;
#elif defined(CONFIG_SPIF_FS)
struct vfs_spiffs_config config_spiffs;
#endif
switch (dev_type) {
#ifdef CONFIG_FAT_FS
case FS_MNT_DEV_TYPE_SDCARD:
ret = vfs_fatfs_mount(dev_id);
break;
#endif
#ifdef CONFIG_LITTLE_FS
case FS_MNT_DEV_TYPE_FLASH:
config_lfs.start_addr = CONFIG_LITTLE_FS_START_ADDR;
config_lfs.block_size = CONFIG_LITTLE_FS_BLOCK_SIZE;
config_lfs.block_count = CONFIG_LITTLE_FS_BLOCK_COUNT;
ret = vfs_lfs_mount(dev_id, &config_lfs);
break;
#elif defined(CONFIG_SPIF_FS)
case FS_MNT_DEV_TYPE_FLASH:
config_spiffs.start_addr = CONFIG_SPIF_FS_START_ADDR;
config_spiffs.block_size = CONFIG_SPIF_FS_BLOCK_SIZE;
config_spiffs.fs_size = CONFIG_SPIF_FS_PHY_SIZE;
ret = vfs_spiffs_mount(dev_id, &config_spiffs);
break;
#endif
default:
ret = -1;
break;
}
#if PRJCONF_SYS_CTRL_EN
status = (ret == 0 ? FS_MNT_STATUS_MOUNT_OK : FS_MNT_STATUS_MOUNT_FAIL);
if (sys_event_send(CTRL_MSG_TYPE_FS,
FS_CTRL_MSG_FS_MNT,
FS_MNT_MSG_PARAM(dev_type, dev_id, status),
0) != 0) {
FS_ERR("send event fail\n");
}
#endif
return ret;
}
int fs_ctrl_unmount(enum fs_mnt_dev_type dev_type, uint32_t dev_id)
{
int ret = 0;
switch (dev_type) {
#ifdef CONFIG_FAT_FS
case FS_MNT_DEV_TYPE_SDCARD:
ret = vfs_fatfs_unmount(dev_id);
break;
#endif
#ifdef CONFIG_LITTLE_FS
case FS_MNT_DEV_TYPE_FLASH:
ret = vfs_lfs_unmount(dev_id);
break;
#elif defined(CONFIG_SPIF_FS)
case FS_MNT_DEV_TYPE_FLASH:
ret = vfs_spiffs_unmount(dev_id);
break;
#endif
default:
ret = -1;
break;
}
#if PRJCONF_SYS_CTRL_EN
if (ret == 0) {
if (sys_event_send(CTRL_MSG_TYPE_FS,
FS_CTRL_MSG_FS_MNT,
FS_MNT_MSG_PARAM(dev_type, dev_id,
FS_MNT_STATUS_UNMOUNT),
0) != 0) {
FS_ERR("send event fail\n");
}
}
#endif
return ret;
}
int fs_ctrl_format(enum fs_mnt_dev_type dev_type, uint32_t dev_id)
{
int ret = 0;
switch (dev_type) {
#ifdef CONFIG_FAT_FS
case FS_MNT_DEV_TYPE_SDCARD:
//TODO: add fatfs format function.
break;
#endif
#ifdef CONFIG_LITTLE_FS
case FS_MNT_DEV_TYPE_FLASH:
ret = vfs_lfs_format(dev_id);
break;
#elif defined(CONFIG_SPIF_FS)
case FS_MNT_DEV_TYPE_FLASH:
ret = vfs_spiffs_format(dev_id);
break;
#endif
default:
ret = -1;
break;
}
return ret;
}
#ifdef CONFIG_FAT_FS
#if PRJCONF_SYS_CTRL_EN
static void fs_ctrl_msg_process(uint32_t event, uint32_t data, void *arg)
{
switch (EVENT_SUBTYPE(event)) {
case SD_CARD_MSG_INSERT:
fs_ctrl_mount(FS_MNT_DEV_TYPE_SDCARD, 0);
break;
case SD_CARD_MSG_REMOVE:
fs_ctrl_unmount(FS_MNT_DEV_TYPE_SDCARD, 0);
break;
default:
break;
}
}
#endif
#endif
/*
* @brief Init file system control module
* @return 0 on success, -1 on failure
*/
int fs_ctrl_init(void)
{
int ret = 0;
vfs_list_init();
#ifdef CONFIG_LITTLE_FS
ret = vfs_register_lfs();
if (ret != 0) {
FS_ERR("register lfs fail\n");
return -1;
}
#elif defined(CONFIG_SPIF_FS)
ret = vfs_register_spiffs();
if (ret != 0) {
FS_ERR("register spiffs fail\n");
return -1;
}
#endif
#ifdef CONFIG_FAT_FS
ret = vfs_register_fatfs();
if (ret != 0) {
FS_ERR("register fatfs fail\n");
return -1;
}
#if PRJCONF_SYS_CTRL_EN
observer_base *base = sys_callback_observer_create(CTRL_MSG_TYPE_SDCARD,
SD_CARD_MSG_ALL,
fs_ctrl_msg_process,
NULL);
if (base == NULL) {
FS_ERR("create fail\n");
return -1;
}
if (sys_ctrl_attach(base) != 0) {
FS_ERR("attach fail\n");
return -1;
}
#endif
#endif
return ret;
}
/*
* @brief SD card detect callback fucntion
* @param[in] present 1 for card inserted, 0 for card removed
* @return none
*/
void sdcard_detect_callback(uint32_t present)
{
#if PRJCONF_SYS_CTRL_EN
uint16_t subtype;
if (present) {
FS_INF("card insert\n");
subtype = SD_CARD_MSG_INSERT;
} else {
FS_INF("card remove\n");
subtype = SD_CARD_MSG_REMOVE;
}
if (sys_event_send(CTRL_MSG_TYPE_SDCARD, subtype, 0, 0) != 0) {
FS_ERR("send event fail\n");
}
#endif
}