bbfs.h
2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#ifndef __bb_fs_h__
#define __bb_fs_h__
#include <PR/bbtypes.h>
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
/*
* BBplayer file system data structures
*/
#define BB_FL_PAGE_SIZE 512
#define BB_FL_SPARE_SIZE 16
#define BB_FL_BLOCK_SIZE 16384
#define BB_FL_BYTE_TO_BLOCK(x) ((u32)(x)>>14)
#define BB_FL_BLOCK_TO_BYTE(x) ((u32)(x)<<14)
#define BB_FL_KB_TO_BLOCK(x) ((u32)(x)>>4)
#define BB_FL_BLOCK_TO_KB(x) ((u32)(x)<<4)
#define BB_FL_BYTE_TO_PAGE(x) ((u32)(x)>>9)
#define BB_FL_PAGE_TO_BYTE(x) ((u32)(x)<<9)
#define BB_FL_BLOCK_PAGES (BB_FL_BLOCK_SIZE/BB_FL_PAGE_SIZE)
#define BB_FL_ECC0_OFF (525-512)
#define BB_FL_ECC1_OFF (520-512)
#define BB_FL_BLOCK_STATUS_OFF (517-512)
#define BB_FL_BLOCK_LINK_OFF (512-512)
#define BB_FL_BLOCK_LINK_SIZE 2
#define BB_FL_SEQ_OFF (514-512)
/*
* FAT entries are 16-bit block numbers, each pointing to the
* next block in a file or a system-specific code
* Block numbers are relative to the start of the device.
*/
typedef u16 BbFatEntry;
#define BB_FAT_AVAIL 0x0000 /* available block */
#define BB_FAT_LAST 0xFFFF /* last block of a file */
#define BB_FAT_BAD 0xFFFE /* unreadable/writable block */
#define BB_FAT_RESERVED 0xFFFD /* reserved block */
#define BB_FAT16_ENTRIES 4096 /* enough to span 64MB */
#define BB_FAT16_ENTRIES_SHIFT 12 /* enough to span 64MB */
#define BB_INODE16_ENTRIES 409 /* remainder of space in FAT block */
#define BB_INODE16_NAMELEN 11 /* maximum name length */
#define BB_FAT16_MAGIC "BBFS"
#define BB_FAT16_LINK_MAGIC "BBFL"
#define BB_FAT16_CKSUM 0xcad7
#define BB_FAT16_BLOCKS 16 /* number of copies of the fat */
#define BB_SYSTEM_AREA_SIZE 0x100000 /* 384KB reserved for system area */
#define BB_BIG_FILE_THRESHOLD 0x100000 /* allocation hint */
/*
* Inode entries contain the file name, type, first block address
* and file size. There are a fixed number of inodes immediately
* following the FAT entries.
*/
/*
* All fields are big-endian
*/
typedef struct {
u8 name[BB_INODE16_NAMELEN]; /* 8.3 name */
u8 type; /* unused type field */
u16 block; /* address of first block in file */
u16 pad; /* to align on 4-byte boundary */
u32 size; /* size of file in bytes */
} BbInode;
typedef struct { /* FAT for a 16K block size */
BbFatEntry entry[BB_FAT16_ENTRIES];
BbInode inode[BB_INODE16_ENTRIES];
u8 magic[4]; /* 'BBFS' */
u32 seq; /* highest number is current */
u16 link; /* link to another FAT */
u16 cksum; /* mod 2^16 checksum */
} BbFat16;
#define BB_FAT16_NEXT(fat,n) (fat)[(n)>>BB_FAT16_ENTRIES_SHIFT].entry[(n)&(BB_FAT16_ENTRIES-1)]
#endif
#endif