summaryrefslogtreecommitdiff
path: root/nuttx/drivers/ramdisk.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-09-12 14:34:06 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-09-12 14:34:06 +0000
commit6aef5e8ed36c97406e930f3cf45d259399fc3d59 (patch)
tree98259bf727ccfc4f7cd0589bebd387caf72c0191 /nuttx/drivers/ramdisk.c
parent627dfd23c0a52dc8a5f8b9c2cdaaa6681154f948 (diff)
downloadpx4-nuttx-6aef5e8ed36c97406e930f3cf45d259399fc3d59.tar.gz
px4-nuttx-6aef5e8ed36c97406e930f3cf45d259399fc3d59.tar.bz2
px4-nuttx-6aef5e8ed36c97406e930f3cf45d259399fc3d59.zip
Add ioctl's to support XIP
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@913 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/drivers/ramdisk.c')
-rw-r--r--nuttx/drivers/ramdisk.c85
1 files changed, 54 insertions, 31 deletions
diff --git a/nuttx/drivers/ramdisk.c b/nuttx/drivers/ramdisk.c
index 3f261943e..0bb7c1cb0 100644
--- a/nuttx/drivers/ramdisk.c
+++ b/nuttx/drivers/ramdisk.c
@@ -40,6 +40,7 @@
#include <nuttx/config.h>
#include <sys/types.h>
+#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -82,6 +83,7 @@ static ssize_t rd_write(FAR struct inode *inode, const unsigned char *buffer,
size_t start_sector, unsigned int nsectors);
#endif
static int rd_geometry(FAR struct inode *inode, struct geometry *geometry);
+static int rd_ioctl(FAR struct inode *inode, int cmd, unsigned long arg);
/****************************************************************************
* Private Data
@@ -98,7 +100,7 @@ static const struct block_operations g_bops =
NULL, /* write */
#endif
rd_geometry, /* geometry */
- NULL /* ioctl */
+ rd_ioctl /* ioctl */
};
/****************************************************************************
@@ -140,18 +142,16 @@ static ssize_t rd_read(FAR struct inode *inode, unsigned char *buffer,
size_t start_sector, unsigned int nsectors)
{
struct rd_struct_s *dev;
- if (inode)
+
+ DEBUGASSERT(inode && inode->i_private);
+ dev = (struct rd_struct_s *)inode->i_private;
+ if (start_sector < dev->rd_nsectors &&
+ start_sector + nsectors <= dev->rd_nsectors)
{
- dev = (struct rd_struct_s *)inode->i_private;
- if (dev &&
- start_sector < dev->rd_nsectors &&
- start_sector + nsectors <= dev->rd_nsectors)
- {
- memcpy(buffer,
- &dev->rd_buffer[start_sector * dev->rd_sectsize],
- nsectors * dev->rd_sectsize);
- return nsectors;
- }
+ memcpy(buffer,
+ &dev->rd_buffer[start_sector * dev->rd_sectsize],
+ nsectors * dev->rd_sectsize);
+ return nsectors;
}
return -EINVAL;
}
@@ -168,26 +168,22 @@ static ssize_t rd_write(FAR struct inode *inode, const unsigned char *buffer,
size_t start_sector, unsigned int nsectors)
{
struct rd_struct_s *dev;
- if (inode)
+
+ DEBUGASSERT(inode && inode->i_private);
+ dev = (struct rd_struct_s *)inode->i_private;
+ if (!dev->rd_writeenabled)
{
- dev = (struct rd_struct_s *)inode->i_private;
- if (dev)
- {
- if (!dev->rd_writeenabled)
- {
- return -EACCES;
- }
- else if (start_sector < dev->rd_nsectors &&
- start_sector + nsectors <= dev->rd_nsectors)
- {
- memcpy(&dev->rd_buffer[start_sector * dev->rd_sectsize],
- buffer,
- nsectors * dev->rd_sectsize);
- return nsectors;
- }
- }
+ return -EACCES;
}
- return -EINVAL;
+ else if (start_sector < dev->rd_nsectors &&
+ start_sector + nsectors <= dev->rd_nsectors)
+ {
+ memcpy(&dev->rd_buffer[start_sector * dev->rd_sectsize],
+ buffer,
+ nsectors * dev->rd_sectsize);
+ return nsectors;
+ }
+ return -EFBIG;
}
#endif
@@ -201,7 +197,9 @@ static ssize_t rd_write(FAR struct inode *inode, const unsigned char *buffer,
static int rd_geometry(FAR struct inode *inode, struct geometry *geometry)
{
struct rd_struct_s *dev;
- if (inode && geometry)
+
+ DEBUGASSERT(inode);
+ if (geometry)
{
dev = (struct rd_struct_s *)inode->i_private;
geometry->geo_available = TRUE;
@@ -219,6 +217,31 @@ static int rd_geometry(FAR struct inode *inode, struct geometry *geometry)
}
/****************************************************************************
+ * Name: rd_geometry
+ *
+ * Description: Return device geometry
+ *
+ ****************************************************************************/
+
+static int rd_ioctl(FAR struct inode *inode, int cmd, unsigned long arg)
+{
+ struct rd_struct_s *dev ;
+ void **ppv = (void**)arg;
+
+ /* Only one ioctl command is supported */
+
+ DEBUGASSERT(inode && inode->i_private);
+ if (cmd == BIOC_XIPBASE && ppv)
+ {
+ dev = (struct rd_struct_s *)inode->i_private;
+ *ppv = (void*)dev->rd_buffer;
+ return OK;
+ }
+
+ return -ENOTTY;
+}
+
+/****************************************************************************
* Public Functions
****************************************************************************/