基于虚拟文件系统(VFS)的应用开发

为了更好地支持SPV1x对于外置存储介质(如外置数据SPI Nor Flash和SPI SD/TF卡)的访问, 并将获得的数据用于SPV1x配套音频解码库输入,SPV1x SDK提供了相应的软件配套。

备注

  • 单纯使用SPV1x内置flash(定义为通过Nor控制器直连的flash)的场景搭建,请使用非VFS流程,获得最佳性能。

  • 目前只有音频解码播放库支持VFS方式使用,录音库/离线语音识别/MIDI库暂不支持VFS。

VFS应用框架

../_images/kiwi-vfs-sys-flow.png

说明

  • 物理存储介质的驱动,需要实现实体文件系统的文件操作方式,后挂载到虚拟文件系统上,库通过调用虚拟文件系统接口,实现对介质的访问。

  • 同一时刻只能访问单个文件夹中单个文件

API

enum vfs_err_t

文件系统错误码

  • VFS_EOK: 正确

  • VFS_ERROR: 存在错误

enum vfs_type_t

已支持文件系统类型

  • VFS_Type_None: 表示无文件系统

  • VFS_Type_Flash: 表示内置cpu可直接地址方式访问flash文件系统

  • VFS_Type_SDC: 表示sd卡文件系统

  • VFS_Type_Spiflash: 表示spi驱动小于16Mbyteflash文件系统

  • VFS_Type_Ospiflash: 表示spi驱动大于16Mbyteflash文件系统

  • VFS_Type_SDC_Direct: 表示sd卡访问,以类似flash方式访问的文件系统

struct vfs_dir_t

文件夹信息

uint16_t index

文件序号

uint8_t *fn

文件名地址

uint32_t sclust

开始簇地址,fat32使用

uint32_t clust

当前簇地址,fat32使用

uint32_t sect

当前簇中块序号,fat32使用

struct vfs_filinfo_t

打开文件信息

uint32_t fsize

文件大小

uint16_t fdate

文件日期

uint16_t ftime

文件时间

uint8_t fattrib

文件属性

char fname[25]

文件名

struct vfs_t

虚拟文件系统实体

vfs_err_t (*init)()

挂载物理介质的初始化函数实体

vfs_err_t (*open)(char *filename)

挂载文件打开

int32_t (*read)(void *buffer, int32_t size)

挂载文件读取

vfs_err_t (*write)(void *buffer, int32_t size)

挂载文件写

vfs_err_t (*lseek)(int32_t offset, int32_t fromwhere)

挂载文件光标位置修改

int32_t (*size)()

挂载获取文件大小

int32_t (*tell)()

挂载获取文件光标位置

vfs_err_t (*opendir)(vfs_dir_t *dj, const char *path)

挂载打开文件夹

vfs_err_t (*readdir)(vfs_dir_t *dj, vfs_filinfo_t *fno)

挂载打开已打开文件夹下文件

player_file_attribute_t (*get_file_attribute)()

挂载已打开获取文件属性

vfs_err_t vfs_register(vfs_t *dev_vfs, vfs_type_t use_file_type)

注册文件系统的接口

param dev_vfs

接口信息指针

param use_file_type

所使用文件系统类型

retval VFS_EOK

成功

retval other

失败

vfs_type_t vfs_get_current_file_type()

获取当前打开文件系统类型

:retval : 参看 vfs_type_t

vfs_err_t vfs_init()

接口初始化

retval VFS_EOK

成功

retval other

失败

vfs_err_t vfs_open(char *filename)

打开文件

param filename

当前文件夹下,需打开文件的文件名,支持播放文件后缀参看 player_file_attribute_t

retval VFS_EOK

成功

retval other

失败

int32_t vfs_read(void *buffer, int32_t size)

从打开文件中读取数据

param buffer

读取数据缓存空间的首地址

param size

读取数据长度,单位byte

retval int32_t

实际读取到的数据长度

note

读数之前需要确保文件打开,否则数据读取错误,函数不检测文件是否打开

vfs_err_t vfs_write(void *buffer, int32_t size)

将数据写入已打开文件

param buffer

写入数据缓存空间的首地址

param size

写入数据长度,单位byte

retval VFS_EOK

成功

retval other

失败

vfs_err_t vfs_lseek(int32_t offset, int32_t fromwhere)

设置文件当前访问的位置偏移

param offset

相对位置偏移

param fromwhere

相对偏移的起始位置,SEEK_SET 相对文件开始位置,SEEK_CUR 相对当前位置,SEEK_END 相对文件结束位置

retval VFS_EOK

成功

retval other

失败

int32_t vfs_size()

读取文件大小

:retval : 文件大小,单位byte

int32_t vfs_tell()

访问文件当前偏移

:retval : 文件当前偏移

vfs_err_t vfs_opendir(vfs_dir_t *dj, const char *path)

打开指定文件夹

param dj

存放文件夹信息的指针 vfs_dir_t 类型

param path

文件夹名

retval VFS_EOK

成功

retval other

失败

vfs_err_t vfs_readdir(vfs_dir_t *dj, vfs_filinfo_t *fno)

读取已打开文件夹中的文件

param dj

已打开文件夹信息的指针 vfs_dir_t类型

param fno

文件信息指针 vfs_filinfo_t类型

retval VFS_EOK

成功

retval other

失败

player_file_attribute_t vfs_get_file_attribute()

读已打开文件属性

retval

文件属性

使用方法

  1. 调用vfs_register()注册文件系统;

  2. 调用vfs_init()初始化文件系统;

  3. 正常使用vfs_xxx()函数访问文件。

示例应用

参看sdk下templates文件夹中带有vfs名称的工程