return 0;
}
+int pffs_get_data_sec(t_pffs_fd *fd) {
+
+ t_pffs *pffs;
+ u8 sec,sec0,sec1;
+
+ pffs->fd->pffs;
+ sec0=pffs->sec_num_data[0];
+ sec1=pffs->sec_num_data[1];
+
+ for(sec=sec0;sec<sec1;sec++) {
+ if((addr<pffs->sec_addr[sec+1])&(addr>=pffs->sec_addr[sec])) {
+ fd->data_sec=sec;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+int pffs_rearrange(t_pffs *pffs) {
+
+
+
+ return 0;
+}
+
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,
*iaddr=pffs->base_addr|pffs->sec_addr[pffs->index_sec];
- while(*iaddr<pffs->sec_addr[pffs->index_sec]) {
+ while(*iaddr<pffs->sec_addr[pffs->index_sec+1]) {
pffs->fr(*iaddr,data,3);
if(!pffs_check_magic(data[0]))
return ret;
}
+int pffs_write_index_init(t_pffs_fd *fd) {
+
+ t_pffs *pffs;
+ u16 data[PFFS_HEADER_SIZE+PFFS_MAX_FILENAME_SIZE];
+
+ pffs=fd->pffs;
+ fns=fd->fn-size;
+
+ if(fd->iaddr+6+fns+fns>=pffs->sec_addr[pffs->index_sec+1])
+ return PFFS_NO_INDEX_SPACE_LEFT;
+
+ data[0]=0x7f00|(fns<<4)|((fd->daddr>>16)&0xf);
+ data[1]=fd->daddr&0xffff;
+ pffs->fw(fd->iaddr,data,4);
+ pffs->fw(fd->iaddr+6,fd->file,fns+fns);
+
+ return PFFS_INDEX_WROTE_INIT;
+}
+
+int pffs_write_finish(t_pffs_fd *fd) {
+
+ fd->pffs->fw(fd->iaddr+4,&(fd->len),2);
+
+ return 0;
+}
+
int pffs_open_write(t_pffs_fd *fd) {
int ret;
switch(ret) {
case PFFS_FILE_NOT_FOUND:
- fd->mode=PFFS_WRITE;
- pffs_write_index_init();
+ ret=pffs_write_index_init();
+ if(ret!=PFFS_INDEX_WROTE_INIT)
+ break;
fd->dptr=fd->daddr;
+ fd->len=0;
+ fd->mode=PFFS_WRITE;
break;
case PFFS_FILE_FOUND:
default:
/* filename */
fd->fn_size=strlen(file);
- if(fd->fn_size>PFFS_MAX_FILENAME_SIZE+PFFS_MAX_FILENAME_SIZE)
- return PFFS_FILENAME_TOO_LONG;
- strncpy(fd->file,file,fd->fn_size);
if(fd->fn_size&1)
fd->file[fd->fn_size++]='\0';
+ fd->fn_size>>1;
+ if(fd->fn_size>PFFS_MAX_FILENAME_SIZE)
+ return PFFS_FILENAME_TOO_LONG;
+ strncpy(fd->file,file,fd->fn_size+fd->fn_size);
/* clear fd mode */
fd->mode=0;
int pffs_read(t_pffs_fd *fd,u8 *buf,int len) {
int missing;
+ int sec_end;
/* check whether valid */
if(!(fd->mode&PFFS_READ))
return PFFS_EINVAL;
- /* checl len */
+ /* check len */
if(len&1)
return PFFS_INVALID_LEN;
+ /* check how much we read */
missing=fd->len-(fd->dptr-fd->daddr);
if(len>missing)
len=missing;
+ if((fd->dptr+len)>=pffs->sec_addr[pffs->sec_num_data[1]+1])
+ sec_end=pffs->sec_addr[pffs->sec_num_data[1]+1]-fd->dptr;
+
+
/* read */
fd->pffs->fr(fd->dptr,(u16 *)buf,len);
fd->dptr+=len;;
return len;
}
+int pffs_write(t_pffs_fd *fd,u8 buf,int len) {
+
+ /* check whether valid */
+ if(!(fd->mode&PFFS_WRITE))
+ return PFFS_EINVAL;
+
+ /* check len */
+ if(len&1)
+ return PFFS_INVALID_LEN;
+
+ missing=PFFS_MAX_FILE_SIZE-fd->len;
+ if(len>missing)
+ len=missing;
+
+ /* check for */
+ if(fd->dptr+len>=pffs->)
+}
+