RISCV RTOS ProxyFs 使用参考

1. 概述

ProxyFs 是用于实现在 DualOs 下 RISCV RTOS 能够访问 Linux 端的文件系统的功能,该功能实现的基础是通过 rpmsg 进行核间通讯。此外, ProxyFs 通过类似 Linux 下操作文件方式,使用 CamFs 接口封装实现相关功能,这样在 RISCV RTOS 下就可以和 Linux 上一样使用 CamFs 相关接口操作 Linux 下的文件。

2. RTOS 用法介绍

2.1. CONFIG 配置

使能 RISCV RTOS ProxyFs 功能需要开启位于 mak/options_chipname_riscv_isw.mak 的 config 文件中的 CONFIG_PROXYFS_SUPPORT 配置。

# Description = [SYS] Proxyfs Support
# Option_Selection = N/A
CONFIG_PROXYFS_SUPPORT = TRUE

2.2. ProxyFs 软件接口说明

ProxyFs 相关软件接口和定义的头文件位于 kernel/rtk/proj/hdrs/pcupid_riscv_isw/cam_fs_wrapper.h 中。

2.2.1 CamFsMount

  • 作用

    挂载文件系统

  • 语法

    CamFsRet_e CamFsMount(CamFsFmt_e fmt, const char *szPartName, const char *szMntPath)

  • 参数

    参数名称 描述
    fmt 文件系统类型,使用 ProxyFs 传入 CAM_FS_FMT_PROXYFS
    szPartName 分区名字,ProxyFs 传入 NULL
    szMntPath 挂载路径
  • 返回值

    返回值 描述
    CAM_FS_OK 成功
    CAM_FS_FAIL 失败

2.2.2 CamFsUnmount

  • 作用

    卸载文件系统

  • 语法

    CamFsRet_e CamFsUnmount(const char *szMntPath)

  • 参数

    参数名称 描述
    szMntPath 挂载路径
  • 返回值

    返回值 描述
    CAM_FS_OK 成功
    CAM_FS_FAIL 失败

2.2.3 CamFsShowMount

  • 作用

    显示当前的挂载路径

  • 语法

    void CamFsShowMount(void)

  • 参数

  • 返回值

2.2.4 CamFsOpen

  • 作用

    打开文件

  • 语法

    CamFsRet_e CamFsOpen(CamFsFd *ptFd, const char *szPath, u32 nFlag, u32 nMode)

  • 参数

    参数名称 描述
    ptFd 文件描述符
    szPath 文件路径
    nFlag 文件状态标志位
    nMode 文件模式
  • 返回值

    返回值 描述
    CAM_FS_OK 成功
    CAM_FS_FAIL 失败

2.2.5 CamFsClose

  • 作用

    关闭文件

  • 语法

    CamFsRet_e CamFsClose(CamFsFd tFd)

  • 参数

    参数名称 描述
    tFd 文件描述符
  • 返回值

    返回值 描述
    CAM_FS_OK 成功
    CAM_FS_FAIL 失败

2.2.6 CamFsRead

  • 作用

    读取文件数据

  • 语法

    s32 CamFsRead(CamFsFd tFd, void *pBuf, u32 nCount)

  • 参数

    参数名称 描述
    tFd 文件描述符
    pBuf 存储读取数据的 buffer
    nCount 读取的最大字节数
  • 返回值

    返回值 描述
    大于零值 实际读取的数据字节数
    -1 失败

2.2.7 CamFsWrite

  • 作用

    写入文件

  • 语法

    s32 CamFsWrite(CamFsFd tFd, const void *pBuf, u32 nCount);

  • 参数

    参数名称 描述
    tFd 文件描述符
    pBuf 存储写入数据的 buffer
    nCount 写入数据的字节数
  • 返回值

    返回值 描述
    大于零值 实际写入的数据字节数
    -1 失败

2.2.8 CamFsSeek

  • 作用

    定位文件

  • 语法

    s32 CamFsSeek(CamFsFd tFd, u32 nOffset, u32 nWhence)

  • 参数

    参数名称 描述
    tFd 文件描述符
    nOffset 相对于文件位置 whence 的偏移值
    nWhence 指定文件位置
  • 返回值

    返回值 描述
    大于零值 当前相对于文件开头的偏移值
    -1 失败

3. ProxyFs demo 用法介绍

3.1. config 配置

demo 源码位于 kernel/rtk/proj/sc/application/fs_app/fs_app.c 并会编译成一个名为 fs_test 的 CLI CMD,如需开启 demo 编译则要在 mak/options_chipname_riscv_isw.mak 这个 config 文件中使能 CONFIG_FS_APP_SUPPORT

# Feature_Name = [APPLICATION] Support FS Demo App
# Description = Support FS Demo App
# Option_Selection = TRUE, FALSE
CONFIG_FS_APP_SUPPORT = TRUE

3.2. demo 使用说明

fs_test 这个 CLI 指令的基础使用方式如下:

fs_test [command] [parameter1] [parameter2] [parameter3]...

其中 command 选项为:open,close,read,write,seek;

parameter 选项个数和含义根据 command 选项不同而不同。

3.2.1. fs_test 挂载文件目录

在执行所有的文件操作之前都必须首先挂载文件目录,使用 fs_test 挂载文件目录指令如下:

fs_test mount [path]

path:挂载的文件目录路径,例如 /proc;

如果操作成功就会有如下类似输出:

SS-RTOS # fs_test mount /proc
fs_cli_mount: success!

3.2.2. fs_test 打开文件

使用 fs_test 打开文件指令如下:

fs_test open [file_path] [flags] [mode]

file_path:打开文件的路径,例如 /proc/version;

flags:文件状态标志位,支持的几种 flags 定义前文所述的头文件中:

#define CAM_FS_O_RDONLY 0x00010001
#define CAM_FS_O_WRONLY 0x00020002
#define CAM_FS_O_RDWR   0x00040004
#define CAM_FS_O_CREAT  0x00080008
#define CAM_FS_O_TRUNC  0x02000200
#define CAM_FS_O_APPEND 0x04000400

mode:文件模式,这个影响后面对文件进行读写时候的行为,例如 0(文本模式,对文件读写会将以字符形式进行操作),1(十六进制模式,对文件读写会将以转换成十六进制数);

如果操作成功就会有如下类似输出:

SS-RTOS # fs_test mount /proc
fs_cli_mount: success!
SS-RTOS # fs_test open /proc/version 0x00040004 0
fs_cli_open: success!

3.2.3. fs_test 关闭文件

使用 fs_test 打开文件指令如下:

fs_test close

close command 没有参数,执行完成之后就会关闭上次打开的文件。

3.2.4. fs_test 读取文件

使用 fs_test 读取文件指令如下:

fs_test read [size]

size:读取的数据大小;

如果操作成功就会输出读取到的 size 字节数据:

SS-RTOS # fs_test mount /proc
fs_cli_mount: success!
SS-RTOS # fs_test open /proc/version 0x00040004 0
fs_cli_open: success!
SS-RTOS # fs_test read 50
fs_cli_read[text][50]: Linux version 5.10.117 (payne.chen@xml3bc12803) (a!

需要注意的是,读取文件之前一定要先使用 open command 打开文件并执行读取模式。这里是以字符的类型进行读取,如果前面打开文件的模式为十六进制模式,则输出如下:

SS-RTOS # fs_test open /proc/version 0x00040004 1
fs_cli_open: success!
SS-RTOS # fs_test read 50
fs_cli_read[hex][50]: 4C 69 6E 75 78 20 76 65 72 73 69 6F 6E 20 35 2E 31 30 2E 31 31 37 20 28 70 61 79 6E 65 2E 63 68 65 6E 40 78 6D 6C 33 62 63 31 32 38 30 33 29 20 28 61

3.2.5. fs_test 写入文件

使用 fs_test 写入文件指令如下:

fs_test write [data]

data:需要写入的数据,如果前面打开文件是以十六进制打开,则这里输入的数据大小必须是 2 的整数倍。

如果操作成功就会向文件中写入 data 数据:

SS-RTOS # fs_test mount /dev
fs_cli_mount: success!
SS-RTOS # fs_test open /dev/null 0x00040004 0
fs_cli_open: success!
SS-RTOS # fs_test write abcdef
fs_cli_write[text][6]: abcdef

需要注意的是,读取文件之前一定要先使用 open command 打开文件并执行读取模式。这里是以字符的类型进行写入,如果前面打开文件的模式为十六进制模式,则写入的是对应的十六进制数:

SS-RTOS # fs_test open /dev/null 0x00040004 1
fs_cli_open: success!
SS-RTOS # fs_test write abcdef
fs_cli_write[hex]: 3

3.2.6. fs_test 定位文件

使用 fs_test 定位文件指令如下:

fs_test seek [offset] [whence]

offset:相对于文件位置 whence 的偏移值;

whence:指定文件位置,支持写入的几个值及其含义如下:

#define CAM_FS_SEEK_SET 0xFF000000 /* seek relative to beginning of file */
#define CAM_FS_SEEK_CUR 0xFF000001 /* seek relative to current file position */
#define CAM_FS_SEEK_END 0xFF000002 /* seek relative to end of file */

以下例子就是将文件重新定位到开头位置,这样就能够重复读取到之前的数据:

SS-RTOS # fs_test open /proc/version 0x00040004 0
fs_cli_open: success!
SS-RTOS # fs_test read 10
fs_cli_read[text][10]: Linux vers!
SS-RTOS # fs_test read 10
fs_cli_read[text][10]: ion 5.10.1!
SS-RTOS # fs_test seek 0 0xFF000000
fs_cli_seek: 0
SS-RTOS # fs_test read 10
fs_cli_read[text][10]: Linux vers!