📄 saftl.h
字号:
/***********************************************************************************/
/* M-Systems Confidential */
/* Copyright (C) M-Systems Flash Disk Pioneers Ltd. 1995-2003 */
/* All Rights Reserved */
/***********************************************************************************/
/* NOTICE OF M-SYSTEMS OEM */
/* SOFTWARE LICENSE AGREEMENT */
/* */
/* THE USE OF THIS SOFTWARE IS GOVERNED BY A SEPARATE LICENSE */
/* AGREEMENT BETWEEN THE OEM AND M-SYSTEMS. REFER TO THAT AGREEMENT */
/* FOR THE SPECIFIC TERMS AND CONDITIONS OF USE, */
/* OR CONTACT M-SYSTEMS FOR LICENSE ASSISTANCE: */
/* E-MAIL = info@m-sys.com */
/***********************************************************************************/
/*
* $Log: V:/PVCSDB/DiskOnChip/archives/general storage/TrueFFS/src/tl/saftl.h-arc $
*
* Rev 1.11 Jan 27 2004 08:14:00 oris
* Changed comments
*
* Rev 1.10 Sep 30 2003 17:53:36 oris
* Added FL prefix to SECTOR_SIZE and SECTOR_SIZE_BITS
*
* Rev 1.9 Sep 21 2003 10:18:46 OriS
* Added noOfQuickMountUnits to TL private record.
*
* Rev 1.8 Sep 01 2003 19:03:26 oris
* - Changed SAFTL_UNMOUNTED_UNIT from 0xf805 to 0xF810 - Unit not mounted yet
* - Changed SAFTL_TO_BE_ERASED from 0xf806 to 0xF811 - Unit should be erased
* - Added SAFTL_FREE_NOT_ERASED_UNIT 0xf805 - Unused unit that wasa not erased yet
* - Added 2 new fields to the media header:
* ProgrammerName - Programmer name
* ProgrammerVersion - Programmer version
*
* Rev 1.7 Jun 19 2003 13:35:52 OriS
* Removed warnings
*
* Rev 1.6 Jun 16 2003 01:18:50 oris
* Added GetSSC and GetVSO macros.
*
* Rev 1.5 May 16 2003 00:58:46 OriS
* Bug fix - leave binary partition when disk partition is protected might cause media header to become corrupted.
*
* Rev 1.4 May 12 2003 22:53:50 oris
* Added minimal TrueFFS version field in the media header to support future competability.
*
* Rev 1.3 May 11 2003 08:28:42 OriS
* Changed static folding buffer size to 2KB instead of 4KB.
* Added SAFTL_ALGORITHM_SWITCH_PEERCENTAGE definition for setting the percentage of the media to switch folding algorithms.
* Improved cache size default algorithm.
*
* Rev 1.2 May 06 2003 11:55:46 OriS
* Changed SAFTL_K_NUMBER_OF_CACHED_UNITS to FL_NUMBER_OF_CACHED_UNITS
*
* Rev 1.1 Apr 27 2003 09:04:18 Oris
* changed static files wear leveling counter to 0x1000
* Added MAX_BAD_UNIT_IN_FORMAT which controllers the number of allowed dynamic bad blocks.
* Added unused fields to the media header.
*
* Rev 1.0 Apr 09 2003 12:15:54 OriS
* Initial revision.
*
*/
/*******************************************/
/* T r u e F F S S o u r c e F i l e s */
/* --------------------------------------- */
/*******************************************/
/*****************************************************************************
* File Header *
* ----------- *
* Name : saftl.h *
* *
* Description : Data strucute and genreal defintions for SAFTL flash *
* translation layer. *
* *
*****************************************************************************/
#ifndef SAFTL_H
#define SAFTL_H
#include "flbuffer.h"
#include "flflash.h"
#include "fltl.h"
/*********************************/
/* Private macro's Used by SAFTL */
/*********************************/
/* Produce sector number out of unit and sector offset */
#define UnitAndOffset(volPrmPtr,unitNo,sectorNo) \
(((FLDword)((unitNo) + (volPrmPtr)->firstUnit) \
<< (volPrmPtr)->sectorsInUnitBits) + (sectorNo))
/* Failed erasing a unit, mark it as bad */
#define MarkUnitBad(volPrmPtr,wIUnit) \
(volPrmPtr)->LUT[wIUnit] = SAFTL_UNAVAILABLE_UNIT
/* Check if the 2 ANAC are consecutive */
#define ConsecutiveANAC(A,B) \
(((A+1) & SAFTL_CHAIN_LENGTH_MASK) == (B & SAFTL_CHAIN_LENGTH_MASK))
/* Get ANAC from Chain length table */
#define GetANAC(volPrmPtr,wLogicalUnit) \
(((volPrmPtr)->CLT[wLogicalUnit] & SAFTL_ANAC_MASK) >> SAFTL_ANAC_SHIFT)
#define SetANAC(volPrmPtr,wLogicalUnit,val) \
(volPrmPtr)->CLT[wLogicalUnit] &= ~SAFTL_ANAC_MASK; \
(volPrmPtr)->CLT[wLogicalUnit] |= (val) << SAFTL_ANAC_SHIFT
/* Get Chains length from Chain length table */
#define GetChainLength(volPrmPtr,wVirtualUnit) \
((volPrmPtr)->CLT[wVirtualUnit] & SAFTL_CHAIN_LENGTH_MASK)
#define SetChainsLength(volPrmPtr,wVirtualUnit,val) \
(volPrmPtr)->CLT[wVirtualUnit] &= ~SAFTL_CHAIN_LENGTH_MASK; \
(volPrmPtr)->CLT[wVirtualUnit] |= (val)
/* Check if virtual unit is cached */
#define IsUnitCached(volPrmPtr,virtualUnitNo) \
(((volPrmPtr)->VUT[virtualUnitNo] >= SAFTL_CACHED_UNIT) && \
((volPrmPtr)->VUT[virtualUnitNo] != SAFTL_UNUSED_UNIT))
/* Check if virtual unit is in use */
#define IsVirtualUnitFreeOrCached(volPrmPtr,wVirtualUnit) \
(volPrmPtr->VUT[wVirtualUnit] >= SAFTL_CACHED_UNIT)
/* Check if a logical unit is in use */
#define IsLogicalUnitInUse(volPrmPtr,wLogicalUnit) \
(volPrmPtr->LUT[wLogicalUnit] > SAFTL_UNUSED_UNIT_BOUNDARY)
/* Get virtual unit cache entry index */
#define GetCacheIndex(volPrmPtr,wVirtualUnit) \
(((volPrmPtr)->VUT[wVirtualUnit]) & (~SAFTL_CACHED_UNIT))
/* Get pointer to unit cache entry using its index */
#define GetCachePtr(volPrmPtr,wCacheIndex) \
((volPrmPtr)->CT + (wCacheIndex))
/* Get logical address offset in the unit */
#define ToUnitOffset(volPrmPtr,logicalSector) \
(FLWord)((logicalSector) & ((volPrmPtr)->sectorsInUnitMask))
/* Get sector cache entry using the unit cache entry */
#define SectorCacheEntry(volPrmPtr,cachePtr) \
((FLWord FAR1 *)((volPrmPtr)->sectors + \
(((cachePtr) - (volPrmPtr)->CT) << (volPrmPtr)->sectorsInUnitBits)))
/* Change sector number to the begining of the next page */
#define SetToNextPageStart(volPrmPtr,target) \
(((target) & (volPrmPtr)->pageMask) + (volPrmPtr)->minSectorsForNextWrite)
/* Round upwards to full sectors */
#define RoundToSectors(size) \
((((size) + FL_SECTOR_SIZE - 1)>>FL_SECTOR_SIZE_BITS)<<FL_SECTOR_SIZE_BITS)
/* Get VSO value */
#define GetVSO(VSO) \
(LE2((VSO)) & SAFTL_VSO_SECTOR_OFFSET_MASK)
/* Get SSC value */
#define GetSSC(offset,SSC) \
(((offset) == 0) ? 0 : LE2((SSC)) & SAFTL_VSO_SECTOR_OFFSET_MASK)
/* TL/Socket buffer */
#define saftlBuffer volPrmPtr->buffer
/*************************/
/* Customization Section */
/*************************/
/* TL limits */
#if (defined(ENVIRONMENT_VARS) && defined(FL_MALLOC)) /* Set at run time */
#define FL_NUMBER_OF_CACHED_UNITS flCacheSize[flSocketNoOf(volPrmPtr->flash->socket)][partitionNo]
#else /* Set at compile time */
#ifndef FL_NUMBER_OF_CACHED_UNITS
#ifndef FL_MALLOC
#define FL_NUMBER_OF_CACHED_UNITS FL_DEFAULT_CACHE_SIZE_FOR_MINIMAL_CACHE
#else /* FL_MALLOC */
#ifdef FL_TL_CACHE
#define FL_NUMBER_OF_CACHED_UNITS 0xFFFL
#else /* FL_TL_CACHE */
#define FL_NUMBER_OF_CACHED_UNITS FL_DEFAULT_CACHE_SIZE_FOR_MINIMAL_CACHE
#endif /* FL_TL_CACHE */
#endif /* FL_MALLOC */
#endif /* FL_NUMBER_OF_CACHED_UNITS */
#endif /* ENVIRONMENT_VARS && FL_MALLOC */
#ifndef SAFTL_WEAR_LEVELING_LIMIT
#define SAFTL_WEAR_LEVELING_LIMIT 0x1000L /* Limit for wear leveling */
#endif /* SAFTL_WEAR_LEVELING_LIMIT */
#ifndef MAX_UNIT_CHAIN
#ifdef ENVIRONMENT_VARS
#define MAX_UNIT_CHAIN flMaxUnitChain
#else /* ENVIRONMENT_VARS not defined */
#define MAX_UNIT_CHAIN 7
#endif /* ENVIRONMENT_VARS */
#endif /* MAX_UNIT_CHAIN */
#ifndef ASSUMED_FOLDING_BUFFER_SIZE
#define ASSUMED_FOLDING_BUFFER_SIZE 2048
#endif /* ASSUMED_FOLDING_BUFFER_SIZE */
#ifndef ASSUMED_LAST_WRITE_BUFFER_SIZE
#define ASSUMED_LAST_WRITE_BUFFER_SIZE 8192
#endif /* ASSUMED_LAST_WRITE_BUFFER_SIZE */
#ifndef SAFTL_MAX_PARTITIONING_TRIES
#define SAFTL_MAX_PARTITIONING_TRIES 5
#endif /* SAFTL_MAX_PARTITIONING_TRIES */
#ifndef SAFTL_ALGORITHM_SWITCH_PEERCENTAGE
#define SAFTL_ALGORITHM_SWITCH_PEERCENTAGE 65
#endif /* SAFTL_ALGORITHM_SWITCH_PEERCENTAGE */
/***********************/
/* General Definitions */
/***********************/
/* Media flags */
/* Partition flags */
#define SAFTL_RUGGEDIZED 0x01000000L
#define SAFTL_BINARY 0x02000000L
#define SAFTL_BDTL 0x04000000L
#define SAFTL_LAST 0x08000000L
#define SAFTL_QUICK_MOUNT 0x10000000L
#define SAFTL_ADVANCED_MATCHING 0x00100000L
#define SAFTL_REL_PARTITION 0x00200000L
#define SAFTL_FAST_PARTITION 0x00400000L
#define SAFTL_NO_MATCHING 0x00800000L
/* PROTECTABLE defined in flflash.h as 1 */
/* READ_PROTECTED defined in flflash.h as 2 */
/* WRITE_PROTECTED defined in flflash.h as 4 */
/* LOCK_ENABLED defined in flflash.h as 8 */
/* LOCK_ASSERTED defined in flflash.h as 16 */
/* KEY_INSERTED defined in flflash.h as 32 */
/* CHANGEABLE_PROTECTION defined in flflash.h as 64 */
/* STICKY_LOCK_ASSERTED defined in flflash.h as 128 */
/* VUT values */
#define SAFTL_CACHED_UNIT 0xF000 /* Indicates a unit is cached */
/* Additional LUT values valid only during the mount proccess */
#define SAFTL_UNMOUNTED_UNIT 0xF810 /* Unit not mounted yet */
#define SAFTL_TO_BE_ERASED 0xF811 /* Unit should be erased */
/* LUT values */
#define SAFTL_UNINITIALIZED_OLDEST 0xF800 /* Oldest in chain unit with */
/* uninitialized last used sector */
#define SAFTL_FREE_UNIT 0xF801 /* Unused logical unit */
#define SAFTL_BAD_UNIT 0xF802 /* Unsable unit marked by the MTD */
#define SAFTL_UNAVAILABLE_UNIT 0xF803 /* Unsable unit marked by the TL */
#define SAFTL_FAILED_TO_ERASE 0xF804 /* Failed erasing this unit, try */
#define SAFTL_FREE_NOT_ERASED_UNIT 0xF805 /* Unused unit that was not */
/* verified as an erased unit */
#define SAFTL_UNUSED_UNIT_BOUNDARY 0xF800 /* Higher LUT value indicate the */
/* unit is not in use. */
#define SAFTL_OLDER_UNIT_LIMIT 0xEFFF /* Largest LUT value that points */
/* to older logical unit */
/* not to use it */
/* Both LUT and VUT values */
#define SAFTL_UNUSED_UNIT 0xFFFF
/* Sector values */
#define SAFTL_INVALID_SECTOR_NO 0xFFFFFFFF /* ANAND_UNASSIGNED_ADDRESS */
/* Sector cache entrie values */
#define SAFTL_SECTOR_NOT_VALID 0x8001 /* Uninitialized */
#define SAFTL_SECTOR_NOT_FOUND 0x8000 /* Deleted or never written */
#define SAFTL_NONE_USED_SECTOR_MASK 0x8000 /* Either of the above */
/* Sector flash flags */
#define SAFTL_VSO_SECTOR_FREE_FLAG 0xC000 /* Sector is free : 14-15 LSB */
#define SAFTL_VSO_SECTOR_USED_FLAG 0x8000 /* Sector is used : 14-15 LSB */
#define SAFTL_VSO_SECTOR_TRANSACTION 0x3800 /* 11-13 LSB - transaction */
#define SAFTL_SSC_SECTOR_RESERVED 0xC000 /* 14-15 LSB - SSC reserved */
#define SAFTL_ANAC_SECTOR_RESERVED 0x70 /* 4-6 LSB - ANAC reserved */
/* Sector flash masks */
#define SAFTL_VSO_SECTOR_OFFSET_MASK 0x7FF /* 0-10 LSB - sector offset */
#define SAFTL_VSO_SECTOR_TRANSACTION_MASK 0x3800 /* 11-13 LSB - sector transcation */
#define SAFTL_VSO_SECTOR_FLAGS_MASK 0xC000 /* 14-15 LSB - sector flags */
#define SAFTL_SSC_RESERVED_MASK 0xC000 /* 14-15 LSB - SSC reserved */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -