From cfa3ecfa9eee0b580d59e5a24cb374a72a5fc34e Mon Sep 17 00:00:00 2001 From: Shell Date: Mon, 22 Jul 2024 11:51:23 +0800 Subject: bsp: cvitek/c906B: feat: add config of bootfs To support more choice on bootfs. romfs, cromfs are now supported on risc_v_big platform. Changes: - added mount operations under port - added prototypes for cromfs init APIs Signed-off-by: Shell Reviewed-on: https://github.com/RT-Thread/rt-thread/pull/9229 Reviewed-by: Chen Wang --- bsp/cvitek/cv18xx_risc-v/Kconfig | 15 +++ bsp/cvitek/drivers/SConscript | 8 +- bsp/cvitek/drivers/port/mnt.c | 108 --------------------- bsp/cvitek/drivers/port/mnt_cromfs.c | 106 ++++++++++++++++++++ bsp/cvitek/drivers/port/mnt_romfs.c | 108 +++++++++++++++++++++ .../dfs/dfs_v2/filesystems/cromfs/dfs_cromfs.h | 3 + 6 files changed, 238 insertions(+), 110 deletions(-) delete mode 100644 bsp/cvitek/drivers/port/mnt.c create mode 100644 bsp/cvitek/drivers/port/mnt_cromfs.c create mode 100644 bsp/cvitek/drivers/port/mnt_romfs.c diff --git a/bsp/cvitek/cv18xx_risc-v/Kconfig b/bsp/cvitek/cv18xx_risc-v/Kconfig index e21d6bfedc..42796ddcb2 100755 --- a/bsp/cvitek/cv18xx_risc-v/Kconfig +++ b/bsp/cvitek/cv18xx_risc-v/Kconfig @@ -75,3 +75,18 @@ choice bool "milkv-duo256m-spinor" endchoice + +choice BSP_ROOTFS_TYPE + prompt "rootfs type" + default BSP_ROOTFS_TYPE_ROMFS + + config BSP_ROOTFS_TYPE_ROMFS + bool "ROMFS" + select RT_USING_DFS_ROMFS + + config BSP_ROOTFS_TYPE_CROMFS + bool "CROMFS" + select RT_USING_DFS_CROMFS + select PKG_USING_ZLIB + select PKG_USING_ZLIB_LATEST_VERSION +endchoice diff --git a/bsp/cvitek/drivers/SConscript b/bsp/cvitek/drivers/SConscript index 91961af61a..56bca8b136 100755 --- a/bsp/cvitek/drivers/SConscript +++ b/bsp/cvitek/drivers/SConscript @@ -38,11 +38,15 @@ if GetDepend('BSP_USING_PWM'): src += ['drv_pwm.c'] CPPPATH += [cwd + r'/libraries/cv180x/pwm'] +if GetDepend('BSP_ROOTFS_TYPE_CROMFS'): + src += ['port/mnt_cromfs.c'] +elif GetDepend('BSP_ROOTFS_TYPE_ROMFS'): + src += ['port/mnt_romfs.c'] + if GetDepend('BSP_USING_SDH'): - src += ['drv_sdhci.c', 'port/mnt.c'] + src += ['drv_sdhci.c'] CPPPATH += [cwd + r'/libraries/sdif'] - if GetDepend('BSP_USING_ETH'): src += Split(''' drv_eth.c diff --git a/bsp/cvitek/drivers/port/mnt.c b/bsp/cvitek/drivers/port/mnt.c deleted file mode 100644 index 799b7c5ccf..0000000000 --- a/bsp/cvitek/drivers/port/mnt.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2022/12/25 flyingcys first version - */ -#include - -#ifdef RT_USING_DFS -#include -#include "dfs_romfs.h" - -#define DBG_TAG "app.filesystem" -#define DBG_LVL DBG_LOG -#include - -static const struct romfs_dirent _romfs_root[] = -{ -#ifdef BSP_USING_ON_CHIP_FLASH - {ROMFS_DIRENT_DIR, "flash", RT_NULL, 0}, -#endif - {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0} -}; - -const struct romfs_dirent romfs_root = -{ - ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root) / sizeof(_romfs_root[0]) -}; - -static void sd_mount(void *parameter) -{ - while (1) - { - rt_thread_mdelay(500); - - if (rt_device_find("sd0") != RT_NULL) - { - if (dfs_mount("sd0", "/sdcard", "elm", 0, 0) == RT_EOK) - { - LOG_I("sd card mount to '/sdcard'"); - break; - } - else - { - LOG_W("sd card mount to '/sdcard' failed! %d\n", rt_get_errno()); - } - } - } -} - -int mount_init(void) -{ - if(dfs_mount(RT_NULL, "/", "rom", 0, &romfs_root) != 0) - { - LOG_E("rom mount to '/' failed!"); - } - -#ifdef BSP_USING_ON_CHIP_FLASH_FS - struct rt_device *flash_dev = RT_NULL; - - /* 使用 filesystem 分区创建块设备,块设备名称为 filesystem */ - flash_dev = fal_blk_device_create("filesystem"); - if(flash_dev == RT_NULL) - { - LOG_E("Failed to create device.\n"); - return -RT_ERROR; - } - - if (dfs_mount("filesystem", "/flash", "lfs", 0, 0) != 0) - { - LOG_I("file system initialization failed!\n"); - if(dfs_mkfs("lfs", "filesystem") == 0) - { - if (dfs_mount("filesystem", "/flash", "lfs", 0, 0) == 0) - { - LOG_I("mount to '/flash' success!"); - } - } - } - else - { - LOG_I("mount to '/flash' success!"); - } -#endif - -#ifdef BSP_USING_SDH - rt_thread_t tid; - - tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, - 4096, RT_THREAD_PRIORITY_MAX - 2, 20); - if (tid != RT_NULL) - { - rt_thread_startup(tid); - } - else - { - LOG_E("create sd_mount thread err!"); - } -#endif - - return RT_EOK; -} -INIT_APP_EXPORT(mount_init); - -#endif /* RT_USING_DFS */ diff --git a/bsp/cvitek/drivers/port/mnt_cromfs.c b/bsp/cvitek/drivers/port/mnt_cromfs.c new file mode 100644 index 0000000000..5ca7416215 --- /dev/null +++ b/bsp/cvitek/drivers/port/mnt_cromfs.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-06-18 Shell add cromfs support + */ + +#define DBG_TAG "app.filesystem" +#define DBG_LVL DBG_LOG +#include + +#include +#include +#include +#include +#include +#include + +#include + +struct _mount_table +{ + char *dev_name; + char *mount_point; + char *fs_name; + long rwflag; + void *data; +}; + +struct _mount_table _mount_table[] = { + [0] = {NULL, "/", "crom", 0, 0}, + +}; + +static int _wait_device_ready(const char* devname) +{ + int k; + + for(k = 0; k < 10; k++) + { + if (rt_device_find(devname) != RT_NULL) + { + return 1; + } + rt_thread_mdelay(50); + } + + return 0; +} + +int mnt_init(void) +{ + int i; + uint32_t crom_data_len = 0; + uint32_t length; + + _mount_table[0].data = cromfs_get_partition_data(&length); + crom_data_len = length; + + if (_mount_table[0].data && (crom_data_len > 0)) + { + for (i = 0; i < sizeof(_mount_table) / sizeof(_mount_table[0]); i++) + { + if (_mount_table[i].dev_name && !_wait_device_ready(_mount_table[i].dev_name)) + { + LOG_E("device %s find timeout", _mount_table[i].dev_name); + continue; + } + + if (dfs_mount(_mount_table[i].dev_name, _mount_table[i].mount_point, + _mount_table[i].fs_name, _mount_table[i].rwflag, _mount_table[i].data) != 0) + { + LOG_E("Dir %s %s mount failed!", _mount_table[i].mount_point, + _mount_table[i].dev_name ? _mount_table[i].dev_name : _mount_table[i].fs_name); + } + else + { + LOG_I("Dir %s %s mount ok!", _mount_table[i].mount_point, + _mount_table[i].dev_name ? _mount_table[i].dev_name : _mount_table[i].fs_name); + } + } + } + else + { + LOG_E("No mount data found!"); + } + + mkdir("/dev/shm", 0777); + + if (dfs_mount(NULL, "/dev/shm", "tmp", 0, 0) != 0) + { + LOG_E("Dir %s %s mount failed!", "/dev/shm", "tmp"); + } + else + { + LOG_I("Dir %s %s mount ok!", "/dev/shm", "tmp"); + } + + LOG_I("file system initialization done!\n"); + + return 0; +} +INIT_ENV_EXPORT(mnt_init); diff --git a/bsp/cvitek/drivers/port/mnt_romfs.c b/bsp/cvitek/drivers/port/mnt_romfs.c new file mode 100644 index 0000000000..799b7c5ccf --- /dev/null +++ b/bsp/cvitek/drivers/port/mnt_romfs.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022/12/25 flyingcys first version + */ +#include + +#ifdef RT_USING_DFS +#include +#include "dfs_romfs.h" + +#define DBG_TAG "app.filesystem" +#define DBG_LVL DBG_LOG +#include + +static const struct romfs_dirent _romfs_root[] = +{ +#ifdef BSP_USING_ON_CHIP_FLASH + {ROMFS_DIRENT_DIR, "flash", RT_NULL, 0}, +#endif + {ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0} +}; + +const struct romfs_dirent romfs_root = +{ + ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root) / sizeof(_romfs_root[0]) +}; + +static void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + + if (rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/sdcard", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/sdcard'"); + break; + } + else + { + LOG_W("sd card mount to '/sdcard' failed! %d\n", rt_get_errno()); + } + } + } +} + +int mount_init(void) +{ + if(dfs_mount(RT_NULL, "/", "rom", 0, &romfs_root) != 0) + { + LOG_E("rom mount to '/' failed!"); + } + +#ifdef BSP_USING_ON_CHIP_FLASH_FS + struct rt_device *flash_dev = RT_NULL; + + /* 使用 filesystem 分区创建块设备,块设备名称为 filesystem */ + flash_dev = fal_blk_device_create("filesystem"); + if(flash_dev == RT_NULL) + { + LOG_E("Failed to create device.\n"); + return -RT_ERROR; + } + + if (dfs_mount("filesystem", "/flash", "lfs", 0, 0) != 0) + { + LOG_I("file system initialization failed!\n"); + if(dfs_mkfs("lfs", "filesystem") == 0) + { + if (dfs_mount("filesystem", "/flash", "lfs", 0, 0) == 0) + { + LOG_I("mount to '/flash' success!"); + } + } + } + else + { + LOG_I("mount to '/flash' success!"); + } +#endif + +#ifdef BSP_USING_SDH + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 4096, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } +#endif + + return RT_EOK; +} +INIT_APP_EXPORT(mount_init); + +#endif /* RT_USING_DFS */ diff --git a/components/dfs/dfs_v2/filesystems/cromfs/dfs_cromfs.h b/components/dfs/dfs_v2/filesystems/cromfs/dfs_cromfs.h index 97339bc510..a22bd5e433 100644 --- a/components/dfs/dfs_v2/filesystems/cromfs/dfs_cromfs.h +++ b/components/dfs/dfs_v2/filesystems/cromfs/dfs_cromfs.h @@ -11,6 +11,9 @@ #ifndef __DFS_CROMFS_H__ #define __DFS_CROMFS_H__ +#include + int dfs_cromfs_init(void); +uint8_t *cromfs_get_partition_data(uint32_t *len); #endif /*__DFS_CROMFS_H__*/ -- cgit v1.3.1