xref: /nrf52832-nimble/rt-thread/components/dfs/filesystems/uffs/uffs_config.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero   This file is part of UFFS, the Ultra-low-cost Flash File System.
3*10465441SEvalZero 
4*10465441SEvalZero   Copyright (C) 2005-2009 Ricky Zheng <[email protected]>
5*10465441SEvalZero 
6*10465441SEvalZero   UFFS is free software; you can redistribute it and/or modify it under
7*10465441SEvalZero   the GNU Library General Public License as published by the Free Software
8*10465441SEvalZero   Foundation; either version 2 of the License, or (at your option) any
9*10465441SEvalZero   later version.
10*10465441SEvalZero 
11*10465441SEvalZero   UFFS is distributed in the hope that it will be useful, but WITHOUT
12*10465441SEvalZero   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*10465441SEvalZero   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*10465441SEvalZero   or GNU Library General Public License, as applicable, for more details.
15*10465441SEvalZero 
16*10465441SEvalZero   You should have received a copy of the GNU General Public License
17*10465441SEvalZero   and GNU Library General Public License along with UFFS; if not, write
18*10465441SEvalZero   to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19*10465441SEvalZero   Boston, MA  02110-1301, USA.
20*10465441SEvalZero 
21*10465441SEvalZero   As a special exception, if other files instantiate templates or use
22*10465441SEvalZero   macros or inline functions from this file, or you compile this file
23*10465441SEvalZero   and link it with other works to produce a work based on this file,
24*10465441SEvalZero   this file does not by itself cause the resulting work to be covered
25*10465441SEvalZero   by the GNU General Public License. However the source code for this
26*10465441SEvalZero   file must still be made available in accordance with section (3) of
27*10465441SEvalZero   the GNU General Public License v2.
28*10465441SEvalZero 
29*10465441SEvalZero   This exception does not invalidate any other reasons why a work based
30*10465441SEvalZero   on this file might be covered by the GNU General Public License.
31*10465441SEvalZero */
32*10465441SEvalZero 
33*10465441SEvalZero /**
34*10465441SEvalZero  * \file uffs_config.h
35*10465441SEvalZero  * \brief basic configuration of uffs
36*10465441SEvalZero  * \author Ricky Zheng
37*10465441SEvalZero  */
38*10465441SEvalZero 
39*10465441SEvalZero #ifndef _UFFS_CONFIG_H_
40*10465441SEvalZero #define _UFFS_CONFIG_H_
41*10465441SEvalZero 
42*10465441SEvalZero /**
43*10465441SEvalZero  * \def UFFS_MAX_PAGE_SIZE
44*10465441SEvalZero  * \note maximum page size UFFS support
45*10465441SEvalZero  */
46*10465441SEvalZero #define UFFS_MAX_PAGE_SIZE		2048
47*10465441SEvalZero 
48*10465441SEvalZero /**
49*10465441SEvalZero  * \def UFFS_MAX_SPARE_SIZE
50*10465441SEvalZero  */
51*10465441SEvalZero #define UFFS_MAX_SPARE_SIZE ((UFFS_MAX_PAGE_SIZE / 256) * 8)
52*10465441SEvalZero 
53*10465441SEvalZero /**
54*10465441SEvalZero  * \def UFFS_MAX_ECC_SIZE
55*10465441SEvalZero  */
56*10465441SEvalZero #define UFFS_MAX_ECC_SIZE  ((UFFS_MAX_PAGE_SIZE / 256) * 5)
57*10465441SEvalZero 
58*10465441SEvalZero /**
59*10465441SEvalZero  * \def MAX_CACHED_BLOCK_INFO
60*10465441SEvalZero  * \note uffs cache the block info for opened directories and files,
61*10465441SEvalZero  *       a practical value is 5 ~ MAX_OBJECT_HANDLE
62*10465441SEvalZero  */
63*10465441SEvalZero #define MAX_CACHED_BLOCK_INFO	50
64*10465441SEvalZero 
65*10465441SEvalZero /**
66*10465441SEvalZero  * \def MAX_PAGE_BUFFERS
67*10465441SEvalZero  * \note the bigger value will bring better read/write performance.
68*10465441SEvalZero  *       but few writing performance will be improved when this
69*10465441SEvalZero  *       value is become larger than 'max pages per block'
70*10465441SEvalZero  */
71*10465441SEvalZero #define MAX_PAGE_BUFFERS		40
72*10465441SEvalZero 
73*10465441SEvalZero 
74*10465441SEvalZero /**
75*10465441SEvalZero  * \def CLONE_BUFFER_THRESHOLD
76*10465441SEvalZero  * \note reserve buffers for clone. 1 or 2 should be enough.
77*10465441SEvalZero  */
78*10465441SEvalZero #define CLONE_BUFFERS_THRESHOLD	2
79*10465441SEvalZero 
80*10465441SEvalZero /**
81*10465441SEvalZero  * \def MAX_SPARE_BUFFERS
82*10465441SEvalZero  * \note spare buffers are used for lower level flash operations,
83*10465441SEvalZero  *		 5 should be enough.
84*10465441SEvalZero  */
85*10465441SEvalZero #define MAX_SPARE_BUFFERS		5
86*10465441SEvalZero 
87*10465441SEvalZero 
88*10465441SEvalZero /**
89*10465441SEvalZero  * \def MAX_DIRTY_PAGES_IN_A_BLOCK
90*10465441SEvalZero  * \note this value should be between '2' and the lesser of
91*10465441SEvalZero  *		 'max pages per block' and (MAX_PAGE_BUFFERS - CLONE_BUFFERS_THRESHOLD - 1).
92*10465441SEvalZero  *
93*10465441SEvalZero  *       the smaller the value the frequently the buffer will be flushed.
94*10465441SEvalZero  */
95*10465441SEvalZero #define MAX_DIRTY_PAGES_IN_A_BLOCK 32
96*10465441SEvalZero 
97*10465441SEvalZero /**
98*10465441SEvalZero  * \def MAX_DIRTY_BUF_GROUPS
99*10465441SEvalZero  */
100*10465441SEvalZero #define MAX_DIRTY_BUF_GROUPS	3
101*10465441SEvalZero 
102*10465441SEvalZero /**
103*10465441SEvalZero  * \def CONFIG_ENABLE_UFFS_DEBUG_MSG
104*10465441SEvalZero  * \note Enable debug message output. You must call uffs_InitDebugMessageOutput()
105*10465441SEvalZero  *      to initialize debug apart from enable debug feature.
106*10465441SEvalZero  */
107*10465441SEvalZero #define CONFIG_ENABLE_UFFS_DEBUG_MSG
108*10465441SEvalZero 
109*10465441SEvalZero /**
110*10465441SEvalZero  * \def CONFIG_USE_GLOBAL_FS_LOCK
111*10465441SEvalZero  * \note use global lock instead of per-device lock.
112*10465441SEvalZero  *       this is required if you use fd APIs in multi-thread environment.
113*10465441SEvalZero  */
114*10465441SEvalZero #define CONFIG_USE_GLOBAL_FS_LOCK
115*10465441SEvalZero 
116*10465441SEvalZero 
117*10465441SEvalZero /**
118*10465441SEvalZero  * \def CONFIG_USE_PER_DEVICE_LOCK
119*10465441SEvalZero  * \note use per-device lock.
120*10465441SEvalZero  *		 this is required if you use fs APIs in multi-thread environment.
121*10465441SEvalZero  */
122*10465441SEvalZero //#define CONFIG_USE_PER_DEVICE_LOCK
123*10465441SEvalZero 
124*10465441SEvalZero 
125*10465441SEvalZero 
126*10465441SEvalZero /**
127*10465441SEvalZero  * \def CONFIG_USE_STATIC_MEMORY_ALLOCATOR
128*10465441SEvalZero  * \note uffs will use static memory allocator if this is defined.
129*10465441SEvalZero  *       to use static memory allocator, you need to provide memory
130*10465441SEvalZero  *       buffer when creating uffs_Device.
131*10465441SEvalZero  *
132*10465441SEvalZero  *       use UFFS_STATIC_BUFF_SIZE() to calculate memory buffer size.
133*10465441SEvalZero  */
134*10465441SEvalZero #define CONFIG_USE_STATIC_MEMORY_ALLOCATOR 0
135*10465441SEvalZero 
136*10465441SEvalZero /**
137*10465441SEvalZero  * \def CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR
138*10465441SEvalZero  * \note  using system platform's 'malloc' and 'free'.
139*10465441SEvalZero  */
140*10465441SEvalZero #define CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR 1
141*10465441SEvalZero 
142*10465441SEvalZero 
143*10465441SEvalZero 
144*10465441SEvalZero /**
145*10465441SEvalZero  * \def CONFIG_FLUSH_BUF_AFTER_WRITE
146*10465441SEvalZero  * \note UFFS will write all data directly into flash in
147*10465441SEvalZero  *       each 'write' call if you enable this option.
148*10465441SEvalZero  *       (which means lesser data lost when power failure but
149*10465441SEvalZero  *		 poorer writing performance).
150*10465441SEvalZero  *		 It's not recommended to open this define for normal applications.
151*10465441SEvalZero  */
152*10465441SEvalZero #define CONFIG_FLUSH_BUF_AFTER_WRITE
153*10465441SEvalZero 
154*10465441SEvalZero 
155*10465441SEvalZero /**
156*10465441SEvalZero  * \def CONFIG_UFFS_AUTO_LAYOUT_MTD_COMP
157*10465441SEvalZero  * \note Use Linux MTD compatiable spare placement for UFFS_LAYOUT_AUTO,
158*10465441SEvalZero  *       only valid for page data size 512 or 2048.
159*10465441SEvalZero  */
160*10465441SEvalZero //#define CONFIG_UFFS_AUTO_LAYOUT_USE_MTD_SCHEME
161*10465441SEvalZero 
162*10465441SEvalZero 
163*10465441SEvalZero /**
164*10465441SEvalZero  * \def MAX_OBJECT_HANDLE
165*10465441SEvalZero  * maximum number of object handle
166*10465441SEvalZero  */
167*10465441SEvalZero #define MAX_OBJECT_HANDLE	50
168*10465441SEvalZero #define FD_SIGNATURE_SHIFT	6
169*10465441SEvalZero 
170*10465441SEvalZero 
171*10465441SEvalZero /**
172*10465441SEvalZero  * \def MAX_DIR_HANDLE
173*10465441SEvalZero  * maximum number of uffs_DIR
174*10465441SEvalZero  */
175*10465441SEvalZero #define MAX_DIR_HANDLE 10
176*10465441SEvalZero 
177*10465441SEvalZero /**
178*10465441SEvalZero  * \def MINIMUN_ERASED_BLOCK
179*10465441SEvalZero  *  UFFS will not allow appending or creating new files when the free/erased block
180*10465441SEvalZero  *  is lower then MINIMUN_ERASED_BLOCK.
181*10465441SEvalZero  */
182*10465441SEvalZero #define MINIMUN_ERASED_BLOCK 2
183*10465441SEvalZero 
184*10465441SEvalZero /**
185*10465441SEvalZero  * \def CONFIG_CHANGE_MODIFY_TIME
186*10465441SEvalZero  * \note If defined, closing a file which is opened for writing/appending will
187*10465441SEvalZero  *       update the file's modify time as well. Disable this feature will save a
188*10465441SEvalZero  *       lot of writing activities if you frequently open files for write and close it.
189*10465441SEvalZero  */
190*10465441SEvalZero //#define CONFIG_CHANGE_MODIFY_TIME
191*10465441SEvalZero 
192*10465441SEvalZero 
193*10465441SEvalZero /**
194*10465441SEvalZero  * \def CONFIG_ENABLE_BAD_BLOCK_VERIFY
195*10465441SEvalZero  * \note allow erase and verify block marked as 'bad' when format UFFS partition.
196*10465441SEvalZero  *		it's not recommended for most NAND flash.
197*10465441SEvalZero  */
198*10465441SEvalZero #define CONFIG_ENABLE_BAD_BLOCK_VERIFY
199*10465441SEvalZero 
200*10465441SEvalZero /**
201*10465441SEvalZero  * \def CONFIG_ERASE_BLOCK_BEFORE_MARK_BAD
202*10465441SEvalZero  * \note erase block again before mark bad block
203*10465441SEvalZero  */
204*10465441SEvalZero //#define CONFIG_ERASE_BLOCK_BEFORE_MARK_BAD
205*10465441SEvalZero 
206*10465441SEvalZero /**
207*10465441SEvalZero  * \def CONFIG_PAGE_WRITE_VERIFY
208*10465441SEvalZero  * \note verify page data after write, for extra safe data storage.
209*10465441SEvalZero  */
210*10465441SEvalZero #define CONFIG_PAGE_WRITE_VERIFY
211*10465441SEvalZero 
212*10465441SEvalZero /**
213*10465441SEvalZero  * \def CONFIG_BAD_BLOCK_POLICY_STRICT
214*10465441SEvalZero  * \note If this is enabled, UFFS will report the block as 'bad' if any bit-flips found;
215*10465441SEvalZero  *       otherwise, UFFS report bad block only when ECC failed or reported
216*10465441SEvalZero  *		 by low level flash driver.
217*10465441SEvalZero  *
218*10465441SEvalZero  * \note Enable this will ensure your data always be stored on completely good blocks.
219*10465441SEvalZero  */
220*10465441SEvalZero #define CONFIG_BAD_BLOCK_POLICY_STRICT
221*10465441SEvalZero 
222*10465441SEvalZero 
223*10465441SEvalZero /**
224*10465441SEvalZero  * \def CONFIG_ENABLE_PAGE_DATA_CRC
225*10465441SEvalZero  * \note If this is enabled, UFFS save page data CRC16 sum in mini header,
226*10465441SEvalZero  *       it provides extra protection for data integrity.
227*10465441SEvalZero  */
228*10465441SEvalZero #define CONFIG_ENABLE_PAGE_DATA_CRC
229*10465441SEvalZero 
230*10465441SEvalZero 
231*10465441SEvalZero /** micros for calculating buffer sizes */
232*10465441SEvalZero 
233*10465441SEvalZero /**
234*10465441SEvalZero  *	\def UFFS_BLOCK_INFO_BUFFER_SIZE
235*10465441SEvalZero  *	\brief calculate memory bytes for block info caches
236*10465441SEvalZero  */
237*10465441SEvalZero #define UFFS_BLOCK_INFO_BUFFER_SIZE(n_pages_per_block)	\
238*10465441SEvalZero 			(											\
239*10465441SEvalZero 				(										\
240*10465441SEvalZero 					sizeof(uffs_BlockInfo) +			\
241*10465441SEvalZero 					sizeof(uffs_PageSpare) * n_pages_per_block \
242*10465441SEvalZero 				 ) * MAX_CACHED_BLOCK_INFO				\
243*10465441SEvalZero 			)
244*10465441SEvalZero 
245*10465441SEvalZero /**
246*10465441SEvalZero  *	\def UFFS_PAGE_BUFFER_SIZE
247*10465441SEvalZero  *	\brief calculate memory bytes for page buffers
248*10465441SEvalZero  */
249*10465441SEvalZero #define UFFS_PAGE_BUFFER_SIZE(n_page_size)	\
250*10465441SEvalZero 			(								\
251*10465441SEvalZero 				(							\
252*10465441SEvalZero 					sizeof(uffs_Buf) + n_page_size	\
253*10465441SEvalZero 				) * MAX_PAGE_BUFFERS		\
254*10465441SEvalZero 			)
255*10465441SEvalZero 
256*10465441SEvalZero /**
257*10465441SEvalZero  *	\def UFFS_TREE_BUFFER_SIZE
258*10465441SEvalZero  *	\brief calculate memory bytes for tree nodes
259*10465441SEvalZero  */
260*10465441SEvalZero #define UFFS_TREE_BUFFER_SIZE(n_blocks) (sizeof(TreeNode) * n_blocks)
261*10465441SEvalZero 
262*10465441SEvalZero 
263*10465441SEvalZero #define UFFS_SPARE_BUFFER_SIZE (MAX_SPARE_BUFFERS * UFFS_MAX_SPARE_SIZE)
264*10465441SEvalZero 
265*10465441SEvalZero 
266*10465441SEvalZero /**
267*10465441SEvalZero  *	\def UFFS_STATIC_BUFF_SIZE
268*10465441SEvalZero  *	\brief calculate total memory usage of uffs system
269*10465441SEvalZero  */
270*10465441SEvalZero #define UFFS_STATIC_BUFF_SIZE(n_pages_per_block, n_page_size, n_blocks) \
271*10465441SEvalZero 			(		\
272*10465441SEvalZero 				UFFS_BLOCK_INFO_BUFFER_SIZE(n_pages_per_block) + \
273*10465441SEvalZero 				UFFS_PAGE_BUFFER_SIZE(n_page_size) + \
274*10465441SEvalZero 				UFFS_TREE_BUFFER_SIZE(n_blocks) + \
275*10465441SEvalZero 				UFFS_SPARE_BUFFER_SIZE \
276*10465441SEvalZero 			 )
277*10465441SEvalZero 
278*10465441SEvalZero 
279*10465441SEvalZero 
280*10465441SEvalZero /* config check */
281*10465441SEvalZero #if (MAX_PAGE_BUFFERS - CLONE_BUFFERS_THRESHOLD) < 3
282*10465441SEvalZero #error "MAX_PAGE_BUFFERS is too small"
283*10465441SEvalZero #endif
284*10465441SEvalZero 
285*10465441SEvalZero #if (MAX_DIRTY_PAGES_IN_A_BLOCK < 2)
286*10465441SEvalZero #error "MAX_DIRTY_PAGES_IN_A_BLOCK should >= 2"
287*10465441SEvalZero #endif
288*10465441SEvalZero 
289*10465441SEvalZero #if (MAX_PAGE_BUFFERS - CLONE_BUFFERS_THRESHOLD - 1 < MAX_DIRTY_PAGES_IN_A_BLOCK)
290*10465441SEvalZero #error "MAX_DIRTY_PAGES_IN_A_BLOCK should < (MAX_PAGE_BUFFERS - CLONE_BUFFERS_THRESHOLD)"
291*10465441SEvalZero #endif
292*10465441SEvalZero 
293*10465441SEvalZero #if defined(CONFIG_PAGE_WRITE_VERIFY) && (CLONE_BUFFERS_THRESHOLD < 2)
294*10465441SEvalZero #error "CLONE_BUFFERS_THRESHOLD should >= 2 when CONFIG_PAGE_WRITE_VERIFY is enabled."
295*10465441SEvalZero #endif
296*10465441SEvalZero 
297*10465441SEvalZero #if CONFIG_USE_STATIC_MEMORY_ALLOCATOR + CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR > 1
298*10465441SEvalZero #error "Please enable ONLY one memory allocator"
299*10465441SEvalZero #endif
300*10465441SEvalZero 
301*10465441SEvalZero #if CONFIG_USE_STATIC_MEMORY_ALLOCATOR + CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR == 0
302*10465441SEvalZero #error "Please enable ONE of memory allocators"
303*10465441SEvalZero #endif
304*10465441SEvalZero 
305*10465441SEvalZero #if defined(CONFIG_USE_GLOBAL_FS_LOCK) && defined(CONFIG_USE_PER_DEVICE_LOCK)
306*10465441SEvalZero #error "enable either CONFIG_USE_GLOBAL_FS_LOCK or CONFIG_USE_PER_DEVICE_LOCK, not both"
307*10465441SEvalZero #endif
308*10465441SEvalZero 
309*10465441SEvalZero #if (MAX_OBJECT_HANDLE > (1 << FD_SIGNATURE_SHIFT))
310*10465441SEvalZero #error "Please increase FD_SIGNATURE_SHIFT !"
311*10465441SEvalZero #endif
312*10465441SEvalZero 
313*10465441SEvalZero #ifdef WIN32
314*10465441SEvalZero # pragma warning(disable : 4996)
315*10465441SEvalZero # pragma warning(disable : 4244)
316*10465441SEvalZero # pragma warning(disable : 4214)
317*10465441SEvalZero # pragma warning(disable : 4127)
318*10465441SEvalZero # pragma warning(disable : 4389)
319*10465441SEvalZero # pragma warning(disable : 4100)
320*10465441SEvalZero #endif
321*10465441SEvalZero 
322*10465441SEvalZero #endif
323