FreeCalypso > hg > freecalypso-sw
view target-utils/libmpffs/init.c @ 192:707aa640b2dc
fc-tmsh: w8/w16/w32 implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Mon, 25 Nov 2013 05:37:46 +0000 |
parents | 02ece4d8c755 |
children |
line wrap: on
line source
#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); }