playing around with pffs (NOT FINISHED, DOESNT COMPILE!)
[my-code/arm.git] / betty / pffs.c
index 7b3b5e8..1257d18 100644 (file)
@@ -36,7 +36,8 @@ u32 pffs_get_ptr(t_pffs *pffs,u8 sector) {
        pffs->data_ptr=daddr;
 
        if(found) {
-               pffs->index_ptr=pffs->sec_addr[sector]+iaddr;
+               pffs->index_ptr[0]=pffs->sec_addr[sector];
+               pffs->index_ptr[1]=pffs->sec_addr[sector]+iaddr;
                return 0;
        }
        else
@@ -62,7 +63,7 @@ int pffs_sec_empty(t_pffs *pffs,u8 sec) {
 
 #define pffs_sec_erase(pffs,sec) pffs->fe(pffs->base_addr|pffs->sec_addr[sec])
 
-int pffs_reorientate(t_pffs *pffs) {
+int pffs_orientate(t_pffs *pffs) {
 
        u8 sec,sec0,sec1;
 
@@ -88,7 +89,7 @@ int pffs_reorientate(t_pffs *pffs) {
        return 0;
 }
 
-int pffs_flash_register(t_pffs *pffs,u32 base_addr,u8 sec_num,u32 *sec_addr,
+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),
@@ -97,7 +98,6 @@ int pffs_flash_register(t_pffs *pffs,u32 base_addr,u8 sec_num,u32 *sec_addr,
 
        /* assign physical flash specs */
        pffs->base_addr=base_addr;
-       pffs->sec_num=sec_num;
        pffs->sec_addr=sec_addr;
 
        /* specified index and data sectors */
@@ -111,9 +111,6 @@ int pffs_flash_register(t_pffs *pffs,u32 base_addr,u8 sec_num,u32 *sec_addr,
        pffs->fr=fr;
        pffs->fe=fe;
 
-       /* orientate */
-       pffs_reorientate(pffs);
-
        pffs->state|=PFFS_REGISTERED;
 
        return 0;
@@ -121,9 +118,87 @@ int pffs_flash_register(t_pffs *pffs,u32 base_addr,u8 sec_num,u32 *sec_addr,
 
 int pffs_init(t_pffs *pffs) {
 
+       /* check whether a flash is registered */
        if(!(pffs->state&PFFS_REGISTERED))
                return -1;
 
+       /* orientate */
+       pffs_orientate(pffs);
+
+       return 0;
+}
+
+#define pffs_check_magic(data) (((data)&PFFS_INDEX_MAGIC_MASK)==PFFS_INDEX_MAGIC)
+#define pffs_fnlen(data) (((data)&PFFS_FNLEN_MASK)>>4)
+#define pffs_daddr_msb(data) (((data)&))
+
+int pffs_find_file(t_pffs *pffs,char *file,u32 *iaddr,u32 *daddr,u16 *len) {
+
+       u8 fnl;
+       u16 data[PFFS_MAX_FILENAME_SIZE+PFFS_HEADER_SIZE];
+
+       pffs->index_ptr[2]=pffs->base_addr|pffs->index_ptr[0];
+
+       while(pffs->index_ptr[2]<pffs->index_ptr[1])
+               pffs->fr(iaddr,data,3);
+
+               if(!pffs_check_magic(data[0]))
+                       break;
+
+               fnl=pffs_fnlen(data[0]);
+               pffs->fr(iaddr+6,data+3,fnl+fnl);
+
+               if(!strncmp(fd->file,(char *)(data+3),fnl+fnl)) {
+                       *daddr=((data[0]&0x000f)<<16)|data[1];
+                       *len=data[2];
+                       pffs->index_ptr[2]=*iaddr;
+                       return PFFS_FILE_EXISTS;
+               }
+               pffs->fr(iaddr,data,3);
+       }
+       
+       return PFFS_FILE_NOT_FOUND;
+}
+
+int pffs_open_read(t_pffs *pffs,t_pffs_fd *fd) {
+
+       u32 iaddr;
+       u32 daddr;
+       u16 data[PFFS_MAX_FILENAME+PFFS_HEADER_SIZE];
+
+       iaddr=pffs->base_addr|pffs->index_ptr[0];
+
+       return 0x23;
+}
+
+int pffs_open(t_pffs *pffs,t_pffs_fd *fd,char *file,u8 mode) {
+
+       /* the pffs struct */
+       fd->pffs=pffs;
+
+       /* filename */
+       fd->fn_size=strlen(file);
+       if(fd->fn_size>30)
+               return PFFS_FILENAME_TOO_LONG;
+       strncpy(fd->file,file,fd->fn_size);
+       if(fd->fn_size&1)
+               fd->file[fd->fn_size++]='\0';
+
+       /* mode */
+       fd->mode=mode;
+
+       /* action */
+       switch(mode) {
+               case PFFS_READ:
+                       pffs_open_read(pffs,fd);
+                       break;
+               case PFFS_WRITE:
+                       break;
+               case PFFS_RDWR:
+               default:
+                       return PFFS_MODE_UNSUPPORTED;
+       }
+
        return 0;
 }