This commit is contained in:
lmx
2025-10-29 13:10:02 +08:00
commit 49a07fa419
2284 changed files with 642060 additions and 0 deletions

1042
include_lib/system/fs/fs.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,35 @@
#ifndef __FS_FILE_NAME_H__
#define __FS_FILE_NAME_H__
#include "generic/typedef.h"
#define D_LFN_MAX_SIZE 512
#define LFN_MAX_SIZE D_LFN_MAX_SIZE //不能超过512 //必须4byte对齐
typedef struct _LONG_FILE_NAME {
u16 lfn_cnt;
char lfn[LFN_MAX_SIZE]; //长文件名buffer
} LONG_FILE_NAME; //整理后的长文件名
typedef struct _FS_DIR_INFO {
u32 sclust; //dir sclust
u16 dir_type; // 0-folder,1-file
u16 fn_type; // 0-sfn,1-lfn
LONG_FILE_NAME lfn_buf; //long file name
} FS_DIR_INFO;
typedef struct _FS_DISP_INFO {
char tpath[128];
LONG_FILE_NAME file_name;
LONG_FILE_NAME dir_name;
u8 update_flag;
} FS_DISP_INFO;
typedef struct _FLASH_FAT_ADDRINFO {
u32 saddr; //当前连续簇块文件起始实际物理地址
u32 end_addr; //当前连续簇块结束位置
u32 file_len; //文件长度,如 JL.res文件的
} FLASH_FAT_ADDRINFO;
#endif /* __FS_FILE_NAME_H__ */

View File

@ -0,0 +1,222 @@
#ifndef _SDFILE_H_
#define _SDFILE_H_
#include "typedef.h"
//=======================================================//
// 默认宏配置定义 //
//=======================================================//
#ifndef SDFILE_STORAGE
#define SDFILE_STORAGE 0
#endif /* #ifndef SDFILE_STORAGE */
#define NOR_SDFILE_ENABLE 1
/********* sdfile 文件头 **********/
#define SDFILE_NAME_LEN 16
typedef struct sdfile_file_head {
u16 head_crc;
u16 data_crc;
u32 addr;
u32 len;
u8 attr;
u8 res;
u16 index;
char name[SDFILE_NAME_LEN];
} SDFILE_FILE_HEAD;
#if 0
////////////////////////////sdfile_file_head成员详细说明///////////////////////////////////////
typedef struct SDFILEJL_FILE_HEAD {
u16 u16Crc; // 结构体自身校验码
u16 u16DataCrc; // 文件数据校验码
u32 u32Address; // 数据存储地址
u32 u32Length; // 数据长度
u8 u8Attribute; // 属性
u8 u8Res; // 保留数据
u16 u16Index; // 文件编号从大到小排列编号为0时代表后面没有文件
char szFileName[16];// 文件名
} JL_SDFILE_HEAD;
////////////////////////////flash_head成员详细说明///////////////////////////////////////
typedef struct SDFILEJL_FLASH_HEAD_V2 {
u16 u16Crc; // 结构体自身校验码
u16 u16SizeForBurner; // 为烧写器保留的空间大小
char vid[4]; // 存放VID信息长度是4个byte
u32 u32FlashSize; // FLASH大小,由isd_download计算得出
u8 u8FsVersion; // flash类型BR18(0)/BR22(1)
u8 u8BlockAlingnModulus;// 对齐系数,对齐的值=对齐系数*256
u8 u8Res; // 保留
u8 u8SpecialOptFlag; // 用于标记是否需要生成2种flash格式的标记位目前只用1位
char pid[16]; // 存放PID信息长度是16个byte
} SDFILEJL_FLASH_HEAD_V2;
#endif
struct sdfile_dir {
u16 file_num;
struct sdfile_file_head head;
};
enum sdfile_err_table {
SDFILE_DIR_NOT_EXIST = -0xFF,
SDFILE_FILE_NOT_EXIST,
SDFILE_MALLOC_ERR,
SDFILE_VM_NOT_FIND,
SDFILE_DATA_CRC_ERR,
SDFILE_WRITE_AREA_NEED_ERASE_ERR,
SDFILE_SUSS = 0,
SDFILE_END,
};
#if (VFS_ENABLE == 1)
#if SDFILE_STORAGE
#define SDFILE_MAX_DEEPTH 2
struct sdfile_folder {
u32 saddr;
u32 addr;
u32 len;
};
struct sdfile_scn {
u8 subpath;
u8 cycle_mode;
u8 attr;
u8 deepth;
u16 dirCounter;
u16 fileCounter;
u16 fileNumber; // 当前文件序号
u16 totalFileNumber;
u16 last_file_number;
u16 fileTotalInDir; // 当前目录的根下有效文件的个数
u16 fileTotalOutDir; // 当前目录前的文件总数,目录循环模式下,需要用它来计算文件序号
u32 sclust_id;
const char *ftypes;
struct sdfile_file_head head;
struct sdfile_folder folder[SDFILE_MAX_DEEPTH];
};
#endif
typedef struct sdfile_file_t {
u32 fptr;
struct sdfile_file_head head;
#if SDFILE_STORAGE
struct sdfile_scn *pscn;
#endif
} SDFILE;
#else
typedef struct sdfile_file_t {
u32 fptr;
struct sdfile_file_head head;
} SDFILE, FILE;
struct vfs_attr {
u8 attr; //属性
u32 fsize; //文件大小
u32 sclust; //地址
};
SDFILE *sdfile_open(const char *path, const char *mode);
int sdfile_read(SDFILE *fp, void *buf, u32 len);
int sdfile_write(SDFILE *fp, void *buf, u32 len);
int sdfile_seek(SDFILE *fp, u32 offset, u32 fromwhere);
int sdfile_close(SDFILE *fp);
int sdfile_pos(SDFILE *fp);
int sdfile_len(SDFILE *fp);
int sdfile_get_name(SDFILE *fp, u8 *name, int len);
int sdfile_get_attrs(SDFILE *fp, struct vfs_attr *attr);
#if 0
#define fopen sdfile_open
#define fread sdfile_read
#define fseek sdfile_seek
#define fclose sdfile_close
#define fwrite sdfile_write
#define flen sdfile_len
#define fpos sdfile_pos
#define fget_name sdfile_get_name
#define fget_attrs sdfile_get_attrs
#else
static inline SDFILE *fopen(const char *path, const char *mode)
{
return sdfile_open(path, mode);
}
static inline int fread(SDFILE *fp, void *buf, u32 len)
{
return sdfile_read(fp, buf, len);
}
static inline int fwrite(SDFILE *fp, void *buf, u32 len)
{
return sdfile_write(fp, buf, len);
}
static inline int fseek(SDFILE *fp, u32 offset, u32 fromwhere)
{
return sdfile_seek(fp, offset, fromwhere);
}
static inline int fclose(SDFILE *fp)
{
return sdfile_close(fp);
}
static inline int fpos(SDFILE *fp)
{
return sdfile_pos(fp);
}
static inline int flen(SDFILE *fp)
{
return sdfile_len(fp);
}
static inline int fget_name(SDFILE *fp, u8 *name, int len)
{
return sdfile_get_name(fp, name, len);
}
static inline int fget_attrs(SDFILE *fp, struct vfs_attr *attr)
{
return sdfile_get_attrs(fp, attr);
}
#endif
#endif /* VFS_ENABLE */
int sdfile_delete_data(SDFILE *fp);
#define fdel_data sdfile_delete_data
#ifndef SDFILE_MOUNT_PATH
#define SDFILE_MOUNT_PATH "mnt/sdfile"
#endif /* #ifndef SDFILE_MOUNT_PATH */
#if (USE_SDFILE_NEW)
#ifndef SDFILE_APP_ROOT_PATH
#define SDFILE_APP_ROOT_PATH SDFILE_MOUNT_PATH"/app/" //app分区
#endif /* #ifndef SDFILE_APP_ROOT_PATH */
#ifndef SDFILE_RES_ROOT_PATH
#define SDFILE_RES_ROOT_PATH SDFILE_MOUNT_PATH"/res/" //资源文件分区
#endif /* #ifndef SDFILE_RES_ROOT_PATH */
#else
#ifndef SDFILE_RES_ROOT_PATH
#define SDFILE_RES_ROOT_PATH SDFILE_MOUNT_PATH"/C/"
#endif /* #ifndef SDFILE_RES_ROOT_PATH */
#endif /* #if (USE_SDFILE_NEW) */
//获取flash物理大小, 单位: Byte
u32 sdfile_get_disk_capacity(void);
//flash addr -> cpu addr
u32 sdfile_flash_addr2cpu_addr(u32 offset);
//cpu addr -> flash addr
u32 sdfile_cpu_addr2flash_addr(u32 offset);
void sdfile_head_addr_get(char *name, u32 *addr, u32 *len);
u32 init_norsdfile_hdl(void);
int set_res_startaddr(int offset);
#endif /* _SDFILE_H_ */

View File

@ -0,0 +1,161 @@
#ifndef VIRTUAL_DISK_H
#define VIRTUAL_DISK_H
#include "system/includes.h"
#define VIR_FILE_TYPE_MP3 1
#define VIR_FILE_TYPE_WAV 2
extern const struct device_operations virfat_flash_dev_ops;
extern const struct device_operations private_sfc_dev_ops;
typedef enum {
FS_FAT12 = 0x01,
FS_FAT16 = 0x02,
FS_FAT32 = 0x04,
FS_EXFAT = 0x14,
} FS_TYPE;
#define JLFAT_DIRINFO_ENABLE 0
#if JLFAT_DIRINFO_ENABLE
typedef struct jlfat_dirinfo {
u8 name[12]; //文件名字
int fsize; // 文件大小
u16 fix_date; //修改日期
u16 fix_time; //修改时间
u8 attr; //文件属性
int sclust; //文件起始簇
} JLFAT_DIRINFO;
#endif
typedef struct _virfat_flash_t {
u32 fatbase;
// u32 fatbase2;
u16 fatsize;
u32 dirbase;
u32 database;
u32 clustSize;
u32 max_clust;
u32 capacity;
u8 csize;
FS_TYPE fs_type;
char re_devname[24];
u32 flash_fatfs_addr;
u32 fatfs_len;
} virfat_flash_t;
typedef struct _dir_entry {
u8 name[12];
u32 fileSize;
} dir_entry_t;
#if 0
extern void virfat_flash_rand_file_size();
extern void virtual_disk_reduce_file_size(tu8 file_num);
extern void virtual_disk_remove_files(tu8 file_type);
extern void virtual_disk_reduce_file_size(tu8 file_num);
extern u8 virfat_flash_init(void *buf_512, void (*fun_read_file)(u32, u32, u8 *, u32));
#endif
#define MIN_FAT16 4086 /* Minimum number of clusters for FAT16 */
#define MIN_FAT32 65526 /* Minimum number of clusters for FAT32 */
#define AM_RDO 0x01 /* Read only */
#define AM_HID 0x02 /* Hidden */
#define AM_SYS 0x04 /* System */
#define AM_VOL 0x08 /* Volume label */
#define AM_LFN 0x0F /* LFN entry */
#define AM_DIR 0x10 /* Directory */
#define AM_ARC 0x20 /* Archive */
#define AM_FCH 0x80 /* exFAT下,文件簇连续标志 */
#define AM_FRG 0x40 /* exFAT下,文件簇BITMAP 有碎片 */
#define AM_LFN0_START 0x1
#define AM_LFN0_LEN 10
#define AM_LFN1_START 0xE
#define AM_LFN1_LEN 12
#define AM_LFN2_START 0x1C
#define AM_LFN2_LEN 4
#define AM_LFN_LEN 26
#define AM_EX_DIR_STRETCHED 0x08
#define BS_jmpBoot 0
#define BS_OEMName 3
#define BPB_BytsPerSec_l 11
#define BPB_BytsPerSec_h 12
#define BPB_SecPerClus 13
#define BPB_RsvdSecCnt 14
#define BPB_NumFATs 16
#define BPB_RootEntCnt 17
#define BPB_TotSec16 19
#define BPB_Media 21
#define BPB_FATSz16 22
#define BPB_SecPerTrk 24
#define BPB_NumHeads 26
#define BPB_HiddSec 28
#define BPB_TotSec32 32
#define BS_55AA 510
#define BS_DrvNum 36
#define BS_BootSig 38
#define BS_VolID 39
#define BS_VolLab 43
#define BS_FilSysType 54
#define BPB_FATSz32 36
#define BPB_ExtFlags 40
#define BPB_FSVer 42
#define BPB_RootClus 44
#define BPB_FSInfo 48
#define BPB_BkBootSec 50
#define BS_DrvNum32 64
#define BS_BootSig32 66
#define BS_VolID32 67
#define BS_VolLab32 71
#define BS_FilSysType32 82
#define BS_FileSysTypeexFAT 5
#define BPB_FatOffset 80
#define BPB_FatLength 84
#define BPB_ClusterHeapOffset 88
#define BPB_ClusterCount 92
#define BPB_FirstClusterOfRootDirectory 96
#define BPB_VolumeFlags 106
#define BPB_BytesPerSectorShift 108
#define BPB_SectorsPerClusterShift 109
#define BPB_NumberOfFats 110
#define MBR_Table 446
#define FSI_LeadSig 0 /* FSI: Leading signature (4) */
#define FSI_StrucSig 484 /* FSI: Structure signature (4) */
#define FSI_Free_Count 488 /* FSI: Number of free clusters (4) */
#define FSI_Nxt_Free 492 /* FSI: Last allocated cluster (4) */
///for FAT12/FAT16/FAT32
#define DIR_Name 0 /* Short file name (11) */
#define DIR_Attr 11 /* Attribute (1) */
#define DIR_NTres 12 /* NT flag (1) */
#define DIR_CrtTimeTenth 13 /* Created time sub-second (1) */
#define DIR_CrtTime 14 /* Created time (2) */
#define DIR_CrtDate 16 /* Created date (2) */
#define DIR_LstAccDate 18 /* Last accessed date (2) */
#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (2) */
#define DIR_WrtTime 22 /* Modified time (2) */
#define DIR_WrtDate 24 /* Modified date (2) */
#define DIR_FstClusLO 26
#define DIR_FileSize 28
#define LDIR_Attr 11 /* LFN attribute (1) */
#define LDIR_Type 12 /* LFN type (1) */
#define LDIR_Chksum 13 /* Sum of corresponding SFN entry */
////for exFAT
#define DIR_FileChainFlags 1
#define DIR_NameLen 3
#define DIR_AttrexFAT 4
#define DIR_FileSizeexFAT 8
#define DIR_FstClustexFAT 20
#define DIR_FileSize2exFAT 24
#endif