Merge branch 'master' of ssh://www.aleph1.co.uk/home/aleph1/git/yaffs2
authorCharles Manning <cdhmanning@gmail.com>
Thu, 9 May 2013 09:24:53 +0000 (21:24 +1200)
committerCharles Manning <cdhmanning@gmail.com>
Thu, 9 May 2013 09:24:53 +0000 (21:24 +1200)
direct/test-framework/FrameworkRules.mk
direct/test-framework/yaffs_nand_drv.c
direct/test-framework/yaffs_nand_drv.h
direct/test-framework/yaffs_nandsim_file.c [new file with mode: 0644]
direct/test-framework/yaffs_nandsim_file.h [new file with mode: 0644]
direct/yaffs_nandif.c [deleted file]
direct/yaffs_nandif.h [deleted file]

index 3b6088a21c15bdd52bfa152f4e5e13e9f2d01267..f4d955c6fa513d3243a747606c4c94fb8e71bc52 100644 (file)
@@ -38,8 +38,8 @@ COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o yaffs_error.o\
                 yaffs_nameval.o yaffs_attribs.o \
                 yaffs_m18_drv.o  yaffs_nor_drv.o ynorsim.o \
                 yaffs_nand_drv.o \
-                nanddrv.o nandsim.o \
-                nandsim_file.o nandstore_file.o \
+                nanddrv.o \
+                yaffs_nandsim_file.o nandsim.o nandsim_file.o nandstore_file.o \
                 yaffs_allocator.o \
                 yaffs_bitmap.o \
                 yaffs_yaffs1.o \
@@ -57,7 +57,7 @@ YAFFSDIRECTSYMLINKS =  \
           yaffscfg.h yaffs_qsort.c \
           yaffs_nandemul2k.h yaffs_list.h \
           yaffs_attribs.c \
-          yaffs_nandif.c yaffs_nandif.h yportenv.h \
+          yportenv.h \
           yaffs_hweight.c yaffs_hweight.h \
          yaffs_error.c \
           yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h \
@@ -85,6 +85,7 @@ FRAMEWORKEXTRASYMLINKS = \
                yaffs_ramdisk.c yaffs_ramdisk.h yaffs_ramem2k.c \
                nand_chip.h nanddrv.c nanddrv.h nandsim.c nandsim.h nand_store.h \
                nandsim_file.c nandsim_file.h nandstore_file.c nandstore_file.h \
+               yaffs_nandsim_file.c yaffs_nandsim_file.h \
                ynorsim.h ynorsim.c yaffs_osglue.c
 
 FRAMEWORK_SOURCES = $(YAFFSDIRECTSYMLINKS) $(FRAMEWORKEXTRASYMLINKS)
index d9c4e739674a4e8390743e4e76abe8a1978ff2ab..9bdcb5550f9c81304f424284d0b8a70ca9cce146 100644 (file)
@@ -220,6 +220,7 @@ static int yaffs_nand_drv_Initialise(struct yaffs_dev *dev)
 {
        struct nand_chip *chip = dev_to_chip(dev);
 
+       (void)chip;
        return YAFFS_OK;
 }
 
@@ -227,56 +228,23 @@ static int yaffs_nand_drv_Deinitialise(struct yaffs_dev *dev)
 {
        struct nand_chip *chip = dev_to_chip(dev);
 
+       (void) chip;
        return YAFFS_OK;
 }
 
-#include "nandsim_file.h"
 
-struct yaffs_dev *yaffs_nandsim_install_drv(const char *name,
-                                       const char *file_name,
-                                       int n_blocks)
+int yaffs_nand_install_drv(struct yaffs_dev *dev, struct nand_chip *chip)
 {
-       struct yaffs_dev *dev;
-       char *name_copy = NULL;
-       struct yaffs_param *param;
-       struct yaffs_driver *drv;
-       struct nand_chip *chip = NULL;
-       struct nand_context *ctxt = NULL;
+       struct yaffs_driver *drv = &dev->drv;
        u8 *buffer = NULL;
+       struct nand_context *ctxt = NULL;
 
-       dev = malloc(sizeof(struct yaffs_dev));
        ctxt = malloc(sizeof(struct nand_context));
-       name_copy = strdup(name);
-
-       if(!dev || !ctxt || !name_copy)
-               goto fail;
-
-       chip = nandsim_file_init(file_name, n_blocks, 64, 2048, 64, 0);
-       if(!chip)
-               goto fail;
-
        buffer = malloc(chip->spare_bytes_per_page);
 
-       if(!buffer)
+       if(!buffer || !ctxt)
                goto fail;
 
-       param = &dev->param;
-       drv = &dev->drv;
-
-       memset(dev, 0, sizeof(*dev));
-       memset(ctxt, 0, sizeof(*ctxt));
-
-       param->name = name_copy;
-
-       param->total_bytes_per_chunk = chip->data_bytes_per_page;
-       param->chunks_per_block = chip->pages_per_block;
-       param->n_reserved_blocks = 5;
-       param->start_block = 0; // Can use block 0
-       param->end_block = chip->blocks - 1; // Last block
-       param->is_yaffs2 = 1;
-       param->use_nand_ecc = 1;
-       param->n_caches = 10;
-
        drv->drv_write_chunk_fn = yaffs_nand_drv_WriteChunk;
        drv->drv_read_chunk_fn = yaffs_nand_drv_ReadChunk;
        drv->drv_erase_fn = yaffs_nand_drv_EraseBlock;
@@ -288,15 +256,10 @@ struct yaffs_dev *yaffs_nandsim_install_drv(const char *name,
        ctxt->chip = chip;
        ctxt->buffer = buffer;
        dev->driver_context = (void *) ctxt;
-
-       yaffs_add_device(dev);
-
-       return dev;
+       return YAFFS_OK;
 
 fail:
-       free(dev);
        free(ctxt);
-       free(name_copy);
        free(buffer);
-       return NULL;
+       return YAFFS_FAIL;
 }
index 3e93644bc8f148f2012933ea535fb13bd6f58efe..047ab34e3fe703e866b6da864f11384ed7f866f4 100644 (file)
 #ifndef __YAFFS_NAND_DRV_H__
 #define __YAFFS_NAND_DRV_H__
 
-struct nand_store;
+#include "yaffs_guts.h"
+#include "nand_chip.h"
 
-struct yaffs_dev *
-       yaffs_nand_install_drv(const char *name,
-                               struct nand_store *ns);
-
-struct yaffs_dev *yaffs_nandsim_install_drv(const char *name,
-                                       const char *file_name,
-                                       int n_blocks);
+int yaffs_nand_install_drv(struct yaffs_dev *dev, struct nand_chip *chip);
 
 #endif
diff --git a/direct/test-framework/yaffs_nandsim_file.c b/direct/test-framework/yaffs_nandsim_file.c
new file mode 100644 (file)
index 0000000..962b3d6
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+
+#include "yaffs_nandsim_file.h"
+
+#include "nandsim_file.h"
+#include "nand_chip.h"
+#include "yaffs_guts.h"
+#include <stddef.h>
+
+
+struct yaffs_dev *yaffs_nandsim_install_drv(const char *dev_name,
+                                       const char *backing_file_name,
+                                       int n_blocks)
+{
+       struct yaffs_dev *dev;
+       char *name_copy = NULL;
+       struct yaffs_param *param;
+       struct nand_chip *chip = NULL;
+
+
+
+       dev = malloc(sizeof(struct yaffs_dev));
+       name_copy = strdup(dev_name);
+
+       if(!dev || !name_copy)
+               goto fail;
+
+       memset(dev, 0, sizeof(*dev));
+       chip = nandsim_file_init(backing_file_name, n_blocks, 64, 2048, 64, 0);
+       if(!chip)
+               goto fail;
+
+       param = &dev->param;
+
+       param->name = name_copy;
+
+       param->total_bytes_per_chunk = chip->data_bytes_per_page;
+       param->chunks_per_block = chip->pages_per_block;
+       param->n_reserved_blocks = 5;
+       param->start_block = 0; // First block
+       param->end_block = n_blocks - 1; // Last block
+       param->is_yaffs2 = 1;
+       param->use_nand_ecc = 1;
+       param->n_caches = 10;
+
+
+       if(yaffs_nand_install_drv(dev, chip) != YAFFS_OK)
+               goto fail;
+
+       /* The yaffs device has been configured, install it into yaffs */
+       yaffs_add_device(dev);
+
+       return dev;
+
+fail:
+       free(dev);
+       free(name_copy);
+       return NULL;
+}
diff --git a/direct/test-framework/yaffs_nandsim_file.h b/direct/test-framework/yaffs_nandsim_file.h
new file mode 100644 (file)
index 0000000..0960dac
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * 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
+ *
+ * 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 Lesser General Public License version 2.1 as
+ * published by the Free Software Foundation.
+ *
+ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
+ */
+
+#ifndef __YAFFS_NAND_DRV_H__
+#define __YAFFS_NAND_DRV_H__
+
+struct yaffs_dev;
+
+struct yaffs_dev *yaffs_nandsim_file_install(const char *dev_name,
+                                       const char *backing_file_name,
+                                       int n_blocks);
+
+#endif
diff --git a/direct/yaffs_nandif.c b/direct/yaffs_nandif.c
deleted file mode 100644 (file)
index 3f1de6d..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * 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
- *
- * 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.
- */
-
-#include "yportenv.h"
-#include "yaffs_guts.h"
-
-
-#include "yaffs_nandif.h"
-#include "yaffs_packedtags2.h"
-
-#include "yramsim.h"
-
-#include "yaffs_trace.h"
-#include "yaffsfs.h"
-
-
-/* NB For use with inband tags....
- * We assume that the data buffer is of size totalBytersPerChunk so that
- * we can also use it to load the tags.
- */
-int ynandif_WriteChunkWithTagsToNAND(struct yaffs_dev *dev, int nand_chunk,
-                                     const u8 *data,
-                                     const struct yaffs_ext_tags *tags)
-{
-
-       int retval = 0;
-       struct yaffs_packed_tags2 pt;
-       void *spare;
-       unsigned spareSize = 0;
-       struct ynandif_Geometry *geometry = (struct ynandif_Geometry *)(dev->driver_context);
-
-       yaffs_trace(YAFFS_TRACE_MTD,
-               "nandmtd2_WriteChunkWithTagsToNAND chunk %d data %p tags %p",
-               nand_chunk, data, tags);
-
-
-       /* For yaffs2 writing there must be both data and tags.
-        * If we're using inband tags, then the tags are stuffed into
-        * the end of the data buffer.
-        */
-
-       if (dev->param.inband_tags) {
-               struct yaffs_packed_tags2_tags_only *pt2tp;
-
-               pt2tp = (struct yaffs_packed_tags2_tags_only *)
-                       (data + dev->data_bytes_per_chunk);
-               yaffs_pack_tags2_tags_only(pt2tp, tags);
-               spare = NULL;
-               spareSize = 0;
-       } else {
-               yaffs_pack_tags2(&pt, tags, !dev->param.no_tags_ecc);
-               spare = &pt;
-               spareSize = sizeof(struct yaffs_packed_tags2);
-       }
-
-       retval = geometry->writeChunk(dev, nand_chunk,
-                               data, dev->param.total_bytes_per_chunk,
-                               spare, spareSize);
-
-       return retval;
-}
-
-int ynandif_ReadChunkWithTagsFromNAND(struct yaffs_dev *dev, int nand_chunk,
-                                      u8 *data, struct yaffs_ext_tags *tags)
-{
-       struct yaffs_packed_tags2 pt;
-       int localData = 0;
-       void *spare = NULL;
-       unsigned spareSize;
-       int retval = 0;
-       int eccStatus; /* 0 = ok, 1 = fixed, -1 = unfixed */
-       struct ynandif_Geometry *geometry = (struct ynandif_Geometry *)(dev->driver_context);
-
-       yaffs_trace(YAFFS_TRACE_MTD,
-               "nandmtd2_ReadChunkWithTagsFromNAND chunk %d data %p tags %p",
-               nand_chunk, data, tags);
-
-       if (!tags) {
-               spare = NULL;
-               spareSize = 0;
-       } else if (dev->param.inband_tags) {
-
-               if (!data) {
-                       localData = 1;
-                       data = yaffs_get_temp_buffer(dev);
-               }
-               spare = NULL;
-               spareSize = 0;
-       } else {
-               spare = &pt;
-               spareSize = sizeof(struct yaffs_packed_tags2);
-       }
-
-       retval = geometry->readChunk(dev, nand_chunk,
-                                data,
-                                data ? dev->param.total_bytes_per_chunk : 0,
-                                spare, spareSize,
-                                &eccStatus);
-
-       if (dev->param.inband_tags) {
-               if (tags) {
-                       struct yaffs_packed_tags2_tags_only *pt2tp;
-                       pt2tp = (struct yaffs_packed_tags2_tags_only *)
-                                       &data[dev->data_bytes_per_chunk];
-                       yaffs_unpack_tags2_tags_only(tags, pt2tp);
-               }
-       } else {
-               if (tags)
-                       yaffs_unpack_tags2(tags, &pt, !dev->param.no_tags_ecc);
-       }
-
-       if (tags && tags->chunk_used) {
-               if (eccStatus < 0 ||
-                  tags->ecc_result == YAFFS_ECC_RESULT_UNFIXED)
-                       tags->ecc_result = YAFFS_ECC_RESULT_UNFIXED;
-               else if (eccStatus > 0 ||
-                            tags->ecc_result == YAFFS_ECC_RESULT_FIXED)
-                       tags->ecc_result = YAFFS_ECC_RESULT_FIXED;
-               else
-                       tags->ecc_result = YAFFS_ECC_RESULT_NO_ERROR;
-       }
-
-       if (localData)
-               yaffs_release_temp_buffer(dev, data);
-
-       return retval;
-}
-
-int ynandif_MarkNANDBlockBad(struct yaffs_dev *dev, int blockId)
-{
-       struct ynandif_Geometry *geometry = (struct ynandif_Geometry *)(dev->driver_context);
-
-       return geometry->markBlockBad(dev, blockId);
-}
-
-int ynandif_EraseBlockInNAND(struct yaffs_dev *dev, int blockId)
-{
-       struct ynandif_Geometry *geometry = (struct ynandif_Geometry *)(dev->driver_context);
-
-       return geometry->eraseBlock(dev, blockId);
-
-}
-
-
-static int ynandif_IsBlockOk(struct yaffs_dev *dev, int blockId)
-{
-       struct ynandif_Geometry *geometry = (struct ynandif_Geometry *)(dev->driver_context);
-
-       return geometry->checkBlockOk(dev, blockId);
-}
-
-int ynandif_QueryNANDBlock(struct yaffs_dev *dev, int blockId,
-               enum yaffs_block_state *state, u32 *seq_number)
-{
-       unsigned chunkNo;
-       struct yaffs_ext_tags tags;
-
-       *seq_number = 0;
-
-       chunkNo = blockId * dev->param.chunks_per_block;
-
-       if (!ynandif_IsBlockOk(dev, blockId)) {
-               *state = YAFFS_BLOCK_STATE_DEAD;
-       } else {
-               ynandif_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &tags);
-
-               if (!tags.chunk_used) {
-                       *state = YAFFS_BLOCK_STATE_EMPTY;
-               } else {
-                       *state = YAFFS_BLOCK_STATE_NEEDS_SCAN;
-                       *seq_number = tags.seq_number;
-               }
-       }
-
-       return YAFFS_OK;
-}
-
-
-int ynandif_InitialiseNAND(struct yaffs_dev *dev)
-{
-       struct ynandif_Geometry *geometry = (struct ynandif_Geometry *)(dev->driver_context);
-
-       geometry->initialise(dev);
-
-       return YAFFS_OK;
-}
-
-int ynandif_Deinitialise_flash_fn(struct yaffs_dev *dev)
-{
-       struct ynandif_Geometry *geometry = (struct ynandif_Geometry *)(dev->driver_context);
-
-       geometry->deinitialise(dev);
-
-       return YAFFS_OK;
-}
-
-
-struct yaffs_dev *
-       yaffs_add_dev_from_geometry(const YCHAR *name,
-                                       const struct ynandif_Geometry *geometry)
-{
-       YCHAR *clonedName = malloc(sizeof(YCHAR) *
-                               (strnlen(name, YAFFS_MAX_NAME_LENGTH)+1));
-       struct yaffs_dev *dev = malloc(sizeof(struct yaffs_dev));
-       struct yaffs_param *param;
-
-       if (dev && clonedName) {
-               memset(dev, 0, sizeof(struct yaffs_dev));
-               strcpy(clonedName, name);
-
-               param = &dev->param;
-
-               param->name = clonedName;
-               param->write_chunk_tags_fn = ynandif_WriteChunkWithTagsToNAND;
-               param->read_chunk_tags_fn = ynandif_ReadChunkWithTagsFromNAND;
-               param->erase_fn = ynandif_EraseBlockInNAND;
-               param->initialise_flash_fn = ynandif_InitialiseNAND;
-               param->query_block_fn = ynandif_QueryNANDBlock;
-               param->bad_block_fn = ynandif_MarkNANDBlockBad;
-               param->n_caches = 20;
-               param->start_block = geometry->start_block;
-               param->end_block   = geometry->end_block;
-               param->total_bytes_per_chunk  = geometry->dataSize;
-               param->spare_bytes_per_chunk  = geometry->spareSize;
-               param->inband_tags                = geometry->inband_tags;
-               param->chunks_per_block   = geometry->pagesPerBlock;
-               param->use_nand_ecc               = geometry->hasECC;
-               param->is_yaffs2                  = geometry->useYaffs2;
-               param->n_reserved_blocks          = 5;
-               dev->driver_context               = (void *)geometry;
-
-               yaffs_add_device(dev);
-
-               return dev;
-       }
-
-       free(dev);
-       free(clonedName);
-
-       return NULL;
-}
-
diff --git a/direct/yaffs_nandif.h b/direct/yaffs_nandif.h
deleted file mode 100644 (file)
index e780f7f..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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
- *
- * 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 Lesser General Public License version 2.1 as
- * published by the Free Software Foundation.
- *
- * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
- */
-
-
-#ifndef __YNANDIF_H__
-#define __YNANDIF_H__
-
-#include "yaffs_guts.h"
-
-struct ynandif_Geometry {
-       unsigned start_block;
-       unsigned end_block;
-       unsigned dataSize;
-       unsigned spareSize;
-       unsigned pagesPerBlock;
-       unsigned hasECC;
-       unsigned inband_tags;
-       unsigned useYaffs2;
-
-       int (*initialise)(struct yaffs_dev *dev);
-       int (*deinitialise)(struct yaffs_dev *dev);
-
-       int (*readChunk) (struct yaffs_dev *dev,
-                                         unsigned pageId,
-                                         unsigned char *data,
-                                         unsigned dataLength,
-                                         unsigned char *spare,
-                                         unsigned spareLength,
-                                         int *eccStatus);
-       /* ECC status is set to 0 for OK, 1 for fixed, -1 for unfixed. */
-
-       int (*writeChunk)(struct yaffs_dev *dev,
-                                         unsigned pageId,
-                                         const unsigned char *data,
-                                         unsigned dataLength,
-                                         const unsigned char *spare,
-                                         unsigned spareLength);
-
-       int (*eraseBlock)(struct yaffs_dev *dev, unsigned blockId);
-
-       int (*checkBlockOk)(struct yaffs_dev *dev, unsigned blockId);
-       int (*markBlockBad)(struct yaffs_dev *dev, unsigned blockId);
-
-       void *privateData;
-
-};
-
-struct yaffs_dev *
-       yaffs_add_dev_from_geometry(const YCHAR *name,
-                                       const struct ynandif_Geometry *geometry);
-
-
-#endif