📄 yaffs_guts.h
字号:
/*
* YAFFS: Yet another FFS. A NAND-flash specific file system.
* yaffs_guts.h: Configuration etc for yaffs_guts
*
* Copyright (C) 2002 Aleph One Ltd.
* for Toby Churchill Ltd and Brightstar Engineering
*
* Created by Charles Manning <charles@aleph1.co.uk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 2.1 as
* published by the Free Software Foundation.
*
*
* Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
*
* $Id: yaffs_guts.h,v 1.1 2004/11/03 08:14:07 charles Exp $
*/
#ifndef __YAFFS_GUTS_H__
#define __YAFFS_GUTS_H__
#include "devextras.h"
#include "yportenv.h"
#define YAFFS_OK 1
#define YAFFS_FAIL 0
// Give us a Y=0x59,
// Give us an A=0x41,
// Give us an FF=0xFF
// Give us an S=0x53
// And what have we got...
#define YAFFS_MAGIC 0x5941FF53
#define YAFFS_NTNODES_LEVEL0 16
#define YAFFS_TNODES_LEVEL0_BITS 4
#define YAFFS_TNODES_LEVEL0_MASK 0xf
#define YAFFS_NTNODES_INTERNAL (YAFFS_NTNODES_LEVEL0 / 2)
#define YAFFS_TNODES_INTERNAL_BITS (YAFFS_TNODES_LEVEL0_BITS - 1)
#define YAFFS_TNODES_INTERNAL_MASK 0x7
#define YAFFS_TNODES_MAX_LEVEL 6
#ifndef CONFIG_YAFFS_NO_YAFFS1
#define YAFFS_BYTES_PER_SPARE 16
#define YAFFS_BYTES_PER_CHUNK 512
#define YAFFS_CHUNK_SIZE_SHIFT 9
#define YAFFS_CHUNKS_PER_BLOCK 32
#define YAFFS_BYTES_PER_BLOCK (YAFFS_CHUNKS_PER_BLOCK*YAFFS_BYTES_PER_CHUNK)
#endif
#define YAFFS_MAX_CHUNK_ID 0x000FFFFF
#define YAFFS_UNUSED_OBJECT_ID 0x0003FFFF
#define YAFFS_ALLOCATION_NOBJECTS 100
#define YAFFS_ALLOCATION_NTNODES 100
#define YAFFS_ALLOCATION_NLINKS 100
#define YAFFS_NOBJECT_BUCKETS 256
#define YAFFS_OBJECT_SPACE 0x40000
#ifdef CONFIG_YAFFS_UNICODE
#define YAFFS_MAX_NAME_LENGTH 127
#define YAFFS_MAX_ALIAS_LENGTH 79
#else
#define YAFFS_MAX_NAME_LENGTH 255
#define YAFFS_MAX_ALIAS_LENGTH 159
#endif
#define YAFFS_SHORT_NAME_LENGTH 15
#define YAFFS_OBJECTID_ROOT 1
#define YAFFS_OBJECTID_LOSTNFOUND 2
#define YAFFS_OBJECTID_UNLINKED 3
#define YAFFS_OBJECTID_DELETED 4
#define YAFFS_MAX_SHORT_OP_CACHES 20
#define YAFFS_N_TEMP_BUFFERS 4
// Sequence numbers are used in YAFFS2 to determine block allocation order.
// The range is limited slightly to help distinguish bad numbers from good.
// This also allows us to perhaps in the future use special numbers for
// special purposes.
// EFFFFF00 allows the allocation of 8 blocks per second (~1Mbytes) for 15 years,
// and is a larger number than the lifetime of a 2GB device.
#define YAFFS_LOWEST_SEQUENCE_NUMBER 0x00001000
#define YAFFS_HIGHEST_SEQUENCE_NUMBER 0xEFFFFF00
// ChunkCache is used for short read/write operations.
typedef struct
{
struct yaffs_ObjectStruct *object;
int chunkId;
int lastUse;
int dirty;
int nBytes; // Only valid if the cache is dirty
int locked; // Can't push out or flush while locked..
#ifdef YAFFS2_DEFINES
__u8 *data;
#else
__u8 data[YAFFS_BYTES_PER_CHUNK];
#endif
} yaffs_ChunkCache;
#ifndef CONFIG_YAFFS_NO_YAFFS1
// Tags structures in RAM
// NB This uses bitfield. Bitfields should not straddle a u32 boundary otherwise
// the structure size will get blown out.
typedef struct
{
unsigned chunkId:20;
unsigned serialNumber:2;
unsigned byteCount:10;
unsigned objectId:18;
unsigned ecc:12;
unsigned unusedStuff:2;
} yaffs_Tags;
typedef union
{
yaffs_Tags asTags;
__u8 asBytes[8];
} yaffs_TagsUnion;
#endif
typedef enum
{
YAFFS_ECC_RESULT_UNKNOWN,
YAFFS_ECC_RESULT_NO_ERROR,
YAFFS_ECC_RESULT_FIXED,
YAFFS_ECC_RESULT_UNFIXED
} yaffs_ECCResult;
typedef struct
{
unsigned validMarker0;
unsigned chunkUsed; // Status of the chunk: used or unused
unsigned objectId; // If 0 then this is not part of an object (unused)
unsigned chunkId; // If 0 then this is a header
unsigned byteCount; // Only valid for data chunks
// The following stuff only has meaning when we read
yaffs_ECCResult eccResult; // Only valid when we read.
unsigned blockBad; // Only valid on reading
// YAFFS 1 stuff
unsigned chunkDeleted; // The chunk is marked deleted
unsigned serialNumber; // Yaffs1 2-bit serial number
// YAFFS2 stuff
unsigned sequenceNumber; // The sequence number of this block
unsigned validMarker1;
} yaffs_ExtendedTags;
#ifndef CONFIG_YAFFS_NO_YAFFS1
// Spare structure
typedef struct
{
__u8 tagByte0;
__u8 tagByte1;
__u8 tagByte2;
__u8 tagByte3;
__u8 pageStatus; // set to 0 to delete the chunk
__u8 blockStatus;
__u8 tagByte4;
__u8 tagByte5;
__u8 ecc1[3];
__u8 tagByte6;
__u8 tagByte7;
__u8 ecc2[3];
} yaffs_Spare;
//Special structure for passing through to mtd
struct yaffs_NANDSpare {
yaffs_Spare spare;
int eccres1;
int eccres2;
};
#endif
// Block data in RAM
typedef enum {
YAFFS_BLOCK_STATE_UNKNOWN = 0,
#ifndef YAFFS2_DEFINES
YAFFS_BLOCK_STATE_SCANNING,
#else
YAFFS_BLOCK_STATE_NEEDS_SCANNING,// The block might have something on it (ie it is allocating or full, perhaps empty)
// but it needs to be scanned to determine its true state.
// This state is only valid during yaffs_Scan.
// NB We tolerate empty because the pre-scanner might be incapable of deciding
// However, if this state is returned on a YAFFS2 device, then we expect a sequence number
#endif
YAFFS_BLOCK_STATE_EMPTY, // This block is empty
YAFFS_BLOCK_STATE_ALLOCATING, // This block is partially allocated.
// This is the one currently being used for page
// allocation. Should never be more than one of these
YAFFS_BLOCK_STATE_FULL, // All the pages in this block have been allocated.
// At least one page holds valid data.
YAFFS_BLOCK_STATE_DIRTY, // All pages have been allocated and deleted.
// Erase me, reuse me.
YAFFS_BLOCK_STATE_COLLECTING, // This block is being garbage collected
YAFFS_BLOCK_STATE_DEAD // This block has failed and is not in use
} yaffs_BlockState;
typedef struct
{
int softDeletions:8; // number of soft deleted pages
int pagesInUse:8; // number of pages in use
__u32 blockState:4; // One of the above block states
__u32 needsRetiring:1; // Data has failed on this block, need to get valid data off
// and retire the block.
#ifndef CONFIG_YAFFS_NO_YAFFS2
__u32 hasShrinkHeader:1;// This block has at least one object header that does a shrink
__u32 sequenceNumber; // block sequence number for yaffs2
#endif
} yaffs_BlockInfo;
//////////////////// Object structure ///////////////////////////
// This is the object structure as stored on NAND
typedef enum
{
YAFFS_OBJECT_TYPE_UNKNOWN,
YAFFS_OBJECT_TYPE_FILE,
YAFFS_OBJECT_TYPE_SYMLINK,
YAFFS_OBJECT_TYPE_DIRECTORY,
YAFFS_OBJECT_TYPE_HARDLINK,
YAFFS_OBJECT_TYPE_SPECIAL
} yaffs_ObjectType;
typedef struct
{
yaffs_ObjectType type;
// Apply to everything
int parentObjectId;
__u16 sum__NoLongerUsed; // checksum of name. Calc this off the name to prevent inconsistencies
YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];
// Thes following apply to directories, files, symlinks - not hard links
__u32 st_mode; // protection
#ifdef CONFIG_YAFFS_WINCE
__u32 notForWinCE[5];
#else
__u32 st_uid; // user ID of owner
__u32 st_gid; // group ID of owner
__u32 st_atime; // time of last access
__u32 st_mtime; // time of last modification
__u32 st_ctime; // time of last change
#endif
// File size applies to files only
int fileSize;
// Equivalent object id applies to hard links only.
int equivalentObjectId;
// Alias is for symlinks only.
YCHAR alias[YAFFS_MAX_ALIAS_LENGTH + 1];
__u32 st_rdev; // device stuff for block and char devices (maj/min)
#ifdef CONFIG_YAFFS_WINCE
__u32 win_ctime[2];
__u32 win_atime[2];
__u32 win_mtime[2];
__u32 roomToGrow[5];
#else
__u32 roomToGrow[11];
#endif
// isShrink applies to bject headers written when we shrink the file (ie resize)
__u32 isShrink;
} yaffs_ObjectHeader;
//////////////////// Tnode ///////////////////////////
union yaffs_Tnode_union
{
#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG
union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL+1];
#else
union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL];
#endif
__u16 level0[YAFFS_NTNODES_LEVEL0];
};
typedef union yaffs_Tnode_union yaffs_Tnode;
struct yaffs_TnodeList_struct
{
struct yaffs_TnodeList_struct *next;
yaffs_Tnode *tnodes;
};
typedef struct yaffs_TnodeList_struct yaffs_TnodeList;
/////////////////// Object ////////////////////////////////
// An object can be one of:
// - a directory (no data, has children links
// - a regular file (data.... not prunes :->).
// - a symlink [symbolic link] (the alias).
// - a hard link
typedef struct
{
__u32 fileSize;
__u32 scannedFileSize;
int topLevel;
yaffs_Tnode *top;
} yaffs_FileStructure;
typedef struct
{
struct list_head children; // list of child links
} yaffs_DirectoryStructure;
typedef struct
{
YCHAR *alias;
} yaffs_SymLinkStructure;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -