package yaffs2.port; import yaffs2.utils.SerializableObject; public class yaffs_BlockInfo extends yaffs2.utils.SerializableObject { // int softDeletions:10; /* number of soft deleted pages */ // int pagesInUse:10; /* number of pages in use */ // yaffs_BlockState 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. */ // __u32 skipErasedCheck: 1; /* If this is set we can skip the erased check on this block */ // __u32 gcPrioritise: 1; /* An ECC check or bank check has failed on this block. // It should be prioritised for GC */ // __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */ // // #ifdef CONFIG_YAFFS_YAFFS2 // __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */ // __u32 sequenceNumber; /* block sequence number for yaffs2 */ //#endif public yaffs_BlockInfo(SerializableObject owner, int offset) { super(owner, offset); } public yaffs_BlockInfo(byte[] array, int offset) { super(array, offset); } public yaffs_BlockInfo() { super(SERIALIZED_LENGTH); } static final int SERIALIZED_LENGTH = 4+4; int softDeletions() { return yaffs2.utils.Utils.byteAsUnsignedByte(serialized[offset+0]) | ((serialized[offset+1] & 0x3) << 8); } void setSoftDeletions(int value) { serialized[offset+0] = (byte)value; serialized[offset+1] = (byte)(serialized[offset+1] & ~0x3 | ((value & 0x300) >>> 8)); } int pagesInUse() { return (yaffs2.utils.Utils.byteAsUnsignedByte(serialized[offset+1]) >>> 2) | ((serialized[offset+2] & 0xf ) << 2); } void setPagesInUse(int value) { serialized[offset+1] = (byte)(serialized[offset+1] & 0x3 | (value << 2)); serialized[offset+2] = (byte)(serialized[offset+2] & ~0xf | ((value & 0x3C0) >>> 6)); } int blockState() { return (yaffs2.utils.Utils.byteAsUnsignedByte(serialized[offset+2]) >>> 4); } void setBlockState(int value) { serialized[offset+2] = (byte)(serialized[offset+2] & ~0xF0 | (value << 4)); } boolean needsRetiring() { return (serialized[offset+3] & 0x1) != 0; } void setNeedsRetiring(boolean value) { serialized[offset+3] = (byte)(serialized[offset+3] & ~0x1 | (value ? 0x1 : 0)); } boolean skipErasedCheck() { return (serialized[offset+3] & 0x2) != 0; } void setSkipErasedCheck(boolean value) { serialized[offset+3] = (byte)(serialized[offset+3] & ~0x2 | (value ? 0x2 : 0)); } boolean gcPrioritise() { return (serialized[offset+3] & 0x4) != 0; } void setGcPrioritise(boolean value) { serialized[offset+3] = (byte)(serialized[offset+3] & ~0x4 | (value ? 0x4 : 0)); } int chunkErrorStrikes() { return (serialized[offset+3] >>> 3) & 0x7; } void setChunkErrorStrikes(int value) { serialized[offset+3] = (byte)(serialized[offset+3] & (~0x38) | ((value & 0x7) << 3)); } //#ifdef CONFIG_YAFFS_YAFFS2 /*__u32*/ boolean hasShrinkHeader() /* This block has at least one shrink object header */ { return ((serialized[offset+3] >>> 6) & 0x1) != 0; } void setHasShrinkHeader(boolean value) { serialized[offset+3] = (byte)(serialized[offset+3] & ~0x40 | (value ? 0x40 : 0)); } // XXX PORT may be larger than Integer.MAX_VALUE, which causes sign extension for longs! // XXX check every invocation /*__u32*/ int sequenceNumber() /* block sequence number for yaffs2 */ { return yaffs2.utils.Utils.getIntFromByteArray(serialized, offset+4); } void setSequenceNumber(/*__u32*/ int value) { yaffs2.utils.Utils.writeIntToByteArray(serialized, offset+4, value); } //#endif public int getSerializedLength() { return SERIALIZED_LENGTH; } }