/*
* 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>
*
struct nanddrv_transfer tr[2];
int i;
- if(!data || !oob)
+ if(!data)
return YAFFS_FAIL;
for(i = 0, e = buffer + 2; i < chip->data_bytes_per_page; i+=256, e+=3)
yaffs_ecc_calc(data + i, e);
- memcpy(buffer + 26, oob, oob_len);
+ if (oob)
+ memcpy(buffer + 26, oob, oob_len);
/* Set up and execute transfer */
- tr[0].buffer = data;
+ tr[0].buffer = (u8 *)data;
tr[0].offset = 0;
tr[0].nbytes = data_len;
ecc_result = YAFFS_ECC_RESULT_NO_ERROR;
-#if 0
if(data) {
for(i = 0, e = buffer + 2; i < chip->data_bytes_per_page; i+=256, e+=3) {
yaffs_ecc_calc(data + i, read_ecc);
ecc_result = YAFFS_ECC_RESULT_FIXED;
}
}
-#endif
if (ecc_result_out)
*ecc_result_out = ecc_result;
struct nand_chip *chip = dev_to_chip(dev);
u8 *buffer = dev_to_buffer(dev);
int nand_chunk = block_no * chip->pages_per_block;
- int ret;
-
struct nanddrv_transfer tr[1];
memset(buffer, 0, chip->spare_bytes_per_page);
tr[0].offset = chip->data_bytes_per_page;
tr[0].nbytes = chip->spare_bytes_per_page;
- ret = nanddrv_read_tr(chip, nand_chunk, tr, 1);
+ nanddrv_read_tr(chip, nand_chunk, tr, 1);
/* Check that bad block marker is not set */
if(yaffs_hweight8(buffer[0]) + yaffs_hweight8(buffer[1]) < 14)
{
struct nand_chip *chip = dev_to_chip(dev);
+ (void)chip;
return YAFFS_OK;
}
{
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;
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;
}