package yaffs2.port;
import yaffs2.utils.*;
import yaffs2.utils.factory.PrimitiveWrapperFactory;
public class yaffs_nand_C
{
/*
* YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
*
* Copyright (C) 2002-2007 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 General Public License version 2 as
* published by the Free Software Foundation.
*/
static final String yaffs_nand_c_version =
"$Id: yaffs_nand_C.java,v 1.3 2007/07/01 01:29:51 alexander.dejaco Exp $";
/*#include "yaffs_nand.h"
#include "yaffs_tagscompat.h"
#include "yaffs_tagsvalidity.h"*/
static boolean yaffs_ReadChunkWithTagsFromNAND(yaffs_Device dev, int chunkInNAND,
byte[] buffer, int bufferIndex,
yaffs_ExtendedTags tags)
{
boolean result;
yaffs_ExtendedTags localTags = new yaffs_ExtendedTags();
int realignedChunkInNAND = chunkInNAND - dev.subField2.chunkOffset;
/* If there are no tags provided, use local tags to get prioritised gc working */
if(tags == null)
tags = localTags;
if (dev.subField1.readChunkWithTagsFromNAND != null)
result = dev.subField1.readChunkWithTagsFromNAND.readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer, bufferIndex,
tags);
else
result = yaffs_tagscompat_C.yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev,
realignedChunkInNAND,
buffer, bufferIndex,
tags);
if((tags != null) &&
tags.eccResult > Guts_H.YAFFS_ECC_RESULT_NO_ERROR){
yaffs_BlockInfo bi = Guts_H.yaffs_GetBlockInfo(dev, chunkInNAND/dev.subField1.nChunksPerBlock);
yaffs_guts_C.yaffs_HandleChunkError(dev,bi);
}
return result;
}
static boolean yaffs_WriteChunkWithTagsToNAND(yaffs_Device dev,
int chunkInNAND,
byte[] buffer, int bufferIndex,
yaffs_ExtendedTags tags)
{
chunkInNAND -= dev.subField2.chunkOffset;
if (tags != null) {
tags.sequenceNumber = (int)dev.sequenceNumber;
tags.chunkUsed = true;
if (!yaffs_tagsvalidity_C.yaffs_ValidateTags(tags)) {
yportenv.T(yportenv.YAFFS_TRACE_ERROR,
("Writing uninitialised tags" + ydirectenv.TENDSTR));
yaffs2.utils.Globals.portConfiguration.YBUG();
}
yportenv.T(yportenv.YAFFS_TRACE_WRITE,
("Writing chunk %d tags %d %d" + ydirectenv.TENDSTR), PrimitiveWrapperFactory.get(chunkInNAND),
PrimitiveWrapperFactory.get(tags.objectId), PrimitiveWrapperFactory.get(tags.chunkId));
} else {
yportenv.T(yportenv.YAFFS_TRACE_ERROR, ("Writing with no tags" + ydirectenv.TENDSTR));
yaffs2.utils.Globals.portConfiguration.YBUG();
}
if (dev.subField1.writeChunkWithTagsToNAND != null)
return dev.subField1.writeChunkWithTagsToNAND.writeChunkWithTagsToNAND(dev, chunkInNAND, buffer, bufferIndex,
tags);
else
return yaffs_tagscompat_C.yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev,
chunkInNAND,
buffer, bufferIndex,
tags);
}
static boolean yaffs_MarkBlockBad(yaffs_Device dev, int blockNo)
{
blockNo -= dev.subField2.blockOffset;
;
if (dev.subField1.markNANDBlockBad != null)
return dev.subField1.markNANDBlockBad.markNANDBlockBad(dev, blockNo);
else
return yaffs_tagscompat_C.yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo);
}
static boolean yaffs_QueryInitialBlockState(yaffs_Device dev,
int blockNo,
/*yaffs_BlockState*/ IntegerPointer state,
/*unsigned **/ IntegerPointer sequenceNumber)
{
blockNo -= dev.subField2.blockOffset;
if (dev.subField1.queryNANDBlock != null)
return dev.subField1.queryNANDBlock.queryNANDBlock(dev, blockNo, state, sequenceNumber);
else
return yaffs_tagscompat_C.yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo,
state,
sequenceNumber);
}
static boolean yaffs_EraseBlockInNAND(yaffs_Device dev,
int blockInNAND)
{
boolean result;
blockInNAND -= dev.subField2.blockOffset;
dev.subField3.nBlockErasures++;
result = dev.subField1.eraseBlockInNAND.eraseBlockInNAND(dev, blockInNAND);
return result;
}
static boolean yaffs_InitialiseNAND(yaffs_Device dev)
{
return dev.subField1.initialiseNAND.initialiseNAND(dev);
}
}