2 * pffs.c - pseudo flash filesystem
4 * author: hackbard@hackdaworld.org
14 u32 pffs_get_ptr(t_pffs *pffs,u8 sector) {
27 pffs->fr(pffs->base_addr+pffs->sec_addr[sector]+iaddr,data,6);
28 if(!((data[0]&0xff00)==PFFS_INDEX_MAGIC))
31 fnlen=(data[0]&0x00f0)>>4;
32 iaddr+=(6+fnlen+fnlen);
33 daddr=((data[0]&0x000f)<<16)|data[1];
39 pffs->index_ptr=pffs->sec_addr[sector]+iaddr;
46 int pffs_sec_empty(t_pffs *pffs,u8 sec) {
51 addr=pffs->base_addr|pffs->sec_addr[sec];
53 while(addr<(pffs->base_addr|pffs->sec_addr[sec+1])) {
54 data=*((u16 *)(addr));
63 #define pffs_sec_erase(pffs,sec) pffs->fe(pffs->base_addr|pffs->sec_addr[sec])
65 int pffs_reorientate(t_pffs *pffs) {
69 /* check index sectors */
70 sec0=pffs->sec_num_index[0];
71 sec1=pffs->sec_num_index[1];
72 if(!(pffs_get_ptr(pffs,sec0)&pffs_get_ptr(pffs,sec1)))
75 /* initial run => no data + no index assumed => check whether erased! */
76 // erase index sectors
77 if(!pffs_sec_empty(pffs,sec0))
78 pffs_sec_erase(pffs,sec0);
79 if(!pffs_sec_empty(pffs,sec1))
80 pffs_sec_erase(pffs,sec1);
82 sec0=pffs->sec_num_data[0];
83 sec1=pffs->sec_num_data[1];
84 for(sec=sec0;sec<=sec1;sec++)
85 if(!pffs_sec_empty(pffs,sec))
86 pffs_sec_erase(pffs,sec);
91 int pffs_flash_register(t_pffs *pffs,u32 base_addr,u8 sec_num,u32 *sec_addr,
92 u8 sec_num_data_min,u8 sec_num_data_max,
93 u8 sec_num_index0,u8 sec_num_index1,
94 int (*fw)(u32 addr,u16 *buf,int len),
95 int (*fr)(u32 addr,u16 *buf,int len),
96 int (*fe)(u32 addr)) {
98 /* assign physical flash specs */
99 pffs->base_addr=base_addr;
100 pffs->sec_num=sec_num;
101 pffs->sec_addr=sec_addr;
103 /* specified index and data sectors */
104 pffs->sec_num_data[0]=sec_num_data_min;
105 pffs->sec_num_data[1]=sec_num_data_max;
106 pffs->sec_num_index[0]=sec_num_index0;
107 pffs->sec_num_index[1]=sec_num_index1;
109 /* flash acccess function pointers */
115 pffs_reorientate(pffs);
117 pffs->state|=PFFS_REGISTERED;
122 int pffs_init(t_pffs *pffs) {
124 if(!(pffs->state&PFFS_REGISTERED))