view target-utils/libmpffs/init.c @ 217:30a173257f4a

gsm-fw/services/ffs: ffs_target.c generation and compilation
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 06 Jan 2014 08:07:36 +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);
}