⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yaffs_ramdisk.c

📁 flash 中实现yaffs的c 文件源码
💻 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 + -