/* defines */
#define PFFS_MAX_FILENAME_SIZE 15 // in words
#define PFFS_HEADER_SIZE 3 // in words
+#define PFFS_MAX_FILE_SIZE 0xffff
-#define PFFS_REGISTERED (1<<0)
+/* general pffs system */
+#define PFFS_INDEX_FOUND 0x00
+#define PFFS_NO_INDEX_FOUND 0x01
-#define PFFS_INDEX_MAGIC 0x7000
+#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_RESERVED_MASK 0x0f00
+#define PFFS_STATE_MASK 0x0f00
#define PFFS_FNLEN_MASK 0x00f0
-#define PFFS_LEN_MSB_MASK 0x000f
+#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
-/* pffs write / read return codes */
-#define PFFS_FILE_EXISTS 0x01
-#define PFFS_FILE_NOT_FOUND 0x02
-#define PFFS_NO_SPACE_LEFT 0x04
-#define PFFS_FILENAME_TOO_LONG 0x08
+/* 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 */
/* flash specs */
u32 base_addr;
u32 *sec_addr;
+ u8 sec_num_data[2]; // first/last sector used for data
+ u8 sec_num_index[2]; // 2 sectors used as an index
+
/* 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; // pointer where new data goes
- u32 index_ptr[3]; // 0: start, 1: new, 2: current
- u8 sec_num_data[2]; // data start/end sectors
- u8 sec_num_index[2]; // 2 index sectors
+ u8 index_sec; // current index sector
+ u8 data_tmp_sec; // current temp data sector
} t_pffs;
typedef struct s_pffs_fd {
- u32 daddr;
- u32 iaddr;
- char file[PFFS_MAX_FILENAME_SIZE+PFFS_MAX_FILENAME_SIZE];
- u8 fn_size;
- u8 mode;
- t_pffs *pffs;
+ 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; // the pffs main struct
} t_pffs_fd;
-/* function prototypes */
-int pffs_open(t_pffs *pffs,char *file,u8 mode);
-int pffs_write(t_pffs *pffs,int fd,u8 *buf,int len);
-int pffs_read(t_pffs *pffs,int fd,u8 *buf,int len);
-int pffs_close(t_pffs *pffs,int fd);
-int pffs_unlink(t_pffs *pffs,char *file);
+/* function prototypes (only the ones applications should use!) */
+int pffs_flash_register(t_pffs *pffs,u32 base_addr,u32 *sec_addr,
+ u8 sec_num_data_min,u8 sec_num_data_max,
+ u8 sec_num_index0,u8 sec_num_index1,
+ 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