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
|
#pragma src "/usr/inferno/libnandfs"
enum {
NandfsL2PageSize = 9,
NandfsPageSize = 1 << NandfsL2PageSize,
NandfsAuxiliarySize = 16,
NandfsFullSize = NandfsPageSize + NandfsAuxiliarySize,
NandfsPathBits = 26,
NandfsPathMask = ((1 << NandfsPathBits) - 1),
NandfsNeraseBits = 18,
NandfsNeraseMask = ((1 << NandfsNeraseBits) - 1),
};
typedef struct Nandfs Nandfs;
typedef struct NandfsTags {
ulong path; // 26 bits
ulong nerase; // 18 bits
uchar tag; // 8 bits
uchar magic; // 8 bits
} NandfsTags;
char *nandfsinit(void *magic, long rawsize, long rawblocksize,
char *(*read)(void *magic, void *buf, long nbytes, ulong offset),
char *(*write)(void *magic, void *buf, long nbytes, ulong offset),
char *(*erase)(void *magic, long blockaddr),
char *(*sync)(void *magic),
LogfsLowLevel **llp);
void nandfsfree(Nandfs *nandfs);
char *nandfsreadpageauxiliary(Nandfs *nandfs, NandfsTags *tags, long block, int page, int correct, LogfsLowLevelReadResult *result);
void nandfssetmagic(Nandfs *nandfs, void *magic);
char *nandfswritepageauxiliary(Nandfs *nandfs, NandfsTags *tags, long absblock, int page);
char *nandfsreadpage(Nandfs *nandfs, void *buf, NandfsTags *tags, long block, int page, int reportbad, LogfsLowLevelReadResult *result);
char *nandfsreadpagerange(Nandfs *nandfs, void *buf, long block, int page, int offset, int count, LogfsLowLevelReadResult *result);
char *nandfsupdatepage(Nandfs *nandfs, void *buf, ulong path, uchar tag, long block, int page);
long nandfsgetnerase(Nandfs *nandfs, long block);
void nandfssetnerase(Nandfs *nandfs, long block, ulong nerase);
void nandfssetpartial(Nandfs *nandfs, long block, int partial);
char *nandfsmarkabsblockbad(Nandfs *nandfs, long absblock);
/* low level interface functions */
char *nandfsopen(Nandfs *nandfs, long base, long limit, int trace, int xcount, long *data);
short nandfsgettag(Nandfs *nandfs, long block);
void nandfssettag(Nandfs *nandfs, long block, short tag);
long nandfsgetpath(Nandfs *nandfs, long block);
void nandfssetpath(Nandfs *nandfs, long block, ulong path);
int nandfsgetblockpartialformatstatus(Nandfs *nandfs, long block);
long nandfsfindfreeblock(Nandfs *nandfs, long *freeblocksp);
char *nandfsreadblock(Nandfs *nandfs, void *buf, long block, LogfsLowLevelReadResult *blocke);
char *nandfswriteblock(Nandfs *nandfs, void *buf, uchar tag, ulong path, int xcount, long *data, long block);
char *nandfswritepage(Nandfs *nandfs, void *buf, long block, int page);
char *nandfseraseblock(Nandfs *nandfs, long block, void **llsavep, int *markedbad);
char *nandfsformatblock(Nandfs *nandfs, long block, uchar tag, ulong path, long baseblock, long sizeinblocks, int xcount, long *xdata, void *llsave, int *markedbad);
char *nandfsreformatblock(Nandfs *nandfs, long block, uchar tag, ulong path, int xcount, long *xdata, void *llsave, int *markedbad);
char *nandfsmarkblockbad(Nandfs *nandfs, long block);
int nandfsgetpagesize(Nandfs *nandfs);
int nandfsgetpagesperblock(Nandfs *nandfs);
long nandfsgetblocks(Nandfs *nandfs);
long nandfsgetbaseblock(Nandfs *nandfs);
int nandfsgetblocksize(Nandfs *nandfs);
ulong nandfscalcrawaddress(Nandfs *nandfs, long pblock, int dataoffset);
char *nandfsgetblockstatus(Nandfs *nandfs, long block, int *magicfound, void **llsave, LogfsLowLevelReadResult *result);
int nandfscalcformat(Nandfs *nandfs, long base, long limit, long bootsize, long *baseblock, long *limitblock, long *bootblocks);
int nandfsgetopenstatus(Nandfs *nandfs);
char *nandfssync(Nandfs *nandfs);
/* defined in environment */
void *nandfsrealloc(void *p, ulong size);
void nandfsfreemem(void *p);
|