fat.h

来自「基于U(375)盘及SD(SPI模式)卡集成文件系统(包括底层驱动)」· C头文件 代码 · 共 366 行 · 第 1/2 页

H
366
字号
    struct
    {
        UINT32  byte32;                                     /*字节偏移 0XFFFFFFFF则到文件最后*/
    } blocate;
    struct
    {
        UINT8   count;                                      /*输入要读取的字节数,返回实际读取字节数*/
        UINT8   buffer[ FAT_CMD_BUF_LEN-1 ];
    } bread;
    struct
    {
        UINT8   count;                                      /*字节写入*/
        UINT8   buffer[ FAT_CMD_BUF_LEN-1 ];
    } bwrite;
    struct 
    {
		UINT32	total_sector;			                    /*当前磁盘的(文件存放)总扇区数*/
		UINT32	free_sector;			                    /*当前磁盘的(文件存放)剩余可写扇区数*/
		UINT8	fat_type;				                    /*当前磁盘的FAT类型*/
	} query;
}CMD_STRUCT;
typedef CMD_STRUCT FAT_CMD_DEF;

typedef struct
{
  UINT32 cluster;                                           /*开始簇号*/
  UINT8  number;                                            /*此簇号开始有几个连续的簇*/
}fat_chain;                                                 /*用于构建簇链表*/
typedef fat_chain fat_chain_def;
#define MAX_NUMBER     UCHAR_MAX                            /*number所允许的最大数值*/

#ifdef PRODUCE_LOCAL_VARIABLES
/*磁盘基础特性全局变量*/
STATIC BOOL1        fat_bpb_num_fats;                       /*F_TRUE: 2 FATs - F_FALSE: 1 FAT*/
       UINT16X      fat_sector_size;                        /*存放扇区的字节数*/
STATIC UINT8X       fat_sec_perclus;                        /*每个簇占用扇区数*/
STATIC UINT32X      fat_start_sector;                       /*第一个FAT表开始扇区地址*/
STATIC UINT32X      fat_count_fat_sector;                   /*存放一个FAT表占用扇区数*/
STATIC UINT32X      fat_total_clusters;                     /*存放磁盘总的簇数*/
STATIC UINT32X      fat_data_start_sector;                  /*存放数据区开始扇区地址*/
STATIC UINT32X      fat_dir_sector_clus32;                  /*FAT12/16为根目录开始扇区数,FAT32为根目录开始簇号*/
STATIC UINT8X       fat_type_sign;                          /*FAT类型1-FAT12,2-FAT16,3-FAT32*/
STATIC UINT32X      fat_free_clusters;                      /*磁盘空簇数*/

/*以下三个变量用于FAT32*/
       #if(F_USE_FAT32 == 1)
STATIC UINT16X      fat_fsinfo_sector;                      /*FSInfo所在扇区数*/
STATIC UINT32X      fat_fsi_free_count;                     /*剩下可用空簇(用于FAT32)*/
STATIC UINT32X      fat_fsi_nxt_free;                       /*从那里找剩余的空簇*/
       #endif

/*文件使用参数*/
       UINT32X      fat_file_length;                        /*文件长度*/
       UINT8X       fat_file_attr;                          /*文件属性*/

STATIC UINT8X       f[11];                                  /*文件名处理缓冲区*/
STATIC BOOL1        fat_all_gather_bit;                     /*文件所有数据收集完成标志*/
STATIC BOOL1        fat_dir_full_bit;                       /*当前目录是否满标志*/
STATIC BOOL1        fat_dir_fdelete_bit;                    /*在此目录下发现删除文件*/
STATIC BOOL1        fat_file_open_bit;                      /*文件是否打开标志位*/
STATIC BOOL1        fat_disk_end_bit;                       /*磁盘空间是否用完*/

STATIC UINT8X       fat_dir_all_l;                          /*打开文件所处目录深度*/
STATIC UINT8X       fat_dir_now_l;                          /*当前所处深度*/
STATIC UINT32X      fat_start_cluster;                      /*文件或目录当前所处簇*/
STATIC UINT8X       fat_file_sect_offset;                   /*此值*32为在此扇区的偏移量*/
STATIC UINT32X      fat_file_dir_sector;                    /*文件目录项所处扇区*/

/*结构体数组使用全局变量*/
STATIC UINT8X       fat_last_chain_index;                   /*在该文件或目录簇链的最后一个索引*/
STATIC UINT8X       fat_chain_index;                        /*在当前簇链的索引*/
STATIC UINT8X       fat_count_offset_cluster;               /*在连续簇的偏移*/
STATIC UINT8X       fat_count_offset_sector;                /*纪录当前簇里读取扇区偏移*/
STATIC UINT32X      fat_current_sect;                       /*当前所处扇区*/

       #if(F_EN_BYTE ==1)
STATIC BOOL1        fat_byte_mode;                          /*TRUE处在字节模式 否则扇区方式*/
STATIC BOOL1        fat_in_byte_bit;                        /*第一次进入字节读写函数标志位*/    
STATIC UINT16X      fat_sector_byte_offset;                 /*在字节方式操作时,在当前扇区的偏移量*/
       #endif

STATIC PUINT8       fat_buf_pointer;                        /*文件缓冲区开始指针*/
/*对内申明提供函数*/
#if(F_EN_WRITE ==1)
STATIC UINT8 fat_get_space(BOOL1 con_bit);
STATIC UINT8 fat_update(BOOL1 up_mode);
UINT8 fat_fdelete(void);
#endif

/*对内申明,在外产生的全局变量*/
extern FAT_CMD_DEF  fat_cmd;
extern fat_chain_def chain[FAT_CHAIN_LENGTH];
extern UINT8  cmd_buf_len;                                  /*对内申明得到命令缓冲区的长度*/
extern UINT16 file_buf_len;                                 /*对内申明得到文件缓冲区长度*/
extern UINT8  fat_chn_len;                                  /*对内申明得到簇链的深度*/

#if F_EN_DISK_BUF ==1                                       /*调用对外申明的文件缓冲区及磁盘缓冲区*/
extern UINT8X       fat_file_buffer[ ];
extern UINT8X       fat_disk_buffer[ ];
#else
extern UINT8X       fat_file_buffer[ ];
#define fat_disk_buffer  fat_file_buffer
#endif

/*枚举文件回调函数*/
#if(F_EN_ENUM_BACK ==1)
void file_enum_call_back(void)
{
    fat_file_length++;                                      /*枚举序号加一*/
    //com_prints(&fat_cmd.open.buffer,1);                   /*处理搜索到的文件名,在此为从串口发送出去*/
}
#endif
/******************************************************************************/

/*对外申明全局变量及函数*/
/******************************************************************************/
#else
/*对外申明全局变量*/
extern FAT_CMD_DEF  fat_cmd;
extern UINT32X      fat_file_length;
extern UINT8X       fat_file_attr;
extern UINT8X       fat_file_buffer[ ];
extern UINT16X      fat_sector_size;

#if(F_EN_LONG_NAME ==1)
extern UINT8X       fat_long_name_buf[ ];
extern UINT8X       fat_get_name_sign;
#endif

/*申明对外提供函数*/
extern UINT8 fat_init(void);                                /*FAT文件系统初始化*/
extern UINT8 fat_fopen(void);                               /*打开文件函数*/
extern UINT8 fat_fread(void);                               /*读文件数据到缓冲区*/
extern UINT8 fat_freadx(void);                              /*读文件数据到任意位置*/
extern UINT8 fat_locate_sector(void);                       /*偏移扇区*/
extern UINT8 fat_fclose(void);                              /*关闭文件*/
extern UINT8 fat_disk_query( void );                        /*查询磁盘属性*/

#if(F_EN_WRITE ==1)
extern UINT8 fat_fcreate(Bool c_mode);                      /*创建文件*/
extern UINT8 fat_fmodify(void);                             /*修改文件属性*/
extern UINT8 fat_fwrite(void);                              /*写数据到磁盘*/
extern UINT8 fat_fwritex( void );                           /*写任意位置数据到磁盘*/
extern UINT8 fat_fdelete(void);                             /*删除文件*/
extern UINT8 fat_create_dir(void);                          /*创建目录*/
#endif

#if(F_EN_BYTE ==1)
extern UINT8 fat_locate_byte(void);                         /*从文件开始偏移字节*/
extern UINT8 fat_byte_read(void);                           /*字节读取*/
#if(F_EN_WRITE ==1)
extern UINT8 fat_byte_write(void);                          /*字节方式写入*/
#endif
#endif

#ifdef  FAT_INI_VAR                                         /*初始化FAT使用缓冲区变量*/
UINT8   cmd_buf_len = FAT_CMD_BUF_LEN;                      /*得到命令缓冲区长度*/
UINT16  file_buf_len = FAT_FILE_BUF_LEN;                    /*得到文件缓冲区长度*/
UINT8   fat_chn_len = FAT_CHAIN_LENGTH;                     /*得到簇链的深度*/

#if F_EN_LONG_NAME ==1
UINT8X  fat_long_name_buf[F_LNAME_BUF_LEN];                 /*长文件名UNICODE存放缓冲区,用于显示等*/
UINT8X  fat_get_name_sign;                                  /*收集长文件名状态标志位*/
#endif

#if F_EN_DISK_BUF ==1
UINT8X  fat_file_buffer[ FAT_FILE_BUF_LEN ];                /*文件缓冲区*/
UINT8X  fat_disk_buffer[ FAT_SECTOR_SIZE_DEF ];             /*磁盘缓冲区*/
#else                                                       /*不允许在文件尾部添加数据时,文件缓冲区与磁盘缓冲共用*/
UINT8X  fat_file_buffer[ FAT_FILE_BUF_LEN ];                /*文件缓冲区*/
#define fat_disk_buffer  fat_file_buffer                    /*文件缓冲区与磁盘缓冲区共用*/
#endif
FAT_CMD_DEF  fat_cmd;                                       /*FAT命令结构体*/
fat_chain_def chain[ FAT_CHAIN_LENGTH ];                    /*有用簇链缓冲区*/
#endif

#endif                                                      /*PRODUCE_LOCAL_VARIABLES*/
/******************************************************************************/
#ifdef __cplusplus
}
#endif                                                      /*__cplusplus*/
#endif                                                      /*FAT_H*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?