X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Fpffs.h;h=5849fa7576b8de07c972c50ee96ac95fcfede1af;hp=72ec8802265e459a6e277dcfb8183a4b78b1bb43;hb=6a1c483e9c2da2e1affde2a7f3b40ff1c3b09a5f;hpb=e9e1115af8d1609165b3e5baf0aef838f29e91a1 diff --git a/betty/pffs.h b/betty/pffs.h index 72ec880..5849fa7 100644 --- a/betty/pffs.h +++ b/betty/pffs.h @@ -10,32 +10,109 @@ #include "lpc2xxx.h" #include "types.h" +#include "functions.h" /* defines */ +#define PFFS_MAX_FILENAME_SIZE 15 // in words +#define PFFS_HEADER_SIZE 3 // in words +#define PFFS_MAX_FILE_SIZE 0xffff + +/* general pffs system */ +#define PFFS_INDEX_FOUND 0x00 +#define PFFS_NO_INDEX_FOUND 0x01 + +#define PFFS_DATA_TMP_FOUND 0x00 +#define PFFS_NO_DATA_TMP 0x01 + +#define PFFS_SEC_NOT_EMPTY 0x00 +#define PFFS_SEC_EMPTY 0x01 #define PFFS_REGISTERED (1<<0) +/* pffs index format */ +#define PFFS_INDEX_MAGIC_MASK 0xf000 +#define PFFS_STATE_MASK 0x0f00 +#define PFFS_FNLEN_MASK 0x00f0 +#define PFFS_ADDR_MSB_MASK 0x000f + #define PFFS_INDEX_MAGIC 0x7000 +#define PFFS_INDEX_REMOVED 0x0700 + +#define PFFS_ADDR_MSB + +/* file modes */ +#define PFFS_READ 0x01 +#define PFFS_WRITE 0x02 +#define PFFS_RDWR 0x03 + +/* lseek offsets */ +#define PFFS_SEEK_SET 0x01 +#define PFFS_SEEK_CUR 0x02 +#define PFFS_SEEK_END 0x03 + +/* pffs open / write / read return codes */ +#define PFFS_FILE_FOUND 0x01 +#define PFFS_FILE_NOT_FOUND 0x02 +#define PFFS_NO_SPACE_LEFT 0x04 +#define PFFS_FILENAME_TOO_LONG 0x08 +#define PFFS_MODE_UNSUPPORTED 0x10 +#define PFFS_NO_INDEX_SPACE_LEFT 0x20 +#define PFFS_INDEX_WROTE_INIT 0x40 + +#define PFFS_INVALID_LEN 0x01 +#define PFFS_EINVAL 0x02 /* type definitions */ typedef struct s_pffs { /* flash specs */ - u32 base_addr; - u8 sec_num; - u32 *sec_addr; + u32 base_addr; // base flash access address + u32 *sec_addr; // pointer to sector addresses + u8 sec_num; // number of sectors + /* flash write, read and sector erase function pointers */ int (*fw)(u32 addr,u16 *buf,int len); int (*fr)(u32 addr,u16 *buf,int len); int (*fe)(u32 addr); + /* pffs internal variables */ u8 state; - u32 data_ptr; - u32 index_ptr; - u8 sec_num_data[2]; - u8 sec_num_index[2]; + u8 data_tmp_sec; // current temp data sector } t_pffs; -/* function prototypes */ +typedef struct s_pffs_fd { + u32 daddr; // data start address + u8 data_sec; // current data sector + u32 dptr; // data pointer + u32 iaddr; // index address + u16 len; // file size + char file[PFFS_MAX_FILENAME_SIZE+PFFS_MAX_FILENAME_SIZE]; // the file + u8 fn_size; // file name size + u8 mode; // mode, eg: write, read + t_pffs *pffs; // pointer to the pffs main struct +} t_pffs_fd; + +typedef struct s_pffs_sector_header { + u32 wear_level; // program / erase cycles +} + +typedef struct s_pffs_file_header { + u32 file_len; // length of files in ? + u32 file_cont; // continued file addr + u8 file_name_len; // lenght of the filename in words +} + +/* function prototypes (only the ones applications should use!) */ +int pffs_flash_register(t_pffs *pffs,u32 base_addr,u32 *sec_addr,u8 sec_num, + int (*fw)(u32 addr,u16 *buf,int len), + int (*fr)(u32 addr,u16 *buf,int len), + int (*fe)(u32 addr)); +int pffs_init(t_pffs *pffs); +int pffs_open(t_pffs *pffs,t_pffs_fd *fd,char *file,u8 mode); +int pffs_write(t_pffs_fd *fd,u8 *buf,int len); +int pffs_read(t_pffs_fd *fd,u8 *buf,int len); +int pffs_lseek(t_pffs_fd *fd,u8 offset,int len); +int pffs_close(t_pffs_fd *fd); +int pffs_unlink(t_pffs_fd *fd,char *file); #endif