2017-03-25 22:03:19 +01:00
|
|
|
#ifndef __FAT_ACCESS_H__
|
|
|
|
#define __FAT_ACCESS_H__
|
|
|
|
|
|
|
|
#include "fat_defs.h"
|
|
|
|
#include "fat_opts.h"
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Defines
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#define FAT_INIT_OK 0
|
|
|
|
#define FAT_INIT_MEDIA_ACCESS_ERROR (-1)
|
|
|
|
#define FAT_INIT_INVALID_SECTOR_SIZE (-2)
|
|
|
|
#define FAT_INIT_INVALID_SIGNATURE (-3)
|
|
|
|
#define FAT_INIT_ENDIAN_ERROR (-4)
|
|
|
|
#define FAT_INIT_WRONG_FILESYS_TYPE (-5)
|
|
|
|
#define FAT_INIT_WRONG_PARTITION_TYPE (-6)
|
|
|
|
#define FAT_INIT_STRUCT_PACKING (-7)
|
|
|
|
|
|
|
|
#define FAT_DIR_ENTRIES_PER_SECTOR (FAT_SECTOR_SIZE / FAT_DIR_ENTRY_SIZE)
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Function Pointers
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
typedef int (*fn_diskio_read) (uint32 sector, uint8 *buffer, uint32 sector_count);
|
|
|
|
typedef int (*fn_diskio_write)(uint32 sector, uint8 *buffer, uint32 sector_count);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Structures
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
struct disk_if
|
|
|
|
{
|
|
|
|
// User supplied function pointers for disk IO
|
|
|
|
fn_diskio_read read_media;
|
|
|
|
fn_diskio_write write_media;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Forward declaration
|
|
|
|
struct fat_buffer;
|
|
|
|
|
|
|
|
struct fat_buffer
|
|
|
|
{
|
|
|
|
uint8 sector[FAT_SECTOR_SIZE * FAT_BUFFER_SECTORS];
|
|
|
|
uint32 address;
|
|
|
|
int dirty;
|
|
|
|
uint8 * ptr;
|
|
|
|
|
|
|
|
// Next in chain of sector buffers
|
|
|
|
struct fat_buffer *next;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef enum eFatType
|
|
|
|
{
|
|
|
|
FAT_TYPE_16,
|
|
|
|
FAT_TYPE_32
|
|
|
|
} tFatType;
|
|
|
|
|
|
|
|
struct fatfs
|
|
|
|
{
|
|
|
|
// Filesystem globals
|
|
|
|
uint8 sectors_per_cluster;
|
|
|
|
uint32 cluster_begin_lba;
|
|
|
|
uint32 rootdir_first_cluster;
|
2017-03-26 21:03:01 +02:00
|
|
|
uint32 last_free_cluster;
|
2017-03-25 22:03:19 +01:00
|
|
|
uint32 rootdir_first_sector;
|
|
|
|
uint32 rootdir_sectors;
|
|
|
|
uint32 fat_begin_lba;
|
|
|
|
uint16 fs_info_sector;
|
|
|
|
uint32 lba_begin;
|
|
|
|
uint32 fat_sectors;
|
|
|
|
uint32 next_free_cluster;
|
|
|
|
uint16 root_entry_count;
|
|
|
|
uint16 reserved_sectors;
|
|
|
|
uint8 num_of_fats;
|
|
|
|
tFatType fat_type;
|
|
|
|
|
|
|
|
// Disk/Media API
|
|
|
|
struct disk_if disk_io;
|
|
|
|
|
|
|
|
// [Optional] Thread Safety
|
|
|
|
void (*fl_lock)(void);
|
|
|
|
void (*fl_unlock)(void);
|
|
|
|
|
|
|
|
// Working buffer
|
|
|
|
struct fat_buffer currentsector;
|
|
|
|
|
|
|
|
// FAT Buffer
|
|
|
|
struct fat_buffer *fat_buffer_head;
|
|
|
|
struct fat_buffer fat_buffers[FAT_BUFFERS];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct fs_dir_list_status
|
|
|
|
{
|
|
|
|
uint32 sector;
|
|
|
|
uint32 cluster;
|
|
|
|
uint8 offset;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct fs_dir_ent
|
|
|
|
{
|
|
|
|
char filename[FATFS_MAX_LONG_FILENAME];
|
|
|
|
uint8 is_dir;
|
|
|
|
uint32 cluster;
|
|
|
|
uint32 size;
|
|
|
|
|
|
|
|
#if FATFS_INC_TIME_DATE_SUPPORT
|
|
|
|
uint16 access_date;
|
|
|
|
uint16 write_time;
|
|
|
|
uint16 write_date;
|
|
|
|
uint16 create_date;
|
|
|
|
uint16 create_time;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Prototypes
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
int fatfs_init(struct fatfs *fs);
|
|
|
|
uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number);
|
|
|
|
int fatfs_sector_reader(struct fatfs *fs, uint32 Startcluster, uint32 offset, uint8 *target);
|
|
|
|
int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count);
|
|
|
|
int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count);
|
|
|
|
int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target);
|
|
|
|
int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target);
|
|
|
|
void fatfs_show_details(struct fatfs *fs);
|
|
|
|
uint32 fatfs_get_root_cluster(struct fatfs *fs);
|
|
|
|
uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *nametofind, struct fat_dir_entry *sfEntry);
|
|
|
|
int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname);
|
|
|
|
int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength);
|
|
|
|
int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname);
|
|
|
|
void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster);
|
|
|
|
int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry);
|
|
|
|
int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access);
|
|
|
|
|
|
|
|
#endif
|