summaryrefslogtreecommitdiff
path: root/direct/yaffscfg2k.c
blob: 849a56d4b9555b0d28dcdc63462f0210477c3e1c (plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/*
 * YAFFS: Yet another FFS. A NAND-flash specific file system.
 * yaffscfg.c  The configuration for the "direct" use of yaffs.
 *
 * This file is intended to be modified to your requirements.
 * There is no need to redistribute this file.
 */

#include "yaffscfg.h"
#include "yaffsfs.h"
#include "yaffs_fileem2k.h"
#include "yaffs_nandemul2k.h"

#include <errno.h>

unsigned yaffs_traceMask = YAFFS_TRACE_SCAN |  YAFFS_TRACE_GC /*| YAFFS_TRACE_GC_DETAIL | YAFFS_TRACE_WRITE */ | YAFFS_TRACE_ERASE | YAFFS_TRACE_TRACING | YAFFS_TRACE_ALLOCATE | YAFFS_TRACE_CHECKPOINT;


void yaffsfs_SetError(int err)
{
	//Do whatever to set error
	errno = err;
}

void yaffsfs_Lock(void)
{
}

void yaffsfs_Unlock(void)
{
}

__u32 yaffsfs_CurrentTime(void)
{
	return 0;
}

void yaffsfs_LocalInitialisation(void)
{
	// Define locking semaphore.
}

// Configuration for:
// /ram  2MB ramdisk
// /boot 2MB boot disk (flash)
// /flash 14MB flash disk (flash)
// NB Though /boot and /flash occupy the same physical device they
// are still disticnt "yaffs_Devices. You may think of these as "partitions"
// using non-overlapping areas in the same device.
// 

#include "yaffs_ramdisk.h"
#include "yaffs_flashif.h"
#include "yaffs_nandemul2k.h"

static yaffs_Device ramDev;
static yaffs_Device bootDev;
static yaffs_Device flashDev;
static yaffs_Device ram2kDev;

static yaffsfs_DeviceConfiguration yaffsfs_config[] = {
#if 0
	{ "/ram", &ramDev},
	{ "/boot", &bootDev},
	{ "/flash/", &flashDev},
	{ "/ram2k", &ram2kDev},
	{(void *)0,(void *)0}
#else
	{ "/", &ramDev},
	{ "/flash/boot", &bootDev},
	{ "/flash/flash", &flashDev},
	{ "/ram2k", &ram2kDev},
	{(void *)0,(void *)0} /* Null entry to terminate list */
#endif
};


int yaffs_StartUp(void)
{
	// Stuff to configure YAFFS
	// Stuff to initialise anything special (eg lock semaphore).
	yaffsfs_LocalInitialisation();
	
	// Set up devices
	// /ram
	memset(&ramDev,0,sizeof(ramDev));
	ramDev.nBytesPerChunk = 512;
	ramDev.nChunksPerBlock = 32;
	ramDev.nReservedBlocks = 2; // Set this smaller for RAM
	ramDev.startBlock = 0; // Can use block 0
	ramDev.endBlock = 127; // Last block in 2MB.	
	//ramDev.useNANDECC = 1;
	ramDev.nShortOpCaches = 0;	// Disable caching on this device.
	ramDev.genericDevice = (void *) 0;	// Used to identify the device in fstat.
	ramDev.writeChunkWithTagsToNAND = yramdisk_WriteChunkWithTagsToNAND;
	ramDev.readChunkWithTagsFromNAND = yramdisk_ReadChunkWithTagsFromNAND;
	ramDev.eraseBlockInNAND = yramdisk_EraseBlockInNAND;
	ramDev.initialiseNAND = yramdisk_InitialiseNAND;

	// /boot
	memset(&bootDev,0,sizeof(bootDev));
	bootDev.nBytesPerChunk = 512;
	bootDev.nChunksPerBlock = 32;
	bootDev.nReservedBlocks = 5;
	bootDev.startBlock = 0; // Can use block 0
	bootDev.endBlock = 63; // Last block
	//bootDev.useNANDECC = 0; // use YAFFS's ECC
	bootDev.nShortOpCaches = 10; // Use caches
	bootDev.genericDevice = (void *) 1;	// Used to identify the device in fstat.
	bootDev.writeChunkWithTagsToNAND = yflash_WriteChunkWithTagsToNAND;
	bootDev.readChunkWithTagsFromNAND = yflash_ReadChunkWithTagsFromNAND;
	bootDev.eraseBlockInNAND = yflash_EraseBlockInNAND;
	bootDev.initialiseNAND = yflash_InitialiseNAND;
	bootDev.markNANDBlockBad = yflash_MarkNANDBlockBad;
	bootDev.queryNANDBlock = yflash_QueryNANDBlock;



	// /flash
	// Set this puppy up to use
	// the file emulation space as
	// 2kpage/64chunk per block/128MB device
	memset(&flashDev,0,sizeof(flashDev));

	flashDev.nBytesPerChunk = 2048;
	flashDev.nChunksPerBlock = 64;
	flashDev.nReservedBlocks = 5;
	flashDev.nCheckpointReservedBlocks = 5;
	//flashDev.checkpointStartBlock = 1;
	//flashDev.checkpointEndBlock = 20;
	flashDev.startBlock = 20; 
	flashDev.endBlock = 127; // Make it smaller
	//flashDev.endBlock = yflash_GetNumberOfBlocks()-1;
	flashDev.isYaffs2 = 1;
	flashDev.wideTnodesDisabled=0;
	flashDev.nShortOpCaches = 10; // Use caches
	flashDev.genericDevice = (void *) 2;	// Used to identify the device in fstat.
	flashDev.writeChunkWithTagsToNAND = yflash_WriteChunkWithTagsToNAND;
	flashDev.readChunkWithTagsFromNAND = yflash_ReadChunkWithTagsFromNAND;
	flashDev.eraseBlockInNAND = yflash_EraseBlockInNAND;
	flashDev.initialiseNAND = yflash_InitialiseNAND;
	flashDev.markNANDBlockBad = yflash_MarkNANDBlockBad;
	flashDev.queryNANDBlock = yflash_QueryNANDBlock;

	// /ram2k
	// Set this puppy up to use
	// the file emulation space as
	// 2kpage/64chunk per block/128MB device
	memset(&ram2kDev,0,sizeof(ram2kDev));

	ram2kDev.nBytesPerChunk = nandemul2k_GetBytesPerChunk();
	ram2kDev.nChunksPerBlock = nandemul2k_GetChunksPerBlock();
	ram2kDev.nReservedBlocks = 5;
	ram2kDev.startBlock = 0; // First block after /boot
	//ram2kDev.endBlock = 127; // Last block in 16MB
	ram2kDev.endBlock = nandemul2k_GetNumberOfBlocks() - 1; // Last block in 512MB
	ram2kDev.isYaffs2 = 1;
	ram2kDev.nShortOpCaches = 10; // Use caches
	ram2kDev.genericDevice = (void *) 3;	// Used to identify the device in fstat.
	ram2kDev.writeChunkWithTagsToNAND = nandemul2k_WriteChunkWithTagsToNAND;
	ram2kDev.readChunkWithTagsFromNAND = nandemul2k_ReadChunkWithTagsFromNAND;
	ram2kDev.eraseBlockInNAND = nandemul2k_EraseBlockInNAND;
	ram2kDev.initialiseNAND = nandemul2k_InitialiseNAND;
	ram2kDev.markNANDBlockBad = nandemul2k_MarkNANDBlockBad;
	ram2kDev.queryNANDBlock = nandemul2k_QueryNANDBlock;

	yaffs_initialise(yaffsfs_config);
	
	return 0;
}



void SetCheckpointReservedBlocks(int n)
{
	flashDev.nCheckpointReservedBlocks = n;
}