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