📄 yaffs_ramdisk.c
字号:
/* * YAFFS: Yet another FFS. A NAND-flash specific file system. * yaffs_ramdisk.c: yaffs ram disk component * * Copyright (C) 2002 Aleph One Ltd. * * 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 General Public License version 2 as * published by the Free Software Foundation. * */// This provides a ram disk under yaffs.// NB this is not intended for NAND emulation.// Use this with dev->useNANDECC enabled, then ECC overheads are not required.#include "yportenv.h"#include "devextras.h"#include "yaffs_guts.h"#include "yaffs_ramdisk.h"#ifdef CONFIG_YAFFS_NOR_FLASHint yramdisk_WriteChunkToNAND(yaffs_Device *dev, long chunkInNAND, const __u8 *data, yaffs_Spare *spare){ return YAFFS_FAIL;}int yramdisk_ReadChunkFromNAND(yaffs_Device *dev, long chunkInNAND, __u8 *data, yaffs_Spare *spare){ return YAFFS_FAIL;}int yramdisk_EraseBlockInNAND(yaffs_Device *dev, long blockNumber){ return YAFFS_FAIL;}int yramdisk_InitialiseNAND(yaffs_Device *dev){ return YAFFS_FAIL;}#elsetypedef struct { __u8 data[YAFFS_BYTES_PER_CHUNK]; __u8 spare[YAFFS_BYTES_PER_SPARE];} yramdisk_Page;typedef struct { yramdisk_Page page[YAFFS_CHUNKS_PER_BLOCK];} yramdisk_Block;static yramdisk_Block *yramdisk_mem_pool = NULL;static long yramdisk_max_blks = 0;int yramdisk_WriteChunkToNAND(yaffs_Device *dev, long chunkInNAND, const __u8 *data, yaffs_Spare *spare){ long block = (chunkInNAND / YAFFS_CHUNKS_PER_BLOCK) - dev->startBlock; long page = chunkInNAND % YAFFS_CHUNKS_PER_BLOCK; if (yramdisk_mem_pool == NULL) { T(YAFFS_TRACE_ERROR, (TSTR("**>> ram: No memory pool allocated for device\n"))); return YAFFS_FAIL; } if ((block < 0) || (block >= yramdisk_max_blks)) { T(YAFFS_TRACE_ERROR, (TSTR("**>> ram: Illegal chunk number %ld to write\n"), chunkInNAND)); return YAFFS_FAIL; } if (data != NULL) { memcpy(yramdisk_mem_pool[block].page[page].data, data, YAFFS_BYTES_PER_CHUNK); } if (spare != NULL) { memcpy(yramdisk_mem_pool[block].page[page].spare, spare, YAFFS_BYTES_PER_SPARE); } return YAFFS_OK;}int yramdisk_ReadChunkFromNAND(yaffs_Device *dev, long chunkInNAND, __u8 *data, yaffs_Spare *spare){ long block = (chunkInNAND / YAFFS_CHUNKS_PER_BLOCK) - dev->startBlock; long page = chunkInNAND % YAFFS_CHUNKS_PER_BLOCK; if (yramdisk_mem_pool == NULL) { T(YAFFS_TRACE_ERROR, (TSTR("**>> ram: No memory pool allocated for device\n"))); return YAFFS_FAIL; } if ((block < 0) || (block >= yramdisk_max_blks)) { T(YAFFS_TRACE_ERROR, (TSTR("**>> ram: Illegal chunk number %ld to read\n"), chunkInNAND)); return YAFFS_FAIL; } if (data != NULL) { memcpy(data, yramdisk_mem_pool[block].page[page].data, YAFFS_BYTES_PER_CHUNK); } if (spare != NULL) { memcpy(spare, yramdisk_mem_pool[block].page[page].spare, YAFFS_BYTES_PER_SPARE); if (dev->useNANDECC) { struct yaffs_NANDSpare *nsp = (struct yaffs_NANDSpare *)spare; nsp->eccres1 = 0; nsp->eccres2 = 0; } } return YAFFS_OK;}int yramdisk_EraseBlockInNAND(yaffs_Device *dev, long blockNumber){ long block = blockNumber - dev->startBlock; if (yramdisk_mem_pool == NULL) { T(YAFFS_TRACE_ERROR, (TSTR("**>> ram: No memory pool allocated for device\n"))); return YAFFS_FAIL; } if ((block < 0) || (block >= yramdisk_max_blks)) { T(YAFFS_TRACE_ERROR, (TSTR("**>> ram: Illegal block number %ld to erase\n"), blockNumber)); return YAFFS_FAIL; } memset(&yramdisk_mem_pool[block], 0xFF, sizeof(yramdisk_Block)); return YAFFS_OK;}int yramdisk_InitialiseNAND(yaffs_Device *dev){ long block; yramdisk_max_blks = dev->endBlock - dev->startBlock + 1; yramdisk_mem_pool = Malloc(yramdisk_max_blks * sizeof(yramdisk_Block)); if (yramdisk_mem_pool == NULL) { T(YAFFS_TRACE_ERROR, (TSTR("**>> ram: Allocate memory for device failed\n"))); return YAFFS_FAIL; } for (block = 0; block < yramdisk_max_blks; block++) { memset(&yramdisk_mem_pool[block], 0xFF, sizeof(yramdisk_Block)); }#if 1 dev->useNANDECC = 1; // force on useNANDECC which gets faked, this saves us doing ECC checks.#endif return YAFFS_OK;}#endif /* CONFIG_YAFFS_NOR_FLASH */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -