diff --git a/.gitignore b/.gitignore index ae1cc4f39..1b81ca95e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ build/* .config .config.old +.cache mkrtos_knl/stm32_link.lds benos .vscode +mkrtos_tool/kconfig/__pycache__ diff --git a/.vscode/settings.json b/.vscode/settings.json index 1c8378888..c0bfb3bfd 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -186,7 +186,10 @@ "flash.h": "c", "blk_drv_cli.h": "c", "u_slist.h": "c", - "u_share_mem.h": "c" + "u_share_mem.h": "c", + "hw_block_test.h": "c", + "open.h": "c", + "appfs_open.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": true, diff --git a/CMakeLists.txt b/CMakeLists.txt index f2f3b78aa..be3910046 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,12 @@ execute_process( COMMAND git rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE BRANCH ) + +execute_process( + COMMAND cd ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/appfs/src/build.sh && sh build.sh + COMMAND_ECHO STDOUT +) + string(STRIP ${DATE} DATE) string(STRIP ${TIME} TIME) set(code_version ${BRANCH}-${COMMIT} CACHE STRING " " FORCE) diff --git a/mkrtos_configs/ATSURFF437_defconfig b/mkrtos_configs/ATSURFF437_defconfig index c21004084..1e4eb4392 100644 --- a/mkrtos_configs/ATSURFF437_defconfig +++ b/mkrtos_configs/ATSURFF437_defconfig @@ -45,7 +45,7 @@ CONFIG_BOARD_NAME="ATSURFF437" CONFIG_BUDDY_SLAB=n CONFIG_SMP=n CONFIG_CPU=1 -CONFIG_THREAD_BLOCK_SIZE=0x400 +CONFIG_THREAD_BLOCK_SIZE=0x800 CONFIG_PAGE_SHIFT=9 CONFIG_MMU=n CONFIG_KNL_TEST=n @@ -60,4 +60,6 @@ CONFIG_MPU_PAGE_FAULT_SUPPORT=n CONFIG_MPU_PAGE_NUM=64 CONFIG_MPU_PAGE_FAULT_REGIONS_NUM=2 CONFIG_BOOT_INFO_SUPPORT=y -CONFIG_DTBO_SUPPORT=y \ No newline at end of file +CONFIG_DTBO_SUPPORT=y +CONFIG_CPIO_SUPPORT=n +CONFIG_APP_PARAMS_NR=16 \ No newline at end of file diff --git a/mkrtos_img/CMakeLists.txt b/mkrtos_img/CMakeLists.txt index 018eb97c2..1e6509cc3 100755 --- a/mkrtos_img/CMakeLists.txt +++ b/mkrtos_img/CMakeLists.txt @@ -12,7 +12,7 @@ add_custom_target( COMMAND ls | cpio -H newc -o > ${CMAKE_SOURCE_DIR}/build/output/rootfs.cpio COMMAND - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/appfs/src/build/appfs -g ${CMAKE_SOURCE_DIR}/build/output/cpio -o ../appfs.img -s ${APPFS_IMG_SIZE} + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/appfs/src/build/appfs -g ${CMAKE_SOURCE_DIR}/build/output/cpio -o ../appfs.img -s ${APPFS_IMG_SIZE} -b 4096 -j COMMAND srec_cat -output ${CMAKE_SOURCE_DIR}/build/output/kernel.img -binary ${CMAKE_SOURCE_DIR}/build/output/bootstrap -binary -offset 0x0 @@ -28,32 +28,32 @@ add_custom_target( ${CMAKE_OBJCOPY} --change-section-address .text=${CONFIG_SYS_TEXT_ADDR} ${CMAKE_SOURCE_DIR}/build/output/kernel.img.out #以下命令用于生成binutils链接需要的库 - COMMAND - cd ../../ - COMMAND - rm -f -r usr_lib - COMMAND - mkdir -p usr_lib - COMMAND - find mkrtos_user -name "*.a" | xargs cp -t usr_lib - COMMAND - cd usr_lib - COMMAND - ${CMAKE_AR} x libmuslc.a - COMMAND - ${CMAKE_AR} x liblibc_be.a - COMMAND - ${CMAKE_AR} x libsys.a - COMMAND - ${CMAKE_AR} x libsys_svr.a - COMMAND - ${CMAKE_AR} x libsys_util.a - COMMAND - ${CMAKE_AR} x libutil.a - COMMAND - ${CMAKE_AR} cr libnewc.a *.obj - COMMAND - rm *.obj + # COMMAND + # cd ../../ + # COMMAND + # rm -f -r usr_lib + # COMMAND + # mkdir -p usr_lib + # COMMAND + # find mkrtos_user -name "*.a" | xargs cp -t usr_lib + # COMMAND + # cd usr_lib + # COMMAND + # ${CMAKE_AR} x libmuslc.a + # COMMAND + # ${CMAKE_AR} x liblibc_be.a + # COMMAND + # ${CMAKE_AR} x libsys.a + # COMMAND + # ${CMAKE_AR} x libsys_svr.a + # COMMAND + # ${CMAKE_AR} x libsys_util.a + # COMMAND + # ${CMAKE_AR} x libutil.a + # COMMAND + # ${CMAKE_AR} cr libnewc.a *.obj + # COMMAND + # rm *.obj ) add_dependencies(mkrtos_img_dump bootstrap_dump diff --git a/mkrtos_knl/arch/cortex-m4/core_it.c b/mkrtos_knl/arch/cortex-m4/core_it.c index 5f375f60c..24f9b535a 100755 --- a/mkrtos_knl/arch/cortex-m4/core_it.c +++ b/mkrtos_knl/arch/cortex-m4/core_it.c @@ -72,7 +72,6 @@ void HardFault_Handler(void) printk("%s\n", __FUNCTION__); task_knl_kill(thread_get_current(), is_knl); } - /** * @brief This function handles Memory Manage exception. * @param None @@ -84,6 +83,7 @@ void MemManage_Handler(void) addr_t fault_addr = (addr_t)(SCB->MMFAR); addr_t bus_addr = (addr_t)(SCB->BFAR); task_t *cur_task = thread_get_current_task(); + bool_t reset_r9 = FALSE; if ((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) { @@ -93,7 +93,7 @@ void MemManage_Handler(void) { printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n", thread_get_current_task(), fault_addr, bus_addr); - task_knl_kill(thread_get_current(), is_knl); + goto end; } return; } @@ -109,7 +109,20 @@ void MemManage_Handler(void) { printk("Floating point lazy stack error.\n"); } - task_knl_kill(thread_get_current(), is_knl); +end: + reset_r9 = task_knl_kill(thread_get_current(), is_knl); + if (reset_r9) + { + do + { + __asm__ __volatile__( + "mov r9, %0\n\t" + : /* 无输出操作数 */ + : "r"(thread_get_current_task()->mm_space.mm_block) // 输入操作数,将value的值传递给R0寄存器 + : // 告诉编译器R9寄存器将被修改 + ); + } while (0); + } } /** diff --git a/mkrtos_knl/inc/knl/thread_knl.h b/mkrtos_knl/inc/knl/thread_knl.h index e8b382780..d6eb5d330 100644 --- a/mkrtos_knl/inc/knl/thread_knl.h +++ b/mkrtos_knl/inc/knl/thread_knl.h @@ -1,5 +1,5 @@ #pragma once #include -void task_knl_kill(thread_t *kill_thread, bool_t is_knl); +bool_t task_knl_kill(thread_t *kill_thread, bool_t is_knl); void knl_init_1(void); diff --git a/mkrtos_knl/knl/thread.c b/mkrtos_knl/knl/thread.c index e37559a32..64e7290b6 100755 --- a/mkrtos_knl/knl/thread.c +++ b/mkrtos_knl/knl/thread.c @@ -1198,20 +1198,20 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id) ipc_msg_t *src_ipc = (void *)old_task->nofity_msg_buf; ret = ipc_dat_copy_raw(&cur_task->obj_space, &old_task->obj_space, cur_task->lim, dst_ipc, src_ipc, in_tag, TRUE); // copy数据 - if (ret >=0 ) { - for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++) + // if (ret >=0 ) { + for (int i = 0; i < CONFIG_THREAD_MAP_BUF_LEN; i++) + { + if (i < ret) { - if (i < ret) - { - src_ipc->map_buf[i] = old_task->nofity_map_buf[i]; - old_task->nofity_map_buf[i] = 0; - } - else - { - src_ipc->map_buf[i] = old_task->nofity_map_buf[i]; - } + src_ipc->map_buf[i] = old_task->nofity_map_buf[i]; + old_task->nofity_map_buf[i] = 0; + } + else + { + src_ipc->map_buf[i] = old_task->nofity_map_buf[i]; } } + // } mutex_unlock(&old_task->nofity_lock); pf_t *cur_pf = ((pf_t *)((char *)cur_th + CONFIG_THREAD_BLOCK_SIZE + 8)) - 1; diff --git a/mkrtos_knl/knl/thread_knl.c b/mkrtos_knl/knl/thread_knl.c index 9e54d931c..ba66d32bf 100755 --- a/mkrtos_knl/knl/thread_knl.c +++ b/mkrtos_knl/knl/thread_knl.c @@ -17,6 +17,7 @@ #include "knl_misc.h" #include "map.h" #include "mm_wrap.h" +#include "mpu.h" #include "printk.h" #include "task.h" #include "thread.h" @@ -206,8 +207,9 @@ static void knl_init_2(void) } INIT_STAGE2(knl_init_2); -void task_knl_kill(thread_t *kill_thread, bool_t is_knl) +bool_t task_knl_kill(thread_t *kill_thread, bool_t is_knl) { + bool_t reset_ram = FALSE; task_t *task = container_of(kill_thread->task, task_t, kobj); if (!is_knl) { @@ -215,21 +217,27 @@ void task_knl_kill(thread_t *kill_thread, bool_t is_knl) umword_t status2; status2 = spinlock_lock(&del_lock); - if (stack_len(&kill_thread->fast_ipc_stack)!=0) { + if (stack_len(&kill_thread->fast_ipc_stack) != 0) + { int ret; thread_fast_ipc_item_t ipc_item; - ret = thread_fast_ipc_pop(kill_thread, &ipc_item); + ret = thread_fast_ipc_restore(kill_thread); if (ret >= 0) { // 还原栈和usp TODO: arch相关的 - kill_thread->task = ipc_item.task_bk; - thread_user_pf_restore(kill_thread, ipc_item.usp_backup); - pf_t *cur_pf = ((pf_t *)((char *)kill_thread + CONFIG_THREAD_BLOCK_SIZE + 8)) - 1; - cur_pf->regs[5] = (umword_t)(thread_get_bind_task(kill_thread)->mm_space.mm_block); + thread_user_pf_restore(kill_thread, (void *)arch_get_user_sp()); + // umword_t *cur_pf = (umword_t *)(arch_get_user_sp()) - 8; + // cur_pf[5] = (umword_t)(thread_get_bind_task(kill_thread)->mm_space.mm_block); + // register volatile umword_t r9 asm("r9"); + // r9 = (umword_t)(thread_get_bind_task(kill_thread)->mm_space.mm_block); + mpu_switch_to_task(thread_get_bind_task(kill_thread)); ref_counter_dec_and_release(&task->ref_cn, &task->kobj); + reset_ram =TRUE; } - }else{ + } + else + { thread_suspend(kill_thread); kill_thread->ipc_status = THREAD_IPC_ABORT; } @@ -241,6 +249,7 @@ void task_knl_kill(thread_t *kill_thread, bool_t is_knl) printk("[knl]: knl panic.\n"); assert(0); } + return reset_ram; } static void print_mkrtos_info(void) diff --git a/mkrtos_script/build_at32f437.sh b/mkrtos_script/build_at32f437.sh index 8a987bb58..10656b19f 100755 --- a/mkrtos_script/build_at32f437.sh +++ b/mkrtos_script/build_at32f437.sh @@ -1,15 +1,15 @@ #!/bin/bash -export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/ -export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp +# export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/ +# export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp # linux build # export TOOLCHAIN=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/ # export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/armv7e-m/fpu # mac compile -# export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ -# export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/softfp +export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ +export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/softfp # windows compile # export TOOLCHAIN=/d/GNUArmEmbeddedToolchain/102021.10/bin/ diff --git a/mkrtos_script/build_f2.sh b/mkrtos_script/build_f2.sh index 90e3fd657..3388a26d5 100755 --- a/mkrtos_script/build_f2.sh +++ b/mkrtos_script/build_f2.sh @@ -1,10 +1,10 @@ #!/bin/bash -export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/ -export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp +# export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/ +# export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp -# export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ -# export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp +export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ +export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp # export TOOLCHAIN=/d/GNUArmEmbeddedToolchain/102021.10/bin/ # export TOOLCHAIN_LIB=/d/GNUArmEmbeddedToolchain/102021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp diff --git a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c index e1cc8dfac..b699d4514 100644 --- a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c +++ b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c @@ -12,6 +12,7 @@ #include #include #include "u_sys.h" +#include "unistd.h" int ls(int argc, char *agrv[]) { DIR *dir; @@ -37,6 +38,19 @@ int ls(int argc, char *agrv[]) return 0; } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), ls, ls, ls command); + +int rm(int argc, char *agrv[]) +{ + int ret; + if (argc < 2) + { + return -1; + } + + ret = unlink(agrv[1]); + return ret; +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), rm, rm, rm command); int cat(int argc, char *argv[]) { if (argc != 2) @@ -78,7 +92,7 @@ int hex(int argc, char *argv[]) return errno; } - while ((ret = fread( &c, 1,1,fp)) == 1) + while ((ret = fread(&c, 1, 1, fp)) == 1) { printf("%02x ", c); i++; diff --git a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h index 455672356..dfcbe0ec2 100644 --- a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h +++ b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h @@ -94,6 +94,7 @@ long be_getdents(long fd, char *buf, size_t size); long be_mkdir(const char *path, mode_t mode); long be_symlink(const char *src, const char *dst); long be_stat(const char *path, void *buf); +long be_unlink(const char *path); int be_clone(int (*func)(void *), void *stack, int flags, void *args, pid_t *ptid, void *tls, pid_t *ctid); umword_t be_munmap(void *start, size_t len); umword_t be_mmap(void *start, diff --git a/mkrtos_user/lib/libc_backend/src/fs_backend.c b/mkrtos_user/lib/libc_backend/src/fs_backend.c index 7742655d1..329904646 100644 --- a/mkrtos_user/lib/libc_backend/src/fs_backend.c +++ b/mkrtos_user/lib/libc_backend/src/fs_backend.c @@ -457,6 +457,10 @@ long be_fstat(int fd, void *_buf) } return fs_fstat(u_fd.priv_fd, (void *)buf); } +long be_unlink(const char *path) +{ + return fs_unlink(path); +} long sys_be_getdents(va_list ap) { long fd; diff --git a/mkrtos_user/lib/mlibc/src/unistd/unlink.c b/mkrtos_user/lib/mlibc/src/unistd/unlink.c index c40c28d50..3ad178751 100644 --- a/mkrtos_user/lib/mlibc/src/unistd/unlink.c +++ b/mkrtos_user/lib/mlibc/src/unistd/unlink.c @@ -1,11 +1,17 @@ #include #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif int unlink(const char *path) { #ifdef SYS_unlink +#ifdef NO_LITTLE_MODE return syscall(SYS_unlink, path); +#else + return be_unlink(path); +#endif #else return syscall(SYS_unlinkat, AT_FDCWD, path, 0); #endif diff --git a/mkrtos_user/lib/sys_svr/inc/blk_drv_cli.h b/mkrtos_user/lib/sys_svr/inc/blk_drv_cli.h index 14dcf1749..7419a68cb 100644 --- a/mkrtos_user/lib/sys_svr/inc/blk_drv_cli.h +++ b/mkrtos_user/lib/sys_svr/inc/blk_drv_cli.h @@ -6,3 +6,4 @@ int blk_drv_cli_write(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len, int inx); int blk_drv_cli_read(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len, int inx); int blk_drv_cli_map(obj_handler_t svr_boj, obj_handler_t *sem_obj); +int blk_drv_cli_info(obj_handler_t obj, blk_drv_info_t *info); diff --git a/mkrtos_user/lib/sys_svr/inc/blk_drv_svr.h b/mkrtos_user/lib/sys_svr/inc/blk_drv_svr.h index 335446635..697c309b7 100644 --- a/mkrtos_user/lib/sys_svr/inc/blk_drv_svr.h +++ b/mkrtos_user/lib/sys_svr/inc/blk_drv_svr.h @@ -6,4 +6,5 @@ int blk_drv_write(obj_handler_t obj, int len, int inx); int blk_drv_read(obj_handler_t obj, int len, int inx); int blk_drv_map(obj_handler_t *hd); +int blk_drv_info(blk_drv_info_t *info); void blk_drv_init(blk_drv_t *ns); diff --git a/mkrtos_user/lib/sys_svr/inc/blk_drv_types.h b/mkrtos_user/lib/sys_svr/inc/blk_drv_types.h index 9a4090ae8..1e88af9a8 100644 --- a/mkrtos_user/lib/sys_svr/inc/blk_drv_types.h +++ b/mkrtos_user/lib/sys_svr/inc/blk_drv_types.h @@ -2,6 +2,15 @@ #include "u_types.h" #include "u_rpc_svr.h" #include "u_slist.h" +#include "u_rpc.h" +typedef struct blk_drv_info +{ + umword_t blk_start_addr; /*内存中的起始地址*/ + size_t blk_size; /*块大小*/ + size_t blk_nr; /*blk块数量*/ +} blk_drv_info_t; + +RPC_TYPE_DEF_ALL(blk_drv_info_t) typedef struct blk_drv { diff --git a/mkrtos_user/lib/sys_svr/inc/rpc_prot.h b/mkrtos_user/lib/sys_svr/inc/rpc_prot.h index a68aa1300..04ba7e0ba 100644 --- a/mkrtos_user/lib/sys_svr/inc/rpc_prot.h +++ b/mkrtos_user/lib/sys_svr/inc/rpc_prot.h @@ -53,3 +53,4 @@ #define BLK_DRV_WRITE ((umword_t)0) //!< 块驱动写 #define BLK_DRV_READ ((umword_t)1) //!< 块驱动读 #define BLK_DRV_MAP ((umword_t)2) //!< 块驱动对象映射 +#define BLK_DRV_INFO ((umword_t)3) //!< 获取驱动信息 diff --git a/mkrtos_user/lib/sys_svr/src/blk_drv_cli.c b/mkrtos_user/lib/sys_svr/src/blk_drv_cli.c index 16b4f10d1..58228369f 100644 --- a/mkrtos_user/lib/sys_svr/src/blk_drv_cli.c +++ b/mkrtos_user/lib/sys_svr/src/blk_drv_cli.c @@ -59,7 +59,8 @@ int blk_drv_cli_map(obj_handler_t dm9000_obj, obj_handler_t *sem_obj) obj_handler_t newfd; newfd = handler_alloc(); - if (newfd == HANDLER_INVALID) { + if (newfd == HANDLER_INVALID) + { return -ENOENT; } rpc_obj_handler_t_t rpc_sem_obj = { @@ -68,10 +69,36 @@ int blk_drv_cli_map(obj_handler_t dm9000_obj, obj_handler_t *sem_obj) }; msg_tag_t tag = blk_drv_t_map_call(dm9000_obj, &rpc_sem_obj); - if (msg_tag_get_val(tag) < 0) { + if (msg_tag_get_val(tag) < 0) + { handler_free(newfd); return msg_tag_get_val(tag); } *sem_obj = newfd; return msg_tag_get_val(tag); } +RPC_GENERATION_CALL1(TRUE, blk_drv_t, BLK_DRV_PROT, BLK_DRV_INFO, info, + rpc_blk_drv_info_t_t, rpc_blk_drv_info_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, info) +int blk_drv_cli_info(obj_handler_t obj, blk_drv_info_t *info) +{ + assert(info); + + obj_handler_t newfd; + + newfd = handler_alloc(); + if (newfd == HANDLER_INVALID) + { + return -ENOENT; + } + rpc_blk_drv_info_t_t rpc_info; + + msg_tag_t tag = blk_drv_t_info_call(obj, &rpc_info); + + if (msg_tag_get_val(tag) < 0) + { + handler_free(newfd); + return msg_tag_get_val(tag); + } + *info = rpc_info.data; + return msg_tag_get_val(tag); +} \ No newline at end of file diff --git a/mkrtos_user/lib/sys_svr/src/blk_drv_svr.c b/mkrtos_user/lib/sys_svr/src/blk_drv_svr.c index e4934c11e..56f6edfb2 100644 --- a/mkrtos_user/lib/sys_svr/src/blk_drv_svr.c +++ b/mkrtos_user/lib/sys_svr/src/blk_drv_svr.c @@ -12,10 +12,9 @@ RPC_GENERATION_OP3(blk_drv_t, BLK_DRV_PROT, BLK_DRV_WRITE, write, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len, - rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, inx - ) + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, inx) { - return blk_drv_write(rpc_hd_get(0), len->data, inx->data); + return blk_drv_write(vpage_create_raw(shm_obj->data).addr, len->data, inx->data); } RPC_GENERATION_DISPATCH3(blk_drv_t, BLK_DRV_PROT, BLK_DRV_WRITE, write, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, svr_hd, @@ -25,10 +24,9 @@ RPC_GENERATION_DISPATCH3(blk_drv_t, BLK_DRV_PROT, BLK_DRV_WRITE, write, RPC_GENERATION_OP3(blk_drv_t, BLK_DRV_PROT, BLK_DRV_READ, read, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len, - rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, inx - ) + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, inx) { - return blk_drv_read(rpc_hd_get(0), len->data, inx->data); + return blk_drv_read(vpage_create_raw(shm_obj->data).addr, len->data, inx->data); } RPC_GENERATION_DISPATCH3(blk_drv_t, BLK_DRV_PROT, BLK_DRV_READ, read, @@ -49,7 +47,16 @@ RPC_GENERATION_OP1(blk_drv_t, BLK_DRV_PROT, BLK_DRV_MAP, map, RPC_GENERATION_DISPATCH1(blk_drv_t, BLK_DRV_PROT, BLK_DRV_MAP, map, rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd) -RPC_DISPATCH3(blk_drv_t, BLK_DRV_PROT, typeof(BLK_DRV_READ), BLK_DRV_WRITE, write, BLK_DRV_READ, read, BLK_DRV_MAP, map) +/*info*/ +RPC_GENERATION_OP1(blk_drv_t, BLK_DRV_PROT, BLK_DRV_INFO, info, + rpc_blk_drv_info_t_t, rpc_blk_drv_info_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, info) +{ + return blk_drv_info(&info->data); +} +RPC_GENERATION_DISPATCH1(blk_drv_t, BLK_DRV_PROT, BLK_DRV_INFO, info, + rpc_blk_drv_info_t_t, rpc_blk_drv_info_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, len) + +RPC_DISPATCH4(blk_drv_t, BLK_DRV_PROT, typeof(BLK_DRV_READ), BLK_DRV_WRITE, write, BLK_DRV_READ, read, BLK_DRV_MAP, map, BLK_DRV_INFO, info) void blk_drv_init(blk_drv_t *ns) { diff --git a/mkrtos_user/lib/sys_svr/src/fs_cli.c b/mkrtos_user/lib/sys_svr/src/fs_cli.c index 5e3ca3f8a..de747f022 100644 --- a/mkrtos_user/lib/sys_svr/src/fs_cli.c +++ b/mkrtos_user/lib/sys_svr/src/fs_cli.c @@ -354,7 +354,7 @@ RPC_GENERATION_CALL1(TRUE, fs_t, FS_PROT, FS_UNLINK, unlink, int fs_unlink(const char *path) { obj_handler_t hd; - int ret = ns_query(path, &hd, 0x1); + int ret = ns_query(path, &hd, 0); if (ret < 0) { diff --git a/mkrtos_user/lib/sys_util/src/u_fast_ipc.c b/mkrtos_user/lib/sys_util/src/u_fast_ipc.c index aa23d11b0..cef4a014b 100644 --- a/mkrtos_user/lib/sys_util/src/u_fast_ipc.c +++ b/mkrtos_user/lib/sys_util/src/u_fast_ipc.c @@ -30,6 +30,7 @@ static int fast_ipc_dat_copy(ipc_msg_t *dst_ipc, ipc_msg_t *src_ipc, msg_tag_t t MIN(tag.msg_buf_len * WORD_BYTES, IPC_MSG_SIZE)); memcpy(dst_ipc->user, src_ipc->user, sizeof(dst_ipc->user)); + return 0; } static void update_map_buf(void) { diff --git a/mkrtos_user/server/fs/appfs/CMakeLists.txt b/mkrtos_user/server/fs/appfs/CMakeLists.txt index 693ba2ed1..48f36e034 100644 --- a/mkrtos_user/server/fs/appfs/CMakeLists.txt +++ b/mkrtos_user/server/fs/appfs/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.13) # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ") #appfs lib -file(GLOB appfs_src src/appfs.c src/appfs.h) +file(GLOB appfs_src src/appfs.c src/appfs_open.c) add_library( appfs_lib STATIC @@ -13,6 +13,14 @@ target_include_directories( appfs_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc/${ARCH_NAME} + ${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_drv +) +add_dependencies( + appfs_lib + sys + # mk_drv ) # appfstiny lib @@ -26,12 +34,17 @@ target_include_directories( appfs_tiny PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src + # ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc + # ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc + # ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc ) file( GLOB deps heap_stack.c main.c + hw_block.c + fs_rpc.c ) add_executable( @@ -49,6 +62,7 @@ target_link_libraries( sys_util sys_svr appfs_lib + mk_drv ${GCC_LIB_PATH}/libgcc.a ) target_include_directories( @@ -56,6 +70,7 @@ target_include_directories( PUBLIC ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc ${CMAKE_CURRENT_SOURCE_DIR}/src ) @@ -65,6 +80,7 @@ add_dependencies( sys sys_util appfs_lib + ) set_target_properties( appfs.elf PROPERTIES LINK_FLAGS @@ -89,7 +105,3 @@ add_custom_target( add_dependencies(appfs_dump appfs.elf) -execute_process( - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}/src/ && sh build.sh - COMMAND_ECHO STDOUT -) diff --git a/mkrtos_user/server/fs/appfs/fs_rpc.c b/mkrtos_user/server/fs/appfs/fs_rpc.c index e9e10b24d..34577d8e5 100644 --- a/mkrtos_user/server/fs/appfs/fs_rpc.c +++ b/mkrtos_user/server/fs/appfs/fs_rpc.c @@ -1,5 +1,4 @@ #include "cons_cli.h" -#include "ff.h" #include "fs_svr.h" #include "rpc_prot.h" #include "u_env.h" @@ -13,380 +12,81 @@ #include #include #include "kstat.h" +#include "appfs_open.h" static fs_t fs; -static int fs_sig_call_back(pid_t pid, umword_t sig_val); -void fs_svr_init(void) -{ - fs_init(&fs); - meta_reg_svr_obj(&fs.svr, FS_PROT); -#ifdef CONFIG_USING_SIG - pm_sig_func_set(fs_sig_call_back); -#endif -} -typedef struct file_desc -{ - union - { - FIL fp; - FATFS_DIR dir; - }; - pid_t pid; - uint8_t type; //!< 0:file 1:dir -} file_desc_t; -#define FILE_DESC_NR 8 //!< 最多同时可以打开多少个文件 -static file_desc_t files[FILE_DESC_NR]; //!< 预先设置的文件描述符 - -static void free_fd(pid_t pid) -{ - for (int i = 0; i < FILE_DESC_NR; i++) - { - if (files[i].fp.obj.fs) - { - fs_svr_close(i); - files[i].fp.obj.fs = NULL; - files[i].pid = 0; - } - } -} - -static int fs_sig_call_back(pid_t pid, umword_t sig_val) -{ - switch (sig_val) - { - case KILL_SIG: - free_fd(pid); - break; - } - return 0; -} - -static file_desc_t *alloc_file(int *fd) -{ - for (int i = 0; i < FILE_DESC_NR; i++) - { - if (files[i].fp.obj.fs == NULL) - { - *fd = i; - files[i].pid = thread_get_src_pid(); - return &files[i]; - } - } - return NULL; -} -static void free_file(int fd) -{ - files[fd].fp.obj.fs = NULL; -} -static file_desc_t *file_get(int fd) -{ - if (fd < 0 || fd >= FILE_DESC_NR) - { - return NULL; - } - if (files[fd].fp.obj.fs == NULL) - { - return NULL; - } - return files + fd; -} -static int fatfs_err_conv(FRESULT res) -{ - switch (res) - { - case FR_OK: - return 0; - case FR_DISK_ERR: - return -EIO; - case FR_NO_FILE: - return -ENOENT; - case FR_NO_PATH: - return -ENOENT; - case FR_INVALID_NAME: - return -EINVAL; - case FR_DENIED: - return -EPERM; - case FR_EXIST: - return -EEXIST; - case FR_WRITE_PROTECTED: - return -EIO; - case FR_TIMEOUT: - return -ETIMEDOUT; - case FR_NOT_ENOUGH_CORE: - return -ENOMEM; - case FR_INVALID_PARAMETER: - return -EINVAL; - default: - return -1; - } -} int fs_svr_open(const char *path, int flags, int mode) { - // printf("open %s.\n", path); int fd; - pid_t pid = thread_get_src_pid(); - file_desc_t *file = alloc_file(&fd); - if (!file) - { - return -ENOMEM; - } - int new_mode = 0; - - switch (flags & O_ACCMODE) - { - case O_RDWR: - new_mode |= FA_READ; - new_mode |= FA_WRITE; - break; - case O_RDONLY: - new_mode |= FA_READ; - break; - case O_WRONLY: - new_mode |= FA_WRITE; - break; - } - if ((flags & O_CREAT) && (flags & O_EXCL)) - { - new_mode |= FA_CREATE_NEW; - } - else if ((flags & O_CREAT)) - { - new_mode |= FA_OPEN_ALWAYS; - } - if (flags & O_APPEND) - { - new_mode |= FA_OPEN_APPEND; - } - - FRESULT ret = f_open(&file->fp, path, new_mode); - - if (ret != FR_OK) - { - if (ret == FR_NO_FILE || ret == FR_INVALID_NAME) - { - // 打开的是一个目录,则作为一个目录打开 - ret = f_opendir(&file->dir, path); - if (ret != FR_OK) - { - cons_write_str("open fail..\n"); - free_file(fd); - return fatfs_err_conv(ret); - } - file->type = 1; - // cons_write_str("open dir..\n"); - } - } - else - { - file->type = 0; - // cons_write_str("open file..\n"); - } - - if (ret != FR_OK) - { - return fatfs_err_conv(ret); - } -#ifdef CONFIG_USING_SIG - int w_ret = pm_sig_watch(pid, 0 /*TODO:现在只有kill */); - if (w_ret < 0) - { - printf("pm wath pid %d err.\n", w_ret); - } -#endif + fd = appfs_open(path, flags, mode); return fd; } int fs_svr_read(int fd, void *buf, size_t len) { - UINT br; - file_desc_t *file = file_get(fd); + int ret; - if (!file) - { - return -ENOENT; - } - if (file->type != 0) - { - return -EACCES; - } - FRESULT ret = f_read(&file->fp, buf, len, &br); + ret = appfs_read(fd, buf, len); - if (ret != FR_OK) - { - return fatfs_err_conv(ret); - } - return br; + return ret; } int fs_svr_write(int fd, void *buf, size_t len) { - UINT bw; - file_desc_t *file = file_get(fd); + int ret; - if (!file) - { - return -ENOENT; - } - if (file->type != 0) - { - return -EACCES; - } - FRESULT ret = f_write(&file->fp, buf, len, &bw); - - if (ret != FR_OK) - { - return fatfs_err_conv(ret); - } - return bw; + ret = appfs_write(fd, buf, len); + return ret; } void fs_svr_close(int fd) { - file_desc_t *file = file_get(fd); - - if (!file) - { - return; - } - switch (file->type) - { - case 0: - f_close(&file->fp); - break; - case 1: - f_closedir(&file->dir); - break; - } - file->fp.obj.fs = NULL; + appfs_close(fd); } int fs_svr_readdir(int fd, dirent_t *dir) { - file_desc_t *file = file_get(fd); + int ret; - if (!file) - { - return -ENOENT; - } - FILINFO info; - FRESULT ret = f_readdir(&file->dir, &info); - - if (ret != FR_OK || info.fname[0] == 0) - { - return -ENOENT; - } - strncpy(dir->d_name, info.fname, sizeof(dir->d_name)); - dir->d_name[sizeof(dir->d_name) - 1] = 0; - dir->d_reclen = sizeof(*dir); - dir->d_off = 0; - if (info.fattrib & AM_DIR) - { /* Directory */ - dir->d_type = DT_DIR; - } - else - { /* File */ - dir->d_type = DT_CHR; - } - return sizeof(*dir); + ret = appfs_readdir(fd, dir); + return ret; } int fs_svr_lseek(int fd, int offs, int whence) { - UINT bw; - file_desc_t *file = file_get(fd); - int new_offs = 0; + int ret; - if (!file) - { - return -ENOENT; - } - if (file->type != 0) - { - return -EACCES; - } - switch (whence) - { - case SEEK_SET: - new_offs = offs; - break; - case SEEK_END: - { - new_offs = f_size(&file->fp) + offs; - } - break; - case SEEK_CUR: - { - new_offs = offs + f_tell(&file->fp); - } - break; - default: - return -EINVAL; - } -#if 0 - if (new_offs > f_size(&file->fp)) { - new_offs = f_size(&file->fp); - } -#endif - if (new_offs < 0) - { - new_offs = 0; - } - FRESULT ret = f_lseek(&file->fp, new_offs); - - return fatfs_err_conv(ret); + ret = appfs_lseek(fd, offs, whence); + return ret; } int fs_svr_ftruncate(int fd, off_t off) { - file_desc_t *file = file_get(fd); + int ret; - if (!file) - { - return -ENOENT; - } - if (file->type != 0) - { - return -EACCES; - } - FRESULT ret = f_truncate(&file->fp); - - return fatfs_err_conv(ret); + ret = appfs_truncate(fd, off); + return ret; } int fs_svr_fstat(int fd, void *_stat) { - struct kstat *stat = _stat; - file_desc_t *file = file_get(fd); + int ret; - if (!file) - { - return -ENOENT; - } - memset(stat, 0, sizeof(*stat)); - stat->st_size = file->type == 1 ? 0 : f_size(&file->fp); - stat->st_mode = file->type == 1 ? S_IFDIR : S_IFREG; - stat->st_blksize = 0; - return 0; + ret = appfs_stat(fd, _stat); + return ret; } int fs_svr_ioctl(int fd, int req, void *arg) { - return 0; /*TODO:*/ + int ret; + + ret = appfs_ioctl(fd, req, (unsigned long)arg); + return ret; } int fs_svr_fsync(int fd) { - file_desc_t *file = file_get(fd); - - if (!file) - { - return -EBADFD; - } - if (file->type != 0) - { - return -EBADFD; - } - f_sync(&file->fp); return 0; } int fs_svr_unlink(const char *path) { - FRESULT ret = f_unlink(path); + int ret; - return fatfs_err_conv(ret); + ret = appfs_remove(path); + return ret; } int fs_svr_symlink(const char *existing, const char *new) { @@ -394,9 +94,7 @@ int fs_svr_symlink(const char *existing, const char *new) } int fs_svr_mkdir(char *path) { - FRESULT ret = f_mkdir(path); - - return fatfs_err_conv(ret); + return -ENOSYS; } int fs_svr_rmdir(char *path) { @@ -404,23 +102,11 @@ int fs_svr_rmdir(char *path) } int fs_svr_rename(char *oldname, char *newname) { - return fatfs_err_conv(f_rename(oldname, newname)); + return -ENOSYS; } int fs_svr_stat(const char *path, void *_buf) { - FILINFO INFO; - FRESULT ret; - struct kstat *buf = (struct kstat *)_buf; - - ret = f_stat(path, &INFO); - if (ret != FR_OK) - { - return fatfs_err_conv(ret); - } - memset(buf, 0, sizeof(*buf)); - buf->st_size = INFO.fsize; - buf->st_mode = (INFO.fattrib & AM_DIR) ? S_IFDIR : S_IFREG; - return 0; + return -ENOSYS; } ssize_t fs_svr_readlink(const char *path, char *buf, size_t bufsize) { @@ -434,4 +120,31 @@ int fs_svr_statfs(const char *path, struct statfs *buf) void fs_svr_loop(void) { rpc_loop(); -} \ No newline at end of file +} +static const fs_operations_t ops = + { + .fs_svr_open = fs_svr_open, + .fs_svr_read = fs_svr_read, + .fs_svr_write = fs_svr_write, + .fs_svr_close = fs_svr_close, + .fs_svr_readdir = fs_svr_readdir, + .fs_svr_lseek = fs_svr_lseek, + .fs_svr_ftruncate = fs_svr_ftruncate, + .fs_svr_fstat = fs_svr_fstat, + .fs_svr_ioctl = fs_svr_ioctl, + // .fs_svr_fcntl = fs_svr_fcntl, + .fs_svr_fsync = fs_svr_fsync, + .fs_svr_unlink = fs_svr_unlink, + .fs_svr_symlink = fs_svr_symlink, + .fs_svr_mkdir = fs_svr_mkdir, + .fs_svr_rmdir = fs_svr_rmdir, + .fs_svr_rename = fs_svr_rename, + .fs_svr_stat = fs_svr_stat, + .fs_svr_readlink = fs_svr_readlink, +}; +void fs_svr_init(void) +{ + + fs_init(&fs, &ops); + meta_reg_svr_obj(&fs.svr, FS_PROT); +} diff --git a/mkrtos_user/server/fs/appfs/heap_stack.c b/mkrtos_user/server/fs/appfs/heap_stack.c index a88cb819e..409efa80a 100644 --- a/mkrtos_user/server/fs/appfs/heap_stack.c +++ b/mkrtos_user/server/fs/appfs/heap_stack.c @@ -1,5 +1,5 @@ -#define HEAP_SIZE 512 +#define HEAP_SIZE (4*1024) #define STACK_SIZE 1024 * 2 #if defined(__CC_ARM) diff --git a/mkrtos_user/server/fs/appfs/hw_block.c b/mkrtos_user/server/fs/appfs/hw_block.c new file mode 100644 index 000000000..f911ad822 --- /dev/null +++ b/mkrtos_user/server/fs/appfs/hw_block.c @@ -0,0 +1,137 @@ +#include "appfs.h" +#include "hw_block_test.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static obj_handler_t shm_hd; + +static int block_mem_addr = -1; +static int block_nr = -1; +static uint8_t *block_buf; //!< 块缓冲区 +static obj_handler_t blk_drv_hd; +static blk_drv_info_t blk_info; + +static int hw_erase_block(fs_info_t *fs, int block_inx) +{ + int ret; + assert(fs); + assert(block_inx < fs->save.block_nr); + + ret = blk_drv_cli_write(blk_drv_hd, shm_hd, 0, block_inx); + return ret; +} +static int hw_write_and_erase_block(fs_info_t *fs, int block_inx, void *buf, int size) +{ + int ret; + assert(fs); + assert(buf); + assert(block_inx < fs->save.block_nr); + + ret = blk_drv_cli_write(blk_drv_hd, shm_hd, size, block_inx); + return ret; +} +static int hw_read_block(fs_info_t *fs, int block_inx, void *buf, int size) +{ + assert(fs); + assert(buf); + assert(block_inx < fs->save.block_nr); + int ret; + + ret = blk_drv_cli_read(blk_drv_hd, shm_hd, size, block_inx); + return ret; +} +static int hw_init_fs_for_block(fs_info_t *fs) +{ + fs->save.block_size = blk_info.blk_size; + fs->save.block_nr = blk_info.blk_nr; + fs->dev_fd = -1; + fs->mem_addr = (unsigned long)blk_info.blk_start_addr; + fs->buf = (uint32_t *)block_buf; + + return 0; +} +static int hw_create_shm_obj(int size, obj_handler_t *shm_obj) +{ + msg_tag_t tag; + obj_handler_t shm_hd; + + assert(shm_obj); + + shm_hd = handler_alloc(); + if (shm_hd == HANDLER_INVALID) + { + printf("handler alloc fail.\n"); + return -ENOMEM; + } + tag = facotry_create_share_mem(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, shm_hd), + SHARE_MEM_CNT_BUDDY_CNT, size); + if (msg_tag_get_prot(tag) < 0) + { + printf("facotry_create_share_mem fail.\n"); + handler_free(shm_hd); + return -ENOMEM; + } + *shm_obj = shm_hd; + return 0; +} +int hw_init_block(fs_info_t *fs, const char *dev_path) +{ + int ret; + msg_tag_t tag; + addr_t shm_addr; + + fs->cb.hw_erase_block = hw_erase_block; + fs->cb.hw_init_fs_for_block = hw_init_fs_for_block; + fs->cb.hw_read_block = hw_read_block; + fs->cb.hw_write_and_erase_block = hw_write_and_erase_block; + +again: + ret = ns_query(dev_path, &blk_drv_hd, 0x1); + if (ret < 0) + { + u_sleep_ms(50); + goto again; + } + ret = blk_drv_cli_info(blk_drv_hd, &blk_info); + if (ret < 0) + { + printf("blk info get fail.\n"); + return ret; + } + ret = hw_create_shm_obj(blk_info.blk_size, &shm_hd); + if (ret < 0) + { + printf("shm obj create fail.\n"); + return ret; + } + tag = share_mem_map(shm_hd, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0), &shm_addr, NULL); + if (msg_tag_get_prot(tag) < 0) + { + printf("shm mem map fail.\n"); + handler_free_umap(shm_hd); + return -ENOMEM; + } + block_buf = (void *)shm_addr; + printf("block_buf addr:0x%x\n", block_buf); + // printf("img size is %d, block nr is %d.\n", block_mem_size, block_nr); + return 0; +} diff --git a/mkrtos_user/server/fs/appfs/hw_block.h b/mkrtos_user/server/fs/appfs/hw_block.h new file mode 100644 index 000000000..ca275bcbb --- /dev/null +++ b/mkrtos_user/server/fs/appfs/hw_block.h @@ -0,0 +1,4 @@ +#pragma once +#include "appfs.h" + +int hw_init_block(fs_info_t *fs, const char *dev_path); diff --git a/mkrtos_user/server/fs/appfs/main.c b/mkrtos_user/server/fs/appfs/main.c index f7dd4859c..0ddc4d039 100644 --- a/mkrtos_user/server/fs/appfs/main.c +++ b/mkrtos_user/server/fs/appfs/main.c @@ -1,8 +1,84 @@ + #include +#include "u_log.h" +#include "ns_cli.h" +#include "u_rpc_svr.h" +#include "u_prot.h" +#include "u_env.h" +#include "u_task.h" +#include "cons_cli.h" +#include "fs_rpc.h" +#include +#include +#include +#include +#include +#include "appfs.h" +#include "hw_block.h" +#include "appfs_open.h" +#define STACK_COM_ITME_SIZE (2 * 1024) +ATTR_ALIGN(8) +uint8_t stack_coms[STACK_COM_ITME_SIZE]; +uint8_t msg_buf_coms[MSG_BUG_LEN]; -int main(int argv, char *argc[]) +static fs_info_t fs_obj; +void fast_ipc_init(void) { - printf("%s run.\n", argc[0]); + u_fast_ipc_init(stack_coms, msg_buf_coms, 1, STACK_COM_ITME_SIZE); +} +int main(int argc, char *argv[]) +{ + obj_handler_t hd; + int ret; + char *mount_path = NULL; + char *dev_path = NULL; + + task_set_obj_name(TASK_THIS, TASK_THIS, "tk_appfs"); + task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_appfs"); + for (int i = 0; i < argc; i++) + { + printf("args[%d]:%s\n", i, argv[i]); + } + fast_ipc_init(); + int o; + const char *optstring = "d:m:"; // 有三个选项-abc,其中c选项后有冒号,所以后面必须有参数 + while ((o = getopt(argc, argv, optstring)) != -1) + { + switch (o) + { + case 'd': + dev_path = optarg; + break; + case 'm': + printf("mount path:%s\n", optarg); + mount_path = optarg; + break; + case '?': + printf("error optopt: %c\n", optopt); + printf("error opterr: %d\n", opterr); + break; + } + } + if (dev_path == NULL || mount_path == NULL) + { + printf("dev or mout path don't setting.\n"); + printf("example:appfs -m /bin -d /block\n"); + return -1; + } + ret = hw_init_block(&fs_obj, dev_path); + assert(ret >= 0); + ret = appfs_init(&fs_obj); + assert(ret >= 0); + ret = appfs_open_init(&fs_obj); + assert(ret >= 0); + + ret = rpc_meta_init(THREAD_MAIN, &hd); + assert(ret >= 0); + fs_svr_init(); + ns_register(mount_path, hd, MOUNT_NODE); + cons_write_str("appfs mount success\n"); + + fs_svr_loop(); return 0; } \ No newline at end of file diff --git a/mkrtos_user/server/fs/appfs/src/CMakeLists.txt b/mkrtos_user/server/fs/appfs/src/CMakeLists.txt index 8760506c7..1949fcb9f 100644 --- a/mkrtos_user/server/fs/appfs/src/CMakeLists.txt +++ b/mkrtos_user/server/fs/appfs/src/CMakeLists.txt @@ -1,7 +1,10 @@ cmake_minimum_required(VERSION 3.5.0) project(appfs VERSION 0.1.0 LANGUAGES C) set(CMAKE_BUILD_TYPE Debug) -add_executable(appfs appfs.c hw_block_test.c hw_block_sim.c main.c test.c open.c) +add_executable(appfs appfs.c hw_block_test.c hw_block_sim.c main.c test.c appfs_open.c) +add_compile_options( + "-Werror" +) include(CTest) enable_testing() diff --git a/mkrtos_user/server/fs/appfs/src/appfs.c b/mkrtos_user/server/fs/appfs/src/appfs.c index 7d3332136..e861677e2 100644 --- a/mkrtos_user/server/fs/appfs/src/appfs.c +++ b/mkrtos_user/server/fs/appfs/src/appfs.c @@ -17,9 +17,12 @@ int appfs_init(fs_info_t *fs) fs->cb.hw_init_fs_for_block(fs); fs_info_t *fs_info = (fs_info_t *)fs->mem_addr; - ret = fs->cb.hw_read_block(fs, 0, fs_info, MIN(sizeof(fs_info_t), fs->save.block_size)); - - *fs = *fs_info; + // ret = fs->cb.hw_read_block(fs, 0, fs->buf, fs->save.block_size); + // if (ret >= 0) + // { + // memcpy(fs, fs->buf, sizeof(fs_info_t)); + // } + fs->save = fs_info->save; return ret; } static int mem_set_bits(uint32_t *buf, int start, int end) @@ -54,6 +57,47 @@ static int mem_clear_bits(uint32_t *buf, int start, int end) return 0; } +static int appfs_get_available_block_nr(fs_info_t *info) +{ + assert(info); + int ret; + int j = 0; + int block_nr = 0; + int total_nr = 0; + + for (int i = info->save.blockinfo_inx; i < (info->save.blockinfo_nr + info->save.blockinfo_inx) && j < info->save.block_nr; i++, j++) + { + ret = info->cb.hw_read_block(info, i, info->buf, info->save.block_size); + if (ret < 0) + { + return ret; + } + uint32_t *buf_ptr = (uint32_t *)info->buf; + for (int a = 0; a < info->save.block_size / BYPTE_PER_PTR; a++) + { + for (int m = 0; m < BITS_PER_PTR; m++) + { + total_nr++; + if ((buf_ptr[a] & (1UL << m))) + { + block_nr++; + } + if (total_nr >= info->save.block_nr) + { + goto end; + } + } + } + } +end: + return block_nr; +} +int appfs_get_available_size(fs_info_t *info) +{ + assert(info); + + return appfs_get_available_block_nr(info) * info->save.block_size; +} /** * 设置块中的某些位为1 */ diff --git a/mkrtos_user/server/fs/appfs/src/appfs.h b/mkrtos_user/server/fs/appfs/src/appfs.h index 973a4a28d..7fa3f6d62 100644 --- a/mkrtos_user/server/fs/appfs/src/appfs.h +++ b/mkrtos_user/server/fs/appfs/src/appfs.h @@ -75,8 +75,12 @@ int appfs_delete_file(fs_info_t *info, const char *name); int appfs_file_resize_raw(fs_info_t *info, const dir_info_t *dir_info, int size); int appfs_file_resize(fs_info_t *info, const char *name, int size); int appfs_arrange_files(fs_info_t *info); +int appfs_get_available_size(fs_info_t *info); int appfs_print_files(fs_info_t *info); - +static inline int appfs_get_total_size(fs_info_t *info) +{ + return info->save.block_nr * info->save.block_size; +} static inline int appfs_get_file_size(const dir_info_t *info) { return info->size; diff --git a/mkrtos_user/server/fs/appfs/src/open.c b/mkrtos_user/server/fs/appfs/src/appfs_open.c similarity index 91% rename from mkrtos_user/server/fs/appfs/src/open.c rename to mkrtos_user/server/fs/appfs/src/appfs_open.c index 0f093b4cf..ef6cb1418 100644 --- a/mkrtos_user/server/fs/appfs/src/open.c +++ b/mkrtos_user/server/fs/appfs/src/appfs_open.c @@ -1,9 +1,8 @@ -#include "open.h" +#include "appfs_open.h" #include #include #include #include -#include #include #include #include @@ -224,9 +223,17 @@ int appfs_read(int fd, void *data, int len) file->offset += ret; return ret; } - +#ifdef MKRTOS +#include +#include +#include +#include +#endif int appfs_ioctl(int fd, unsigned long cmd, unsigned long arg) { +#ifdef MKRTOS + pid_t src_pid = thread_get_src_pid(); +#endif appfs_file_t *file = appfs_get_file(fd); int ret = 0; @@ -242,9 +249,32 @@ int appfs_ioctl(int fd, unsigned long cmd, unsigned long arg) { case APPFS_IOCTOL_GET_ACCESS_ADDR: { - appfs_ioctl_arg_t *fs_arg = (void *)arg; + appfs_ioctl_arg_t *fs_arg; + +#ifdef MKRTOS + msg_tag_t tag; + appfs_ioctl_arg_t fs_arg_tmp; + umword_t cur_pid; + tag = task_get_pid(TASK_THIS, (umword_t *)(&cur_pid)); + if (msg_tag_get_val(tag) < 0) + { + return msg_tag_get_val(tag); + } + fs_arg = &fs_arg_tmp; +#else + fs_arg = (void *)arg; +#endif fs_arg->addr = appfs_get_file_addr(fs, dir_info_cache_list[file->dir_info_fd].info); + fs_arg->size = appfs_get_file_size(dir_info_cache_list[file->dir_info_fd].info); +#ifdef MKRTOS + ret = mk_copy_mem_to_task(cur_pid, fs_arg, src_pid, + (void*)arg, sizeof(appfs_ioctl_arg_t)); + if (ret < 0) + { + return ret; + } +#endif } break; default: @@ -364,7 +394,7 @@ int appfs_stat(int fd, struct stat *st) return -EACCES; } st->st_size = dir_info_cache_list[file->dir_info_fd].info->size; - st->st_mode = __S_IFREG; + st->st_mode = S_IFREG; st->st_nlink = dir_info_cache_list[file->dir_info_fd].info->ref; return 0; } @@ -421,6 +451,7 @@ int appfs_remove(const char *name) int appfs_readdir(int fd, struct dirent *_dir) { int ret = -1; + // *((char*)(0)) = 0; appfs_file_t *file = appfs_get_file(fd); if (!file || file->used == 0) diff --git a/mkrtos_user/server/fs/appfs/src/open.h b/mkrtos_user/server/fs/appfs/src/appfs_open.h similarity index 96% rename from mkrtos_user/server/fs/appfs/src/open.h rename to mkrtos_user/server/fs/appfs/src/appfs_open.h index 3b09c137e..832c8f0b1 100644 --- a/mkrtos_user/server/fs/appfs/src/open.h +++ b/mkrtos_user/server/fs/appfs/src/appfs_open.h @@ -9,6 +9,7 @@ enum appfs_ioctl_cmd_op typedef struct appfs_ioctl_arg { unsigned long addr; + unsigned long size; } appfs_ioctl_arg_t; int appfs_open(const char *name, int flags, int mode); diff --git a/mkrtos_user/server/fs/appfs/src/build.sh b/mkrtos_user/server/fs/appfs/src/build.sh index 47b371b2e..787d7ee33 100755 --- a/mkrtos_user/server/fs/appfs/src/build.sh +++ b/mkrtos_user/server/fs/appfs/src/build.sh @@ -1,5 +1,7 @@ #!/bin/bash set -e -x + +mkdir -p build cmake -G Ninja -B build . cd build && ninja diff --git a/mkrtos_user/server/fs/appfs/src/clean.sh b/mkrtos_user/server/fs/appfs/src/clean.sh new file mode 100755 index 000000000..8146e4f0f --- /dev/null +++ b/mkrtos_user/server/fs/appfs/src/clean.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e -x + +rm -r build \ No newline at end of file diff --git a/mkrtos_user/server/fs/appfs/src/hw_block_sim.c b/mkrtos_user/server/fs/appfs/src/hw_block_sim.c index e8e1bcc15..2957334f1 100644 --- a/mkrtos_user/server/fs/appfs/src/hw_block_sim.c +++ b/mkrtos_user/server/fs/appfs/src/hw_block_sim.c @@ -12,12 +12,11 @@ #include #include -#define BLOCK_SIZE 512 //!< 块大小 - +static int block_size = -1; static int block_mem_size = -1; static int block_nr = -1; -static uint8_t *block; // 32MB -static uint8_t block_buf[BLOCK_SIZE]; //!< 块缓冲区 +static uint8_t *block; // 32MB +static uint8_t *block_buf; //!< 块缓冲区 static int hw_erase_block(fs_info_t *fs, int block_inx) { @@ -45,7 +44,7 @@ static int hw_read_block(fs_info_t *fs, int block_inx, void *buf, int size) } static int hw_init_fs_for_block(fs_info_t *fs) { - fs->save.block_size = BLOCK_SIZE; + fs->save.block_size = block_size; fs->save.block_nr = block_nr; fs->dev_fd = -1; // 模拟设备没有文件描述符 fs->mem_addr = (unsigned long)block; @@ -117,15 +116,30 @@ int hw_offload_img_from_file(const char *name) free(ptr_file_content); return 0; } -int hw_dump_to_file(const char *name) +int hw_dump_to_file(fs_info_t *fs, const char *name, int mode) { int ret; + + unlink(name); + int fd = open(name, O_RDWR | O_CREAT, 0777); if (fd < 0) { + printf("%s file open faile %d.\n", name, fd); return fd; } - ret = write(fd, block, block_mem_size); + int write_size; + + if (mode) + { + write_size = appfs_get_total_size(fs) - appfs_get_available_size(fs); + } + else + { + write_size = block_mem_size; + } + printf("write img size is %dB.\n", write_size); + ret = write(fd, block, write_size); if (ret < 0) { return ret; @@ -133,7 +147,7 @@ int hw_dump_to_file(const char *name) close(fd); return 0; } -int hw_init_block_sim_test(fs_info_t *fs, int img_size) +int hw_init_block_sim_test(fs_info_t *fs, int img_size, int blk_size) { fs->cb.hw_erase_block = hw_erase_block; fs->cb.hw_init_fs_for_block = hw_init_fs_for_block; @@ -145,9 +159,16 @@ int hw_init_block_sim_test(fs_info_t *fs, int img_size) { return -ENOMEM; } - block_mem_size = (img_size / BLOCK_SIZE) * BLOCK_SIZE; - block_nr = img_size / BLOCK_SIZE; - printf("img size is %d, block nr is %d.\n", block_mem_size, block_nr); + block_buf = (void *)malloc(blk_size); + if (block_buf == NULL) + { + free(block); + return -ENOMEM; + } + block_size = blk_size; + block_mem_size = (img_size / blk_size) * blk_size; + block_nr = img_size / blk_size; + printf("img size is %d, block nr is %d, block_size %d.\n", block_mem_size, block_nr, blk_size); // 使用内存模拟一个块设备 memset(block, 0, block_mem_size); return 0; diff --git a/mkrtos_user/server/fs/appfs/src/hw_block_sim.h b/mkrtos_user/server/fs/appfs/src/hw_block_sim.h index f9d109dc7..4fb286d90 100644 --- a/mkrtos_user/server/fs/appfs/src/hw_block_sim.h +++ b/mkrtos_user/server/fs/appfs/src/hw_block_sim.h @@ -1,6 +1,6 @@ #pragma once #include "appfs.h" -int hw_dump_to_file(const char *name); -int hw_init_block_sim_test(fs_info_t *fs, int img_size); +int hw_dump_to_file(fs_info_t *fs, const char *name, int mode); +int hw_init_block_sim_test(fs_info_t *fs, int img_size, int block_size); int hw_read_file_all(const char *file_path, void **ret_ptr); int hw_offload_img_from_file(const char *name); diff --git a/mkrtos_user/server/fs/appfs/src/main.c b/mkrtos_user/server/fs/appfs/src/main.c index 806679d0d..ab61827fe 100644 --- a/mkrtos_user/server/fs/appfs/src/main.c +++ b/mkrtos_user/server/fs/appfs/src/main.c @@ -130,11 +130,13 @@ int read_files_and_write_appfs(const char *path) } static char *debug_img_path; static int gen_img_size = -1; +static int gen_img_blk_size = 4096; +static int slight_mode = 0; //! 瘦模式 static int appfs_gen_init(void) { int ret; - ret = hw_init_block_sim_test(&fs, gen_img_size); + ret = hw_init_block_sim_test(&fs, gen_img_size, gen_img_blk_size); if (ret < 0) { return ret; @@ -152,7 +154,7 @@ int main(int argc, char *argv[]) int ret = 0; // appfs_test_func(); - while ((opt = getopt(argc, argv, "ti:g:o:s:")) != -1) + while ((opt = getopt(argc, argv, "jti:g:o:s:b:")) != -1) { switch (opt) { @@ -160,6 +162,9 @@ int main(int argc, char *argv[]) printf("test mode.\n"); appfs_test_func(); return 0; + case 'j': + slight_mode = 1; + break; case 'i': printf("input img:%s\n", optarg); debug_img_path = optarg; @@ -176,6 +181,10 @@ int main(int argc, char *argv[]) gen_img_size = atol(optarg); printf("img size is %d.\n", gen_img_size); break; + case 'b': + gen_img_blk_size = atol(optarg); + printf("img blk size is %d.\n", gen_img_blk_size); + break; default: printf("Unknown option\n"); break; @@ -188,7 +197,7 @@ int main(int argc, char *argv[]) } if (gen_img_size < 0) { - printf("output img size don't set."); + printf("output img size don't set.\n"); return -1; } if (output_path == NULL) @@ -207,7 +216,7 @@ int main(int argc, char *argv[]) printf("appfs create failed\n"); return ret; } - ret = hw_dump_to_file(output_path); + ret = hw_dump_to_file(&fs, output_path, slight_mode); if (ret < 0) { printf("appfs dump failed\n"); diff --git a/mkrtos_user/server/fs/appfs/src/test.c b/mkrtos_user/server/fs/appfs/src/test.c index 86ba1240b..b4dbaeb0b 100644 --- a/mkrtos_user/server/fs/appfs/src/test.c +++ b/mkrtos_user/server/fs/appfs/src/test.c @@ -8,7 +8,7 @@ #include #include "appfs.h" #include "hw_block_test.h" -#include "open.h" +#include "appfs_open.h" static fs_info_t fs; #define APPFS_FILE_NR 128 diff --git a/mkrtos_user/server/fs/appfs/src/test.sh b/mkrtos_user/server/fs/appfs/src/test.sh index fa50fae88..a62945178 100755 --- a/mkrtos_user/server/fs/appfs/src/test.sh +++ b/mkrtos_user/server/fs/appfs/src/test.sh @@ -1,5 +1,5 @@ #!/bin/bash - -./build/appfs -g test -o out.img -./build/appfs -t +set -xe +./build/appfs -g test -o out.img -s 33554432 -b 4096 -j +# ./build/appfs -t diff --git a/mkrtos_user/server/fs/cpiofs/fs_rpc.c b/mkrtos_user/server/fs/cpiofs/fs_rpc.c index 6a63b1feb..f19ddc893 100644 --- a/mkrtos_user/server/fs/cpiofs/fs_rpc.c +++ b/mkrtos_user/server/fs/cpiofs/fs_rpc.c @@ -92,7 +92,7 @@ int fs_svr_open(const char *path, int flags, int mode) int pid = thread_get_src_pid(); msg_tag_t tag; char *o_path; - *((char *)0) = 0; + // *((char *)0) = 0; if (flags & O_RDWR) { diff --git a/mkrtos_user/server/init/CMakeLists.txt b/mkrtos_user/server/init/CMakeLists.txt index c6eb5b3f0..a9373a094 100644 --- a/mkrtos_user/server/init/CMakeLists.txt +++ b/mkrtos_user/server/init/CMakeLists.txt @@ -50,8 +50,6 @@ add_custom_target( init_dump ALL COMMAND ${CMAKE_OBJDUMP} -s -S init.elf > ${CMAKE_SOURCE_DIR}/build/output/init.S - # COMMAND - # ${CMAKE_READELF} -a init.elf > ${CMAKE_SOURCE_DIR}/build/output/init.txt COMMAND ${CMAKE_OBJCOPY} -O binary -S init.elf init.bin COMMAND @@ -59,7 +57,7 @@ add_custom_target( COMMAND ${CMAKE_COMMAND} -E copy init.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/init COMMAND - ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/src/init.cfg ${CMAKE_SOURCE_DIR}/build/output/cpio/ + ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/board/${CONFIG_BOARD_NAME}/init.cfg ${CMAKE_SOURCE_DIR}/build/output/cpio/ COMMAND ${CMAKE_COMMAND} -E copy init.elf ${CMAKE_SOURCE_DIR}/build/output/init.elf ) diff --git a/mkrtos_user/server/init/src/init.cfg b/mkrtos_user/server/init/board/ATSURFF437/init.cfg similarity index 69% rename from mkrtos_user/server/init/src/init.cfg rename to mkrtos_user/server/init/board/ATSURFF437/init.cfg index e6435cc8d..b00fac1d0 100644 --- a/mkrtos_user/server/init/src/init.cfg +++ b/mkrtos_user/server/init/board/ATSURFF437/init.cfg @@ -1,7 +1,8 @@ #一次读取一行,每行代表启动的应用程序 +block /block +appfs -m /bin -d /block +# cpiofs -m /bin # fatfs -cpiofs -m /bin -fatfs # pin # i2c # pca9555 diff --git a/mkrtos_user/server/init/board/STM32F205/init.cfg b/mkrtos_user/server/init/board/STM32F205/init.cfg new file mode 100644 index 000000000..b00fac1d0 --- /dev/null +++ b/mkrtos_user/server/init/board/STM32F205/init.cfg @@ -0,0 +1,14 @@ +#一次读取一行,每行代表启动的应用程序 +block /block +appfs -m /bin -d /block +# cpiofs -m /bin +# fatfs +# pin +# i2c +# pca9555 +# display +# eth +# snd +# net +# nes +sh \ No newline at end of file diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt b/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt index 350db1093..abd9ed864 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/CMakeLists.txt @@ -80,6 +80,8 @@ add_custom_target( ${CMAKE_COMMAND} -E copy nes.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/nes COMMAND cp nes.elf ${CMAKE_SOURCE_DIR}/build/output/nes.elf + COMMAND + cp ${CMAKE_CURRENT_SOURCE_DIR}/nes_rom/sm.nes ${CMAKE_SOURCE_DIR}/build/output/cpio/ ) add_dependencies(nes_dump nes.elf) diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c b/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c index da18c8c38..36c07a416 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/main.c @@ -12,142 +12,55 @@ #include #include #include "mk_display_drv.h" -mk_display_cfg_t info; -int fd; -int pin_fd; -void delay_ms(int ms) -{ - u_sleep_ms(ms); -} -// #define BGR565TORGB565(a) (((a) >> 11) | ((a) & (0x3f << 5)) | (a & 0x1f) << 11) - -// void nes_lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color) -// { -// uint16_t height, width; -// uint16_t i, j; - -// width = ex - sx + 1; -// height = ey - sy + 1; -// #if 0 -// lcd_windows_set(sx, sy, ex, ey); - -// for (i = 0; i < height; i++) -// { -// for (j = 0; j < width; j++) -// { -// lcd_data_16bit_write(BGR565TORGB565(color[i * width + j])); -// } -// } -// #else -// memcpy(dis_buff[dis_show_line++], color, sizeof(uint16_t) * 256); -// if (dis_show_line >= 120) -// { -// ioctl(fd, MK_DISPLAY_SET_WIN, &((mk_display_win_t){ -// .x = 0, -// .y = dis_offset, -// .w = 256, -// .h = 120, -// })); -// for (int j = 0; j < 120; j++) -// { -// for (int i = 0; i < 256; i++) -// { -// *(volatile uint16_t *)(info.display_addr) = BGR565TORGB565(dis_buff[j][i]); -// } -// } -// if (dis_offset == 0) -// { -// dis_offset = 120; -// } -// else -// { -// dis_offset = 0; -// } -// dis_show_line = 0; -// } -// #endif -// } - -// static uint32_t last_tick; -// static uint32_t frame_flag; -// void NES_LCD_DisplayLine(int y_axes, uint16_t *Disaplyline_buffer) -// { -// memcpy(dis_buff[dis_show_line++], Disaplyline_buffer, sizeof(uint16_t) * 256); -// if (dis_show_line >= 120) -// { -// ioctl(fd, MK_DISPLAY_SET_WIN, &((mk_display_win_t){ -// .x = 0, -// .y = dis_offset, -// .w = 256, -// .h = 120, -// })); -// for (int j = 0; j < 120; j++) -// { -// for (int i = 0; i < 256; i++) -// { -// *(volatile uint16_t *)(info.display_addr) = dis_buff[j][i]; -// } -// } -// if (dis_offset == 0) -// { -// frame_flag = !frame_flag; -// if (frame_flag == 0) -// { -// last_tick = sys_read_tick(); -// } -// else -// { -// printf("fps:%d\n", (1000 / ((sys_read_tick() - last_tick) * (5))) * 3); -// } -// dis_offset = 120; -// } -// else -// { -// dis_offset = 0; -// } -// dis_show_line = 0; -// } -// } -#if 0 -static int drv_iomem_init(void) -{ - addr_t addr; - msg_tag_t tag; - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), - XMC_MEM_BASE - PERIPH_BASE, PERIPH_BASE, &addr); - if (msg_tag_get_val(tag) < 0) - { - printf("periph mem alloc failed..\n"); - return -1; - } - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), - 0x4000000, XMC_MEM_BASE, &addr); - if (msg_tag_get_val(tag) < 0) - { - printf("periph mem alloc failed..\n"); - return -1; - } - tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), - 0x10000, XMC_REG_BASE, &addr); - if (msg_tag_get_val(tag) < 0) - { - printf("periph mem alloc failed..\n"); - return -1; - } - return 0; -} -#endif #include "nes_main.h" #include "mk_pin_drv.h" #include "pca9555.h" #include "joystick.h" +#include "appfs_open.h" +mk_display_cfg_t info; +int fd; +int pin_fd; +int nes_fd; +static addr_t nes_rom_addr; +static size_t new_rom_size; +void delay_ms(int ms) +{ + u_sleep_ms(ms); +} +static int new_rom_get(const char *path) +{ + int ret; + appfs_ioctl_arg_t appfs_arg; -extern const char nes_rom[]; -extern const char nes_rom_end[]; + nes_fd = open(path, O_RDONLY, 0777); + if (nes_fd < 0) + { + return nes_fd; + } + ret = ioctl(nes_fd, APPFS_IOCTOL_GET_ACCESS_ADDR, &appfs_arg); + if (ret < 0) + { + close(nes_fd); + return ret; + } + nes_rom_addr = appfs_arg.addr; + new_rom_size = appfs_arg.size; + return 0; +} int main(int argc, char *argv[]) { + if (argc < 2) + { + printf("nes rom is NULL.\n"); + return -1; + } task_set_obj_name(TASK_THIS, TASK_THIS, "tk_nes"); task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_nes"); + if (new_rom_get(argv[1]) < 0) + { + printf("rom don't finded.\n"); + return -1; + } // thread_run(-1, 4); printf("nes init..\n"); #if 0 @@ -221,6 +134,6 @@ again: .w = 256, .h = 240, })); - nes_load((uint8_t *)nes_rom, (umword_t)(nes_rom_end - nes_rom)); + nes_load((uint8_t *)nes_rom_addr, (umword_t)(new_rom_size)); return 0; } diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes.S b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes.S index 810b93904..3bb2f86f9 100644 --- a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes.S +++ b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes.S @@ -2,7 +2,7 @@ .balign 4 .global nes_rom nes_rom: -.incbin "/home/zhangzheng/projects/mkrtos-real/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/超级马里奥兄弟3[MM之神汉化](JP)[ACT](3Mb).nes" +@ .incbin "/home/zhangzheng/projects/mkrtos-real/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/超级马里奥兄弟3[MM之神汉化](JP)[ACT](3Mb).nes" .global nes_rom_end nes_rom_end: .long 0 diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/超级玛丽.nes b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/sm.nes similarity index 100% rename from mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/超级玛丽.nes rename to mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/sm.nes diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/三国志英杰传 (吞食天地1) (繁体中文版)[外星科技汉化](JP)[RPG](4Mb).nes b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/三国志英杰传 (吞食天地1) (繁体中文版)[外星科技汉化](JP)[RPG](4Mb).nes deleted file mode 100644 index 2833f5875..000000000 Binary files a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/三国志英杰传 (吞食天地1) (繁体中文版)[外星科技汉化](JP)[RPG](4Mb).nes and /dev/null differ diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/三目童子[Flow Wolf汉化](JP)[ACT](2Mb).nes b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/三目童子[Flow Wolf汉化](JP)[ACT](2Mb).nes deleted file mode 100644 index 09af785a7..000000000 Binary files a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/三目童子[Flow Wolf汉化](JP)[ACT](2Mb).nes and /dev/null differ diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/双截龙3 (v1.1)[星空汉化](US)[ACT](2.5Mb).nes b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/双截龙3 (v1.1)[星空汉化](US)[ACT](2.5Mb).nes deleted file mode 100644 index f4c49c3da..000000000 Binary files a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/双截龙3 (v1.1)[星空汉化](US)[ACT](2.5Mb).nes and /dev/null differ diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/吞食天地[酷哥电子](JP)[RPG](4Mb).nes b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/吞食天地[酷哥电子](JP)[RPG](4Mb).nes deleted file mode 100644 index a335b1bdb..000000000 Binary files a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/吞食天地[酷哥电子](JP)[RPG](4Mb).nes and /dev/null differ diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/超级马里奥兄弟3[MM之神汉化](JP)[ACT](3Mb).nes b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/超级马里奥兄弟3[MM之神汉化](JP)[ACT](3Mb).nes deleted file mode 100644 index afcf11887..000000000 Binary files a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/超级马里奥兄弟3[MM之神汉化](JP)[ACT](3Mb).nes and /dev/null differ diff --git a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/魂斗罗[九班汉化](JP)[ACT](2Mb).nes b/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/魂斗罗[九班汉化](JP)[ACT](2Mb).nes deleted file mode 100644 index 716c8a98b..000000000 Binary files a/mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/魂斗罗[九班汉化](JP)[ACT](2Mb).nes and /dev/null differ diff --git a/mkrtos_user/user/drv/ATSURFF437/block/flash.c b/mkrtos_user/user/drv/ATSURFF437/block/flash.c index 8b41162bf..e0f48ec9d 100644 --- a/mkrtos_user/user/drv/ATSURFF437/block/flash.c +++ b/mkrtos_user/user/drv/ATSURFF437/block/flash.c @@ -1,50 +1,93 @@ #include "flash.h" #include "at32f435_437_conf.h" +#include +#include +#include +#include "u_sys.h" +#include "u_prot.h" +#include #if defined(AT32F437xM) || defined(AT32F435xM) || defined(AT32F437xD) || defined(AT32F435xD) #define SECTOR_SIZE 4096 /* this parameter depends on the specific model of the chip */ #else #define SECTOR_SIZE 2048 /* this parameter depends on the specific model of the chip */ #endif +static sys_info_t sys_info; -int flash_get_sector_size(void) +int flash_get_sector_size(umword_t *mem_addr, int *blk_size, int *blk_nr) { - return SECTOR_SIZE; + assert(blk_size); + assert(mem_addr); + assert(blk_nr); + msg_tag_t tag; + + tag = sys_read_info(SYS_PROT, &sys_info, 0); + if (msg_tag_get_val(tag) < 0) + { + return -ENOENT; + } + + *mem_addr = sys_info.bootfs_start_addr; + *blk_size = SECTOR_SIZE; + *blk_nr = (CONFIG_SYS_TEXT_SIZE - CONFIG_BOOTSTRAP_TEXT_SIZE - CONFIG_KNL_TEXT_SIZE - CONFIG_DTBO_TEXT_SIZE) / SECTOR_SIZE; + + printf("flash mem_addr:0x%x blk_size:0x%x blk_nr:0x%x\n", *mem_addr, *blk_size, *blk_nr); + return 0; } int flash_read_sector(uint32_t sector_inx, uint32_t *p_buffer, uint16_t num_read) { uint16_t i; uint32_t read_addr; - if (num_read < SECTOR_SIZE / 4) { + if (num_read < SECTOR_SIZE / 4) + { return -1; } - read_addr = sector_inx * SECTOR_SIZE + FLASH_BASE; + read_addr = sector_inx * SECTOR_SIZE + sys_info.bootfs_start_addr; - for (i = 0; i < num_read; i++) { + for (i = 0; i < num_read; i++) + { p_buffer[i] = *(uint32_t *)(read_addr); read_addr += 4; } return num_read; } +int flash_erase_sector(uint32_t sector_inx) +{ + flash_status_type status = FLASH_OPERATE_DONE; + + flash_unlock(); + status = flash_sector_erase(sector_inx * SECTOR_SIZE + sys_info.bootfs_start_addr); + if (status != FLASH_OPERATE_DONE) + { + flash_lock(); + return -1; + } + flash_lock(); + return 0; +} int flash_write_sector(uint32_t sector_inx, uint32_t *p_buffer, uint16_t num_write) { flash_status_type status = FLASH_OPERATE_DONE; - uint32_t write_addr = sector_inx * SECTOR_SIZE + FLASH_BASE; + uint32_t write_addr = sector_inx * SECTOR_SIZE + sys_info.bootfs_start_addr; - if (num_write < SECTOR_SIZE / 4) { + if (num_write < SECTOR_SIZE / 4) + { return -1; } flash_unlock(); - status = flash_sector_erase(sector_inx * SECTOR_SIZE + FLASH_BASE); - if (status != FLASH_OPERATE_DONE) { + status = flash_sector_erase(sector_inx * SECTOR_SIZE + sys_info.bootfs_start_addr); + if (status != FLASH_OPERATE_DONE) + { flash_lock(); return -1; } - for (int i = 0; i < num_write; i++) { + for (int i = 0; i < num_write; i++) + { status = flash_word_program(write_addr, p_buffer[i]); - if (status != FLASH_OPERATE_DONE) { + if (status != FLASH_OPERATE_DONE) + { flash_lock(); return -1; } @@ -53,3 +96,24 @@ int flash_write_sector(uint32_t sector_inx, uint32_t *p_buffer, uint16_t num_wri flash_lock(); return num_write; } + +int flash_init(void) +{ + msg_tag_t tag; + addr_t vaddr; + + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RW, 0, 0), + 0x400 /*TODO:*/, 0x40023C00, &vaddr); + if (msg_tag_get_val(tag) < 0) + { + return msg_tag_get_val(tag); + } + + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RW, 0, 0), + 32 * 1024 * 1024 /*TODO:*/, 0x8000000, &vaddr); + if (msg_tag_get_val(tag) < 0) + { + return msg_tag_get_val(tag); + } + return 0; +} diff --git a/mkrtos_user/user/drv/ATSURFF437/block/flash.h b/mkrtos_user/user/drv/ATSURFF437/block/flash.h index fb33bf68b..97aca156b 100644 --- a/mkrtos_user/user/drv/ATSURFF437/block/flash.h +++ b/mkrtos_user/user/drv/ATSURFF437/block/flash.h @@ -2,6 +2,8 @@ #include -int flash_get_sector_size(void); int flash_read_sector(uint32_t sector_inx, uint32_t *p_buffer, uint16_t num_read); int flash_write_sector(uint32_t sector_inx, uint32_t *p_buffer, uint16_t num_write); +int flash_get_sector_size(umword_t *mem_addr, int *blk_size, int *blk_nr); +int flash_erase_sector(uint32_t sector_inx); +int flash_init(void); diff --git a/mkrtos_user/user/drv/ATSURFF437/block/main.c b/mkrtos_user/user/drv/ATSURFF437/block/main.c index e43cc240c..3e7273b79 100644 --- a/mkrtos_user/user/drv/ATSURFF437/block/main.c +++ b/mkrtos_user/user/drv/ATSURFF437/block/main.c @@ -30,17 +30,26 @@ int blk_drv_write(obj_handler_t obj, int len, int inx) int ret = -1; addr_t addr = 0; umword_t size = 0; - msg_tag_t tag = share_mem_map(obj, vma_addr_create(VPAGE_PROT_RWX, 0, 0), &addr, &size); + msg_tag_t tag; - if (msg_tag_get_val(tag) < 0) { - handler_free_umap(obj); - printf("net write error.\n"); - return msg_tag_get_val(tag); + if (len == 0) + { + ret = flash_erase_sector(inx); } - - ret = flash_write_sector(inx, (void *)addr, len / 4); - handler_free_umap(obj); - if (ret < 0) { + else + { + tag = share_mem_map(obj, vma_addr_create(VPAGE_PROT_RWX, 0, 0), &addr, &size); + if (msg_tag_get_val(tag) < 0) + { + handler_free_umap(obj); + printf("net write error.\n"); + return msg_tag_get_val(tag); + } + ret = flash_write_sector(inx, (void *)addr, len / 4); + handler_free_umap(obj); + } + if (ret < 0) + { return ret; } return ret * 4; @@ -50,12 +59,19 @@ int blk_drv_read(obj_handler_t obj, int len, int inx) int ret = -1; addr_t addr = 0; umword_t size = 0; - msg_tag_t tag = share_mem_map(obj, vma_addr_create(VPAGE_PROT_RWX, 0, 0), &addr, &size); uint32_t _err; + msg_tag_t tag = share_mem_map(obj, vma_addr_create(VPAGE_PROT_RWX, 0, 0), &addr, &size); + if (msg_tag_get_val(tag) < 0) + { + handler_free_umap(obj); + printf("net write error.\n"); + return msg_tag_get_val(tag); + } ret = flash_read_sector(inx, (void *)addr, len / 4); handler_free_umap(obj); - if (ret < 0) { + if (ret < 0) + { return ret; } return ret * 4; @@ -64,22 +80,48 @@ int blk_drv_map(obj_handler_t *hd) { return -ENOSYS; } +int blk_drv_info(blk_drv_info_t *info) +{ + umword_t mem_addr; + int blk_size; + int blk_nr; + int ret; + + ret = flash_get_sector_size(&mem_addr, &blk_size, &blk_nr); + if (ret < 0) + { + return ret; + } + info->blk_nr = blk_nr; + info->blk_size = blk_size; + info->blk_start_addr = mem_addr; + return 0; +} int main(int argc, char *argv[]) { obj_handler_t hd; int ret; + + if (argc < 2) + { + printf("please set dev path.\n"); + printf("example:block /block"); + return -1; + } task_set_obj_name(TASK_THIS, TASK_THIS, "tk_blk"); task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_blk"); printf("%s init..\n", argv[0]); fast_ipc_init(); + flash_init(); blk_drv_init(&blk_drv); ret = rpc_meta_init(THREAD_MAIN, &hd); assert(ret >= 0); - ns_register("/block", hd, FILE_NODE); + ns_register(argv[1], hd, FILE_NODE); meta_reg_svr_obj(&blk_drv.svr, BLK_DRV_PROT); - while (1) { + while (1) + { rpc_loop(); } } diff --git a/mkrtos_user/user/drv/ATSURFF437/display/fs_rpc.c b/mkrtos_user/user/drv/ATSURFF437/display/fs_rpc.c index 499eb94f1..e1df1e690 100644 --- a/mkrtos_user/user/drv/ATSURFF437/display/fs_rpc.c +++ b/mkrtos_user/user/drv/ATSURFF437/display/fs_rpc.c @@ -80,13 +80,7 @@ static void fd_free(int fd) } } } -void fs_svr_init(void) -{ - msg_tag_t tag; - fs_init(&fs); - meta_reg_svr_obj(&fs.svr, FS_PROT); -} int fs_svr_open(const char *path, int flags, int mode) { int pid = thread_get_src_pid(); @@ -342,4 +336,32 @@ int fs_svr_statfs(const char *path, struct statfs *buf) void fs_svr_loop(void) { rpc_loop(); +} +static const fs_operations_t ops = + { + .fs_svr_open = fs_svr_open, + .fs_svr_read = fs_svr_read, + .fs_svr_write = fs_svr_write, + .fs_svr_close = fs_svr_close, + .fs_svr_readdir = fs_svr_readdir, + .fs_svr_lseek = fs_svr_lseek, + .fs_svr_ftruncate = fs_svr_ftruncate, + .fs_svr_fstat = fs_svr_fstat, + .fs_svr_ioctl = fs_svr_ioctl, + // .fs_svr_fcntl = fs_svr_fcntl, + .fs_svr_fsync = fs_svr_fsync, + .fs_svr_unlink = fs_svr_unlink, + .fs_svr_symlink = fs_svr_symlink, + .fs_svr_mkdir = fs_svr_mkdir, + .fs_svr_rmdir = fs_svr_rmdir, + .fs_svr_rename = fs_svr_rename, + .fs_svr_stat = fs_svr_stat, + .fs_svr_readlink = fs_svr_readlink, +}; +void fs_svr_init(void) +{ + msg_tag_t tag; + + fs_init(&fs, &ops); + meta_reg_svr_obj(&fs.svr, FS_PROT); } \ No newline at end of file diff --git a/mkrtos_user/user/drv/ATSURFF437/eth/main.c b/mkrtos_user/user/drv/ATSURFF437/eth/main.c index 50ec70a62..07c6b24bd 100644 --- a/mkrtos_user/user/drv/ATSURFF437/eth/main.c +++ b/mkrtos_user/user/drv/ATSURFF437/eth/main.c @@ -66,6 +66,10 @@ int blk_drv_map(obj_handler_t *hd) *hd = emac_get_sema(); return 0; } +int blk_drv_info(blk_drv_info_t *info) +{ + return -ENOSYS; +} int main(int argc, char *argv[]) { obj_handler_t hd; diff --git a/mkrtos_user/user/drv/ATSURFF437/i2c/fs_rpc.c b/mkrtos_user/user/drv/ATSURFF437/i2c/fs_rpc.c index 7d79e1a8c..723db0aa4 100644 --- a/mkrtos_user/user/drv/ATSURFF437/i2c/fs_rpc.c +++ b/mkrtos_user/user/drv/ATSURFF437/i2c/fs_rpc.c @@ -80,13 +80,7 @@ static void fd_free(int fd) } } } -void fs_svr_init(void) -{ - msg_tag_t tag; - fs_init(&fs); - meta_reg_svr_obj(&fs.svr, FS_PROT); -} int fs_svr_open(const char *path, int flags, int mode) { int pid = thread_get_src_pid(); @@ -376,4 +370,32 @@ int fs_svr_statfs(const char *path, struct statfs *buf) void fs_svr_loop(void) { rpc_loop(); -} \ No newline at end of file +} +static const fs_operations_t ops = + { + .fs_svr_open = fs_svr_open, + .fs_svr_read = fs_svr_read, + .fs_svr_write = fs_svr_write, + .fs_svr_close = fs_svr_close, + .fs_svr_readdir = fs_svr_readdir, + .fs_svr_lseek = fs_svr_lseek, + .fs_svr_ftruncate = fs_svr_ftruncate, + .fs_svr_fstat = fs_svr_fstat, + .fs_svr_ioctl = fs_svr_ioctl, + // .fs_svr_fcntl = fs_svr_fcntl, + .fs_svr_fsync = fs_svr_fsync, + .fs_svr_unlink = fs_svr_unlink, + .fs_svr_symlink = fs_svr_symlink, + .fs_svr_mkdir = fs_svr_mkdir, + .fs_svr_rmdir = fs_svr_rmdir, + .fs_svr_rename = fs_svr_rename, + .fs_svr_stat = fs_svr_stat, + .fs_svr_readlink = fs_svr_readlink, +}; +void fs_svr_init(void) +{ + msg_tag_t tag; + + fs_init(&fs, &ops); + meta_reg_svr_obj(&fs.svr, FS_PROT); +} diff --git a/mkrtos_user/user/drv/ATSURFF437/pca9555/fs_rpc.c b/mkrtos_user/user/drv/ATSURFF437/pca9555/fs_rpc.c index 0b2aea407..79eddc6ba 100644 --- a/mkrtos_user/user/drv/ATSURFF437/pca9555/fs_rpc.c +++ b/mkrtos_user/user/drv/ATSURFF437/pca9555/fs_rpc.c @@ -80,13 +80,7 @@ static void fd_free(int fd) } } } -void fs_svr_init(void) -{ - msg_tag_t tag; - fs_init(&fs); - meta_reg_svr_obj(&fs.svr, FS_PROT); -} int fs_svr_open(const char *path, int flags, int mode) { int pid = thread_get_src_pid(); @@ -382,4 +376,32 @@ int fs_svr_statfs(const char *path, struct statfs *buf) void fs_svr_loop(void) { rpc_loop(); +} +static const fs_operations_t ops = + { + .fs_svr_open = fs_svr_open, + .fs_svr_read = fs_svr_read, + .fs_svr_write = fs_svr_write, + .fs_svr_close = fs_svr_close, + .fs_svr_readdir = fs_svr_readdir, + .fs_svr_lseek = fs_svr_lseek, + .fs_svr_ftruncate = fs_svr_ftruncate, + .fs_svr_fstat = fs_svr_fstat, + .fs_svr_ioctl = fs_svr_ioctl, + // .fs_svr_fcntl = fs_svr_fcntl, + .fs_svr_fsync = fs_svr_fsync, + .fs_svr_unlink = fs_svr_unlink, + .fs_svr_symlink = fs_svr_symlink, + .fs_svr_mkdir = fs_svr_mkdir, + .fs_svr_rmdir = fs_svr_rmdir, + .fs_svr_rename = fs_svr_rename, + .fs_svr_stat = fs_svr_stat, + .fs_svr_readlink = fs_svr_readlink, +}; +void fs_svr_init(void) +{ + msg_tag_t tag; + + fs_init(&fs, &ops); + meta_reg_svr_obj(&fs.svr, FS_PROT); } \ No newline at end of file diff --git a/mkrtos_user/user/drv/ATSURFF437/pin/fs_rpc.c b/mkrtos_user/user/drv/ATSURFF437/pin/fs_rpc.c index 94ea98036..69ac3dc23 100644 --- a/mkrtos_user/user/drv/ATSURFF437/pin/fs_rpc.c +++ b/mkrtos_user/user/drv/ATSURFF437/pin/fs_rpc.c @@ -83,13 +83,7 @@ static void fd_free(int fd) } } } -void fs_svr_init(void) -{ - msg_tag_t tag; - fs_init(&fs); - meta_reg_svr_obj(&fs.svr, FS_PROT); -} int fs_svr_open(const char *path, int flags, int mode) { int pid = thread_get_src_pid(); @@ -419,4 +413,32 @@ int fs_svr_statfs(const char *path, struct statfs *buf) void fs_svr_loop(void) { rpc_loop(); -} \ No newline at end of file +} +static const fs_operations_t ops = + { + .fs_svr_open = fs_svr_open, + .fs_svr_read = fs_svr_read, + .fs_svr_write = fs_svr_write, + .fs_svr_close = fs_svr_close, + .fs_svr_readdir = fs_svr_readdir, + .fs_svr_lseek = fs_svr_lseek, + .fs_svr_ftruncate = fs_svr_ftruncate, + .fs_svr_fstat = fs_svr_fstat, + .fs_svr_ioctl = fs_svr_ioctl, + // .fs_svr_fcntl = fs_svr_fcntl, + .fs_svr_fsync = fs_svr_fsync, + .fs_svr_unlink = fs_svr_unlink, + .fs_svr_symlink = fs_svr_symlink, + .fs_svr_mkdir = fs_svr_mkdir, + .fs_svr_rmdir = fs_svr_rmdir, + .fs_svr_rename = fs_svr_rename, + .fs_svr_stat = fs_svr_stat, + .fs_svr_readlink = fs_svr_readlink, +}; +void fs_svr_init(void) +{ + msg_tag_t tag; + + fs_init(&fs, &ops); + meta_reg_svr_obj(&fs.svr, FS_PROT); +} diff --git a/mkrtos_user/user/drv/ATSURFF437/snd/main.c b/mkrtos_user/user/drv/ATSURFF437/snd/main.c index eb405da2f..f2cfef88b 100644 --- a/mkrtos_user/user/drv/ATSURFF437/snd/main.c +++ b/mkrtos_user/user/drv/ATSURFF437/snd/main.c @@ -21,7 +21,7 @@ #include "mk_snd_drv_impl.h" static blk_drv_t snd_drv; //!< 网络驱动的协议 -#define STACK_COM_ITME_SIZE (1024+512) +#define STACK_COM_ITME_SIZE (1024 + 512) ATTR_ALIGN(8) uint8_t stack_coms[STACK_COM_ITME_SIZE]; uint8_t msg_buf_coms[MSG_BUG_LEN]; @@ -64,6 +64,10 @@ int blk_drv_map(obj_handler_t *hd) { return -1; } +int blk_drv_info(blk_drv_info_t *info) +{ + return -ENOSYS; +} int main(int argc, char *argv[]) { obj_handler_t hd; diff --git a/mkrtos_user/user/drv/STM32F205/block/stm32f2xx_conf.h b/mkrtos_user/user/drv/STM32F205/block/stm32f2xx_conf.h index 3e0c09d8b..614f0076c 100644 --- a/mkrtos_user/user/drv/STM32F205/block/stm32f2xx_conf.h +++ b/mkrtos_user/user/drv/STM32F205/block/stm32f2xx_conf.h @@ -69,7 +69,7 @@ /* Uncomment the line below to expanse the "assert_param" macro in the Standard Peripheral Library drivers code */ -/* #define USE_FULL_ASSERT 1 */ +#define USE_FULL_ASSERT 1 /* Exported macro ------------------------------------------------------------*/ #ifdef USE_FULL_ASSERT