📄 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.21 2005/10/11 23:43:27 charles Exp $
*/
#ifndef __YAFFS_GUTS_H__
#define __YAFFS_GUTS_H__
#include "ydirectenv.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
#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)
#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
#define YAFFS_MAX_NAME_LENGTH 255
#define YAFFS_SHORT_NAME_LENGTH 15
#define YAFFS_MAX_ALIAS_LENGTH 159
#define YAFFS_OBJECTID_ROOT 1
#define YAFFS_OBJECTID_LOSTNFOUND 2
#define YAFFS_OBJECTID_UNLINKED 3
#define YAFFS_MAX_SHORT_OP_CACHES 20
//yaffsfs.h has defined
typedef int off_t;
typedef int dev_t;
typedef unsigned int mode_t;
// 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
__u8 data[YAFFS_BYTES_PER_CHUNK];
} yaffs_ChunkCache;
// 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;
// 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;
};
// Block data in RAM
typedef enum {
YAFFS_BLOCK_STATE_UNKNOWN = 0,
YAFFS_BLOCK_STATE_SCANNING, // Used while the block is being scanned.
// NB Don't erase blocks while they're being scanned
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_DEAD // This block has failed and is not in use
} yaffs_BlockState;
typedef struct
{
#ifndef CONFIG_YAFFS_NO_YAFFS2
__u32 sequenceNumber; // block sequence number for yaffs2
#endif
int softDeletions:12; // number of soft deleted pages
int pagesInUse:12; // 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.
} 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
char name[YAFFS_MAX_NAME_LENGTH + 1];
// Thes following apply to directories, files, symlinks - not hard links
__u32 yst_mode; // protection
#ifdef CONFIG_YAFFS_WINCE
__u32 notForWinCE[5];
#else
__u32 yst_uid; // user ID of owner
__u32 yst_gid; // group ID of owner
__u32 yst_atime; // time of last access
__u32 yst_mtime; // time of last modification
__u32 yst_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.
char alias[YAFFS_MAX_ALIAS_LENGTH + 1];
__u32 yst_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[6];
#else
__u32 roomToGrow[12];
#endif
} 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
{
char *alias;
} yaffs_SymLinkStructure;
typedef struct
{
struct yaffs_ObjectStruct *equivalentObject;
__u32 equivalentObjectId;
} yaffs_HardLinkStructure;
typedef union
{
yaffs_FileStructure fileVariant;
yaffs_DirectoryStructure directoryVariant;
yaffs_SymLinkStructure symLinkVariant;
yaffs_HardLinkStructure hardLinkVariant;
} yaffs_ObjectVariant;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -