X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=mtdemul%2Fnandemul2k.c;h=7efa8d45d6e383f0764413d14e7d5f341014a99a;hp=ecc96c8e7900ae6aa0fc180debf7694eb956d74e;hb=92ee023b9d7144e178a050eff898aaae4415096b;hpb=412a849e17d81802a45dbed775a6461c8c3a72c7 diff --git a/mtdemul/nandemul2k.c b/mtdemul/nandemul2k.c index ecc96c8..7efa8d4 100644 --- a/mtdemul/nandemul2k.c +++ b/mtdemul/nandemul2k.c @@ -1,7 +1,7 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002 Aleph One Ltd. + * Copyright (C) 2002-2007 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning @@ -9,12 +9,13 @@ * 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 version hacked for emulating 2kpage NAND for YAFFS2 testing. */ -#include +//#include #include #include #include @@ -44,13 +45,14 @@ -#define EM_SIZE_IN_MEG 4 -#define PAGE_DATA_SIZE (2048) -#define PAGE_SPARE_SIZE (64) -#define PAGES_PER_BLOCK (64) #define NAND_SHIFT (11) // Shifter for 2k +#define PAGE_DATA_SIZE (1 << NAND_SHIFT) +#define PAGE_SPARE_SIZE (64) +#define BLK_SHIFT 6 +#define PAGES_PER_BLOCK (1 << BLK_SHIFT) // = 64 +#define EM_SIZE_IN_MEG 4 #define EM_SIZE_IN_BYTES (EM_SIZE_IN_MEG * (1<<20)) #define PAGE_TOTAL_SIZE (PAGE_DATA_SIZE+PAGE_SPARE_SIZE) @@ -253,7 +255,7 @@ int nandemul2k_GetNumberOfBlocks(void) {return nandemul2k_CalcNBlocks();} -int nandemul2k_ReadId(__u8 *vendorId, __u8 *deviceId) +static int nandemul2k_ReadId(__u8 *vendorId, __u8 *deviceId) { *vendorId = 'Y'; *deviceId = '2'; @@ -262,7 +264,7 @@ int nandemul2k_ReadId(__u8 *vendorId, __u8 *deviceId) } -int nandemul2k_ReadStatus(__u8 *status) +static int nandemul2k_ReadStatus(__u8 *status) { *status = 0; return 1; @@ -278,15 +280,10 @@ int nandemul2k_ReadStatus(__u8 *status) */ static int nand_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); -static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, u_char *buf, u_char *oob_buf, struct nand_oobinfo *dummy); static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); static int nand_write (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); -static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const u_char *buf, - u_char *oob_buf, struct nand_oobinfo *dummy); static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,7)) @@ -341,17 +338,17 @@ static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len, /* Get raw starting column */ - start = from & (mtd->oobblock-1); + start = from & (PAGE_DATA_SIZE - 1); // OK now check for the curveball where the start and end are in // the same page - if((start + n) < mtd->oobblock) + if((start + n) < PAGE_DATA_SIZE) { nToCopy = n; } else { - nToCopy = mtd->oobblock - start; + nToCopy = PAGE_DATA_SIZE - start; } nandemul2k_Read(buf, page, start, nToCopy); @@ -384,7 +381,7 @@ static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len, page = ((int) from) >> NAND_SHIFT; /* Mask to get column */ - col = from & 0x0f; + col = from & (PAGE_SPARE_SIZE-1) /* Initialize return length value */ *retlen = 0; @@ -445,17 +442,17 @@ static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len, /* Get raw starting column */ - start = to & (mtd->oobblock - 1); + start = to & (PAGE_DATA_SIZE - 1); // OK now check for the curveball where the start and end are in // the same page - if((start + n) < mtd->oobblock) + if((start + n) < PAGE_DATA_SIZE) { nToCopy = n; } else { - nToCopy = mtd->oobblock - start; + nToCopy = PAGE_DATA_SIZE - start; } nandemul2k_Program(buf, page, start, nToCopy); @@ -490,7 +487,7 @@ static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len, page = ((int) to) >> NAND_SHIFT; /* Mask to get column */ - col = to & 0x0f; + col = to & PAGE_SPARE_SIZE; /* Initialize return length value */ *retlen = 0; @@ -557,16 +554,17 @@ static int nand_erase (struct mtd_info *mtd, struct erase_info *instr) return -EINVAL; } - nBlocks = instr->len >> (NAND_SHIFT + 5); - block = instr->addr >> (NAND_SHIFT + 5); + nBlocks = instr->len >> (NAND_SHIFT + BLK_SHIFT); + block = instr->addr >> (NAND_SHIFT + BLK_SHIFT); for(i = 0; i < nBlocks; i++) { nandemul2k_DoErase(block); block++; } - - + + instr->state = MTD_ERASE_DONE; /* Changed state to done */ + instr->callback(instr); /* ... and wake up */ return 0; @@ -597,10 +595,11 @@ static void nand_sync (struct mtd_info *mtd) /* * Scan for the NAND device */ -int nand_scan (struct mtd_info *mtd,int nchips) +static int nandemul2k_scan (struct mtd_info *mtd,int nchips) { - mtd->oobblock = PAGE_DATA_SIZE; - mtd->oobsize = PAGE_SPARE_SIZE; + mtd->writesize = PAGE_DATA_SIZE; + mtd->oobsize = PAGE_SPARE_SIZE; + mtd->oobavail = PAGE_SPARE_SIZE/2; /* Simulate using up some for other uses */ mtd->erasesize = PAGE_DATA_SIZE * PAGES_PER_BLOCK; mtd->size = sizeInMB * 1024*1024; @@ -610,14 +609,13 @@ int nand_scan (struct mtd_info *mtd,int nchips) mtd->type = MTD_NANDFLASH; mtd->flags = MTD_CAP_NANDFLASH; mtd->owner = THIS_MODULE; - mtd->ecctype = MTD_ECC_NONE; mtd->erase = nand_erase; mtd->point = NULL; mtd->unpoint = NULL; mtd->read = nand_read; mtd->write = nand_write; - mtd->read_ecc = nand_read_ecc; - mtd->write_ecc = nand_write_ecc; + mtd->read_oob = nand_read_oob; + mtd->write_oob = nand_write_oob; mtd->read_oob = nand_read_oob; mtd->write_oob = nand_write_oob; mtd->block_isbad = nand_block_isbad; @@ -630,6 +628,8 @@ int nand_scan (struct mtd_info *mtd,int nchips) mtd->suspend = NULL; mtd->resume = NULL; + mtd->name = "NANDemul2k"; + /* Return happy */ return 0; } @@ -648,9 +648,9 @@ __setup("sizeInMB=",sizeInMB); static struct mtd_partition nandemul2k_partition[] = { - { name: "NANDemul partition 1", - offset: 0, - size: 0 }, + { .name = "NANDemul partition 1", + .offset = 0, + .size = 0 }, }; static int nPartitions = sizeof(nandemul2k_partition)/sizeof(nandemul2k_partition[0]); @@ -665,7 +665,7 @@ int __init nandemul2k_init (void) CheckInit(); - nand_scan(&nandemul2k_mtd,1); + nandemul2k_scan(&nandemul2k_mtd,1); // Build the partition table