X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Farm.git;a=blobdiff_plain;f=betty%2Fpffs.c;h=93351bd7cbaf921711149ae185374a36e94d0c7a;hp=f1fe3f4de247fe815a62ffb6ea39e00740951b74;hb=6a1c483e9c2da2e1affde2a7f3b40ff1c3b09a5f;hpb=476b73692511eeed9602d71e773da5ab24831b74 diff --git a/betty/pffs.c b/betty/pffs.c index f1fe3f4..93351bd 100644 --- a/betty/pffs.c +++ b/betty/pffs.c @@ -122,9 +122,33 @@ int pffs_orientate(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, +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;secsec_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, int (*fw)(u32 addr,u16 *buf,int len), int (*fr)(u32 addr,u16 *buf,int len), int (*fe)(u32 addr)) { @@ -132,12 +156,7 @@ int pffs_flash_register(t_pffs *pffs,u32 base_addr,u32 *sec_addr, /* assign physical flash specs */ pffs->base_addr=base_addr; pffs->sec_addr=sec_addr; - - /* specified index and data sectors */ - pffs->sec_num_data[0]=sec_num_data_min; - pffs->sec_num_data[1]=sec_num_data_max; - pffs->sec_num_index[0]=sec_num_index0; - pffs->sec_num_index[1]=sec_num_index1; + pffs->sec_num=sec_num; /* flash acccess function pointers */ pffs->fw=fw; @@ -168,7 +187,7 @@ int pffs_find_file(t_pffs *pffs,char *file,u32 *iaddr,u32 *daddr,u16 *len) { *iaddr=pffs->base_addr|pffs->sec_addr[pffs->index_sec]; - while(*iaddrsec_addr[pffs->index_sec]) { + while(*iaddrsec_addr[pffs->index_sec+1]) { pffs->fr(*iaddr,data,3); if(!pffs_check_magic(data[0])) @@ -204,6 +223,32 @@ int pffs_open_read(t_pffs_fd *fd) { 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; @@ -213,9 +258,12 @@ int pffs_open_write(t_pffs_fd *fd) { 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: @@ -234,11 +282,12 @@ int pffs_open(t_pffs *pffs,t_pffs_fd *fd,char *file,u8 mode) { /* 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; @@ -262,19 +311,25 @@ int pffs_open(t_pffs *pffs,t_pffs_fd *fd,char *file,u8 mode) { 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;; @@ -282,3 +337,21 @@ int pffs_read(t_pffs_fd *fd,u8 *buf,int 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->) +} +