summaryrefslogtreecommitdiff
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.c56
1 files changed, 51 insertions, 5 deletions
diff --git a/nuttx/drivers/mtd/rammtd.c b/nuttx/drivers/mtd/rammtd.c
index 1d7a570e1..cbfe83e45 100644
--- a/nuttx/drivers/mtd/rammtd.c
+++ b/nuttx/drivers/mtd/rammtd.c
@@ -1,7 +1,7 @@
/****************************************************************************
* drivers/mtd/rammtd.c
*
- * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2011-2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -225,6 +225,30 @@ static int ram_erase(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks
}
/****************************************************************************
+ * Name: ram_readbytes
+ ****************************************************************************/
+
+#ifdef CONFIG_RAMMTD_SMART
+static ssize_t ram_read_bytes(FAR struct mtd_dev_s *dev, off_t offset,
+ size_t nbytes, FAR uint8_t *buf)
+{
+ FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
+
+ DEBUGASSERT(dev && buf);
+
+ /* Don't let read read past end of buffer */
+
+ if (offset + nbytes > priv->nblocks * CONFIG_RAMMTD_ERASESIZE)
+ {
+ return 0;
+ }
+
+ ram_read(buf, &priv->start[offset], nbytes);
+ return nbytes;
+}
+#endif
+
+/****************************************************************************
* Name: ram_bread
****************************************************************************/
@@ -349,13 +373,31 @@ static int ram_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg)
{
size_t size = priv->nblocks * CONFIG_RAMMTD_ERASESIZE;
- /* Erase the entire device */
+ /* Erase the entire device */
memset(priv->start, CONFIG_RAMMTD_ERASESTATE, size);
- ret = OK;
+ ret = OK;
}
break;
-
+
+#ifdef CONFIG_RAMMTD_SMART
+ case MTDIOC_GETCAPS:
+ {
+ ret = MTDIOC_CAPS_BYTEWRITE;
+ break;
+ }
+
+ case MTDIOC_BYTEWRITE:
+ {
+ struct mtd_byte_write_s *bytewrite = (struct mtd_byte_write_s *) arg;
+
+ ram_write(&priv->start[bytewrite->offset], bytewrite->buffer,
+ bytewrite->count);
+ ret = OK;
+ break;
+ }
+#endif
+
default:
ret = -ENOTTY; /* Bad command */
break;
@@ -402,7 +444,7 @@ FAR struct mtd_dev_s *rammtd_initialize(FAR uint8_t *start, size_t size)
fdbg("Need to provide at least one full erase block\n");
return NULL;
}
-
+
/* Perform initialization as necessary */
priv->mtd.erase = ram_erase;
@@ -411,6 +453,10 @@ FAR struct mtd_dev_s *rammtd_initialize(FAR uint8_t *start, size_t size)
priv->mtd.ioctl = ram_ioctl;
priv->mtd.erase = ram_erase;
+#ifdef CONFIG_RAMMTD_SMART
+ priv->mtd.read = ram_read_bytes;
+#endif
+
priv->start = start;
priv->nblocks = nblocks;
return &priv->mtd;