diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-09-12 14:34:06 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-09-12 14:34:06 +0000 |
commit | 6aef5e8ed36c97406e930f3cf45d259399fc3d59 (patch) | |
tree | 98259bf727ccfc4f7cd0589bebd387caf72c0191 /nuttx/drivers/ramdisk.c | |
parent | 627dfd23c0a52dc8a5f8b9c2cdaaa6681154f948 (diff) | |
download | px4-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.c | 85 |
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 ****************************************************************************/ |