FreeCalypso > hg > freecalypso-tools
comparison target-utils/libtiffs/init.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children | 87cb03b35f77 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e7502631a0f9 |
---|---|
1 #include "types.h" | |
2 #include "struct.h" | |
3 #include "globals.h" | |
4 #include "macros.h" | |
5 | |
6 static const u8 ffs_sector_signature[6] = {'F', 'f', 's', '#', 0x10, 0x02}; | |
7 static const u8 blank_flash_line[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
8 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | |
9 0xFF, 0xFF, 0xFF, 0xFF}; | |
10 | |
11 static | |
12 find_indexblk() | |
13 { | |
14 u32 sector_addr; | |
15 u8 *sector_ptr; | |
16 int i; | |
17 | |
18 printf("Looking for MPFFS active index block\n"); | |
19 sector_addr = mpffs_base_addr; | |
20 for (i = 0; i < mpffs_nsectors; i++) { | |
21 sector_ptr = (u8 *) sector_addr; | |
22 if (!bcmp(sector_ptr, ffs_sector_signature, 6) && | |
23 sector_ptr[8] == 0xAB) { | |
24 printf("Found at %08X\n", sector_addr); | |
25 mpffs_active_index = (struct inode *) sector_ptr; | |
26 return(0); | |
27 } | |
28 sector_addr += mpffs_sector_size; | |
29 } | |
30 printf("Error: Not found in any of the %d candidate sectors\n", | |
31 mpffs_nsectors); | |
32 return(-1); | |
33 } | |
34 | |
35 static | |
36 find_rootino() | |
37 { | |
38 int ino; | |
39 struct inode *irec; | |
40 | |
41 printf("Looking for the root inode\n"); | |
42 for (ino = 1; ; ino++) { | |
43 if (ino >= mpffs_sector_size >> 4) { | |
44 printf("Error: Hit end of sector, no root inode found\n"); | |
45 return(-1); | |
46 } | |
47 irec = mpffs_active_index + ino; | |
48 if (!bcmp((u8 *) irec, blank_flash_line, 16)) { | |
49 printf("Error: Hit blank flash, no root inode found\n"); | |
50 return(-1); | |
51 } | |
52 if (irec->type == OBJTYPE_DIR && *inode_to_dataptr(irec) == '/') | |
53 break; | |
54 } | |
55 printf("Found at inode #%x\n", ino); | |
56 mpffs_root_ino = ino; | |
57 return(0); | |
58 } | |
59 | |
60 mpffs_init() | |
61 { | |
62 int stat; | |
63 | |
64 if (mpffs_init_done) | |
65 return(0); | |
66 stat = find_indexblk(); | |
67 if (stat < 0) | |
68 return(stat); | |
69 stat = find_rootino(); | |
70 if (stat < 0) | |
71 return(stat); | |
72 mpffs_init_done = 1; | |
73 return(0); | |
74 } |