/*
* YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
*
- * Copyright (C) 2002-2011 Aleph One Ltd.
- * for Toby Churchill Ltd and Brightstar Engineering
+ * Copyright (C) 2002-2018 Aleph One Ltd.
*
* Created by Charles Manning <charles@aleph1.co.uk>
*
-typedef struct
+typedef struct
{
u8 data[528]; // Data + spare
} yramdisk_page;
typedef struct
{
yramdisk_page page[32]; // The pages in the block
-
+
} yramdisk_block;
static int CheckInit(struct yaffs_dev *dev)
{
static int initialised = 0;
-
+
int i;
int fail = 0;
- //int nBlocks;
+ //int nBlocks;
int nAllocated = 0;
-
- if(initialised)
+
+ if(initialised)
{
return YAFFS_OK;
}
initialised = 1;
-
-
+
+
ramdisk.nBlocks = (SIZE_IN_MB * 1024 * 1024)/(16 * 1024);
-
+
ramdisk.block = malloc(sizeof(yramdisk_block *) * ramdisk.nBlocks);
-
+
if(!ramdisk.block) return 0;
-
+
for(i=0; i <ramdisk.nBlocks; i++)
{
ramdisk.block[i] = NULL;
}
-
+
for(i=0; i <ramdisk.nBlocks && !fail; i++)
{
if((ramdisk.block[i] = malloc(sizeof(yramdisk_block))) == 0)
nAllocated++;
}
}
-
+
if(fail)
{
for(i = 0; i < nAllocated; i++)
kfree(ramdisk.block[i]);
}
kfree(ramdisk.block);
-
+
yaffs_trace(YAFFS_TRACE_ALWAYS,
"Allocation failed, could only allocate %dMB of %dMB requested.\n",
nAllocated/64,ramdisk.nBlocks * 528);
return 0;
}
-
-
+
+
return 1;
}
{
int blk;
int pg;
-
+
CheckInit(dev);
-
+
blk = nand_chunk/32;
pg = nand_chunk%32;
-
-
+
+
if(data)
{
memcpy(ramdisk.block[blk]->page[pg].data,data,512);
}
-
-
+
+
if(tags)
{
struct yaffs_packed_tags1 pt;
-
+
yaffs_pack_tags1(&pt,tags);
memcpy(&ramdisk.block[blk]->page[pg].data[512],&pt,sizeof(pt));
}
- return YAFFS_OK;
+ return YAFFS_OK;
}
int blk;
int pg;
-
+
CheckInit(dev);
-
+
blk = nand_chunk/32;
pg = nand_chunk%32;
-
-
+
+
if(data)
{
memcpy(data,ramdisk.block[blk]->page[pg].data,512);
}
-
-
+
+
if(tags)
{
struct yaffs_packed_tags1 pt;
-
+
memcpy(&pt,&ramdisk.block[blk]->page[pg].data[512],sizeof(pt));
yaffs_unpack_tags1(tags,&pt);
-
+
}
return YAFFS_OK;
int pg;
int i;
-
+
CheckInit(dev);
-
+
blk = nand_chunk/32;
pg = nand_chunk%32;
-
-
+
+
for(i = 0; i < 528; i++)
{
if(ramdisk.block[blk]->page[pg].data[i] != 0xFF)
int yramdisk_erase(struct yaffs_dev *dev, int blockNumber)
{
-
+
CheckInit(dev);
-
+
if(blockNumber < 0 || blockNumber >= ramdisk.nBlocks)
{
yaffs_trace(YAFFS_TRACE_ALWAYS,
memset(ramdisk.block[blockNumber],0xFF,sizeof(yramdisk_block));
return YAFFS_OK;
}
-
+
}
int yramdisk_initialise(struct yaffs_dev *dev)
{
- //dev->use_nand_ecc = 1; // force on use_nand_ecc which gets faked.
+ (void) dev;
+
+ //dev->use_nand_ecc = 1; // force on use_nand_ecc which gets faked.
// This saves us doing ECC checks.
-
+
return YAFFS_OK;
}