323 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			323 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  |   This file is part of UFFS, the Ultra-low-cost Flash File System. | ||
|  |    | ||
|  |   Copyright (C) 2005-2009 Ricky Zheng <ricky_gz_zheng@yahoo.co.nz> | ||
|  | 
 | ||
|  |   UFFS is free software; you can redistribute it and/or modify it under | ||
|  |   the GNU Library General Public License as published by the Free Software  | ||
|  |   Foundation; either version 2 of the License, or (at your option) any | ||
|  |   later version. | ||
|  | 
 | ||
|  |   UFFS is distributed in the hope that it will be useful, but WITHOUT | ||
|  |   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
|  |   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | ||
|  |   or GNU Library General Public License, as applicable, for more details. | ||
|  |   | ||
|  |   You should have received a copy of the GNU General Public License | ||
|  |   and GNU Library General Public License along with UFFS; if not, write | ||
|  |   to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
|  |   Boston, MA  02110-1301, USA. | ||
|  | 
 | ||
|  |   As a special exception, if other files instantiate templates or use | ||
|  |   macros or inline functions from this file, or you compile this file | ||
|  |   and link it with other works to produce a work based on this file, | ||
|  |   this file does not by itself cause the resulting work to be covered | ||
|  |   by the GNU General Public License. However the source code for this | ||
|  |   file must still be made available in accordance with section (3) of | ||
|  |   the GNU General Public License v2. | ||
|  |   | ||
|  |   This exception does not invalidate any other reasons why a work based | ||
|  |   on this file might be covered by the GNU General Public License. | ||
|  | */ | ||
|  | 
 | ||
|  | /** 
 | ||
|  |  * \file uffs_config.h | ||
|  |  * \brief basic configuration of uffs | ||
|  |  * \author Ricky Zheng | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef _UFFS_CONFIG_H_
 | ||
|  | #define _UFFS_CONFIG_H_
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def UFFS_MAX_PAGE_SIZE | ||
|  |  * \note maximum page size UFFS support | ||
|  |  */ | ||
|  | #define UFFS_MAX_PAGE_SIZE		2048
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def UFFS_MAX_SPARE_SIZE | ||
|  |  */ | ||
|  | #define UFFS_MAX_SPARE_SIZE ((UFFS_MAX_PAGE_SIZE / 256) * 8)
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def UFFS_MAX_ECC_SIZE | ||
|  |  */ | ||
|  | #define UFFS_MAX_ECC_SIZE  ((UFFS_MAX_PAGE_SIZE / 256) * 5)
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def MAX_CACHED_BLOCK_INFO | ||
|  |  * \note uffs cache the block info for opened directories and files, | ||
|  |  *       a practical value is 5 ~ MAX_OBJECT_HANDLE | ||
|  |  */ | ||
|  | #define MAX_CACHED_BLOCK_INFO	50
 | ||
|  | 
 | ||
|  | /** 
 | ||
|  |  * \def MAX_PAGE_BUFFERS | ||
|  |  * \note the bigger value will bring better read/write performance. | ||
|  |  *       but few writing performance will be improved when this  | ||
|  |  *       value is become larger than 'max pages per block' | ||
|  |  */ | ||
|  | #define MAX_PAGE_BUFFERS		40
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /** 
 | ||
|  |  * \def CLONE_BUFFER_THRESHOLD | ||
|  |  * \note reserve buffers for clone. 1 or 2 should be enough. | ||
|  |  */ | ||
|  | #define CLONE_BUFFERS_THRESHOLD	2
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def MAX_SPARE_BUFFERS | ||
|  |  * \note spare buffers are used for lower level flash operations, | ||
|  |  *		 5 should be enough. | ||
|  |  */ | ||
|  | #define MAX_SPARE_BUFFERS		5
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def MAX_DIRTY_PAGES_IN_A_BLOCK  | ||
|  |  * \note this value should be between '2' and the lesser of | ||
|  |  *		 'max pages per block' and (MAX_PAGE_BUFFERS - CLONE_BUFFERS_THRESHOLD - 1). | ||
|  |  * | ||
|  |  *       the smaller the value the frequently the buffer will be flushed. | ||
|  |  */ | ||
|  | #define MAX_DIRTY_PAGES_IN_A_BLOCK 32	
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def MAX_DIRTY_BUF_GROUPS | ||
|  |  */ | ||
|  | #define MAX_DIRTY_BUF_GROUPS	3
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_ENABLE_UFFS_DEBUG_MSG | ||
|  |  * \note Enable debug message output. You must call uffs_InitDebugMessageOutput() | ||
|  |  *      to initialize debug apart from enable debug feature. | ||
|  |  */ | ||
|  | #define CONFIG_ENABLE_UFFS_DEBUG_MSG
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_USE_GLOBAL_FS_LOCK | ||
|  |  * \note use global lock instead of per-device lock. | ||
|  |  *       this is required if you use fd APIs in multi-thread environment. | ||
|  |  */ | ||
|  | #define CONFIG_USE_GLOBAL_FS_LOCK
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_USE_PER_DEVICE_LOCK | ||
|  |  * \note use per-device lock. | ||
|  |  *		 this is required if you use fs APIs in multi-thread environment. | ||
|  |  */ | ||
|  | //#define CONFIG_USE_PER_DEVICE_LOCK
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_USE_STATIC_MEMORY_ALLOCATOR | ||
|  |  * \note uffs will use static memory allocator if this is defined. | ||
|  |  *       to use static memory allocator, you need to provide memory | ||
|  |  *       buffer when creating uffs_Device. | ||
|  |  * | ||
|  |  *       use UFFS_STATIC_BUFF_SIZE() to calculate memory buffer size. | ||
|  |  */ | ||
|  | #define CONFIG_USE_STATIC_MEMORY_ALLOCATOR 0
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR | ||
|  |  * \note  using system platform's 'malloc' and 'free'. | ||
|  |  */ | ||
|  | #define CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR 1
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /** 
 | ||
|  |  * \def CONFIG_FLUSH_BUF_AFTER_WRITE | ||
|  |  * \note UFFS will write all data directly into flash in  | ||
|  |  *       each 'write' call if you enable this option. | ||
|  |  *       (which means lesser data lost when power failure but | ||
|  |  *		 poorer writing performance). | ||
|  |  *		 It's not recommended to open this define for normal applications. | ||
|  |  */ | ||
|  | #define CONFIG_FLUSH_BUF_AFTER_WRITE
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_UFFS_AUTO_LAYOUT_MTD_COMP | ||
|  |  * \note Use Linux MTD compatiable spare placement for UFFS_LAYOUT_AUTO, | ||
|  |  *       only valid for page data size 512 or 2048. | ||
|  |  */ | ||
|  | //#define CONFIG_UFFS_AUTO_LAYOUT_USE_MTD_SCHEME
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /** 
 | ||
|  |  * \def MAX_OBJECT_HANDLE | ||
|  |  * maximum number of object handle  | ||
|  |  */ | ||
|  | #define MAX_OBJECT_HANDLE	50
 | ||
|  | #define FD_SIGNATURE_SHIFT	6	
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def MAX_DIR_HANDLE | ||
|  |  * maximum number of uffs_DIR | ||
|  |  */ | ||
|  | #define MAX_DIR_HANDLE 10	
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def MINIMUN_ERASED_BLOCK | ||
|  |  *  UFFS will not allow appending or creating new files when the free/erased block | ||
|  |  *  is lower then MINIMUN_ERASED_BLOCK. | ||
|  |  */ | ||
|  | #define MINIMUN_ERASED_BLOCK 2
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_CHANGE_MODIFY_TIME | ||
|  |  * \note If defined, closing a file which is opened for writing/appending will | ||
|  |  *       update the file's modify time as well. Disable this feature will save a | ||
|  |  *       lot of writing activities if you frequently open files for write and close it. | ||
|  |  */ | ||
|  | //#define CONFIG_CHANGE_MODIFY_TIME
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_ENABLE_BAD_BLOCK_VERIFY | ||
|  |  * \note allow erase and verify block marked as 'bad' when format UFFS partition. | ||
|  |  *		it's not recommended for most NAND flash. | ||
|  |  */ | ||
|  | #define CONFIG_ENABLE_BAD_BLOCK_VERIFY
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_ERASE_BLOCK_BEFORE_MARK_BAD | ||
|  |  * \note erase block again before mark bad block | ||
|  |  */ | ||
|  | //#define CONFIG_ERASE_BLOCK_BEFORE_MARK_BAD
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_PAGE_WRITE_VERIFY | ||
|  |  * \note verify page data after write, for extra safe data storage. | ||
|  |  */ | ||
|  | #define CONFIG_PAGE_WRITE_VERIFY
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_BAD_BLOCK_POLICY_STRICT | ||
|  |  * \note If this is enabled, UFFS will report the block as 'bad' if any bit-flips found; | ||
|  |  *       otherwise, UFFS report bad block only when ECC failed or reported | ||
|  |  *		 by low level flash driver. | ||
|  |  * | ||
|  |  * \note Enable this will ensure your data always be stored on completely good blocks. | ||
|  |  */ | ||
|  | #define CONFIG_BAD_BLOCK_POLICY_STRICT
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * \def CONFIG_ENABLE_PAGE_DATA_CRC | ||
|  |  * \note If this is enabled, UFFS save page data CRC16 sum in mini header, | ||
|  |  *       it provides extra protection for data integrity. | ||
|  |  */ | ||
|  | #define CONFIG_ENABLE_PAGE_DATA_CRC
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /** micros for calculating buffer sizes */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *	\def UFFS_BLOCK_INFO_BUFFER_SIZE | ||
|  |  *	\brief calculate memory bytes for block info caches | ||
|  |  */ | ||
|  | #define UFFS_BLOCK_INFO_BUFFER_SIZE(n_pages_per_block)	\
 | ||
|  | 			(											\ | ||
|  | 				(										\ | ||
|  | 					sizeof(uffs_BlockInfo) +			\ | ||
|  | 					sizeof(uffs_PageSpare) * n_pages_per_block \ | ||
|  | 				 ) * MAX_CACHED_BLOCK_INFO				\ | ||
|  | 			) | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *	\def UFFS_PAGE_BUFFER_SIZE | ||
|  |  *	\brief calculate memory bytes for page buffers | ||
|  |  */ | ||
|  | #define UFFS_PAGE_BUFFER_SIZE(n_page_size)	\
 | ||
|  | 			(								\ | ||
|  | 				(							\ | ||
|  | 					sizeof(uffs_Buf) + n_page_size	\ | ||
|  | 				) * MAX_PAGE_BUFFERS		\ | ||
|  | 			) | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *	\def UFFS_TREE_BUFFER_SIZE | ||
|  |  *	\brief calculate memory bytes for tree nodes | ||
|  |  */ | ||
|  | #define UFFS_TREE_BUFFER_SIZE(n_blocks) (sizeof(TreeNode) * n_blocks)
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #define UFFS_SPARE_BUFFER_SIZE (MAX_SPARE_BUFFERS * UFFS_MAX_SPARE_SIZE)
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *	\def UFFS_STATIC_BUFF_SIZE | ||
|  |  *	\brief calculate total memory usage of uffs system | ||
|  |  */ | ||
|  | #define UFFS_STATIC_BUFF_SIZE(n_pages_per_block, n_page_size, n_blocks) \
 | ||
|  | 			(		\ | ||
|  | 				UFFS_BLOCK_INFO_BUFFER_SIZE(n_pages_per_block) + \ | ||
|  | 				UFFS_PAGE_BUFFER_SIZE(n_page_size) + \ | ||
|  | 				UFFS_TREE_BUFFER_SIZE(n_blocks) + \ | ||
|  | 				UFFS_SPARE_BUFFER_SIZE \ | ||
|  | 			 ) | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /* config check */ | ||
|  | #if (MAX_PAGE_BUFFERS - CLONE_BUFFERS_THRESHOLD) < 3
 | ||
|  | #error "MAX_PAGE_BUFFERS is too small"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if (MAX_DIRTY_PAGES_IN_A_BLOCK < 2)
 | ||
|  | #error "MAX_DIRTY_PAGES_IN_A_BLOCK should >= 2"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if (MAX_PAGE_BUFFERS - CLONE_BUFFERS_THRESHOLD - 1 < MAX_DIRTY_PAGES_IN_A_BLOCK)
 | ||
|  | #error "MAX_DIRTY_PAGES_IN_A_BLOCK should < (MAX_PAGE_BUFFERS - CLONE_BUFFERS_THRESHOLD)"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if defined(CONFIG_PAGE_WRITE_VERIFY) && (CLONE_BUFFERS_THRESHOLD < 2)
 | ||
|  | #error "CLONE_BUFFERS_THRESHOLD should >= 2 when CONFIG_PAGE_WRITE_VERIFY is enabled."
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if CONFIG_USE_STATIC_MEMORY_ALLOCATOR + CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR > 1
 | ||
|  | #error "Please enable ONLY one memory allocator"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if CONFIG_USE_STATIC_MEMORY_ALLOCATOR + CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR == 0
 | ||
|  | #error "Please enable ONE of memory allocators"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if defined(CONFIG_USE_GLOBAL_FS_LOCK) && defined(CONFIG_USE_PER_DEVICE_LOCK)
 | ||
|  | #error "enable either CONFIG_USE_GLOBAL_FS_LOCK or CONFIG_USE_PER_DEVICE_LOCK, not both"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if (MAX_OBJECT_HANDLE > (1 << FD_SIGNATURE_SHIFT))
 | ||
|  | #error "Please increase FD_SIGNATURE_SHIFT !"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifdef WIN32
 | ||
|  | # pragma warning(disable : 4996)
 | ||
|  | # pragma warning(disable : 4244)
 | ||
|  | # pragma warning(disable : 4214)
 | ||
|  | # pragma warning(disable : 4127)
 | ||
|  | # pragma warning(disable : 4389)
 | ||
|  | # pragma warning(disable : 4100)
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif
 |