?? 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.16 2003/01/31 03:30:33 charles Exp $ */#ifndef __YAFFS_GUTS_H__#define __YAFFS_GUTS_H__#include "devextras.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// 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 structuretypedef 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 mtdstruct yaffs_NANDSpare { yaffs_Spare spare; int eccres1; int eccres2;};// Block data in RAMtypedef 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: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.} yaffs_BlockInfo;//////////////////// Object structure ///////////////////////////// This is the object structure as stored on NANDtypedef 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 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. char 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[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 linktypedef 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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -