aboutsummaryrefslogtreecommitdiff
path: root/nuttx/drivers/mtd/rammtd.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/drivers/mtd/rammtd.c')
-rw-r--r--nuttx/drivers/mtd/rammtd.c417
1 files changed, 0 insertions, 417 deletions
diff --git a/nuttx/drivers/mtd/rammtd.c b/nuttx/drivers/mtd/rammtd.c
deleted file mode 100644
index 82a7191ea..000000000
--- a/nuttx/drivers/mtd/rammtd.c
+++ /dev/null
@@ -1,417 +0,0 @@
-/****************************************************************************
- * drivers/mtd/rammtd.c
- *
- * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gnutt@nuttx.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor the names of its contributors may be
- * used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <debug.h>
-
-#include <nuttx/kmalloc.h>
-#include <nuttx/fs/ioctl.h>
-#include <nuttx/mtd.h>
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-/* Configuration ************************************************************/
-
-#ifndef CONFIG_RAMMTD_BLOCKSIZE
-# define CONFIG_RAMMTD_BLOCKSIZE 512
-#endif
-
-#ifndef CONFIG_RAMMTD_ERASESIZE
-# define CONFIG_RAMMTD_ERASESIZE 4096
-#endif
-
-#ifndef CONFIG_RAMMTD_ERASESTATE
-# define CONFIG_RAMMTD_ERASESTATE 0xff
-#endif
-
-#if CONFIG_RAMMTD_ERASESTATE != 0xff && CONFIG_RAMMTD_ERASESTATE != 0x00
-# error "Unsupported value for CONFIG_RAMMTD_ERASESTATE"
-#endif
-
-#if CONFIG_RAMMTD_BLOCKSIZE > CONFIG_RAMMTD_ERASESIZE
-# error "Must have CONFIG_RAMMTD_BLOCKSIZE <= CONFIG_RAMMTD_ERASESIZE"
-#endif
-
-#undef CONFIG_RAMMTD_BLKPER
-#define CONFIG_RAMMTD_BLKPER (CONFIG_RAMMTD_ERASESIZE/CONFIG_RAMMTD_BLOCKSIZE)
-
-#if CONFIG_RAMMTD_BLKPER*CONFIG_RAMMTD_BLOCKSIZE != CONFIG_RAMMTD_ERASESIZE
-# error "CONFIG_RAMMTD_ERASESIZE must be an even multiple of CONFIG_RAMMTD_BLOCKSIZE"
-#endif
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/* This type represents the state of the MTD device. The struct mtd_dev_s
- * must appear at the beginning of the definition so that you can freely
- * cast between pointers to struct mtd_dev_s and struct ram_dev_s.
- */
-
-struct ram_dev_s
-{
- struct mtd_dev_s mtd; /* MTD device */
- FAR uint8_t *start; /* Start of RAM */
- size_t nblocks; /* Number of erase blocks */
-};
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-/* The RAM MTD driver may be useful just as it is, but another good use of
- * the RAM MTD driver is as a FLASH simulation -- to support testing of FLASH
- * based logic without having FLASH. CONFIG_RAMMTD_FLASHSIM will add some
- * extra logic to improve the level of FLASH simulation.
- */
-
-#define ram_read(dest, src, len) memcpy(dest, src, len)
-#ifdef CONFIG_RAMMTD_FLASHSIM
-static void *ram_write(FAR void *dest, FAR const void *src, size_t len);
-#else
-# define ram_write(dest, src, len) memcpy(dest, src, len)
-#endif
-
-/* MTD driver methods */
-
-static int ram_erase(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks);
-static ssize_t ram_bread(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks,
- FAR uint8_t *buf);
-static ssize_t ram_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks,
- FAR const uint8_t *buf);
-static int ram_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg);
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: ram_write
- ****************************************************************************/
-
-#ifdef CONFIG_RAMMTD_FLASHSIM
-static void *ram_write(FAR void *dest, FAR const void *src, size_t len)
-{
- FAR uint8_t *pout = (FAR uint8_t *)dest;
- FAR const uint8_t *pin = (FAR const uint8_t *)src;
-
- while (len-- > 0)
- {
- /* Get the source and destination values */
-
- uint8_t oldvalue = *pout;
- uint8_t srcvalue = *pin++;
- uint8_t newvalue;
-
- /* Get the new destination value, accounting for bits that cannot be
- * changes because they are not in the erased state.
- */
-
-#if CONFIG_RAMMTD_ERASESTATE == 0xff
- newvalue = oldvalue & srcvalue; /* We can only clear bits */
-#else /* CONFIG_RAMMTD_ERASESTATE == 0x00 */
- newvalue = oldvalue | srcvalue; /* We can only set bits */
-#endif
-
- /* Report any attempt to change the value of bits that are not in the
- * erased state.
- */
-
-#ifdef CONFIG_DEBUG
- if (newvalue != srcvalue)
- {
- dbg("ERROR: Bad write: source=%02x dest=%02x result=%02x\n",
- srcvalue, oldvalue, newvalue);
- }
-#endif
-
- /* Write the modified value to simulated FLASH */
-
- *pout++ = newvalue;
- }
-
- return dest;
-}
-#endif
-
-/****************************************************************************
- * Name: ram_erase
- ****************************************************************************/
-
-static int ram_erase(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks)
-{
- FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
- off_t offset;
- size_t nbytes;
-
- DEBUGASSERT(dev);
-
- /* Don't let the erase exceed the size of the ram buffer */
-
- if (startblock >= priv->nblocks)
- {
- return 0;
- }
-
- if (startblock + nblocks > priv->nblocks)
- {
- nblocks = priv->nblocks - startblock;
- }
-
- /* Convert the erase block to a logical block and the number of blocks
- * in logical block numbers
- */
-
- startblock *= CONFIG_RAMMTD_BLKPER;
- nblocks *= CONFIG_RAMMTD_BLKPER;
-
- /* Get the offset corresponding to the first block and the size
- * corresponding to the number of blocks.
- */
-
- offset = startblock * CONFIG_RAMMTD_BLOCKSIZE;
- nbytes = nblocks * CONFIG_RAMMTD_BLOCKSIZE;
-
- /* Then erase the data in RAM */
-
- memset(&priv->start[offset], CONFIG_RAMMTD_ERASESTATE, nbytes);
- return OK;
-}
-
-/****************************************************************************
- * Name: ram_bread
- ****************************************************************************/
-
-static ssize_t ram_bread(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks,
- FAR uint8_t *buf)
-{
- FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
- off_t offset;
- off_t maxblock;
- size_t nbytes;
-
- DEBUGASSERT(dev && buf);
-
- /* Don't let the read exceed the size of the ram buffer */
-
- maxblock = priv->nblocks * CONFIG_RAMMTD_BLKPER;
- if (startblock >= maxblock)
- {
- return 0;
- }
-
- if (startblock + nblocks > maxblock)
- {
- nblocks = maxblock - startblock;
- }
-
- /* Get the offset corresponding to the first block and the size
- * corresponding to the number of blocks.
- */
-
- offset = startblock * CONFIG_RAMMTD_BLOCKSIZE;
- nbytes = nblocks * CONFIG_RAMMTD_BLOCKSIZE;
-
- /* Then read the data frp, RAM */
-
- ram_read(buf, &priv->start[offset], nbytes);
- return nblocks;
-}
-
-/****************************************************************************
- * Name: ram_bwrite
- ****************************************************************************/
-
-static ssize_t ram_bwrite(FAR struct mtd_dev_s *dev, off_t startblock,
- size_t nblocks, FAR const uint8_t *buf)
-{
- FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
- off_t offset;
- off_t maxblock;
- size_t nbytes;
-
- DEBUGASSERT(dev && buf);
-
- /* Don't let the write exceed the size of the ram buffer */
-
- maxblock = priv->nblocks * CONFIG_RAMMTD_BLKPER;
- if (startblock >= maxblock)
- {
- return 0;
- }
-
- if (startblock + nblocks > maxblock)
- {
- nblocks = maxblock - startblock;
- }
-
- /* Get the offset corresponding to the first block and the size
- * corresponding to the number of blocks.
- */
-
- offset = startblock * CONFIG_RAMMTD_BLOCKSIZE;
- nbytes = nblocks * CONFIG_RAMMTD_BLOCKSIZE;
-
- /* Then write the data to RAM */
-
- ram_write(&priv->start[offset], buf, nbytes);
- return nblocks;
-}
-
-/****************************************************************************
- * Name: ram_ioctl
- ****************************************************************************/
-
-static int ram_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg)
-{
- FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
- int ret = -EINVAL; /* Assume good command with bad parameters */
-
- switch (cmd)
- {
- case MTDIOC_GEOMETRY:
- {
- FAR struct mtd_geometry_s *geo = (FAR struct mtd_geometry_s *)((uintptr_t)arg);
- if (geo)
- {
- /* Populate the geometry structure with information need to know
- * the capacity and how to access the device.
- */
-
- geo->blocksize = CONFIG_RAMMTD_BLOCKSIZE;
- geo->erasesize = CONFIG_RAMMTD_ERASESIZE;
- geo->neraseblocks = priv->nblocks;
- ret = OK;
- }
- }
- break;
-
- case MTDIOC_XIPBASE:
- {
- FAR void **ppv = (FAR void**)((uintptr_t)arg);
- if (ppv)
- {
- /* Return (void*) base address of device memory */
-
- *ppv = (FAR void*)priv->start;
- ret = OK;
- }
- }
- break;
-
- case MTDIOC_BULKERASE:
- {
- size_t size = priv->nblocks * CONFIG_RAMMTD_ERASESIZE;
-
- /* Erase the entire device */
-
- memset(priv->start, CONFIG_RAMMTD_ERASESTATE, size);
- ret = OK;
- }
- break;
-
- default:
- ret = -ENOTTY; /* Bad command */
- break;
- }
-
- return ret;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: rammtd_initialize
- *
- * Description:
- * Create and initialize a RAM MTD device instance.
- *
- * Input Parameters:
- * start - Address of the beginning of the allocated RAM regions.
- * size - The size in bytes of the allocated RAM region.
- *
- ****************************************************************************/
-
-FAR struct mtd_dev_s *rammtd_initialize(FAR uint8_t *start, size_t size)
-{
- FAR struct ram_dev_s *priv;
- size_t nblocks;
-
- /* Create an instance of the RAM MTD device state structure */
-
- priv = (FAR struct ram_dev_s *)kmalloc(sizeof(struct ram_dev_s));
- if (!priv)
- {
- fdbg("Failed to allocate the RAM MTD state structure\n");
- return NULL;
- }
-
- /* Force the size to be an even number of the erase block size */
-
- nblocks = size / CONFIG_RAMMTD_ERASESIZE;
- if (nblocks <= 0)
- {
- fdbg("Need to provide at least one full erase block\n");
- return NULL;
- }
-
- /* Perform initialization as necessary */
-
- priv->mtd.erase = ram_erase;
- priv->mtd.bread = ram_bread;
- priv->mtd.bwrite = ram_bwrite;
- priv->mtd.ioctl = ram_ioctl;
- priv->mtd.erase = ram_erase;
-
- priv->start = start;
- priv->nblocks = nblocks;
- return &priv->mtd;
-}