FreeCalypso > hg > freecalypso-sw
diff target-utils/libmpffs/init.c @ 100:02ece4d8c755
pirexplore: beginning of FFS support
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 01 Sep 2013 21:55:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/target-utils/libmpffs/init.c Sun Sep 01 21:55:51 2013 +0000 @@ -0,0 +1,74 @@ +#include "types.h" +#include "struct.h" +#include "globals.h" +#include "macros.h" + +static const u8 ffs_sector_signature[6] = {'F', 'f', 's', '#', 0x10, 0x02}; +static const u8 blank_flash_line[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF}; + +static +find_indexblk() +{ + u32 sector_addr; + u8 *sector_ptr; + int i; + + printf("Looking for MPFFS active index block\n"); + sector_addr = mpffs_base_addr; + for (i = 0; i < mpffs_nsectors; i++) { + sector_ptr = (u8 *) sector_addr; + if (!bcmp(sector_ptr, ffs_sector_signature, 6) && + sector_ptr[8] == 0xAB) { + printf("Found at %08X\n", sector_addr); + mpffs_active_index = (struct inode *) sector_ptr; + return(0); + } + sector_addr += mpffs_sector_size; + } + printf("Error: Not found in any of the %d candidate sectors\n", + mpffs_nsectors); + return(-1); +} + +static +find_rootino() +{ + int ino; + struct inode *irec; + + printf("Looking for the root inode\n"); + for (ino = 1; ; ino++) { + if (ino >= mpffs_sector_size >> 4) { + printf("Error: Hit end of sector, no root inode found\n"); + return(-1); + } + irec = mpffs_active_index + ino; + if (!bcmp((u8 *) irec, blank_flash_line, 16)) { + printf("Error: Hit blank flash, no root inode found\n"); + return(-1); + } + if (irec->type == OBJTYPE_DIR && *inode_to_dataptr(irec) == '/') + break; + } + printf("Found at inode #%x\n", ino); + mpffs_root_ino = ino; + return(0); +} + +mpffs_init() +{ + int stat; + + if (mpffs_init_done) + return(0); + stat = find_indexblk(); + if (stat < 0) + return(stat); + stat = find_rootino(); + if (stat < 0) + return(stat); + mpffs_init_done = 1; + return(0); +}