KT24-1110_65E-HA-651B/include_lib/system/fs/fs.h
2024-11-10 18:44:17 +08:00

363 lines
10 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __FS_H__
#define __FS_H__
#include "generic/typedef.h"
#include "generic/list.h"
#include "generic/ioctl.h"
#include "generic/atomic.h"
#include "system/task.h"
#include "system/malloc.h"
#include "system/sys_time.h"
#include "stdarg.h"
#include "fs_file_name.h"
#define SEEK_SET 0 /* Seek from beginning of file. */
#define SEEK_CUR 1 /* Seek from current position. */
#define SEEK_END 2 /* Seek from end of file. */
#include "sdfile.h"
#define F_ATTR_RO 0x01
#define F_ATTR_ARC 0x02
#define F_ATTR_DIR 0x04
#define F_ATTR_VOL 0x08
#if (VFS_ENABLE == 1)
#ifndef FSELECT_MODE
#define FSELECT_MODE
#define FSEL_FIRST_FILE 0
#define FSEL_LAST_FILE 1
#define FSEL_NEXT_FILE 2
#define FSEL_PREV_FILE 3
#define FSEL_CURR_FILE 4
#define FSEL_BY_NUMBER 5
#define FSEL_BY_SCLUST 6
#define FSEL_AUTO_FILE 7
#define FSEL_NEXT_FOLDER_FILE 8
#define FSEL_PREV_FOLDER_FILE 9
#define FSEL_BY_PATH 10
#endif
#ifndef FCYCLE_MODE
#define FCYCLE_MODE
#define FCYCLE_LIST 0
#define FCYCLE_ALL 1
#define FCYCLE_ONE 2
#define FCYCLE_FOLDER 3
#define FCYCLE_RANDOM 4
#define FCYCLE_MAX 5
#endif
enum {
FS_IOCTL_GET_FILE_NUM,
FS_IOCTL_FILE_CHECK,
FS_IOCTL_GET_ERR_CODE, //暂不支持
FS_IOCTL_FREE_CACHE,
FS_IOCTL_SET_NAME_FILTER, //设置文件过滤
FS_IOCTL_GET_FOLDER_INFO, //获取文件夹序号和文件夹内文件数目
FS_IOCTL_SET_LFN_BUF, // 512
FS_IOCTL_SET_LDN_BUF, // 512
FS_IOCTL_SET_EXT_TYPE, //设置后缀类型
FS_IOCTL_OPEN_DIR, //打开目录
FS_IOCTL_ENTER_DIR, //进入目录
FS_IOCTL_EXIT_DIR, //退出
FS_IOCTL_GET_DIR_INFO, //获取目录信息
FS_IOCTL_GETFILE_BYNAME_INDIR, //由歌曲名称获得歌词
FS_IOCTL_GET_DISP_INFO, //用于长文件名获取
FS_IOCTL_MK_DIR, //创建文件夹
FS_IOCTL_GET_ENCFOLDER_INFO, //获取录音文件信息
FS_IOCTL_GET_OUTFLASH_ADDR, //获取外置flash实际物理地址暂时用于手表case,特殊fat系统
FS_IOCTL_FLUSH_WBUF,
FS_IOCTL_SAVE_FAT_TABLE,
};
struct vfs_devinfo;
struct vfscan;
struct vfs_operations;
struct vfs_devinfo {
void *fd;
u32 sector_size;
void *private_data;
};
#define VFS_PART_DIR_MAX 16
struct vfs_partition {
struct vfs_partition *next;
u32 offset;
u32 clust_size;
u32 total_size;
u8 fs_attr;
char dir[VFS_PART_DIR_MAX];
void *private_data;
};
struct fiter {
u32 index;
};
struct ffolder {
u16 fileStart;
u16 fileTotal;
};
struct imount {
int fd;
const char *path;
struct vfs_operations *ops;
struct vfs_devinfo dev;
struct vfs_partition part;
struct list_head entry;
atomic_t ref;
OS_MUTEX mutex;
u8 avaliable;
u8 part_num;
};
struct vfs_attr {
u8 attr;
u32 fsize;
u32 sclust;
struct sys_time crt_time;
struct sys_time wrt_time;
};
typedef struct {
struct imount *mt;
struct vfs_devinfo *dev;
struct vfs_partition *part;
void *private_data;
} FILE;
struct vfscan {
u8 scan_file;
u8 subpath; //子目录,设置是否只扫描一层
u8 scan_dir;
u8 attr;
u8 cycle_mode;
char sort;
char ftype[20 * 3 + 1];
u16 file_number;
u16 file_counter;
u16 dir_totalnumber; // 文件夹总数
u16 musicdir_counter; // 播放文件所在文件夹序号
u16 fileTotalInDir; //文件夹下的文件数目
void *priv;
struct vfs_devinfo *dev;
struct vfs_partition *part;
char filt_dir[12];
};
struct vfs_operations {
const char *fs_type;
int (*mount)(struct imount *, int);
int (*unmount)(struct imount *);
int (*format)(struct vfs_devinfo *, struct vfs_partition *);
int (*fset_vol)(struct vfs_partition *, const char *name);
int (*fget_free_space)(struct vfs_devinfo *, struct vfs_partition *, u32 *space);
int (*fopen)(FILE *, const char *path, const char *mode);
int (*fread)(FILE *, void *buf, u32 len);
int (*fread_fast)(FILE *, void *buf, u32 len);
int (*fwrite)(FILE *, void *buf, u32 len);
int (*fseek)(FILE *, int offset, int);
int (*fseek_fast)(FILE *, int offset, int);
int (*flen)(FILE *);
int (*fpos)(FILE *);
int (*fcopy)(FILE *, FILE *);
int (*fget_name)(FILE *, u8 *name, int len);
int (*fget_path)(FILE *, struct vfscan *, u8 *name, int len, u8 is_relative_path);
int (*frename)(FILE *, const char *path);
int (*fclose)(FILE *);
int (*fdelete)(FILE *);
int (*fscan)(struct vfscan *, const char *path, u8 max_deepth);
int (*fscan_interrupt)(struct vfscan *, const char *path, u8 max_deepth, int (*callback)(void));
void (*fscan_release)(struct vfscan *);
int (*fsel)(struct vfscan *, int sel_mode, FILE *, int);
int (*fget_attr)(FILE *, int *attr);
int (*fset_attr)(FILE *, int attr);
int (*fget_attrs)(FILE *, struct vfs_attr *);
int (*fmove)(FILE *file, const char *path_dst, FILE *, int clr_attr);
int (*ioctl)(void *, int cmd, int arg);
};
#define REGISTER_VFS_OPERATIONS(ops) \
const struct vfs_operations ops SEC(.vfs_operations)
static inline struct vfs_partition *vfs_partition_next(struct vfs_partition *p)
{
struct vfs_partition *n = (struct vfs_partition *)zalloc(sizeof(*n));
if (n) {
p->next = n;
}
return n;
}
static inline void vfs_partition_free(struct vfs_partition *p)
{
struct vfs_partition *n = p->next;
while (n) {
p = n->next;
free(n);
n = p;
}
}
struct imount *mount(const char *dev_name, const char *path, const char *fs_type,
int cache_num, void *dev_arg); //挂载
int unmount(const char *path);
int f_format(const char *path, const char *fs_type, u32 clust_size); //格式化接口
int f_free_cache(const char *path);
/*----------------------------------------------------------------------------*/
/** @brief:
@param: fopen 扩展功能
@note: fopen自动打开、创建文件夹和文件。
说明:
1. 设备路径+文件,其中文件传入格式:"music/test/1/2/3/pk*.wav" "JL_REC/AC69****.wav" "JL_REC/AC690000.wav"
2. 文件名带*号,带多少个*表示多少个可变数字最多为8+3的大小如表示可变数字名称变为XXX0001,XXXX002这样得格式不带*号则只创建一个文件,写覆盖。
@date: 2020-07-22
*/
/*----------------------------------------------------------------------------*/
FILE *fopen(const char *path, const char *mode);
int fread(FILE *file, void *buf, u32 len);
int fwrite(FILE *file, void *buf, u32 len);
int fseek(FILE *file, int offset, int orig);
int fseek_fast(FILE *file, int offset, int orig);// 快速seek
int fread_fast(FILE *file, void *buf, u32 len); //快速read
int flen(FILE *file);
int fpos(FILE *file);
int fcopy(const char *format, ...);
int fget_name(FILE *file, u8 *name, int len);
int frename(FILE *file, const char *path);
int fclose(FILE *file);
int fdelete(FILE *file);
int fdelete_by_name(const char *fname);
int fget_free_space(const char *path, u32 *space);
int fget_path(FILE *file, struct vfscan *fscan, u8 *name, int len, u8 is_relative_path);
/* arg:
* -t 文件类型
* -r 包含子目录
* -d 扫描文件夹
* -a 文件属性 r: 读, /: 非
* -s 排序方式, t:按时间排序, n:按文件号排序
*/
struct vfscan *fscan(const char *path, const char *arg, u8 max_deepth); //扫描接口,参数配置如上。
struct vfscan *fscan_interrupt(const char *path, const char *arg, u8 max_deepth, int (*callback)(void)); //可打断扫描
struct vfscan *fscan_enterdir(struct vfscan *fs, const char *path);//进入指定子目录,只扫此目录下文件信息
struct vfscan *fscan_exitdir(struct vfscan *fs); //返回上一层
void fscan_release(struct vfscan *fs);
FILE *fselect(struct vfscan *fs, int selt_mode, int arg); //选择指定文件
int fdir_exist(const char *dir); //check 目录是否存在
int fdir(FILE *file, const char *arg, char *name, int len, struct fiter *iter);//暂无此接口
int fget_attr(FILE *file, int *attr); //获取文件属性
int fset_attr(FILE *file, int attr); //设置文件属性
int fget_attrs(FILE *file, struct vfs_attr *attr);//获得文件相关信息如属性、簇号、大小等
struct vfs_partition *fget_partition(const char *path);//获得分区part
int fset_vol(const char *path, const char *name);//设置卷标
int fmove(FILE *file, const char *path_dst, FILE **newFile, int clr_attr);//暂不支持
int fcheck(FILE *file);//暂不支持
int fget_err_code(const char *path); //暂不支持
int fset_name_filter(const char *path, void *name_filter);//暂不支持
int fget_folder(struct vfscan *fs, struct ffolder *arg); //获取文件夹序号和文件夹内文件数目
int fset_lfn_buf(struct vfscan *fs, void *arg);//设置长文件名buf
int fset_ldn_buf(struct vfscan *fs, void *arg);//设置长文件夹名buf
int fset_ext_type(const char *path, void *ext_type);//设置后缀类型
int fopen_dir_info(const char *path, FILE **pp_file, void *dir_dj); //打开目录
int fenter_dir_info(FILE *file, void *dir_dj); //进入目录
int fexit_dir_info(FILE *file); //退出
int fget_dir_info(FILE *file, u32 start_num, u32 total_num, void *buf_info); ////获取目录信息
int fget_fat_outflash_addr(FILE *file, char *name, void *buf_info);//获取外置flash实际物理地址暂时用于手表case,特殊fat系统
int fget_file_byname_indir(FILE *file, FILE **newFile, void *ext_name); //由歌曲名称获得歌词
int fget_disp_info(FILE *file, void *arg); //用于长文件名获取
int fmk_dir(const char *path, char *folder, u8 mode); //创建目录
int fget_encfolder_info(const char *path, char *folder, char *ext, u32 *last_num, u32 *total_num); //获取录音文件信息
int fname_to_path(char *result, const char *path, const char *fname, int len); //把路径和文件名拼接
int get_last_num(void); //录音获取最后序号。
void set_bp_info(u32 clust, u32 fsize, u32 *flag); //扫描前设置断点参数需要put_bp_info对应释放buf.
void put_bp_info(void);
int fsave_fat_table(FILE *file, u16 btr, u8 *buf);
int f_flush_wbuf(const char *path);
#endif /* VFS_ENABLE */
#endif /* __FS_H__ */