summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-06-01 20:08:20 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-06-01 20:08:20 +0000
commit7d94dfd30b6a334a440c69707cec9246dc5c0647 (patch)
tree1278d1fa0ddf74c5719b72d26f9ee1048997d60b
parente82665a8c9ce3d089e4fea4969aac21689f58947 (diff)
downloadnuttx-7d94dfd30b6a334a440c69707cec9246dc5c0647.tar.gz
nuttx-7d94dfd30b6a334a440c69707cec9246dc5c0647.tar.bz2
nuttx-7d94dfd30b6a334a440c69707cec9246dc5c0647.zip
Add RAM disk supportnuttx-3.11
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@765 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/ChangeLog5
-rw-r--r--nuttx/Documentation/NuttX.html56
-rw-r--r--nuttx/ReleaseNotes21
-rw-r--r--nuttx/arch/sim/src/up_blockdevice.c128
-rw-r--r--nuttx/arch/sim/src/up_initialize.c2
-rw-r--r--nuttx/configs/sim/mount/Make.defs4
-rw-r--r--nuttx/configs/sim/mount/defconfig15
-rwxr-xr-xnuttx/configs/sim/mount/setenv.sh2
-rw-r--r--nuttx/drivers/Makefile3
-rw-r--r--nuttx/drivers/ramdisk.c250
-rw-r--r--nuttx/examples/README.txt3
-rw-r--r--nuttx/examples/mount/mount_main.c10
-rw-r--r--nuttx/fs/fs_registerblockdriver.c60
-rw-r--r--nuttx/include/nuttx/fat.h30
-rw-r--r--nuttx/include/nuttx/ramdisk.h82
15 files changed, 465 insertions, 206 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 33668b6ed..28c4a0802 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -356,7 +356,7 @@
deletion logic (timer_delete.c) and one in stream logic (lib_init.c) reported
by kwonsk.
-0.3.11 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
+0.3.11 2008-06-01 Gregory Nutt <spudmonkey@racsa.co.cr>
* Add support for recursive mutexes.
* Eliminate a memory leak -- contained watchdog instance was not being
@@ -367,3 +367,6 @@
* Host simulator no longer uses Linux system calls directly; Now works with Cygwin.
* Fix an error that occurs when a POSIX timer is deleted by the timer signal handler.
* Add logic to allow the examples/ostest to be run repetitively as an endurance test.
+ * Add a ramdisk block driver
+
+0.3.12 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
diff --git a/nuttx/Documentation/NuttX.html b/nuttx/Documentation/NuttX.html
index 6d8a69ba1..16ccfb199 100644
--- a/nuttx/Documentation/NuttX.html
+++ b/nuttx/Documentation/NuttX.html
@@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1>
- <p>Last Updated: May 31, 2008</p>
+ <p>Last Updated: June 1, 2008</p>
</td>
</tr>
</table>
@@ -456,7 +456,7 @@
</table>
<p>
- The 22nd release of NuttX (nuttx-0.3.11) is available for download
+ The 23rd release of NuttX (nuttx-0.3.11) is available for download
from the <a href="http://sourceforge.net/project/showfiles.php?group_id=189573">SourceForge</a>
website.
The change log associated with the release is available <a href="#currentrelease">here</a>.
@@ -464,16 +464,24 @@
These unreleased changes are listed <a href="#pendingchanges">here</a>.
</p>
<p>
- nuttx-0.3.10 is an important bug fix release.
- This release incorporates fixes to correct critical list handling errors
- in task shutdown logic: One in timer deletion logic (timer_delete.c) and one
- in stream logic (lib_init.c).
+ nuttx-0.3.11 is another important bugfix release.
+ This release fixes several bugs:
</p>
+<ul>
+ <li>Two POSIX timer bugs: a memory leak as well a fatal sequencing error.</li>
+ <li>Several FAT filesystem errors.</li>
+ <li>A deadlock that can occur in <code>opendir()</code></li>
+</ul>
<p>
- Additional, minor enhancements includes support to ZiLOG EZ80Acclaim
- microcontrooler (EZ80F91 chip) and configurations fot the ZiLOG z8f64200100kit (Z8F6423)
- and ez80f0910200kitg (EZ80F091) development kit.
+ A few new features were also added:
</p>
+<ul>
+ <li>Support for recursive mutexes</li>
+ <li>Added a RAM disk block driver</li>
+ <li>The host simulator no longer uses direct Linux system calls and now also works on Cygwin.</li>
+ <li>The OS test was strengthen and now runs as an endurance test</li>
+</ul>
+
<p>
As usual, any feedback about bugs or suggestions for improvement would be greatly appreciated.
</p>
@@ -973,14 +981,18 @@ Other memory:
</table>
<pre><ul>
-nuttx-0.3.10 2008-05-15 Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
+nuttx-0.3.11 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
- * Add support for the ZiLOG EZ80Acclaim microcontrooler (EZ80F91 chip).
- * Add configuration for the ZiLOG z8f64200100kit development kit, Z8F6423 part.
- * Add configuration for the ZiLOG ez80f0910200kitg development kit, EZ80F091 part.
- * Correct critical list handling errors in task shutdown logic: One in timer
- deletion logic (timer_delete.c) and one in stream logic (lib_init.c) reported
- by kwonsk.
+ * Add support for recursive mutexes.
+ * Eliminate a memory leak -- contained watchdog instance was not being
+ deleted with a POSIX timer was deleted reported by kwonsk.
+ * Eliminate a deadlock condition in opendir() reported by kwonsk.
+ * Fix several FAT filesystem problems reported by kwonsk (Changes not yet
+ verified).
+ * Host simulator no longer uses Linux system calls directly; Now works with Cygwin.
+ * Fix an error that occurs when a POSIX timer is deleted by the timer signal handler.
+ * Add logic to allow the examples/ostest to be run repetitively as an endurance test.
+ * Add a ramdisk block driver
pascal-0.1.2 2008-02-10 Gregory Nutt <spudmonkey@racsa.co.cr>
@@ -1006,17 +1018,7 @@ buildroot-0.1.0 2007-03-09 &lt;spudmonkey@racsa.co.cr&gt
</table>
<pre><ul>
-nuttx-0.3.11 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
-
- * Add support for recursive mutexes.
- * Eliminate a memory leak -- contained watchdog instance was not being
- deleted with a POSIX timer was deleted reported by kwonsk.
- * Eliminate a deadlock condition in opendir() reported by kwonsk.
- * Fix several FAT filesystem problems reported by kwonsk (Changes not yet
- verified).
- * Host simulator no longer uses Linux system calls directly; Now works with Cygwin.
- * Fix an error that occurs when a POSIX timer is deleted by the timer signal handler.
- * Add logic to allow the examples/ostest to be run repetitively as an endurance test.
+nuttx-0.3.12 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
pascal-0.1.3 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
diff --git a/nuttx/ReleaseNotes b/nuttx/ReleaseNotes
index a1859cb3c..1c54807d7 100644
--- a/nuttx/ReleaseNotes
+++ b/nuttx/ReleaseNotes
@@ -452,4 +452,25 @@ in stream logic (lib_init.c). This release also includes support to ZiLOG EZ80A
microcontrooler (EZ80F91 chip) and configurations fot the ZiLOG z8f64200100kit (Z8F6423)
and ez80f0910200kitg (EZ80F091) development kit.
+nuttx=0.3.11
+^^^^^^^^^^^^
+
+This is the 23rd release of NuttX. This is another important bugfix release.
+This releases fixes several bugs:
+
+* Two POSIX timer bugs: a memory leak as well a fatal sequencing error.
+* Several FAT filesystem errors.
+* A deadlock that can occur in opendir()
+
+A few new features were also added:
+
+* Support for recursive mutexes
+* Added a RAM disk block driver
+* The host simulator no longer uses direct Linux system calls and now also works on Cygwin.
+* The OS test was strengthen and now runs as an endurance test
+
+These changes were verified only on the Host simulator under Cygwin. Please report
+any errors to me.
+
+This tarball contains a complete CVS snapshot from June 1, 2008.
diff --git a/nuttx/arch/sim/src/up_blockdevice.c b/nuttx/arch/sim/src/up_blockdevice.c
index 60dbcd021..243d8215f 100644
--- a/nuttx/arch/sim/src/up_blockdevice.c
+++ b/nuttx/arch/sim/src/up_blockdevice.c
@@ -1,7 +1,7 @@
/****************************************************************************
* up_blockdevice.c
*
- * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -38,11 +38,13 @@
****************************************************************************/
#include <nuttx/config.h>
+
#include <sys/types.h>
#include <string.h>
-#include <nuttx/fs.h>
#include <errno.h>
+#include <nuttx/ramdisk.h>
+
#include "up_internal.h"
/****************************************************************************
@@ -60,142 +62,26 @@
* Private Function Prototypes
****************************************************************************/
-static int up_open(FAR struct inode *inode);
-static int up_close(FAR struct inode *inode);
-static ssize_t up_read(FAR struct inode *inode, unsigned char *buffer,
- size_t start_sector, unsigned int nsectors);
-static ssize_t up_write(FAR struct inode *inode, const unsigned char *buffer,
- size_t start_sector, unsigned int nsectors);
-static int up_geometry(FAR struct inode *inode, struct geometry *geometry);
-
/****************************************************************************
* Private Data
****************************************************************************/
-static const struct block_operations g_bops =
-{
- .open = up_open,
- .close = up_close,
- .read = up_read,
- .write = up_write,
- .geometry = up_geometry,
-};
-
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
- * Name: up_open
- *
- * Description: Open the block device
- *
- ****************************************************************************/
-
-static int up_open(FAR struct inode *inode)
-{
- return OK;
-}
-
-/****************************************************************************
- * Name: up_closel
- *
- * Description: close the block device
- *
- ****************************************************************************/
-
-static int up_close(FAR struct inode *inode)
-{
- return OK;
-}
-
-/****************************************************************************
- * Name: up_read
- *
- * Description: Read the specified numer of sectors
- *
- ****************************************************************************/
-
-static ssize_t up_read(FAR struct inode *inode, unsigned char *buffer,
- size_t start_sector, unsigned int nsectors)
-{
- if (inode)
- {
- char *src = inode->i_private;
- if (src &&
- start_sector < NSECTORS &&
- start_sector + nsectors < NSECTORS)
- {
- memcpy(buffer,
- &src[start_sector*LOGICAL_SECTOR_SIZE],
- nsectors*LOGICAL_SECTOR_SIZE);
- return nsectors;
- }
- }
- return -EINVAL;
-}
-
-/****************************************************************************
- * Name: up_write
- *
- * Description: Write the specified number of sectors
- *
- ****************************************************************************/
-
-static ssize_t up_write(FAR struct inode *inode, const unsigned char *buffer,
- size_t start_sector, unsigned int nsectors)
-{
- if (inode)
- {
- char *dest = inode->i_private;
- if (dest &&
- start_sector < NSECTORS &&
- start_sector + nsectors < NSECTORS)
- {
- memcpy(&dest[start_sector*LOGICAL_SECTOR_SIZE],
- buffer,
- nsectors*LOGICAL_SECTOR_SIZE);
- return nsectors;
- }
- }
- return -EINVAL;
-}
-
-/****************************************************************************
- * Name: up_geometry
- *
- * Description: Return device geometry
- *
- ****************************************************************************/
-
-static int up_geometry(FAR struct inode *inode, struct geometry *geometry)
- {
- if (geometry)
- {
- geometry->geo_available = (inode->i_private != NULL);
- geometry->geo_mediachanged = FALSE;
- geometry->geo_writeenabled = TRUE;
- geometry->geo_nsectors = NSECTORS;
- geometry->geo_sectorsize = LOGICAL_SECTOR_SIZE;
- return OK;
- }
- return -EINVAL;
- }
-
-/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: up_registerblockdevice
*
- * Description: Register the simulated block device
-
+ * Description: Register the FAT ramdisk
+ *
****************************************************************************/
void up_registerblockdevice(void)
{
- /* Inode private data is a filesystem image */
- void *priv = (void*)up_deviceimage();
- (void)register_blockdriver("/dev/blkdev", &g_bops, 0, priv);
+ rd_register(0, up_deviceimage(), NSECTORS, LOGICAL_SECTOR_SIZE, TRUE);
}
diff --git a/nuttx/arch/sim/src/up_initialize.c b/nuttx/arch/sim/src/up_initialize.c
index cb5901ffe..4f639a88b 100644
--- a/nuttx/arch/sim/src/up_initialize.c
+++ b/nuttx/arch/sim/src/up_initialize.c
@@ -85,7 +85,7 @@ void up_initialize(void)
devnull_register(); /* Standard /dev/null */
up_devconsole(); /* Our private /dev/console */
- up_registerblockdevice(); /* Our simulated block device /dev/blkdev */
+ up_registerblockdevice(); /* Our FAT ramdisk at /dev/ram0 */
#if defined(CONFIG_NET) && defined(linux)
uipdriver_init(); /* Our "real" netwok driver */
#endif
diff --git a/nuttx/configs/sim/mount/Make.defs b/nuttx/configs/sim/mount/Make.defs
index b4b553946..b177d9cdf 100644
--- a/nuttx/configs/sim/mount/Make.defs
+++ b/nuttx/configs/sim/mount/Make.defs
@@ -1,7 +1,7 @@
############################################################################
-# configs/sim/Make.defs
+# configs/sim/mount/Make.defs
#
-# Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# Redistribution and use in source and binary forms, with or without
diff --git a/nuttx/configs/sim/mount/defconfig b/nuttx/configs/sim/mount/defconfig
index f5e7bc8f8..1acf235ce 100644
--- a/nuttx/configs/sim/mount/defconfig
+++ b/nuttx/configs/sim/mount/defconfig
@@ -1,7 +1,7 @@
############################################################################
-# sim/defconfig
+# sim/mount/defconfig
#
-# Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# Redistribution and use in source and binary forms, with or without
@@ -81,7 +81,7 @@ CONFIG_ARCH_BOARD_SIM=y
# CONFIG_DEV_CONSOLE - Set if architecture-specific logic
# provides /dev/console. Enables stdout, stderr, stdin.
#
-CONFIG_EXAMPLE=ostest
+CONFIG_EXAMPLE=mount
CONFIG_DEBUG=y
CONFIG_DEBUG_VERBOSE=y
CONFIG_MM_REGIONS=1
@@ -89,9 +89,9 @@ CONFIG_ARCH_LOWPUTC=y
CONFIG_RR_INTERVAL=0
CONFIG_SCHED_INSTRUMENTATION=n
CONFIG_TASK_NAME_SIZE=32
-CONFIG_START_YEAR=2007
-CONFIG_START_MONTH=2
-CONFIG_START_DAY=27
+CONFIG_START_YEAR=2008
+CONFIG_START_MONTH=6
+CONFIG_START_DAY=1
CONFIG_JULIAN_TIME=n
CONFIG_DEV_CONSOLE=y
@@ -299,6 +299,9 @@ CONFIG_EXAMPLES_NSH_DRIPADDR=(10<<24|0<<16|0<<8|1)
CONFIG_EXAMPLES_NSH_NETMASK=(255<<24|255<<16|255<<8|0)
#
+# Settings for examples/mount
+CONFIG_EXAMPLES_MOUNT_DEVNAME="/dev/ram0"
+#
# Stack and heap information
#
# CONFIG_BOOT_FROM_FLASH - Some configurations support XIP
diff --git a/nuttx/configs/sim/mount/setenv.sh b/nuttx/configs/sim/mount/setenv.sh
index 9b3df2015..cb28f8df7 100755
--- a/nuttx/configs/sim/mount/setenv.sh
+++ b/nuttx/configs/sim/mount/setenv.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# sim/setenv.sh
#
-# Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# Redistribution and use in source and binary forms, with or without
diff --git a/nuttx/drivers/Makefile b/nuttx/drivers/Makefile
index 00ceef1f0..b300045bc 100644
--- a/nuttx/drivers/Makefile
+++ b/nuttx/drivers/Makefile
@@ -45,6 +45,9 @@ AOBJS = $(ASRCS:.S=$(OBJEXT))
CSRCS =
ifneq ($(CONFIG_NFILE_DESCRIPTORS),0)
CSRCS += dev_null.c dev_zero.c serial.c lowconsole.c can.c
+ifneq ($(CONFIG_DISABLE_MOUNTPOINT),y)
+CSRCS += ramdisk.c
+endif
endif
CSRCS += $(NET_CSRCS)
COBJS = $(CSRCS:.c=$(OBJEXT))
diff --git a/nuttx/drivers/ramdisk.c b/nuttx/drivers/ramdisk.c
new file mode 100644
index 000000000..506eb4593
--- /dev/null
+++ b/nuttx/drivers/ramdisk.c
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * drivers/ramdisk.c
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <nuttx/fs.h>
+#include <nuttx/ramdisk.h>
+
+/****************************************************************************
+ * Private Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct rd_struct_s
+{
+ uint32 rd_nsectors; /* Number of sectors on device */
+ uint16 rd_sectsize; /* The size of one sector */
+ boolean rd_writeenabled; /* TRUE: can write to ram disk */
+ ubyte *rd_buffer; /* RAM disk backup memory */
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static int rd_open(FAR struct inode *inode);
+static int rd_close(FAR struct inode *inode);
+static ssize_t rd_read(FAR struct inode *inode, unsigned char *buffer,
+ size_t start_sector, unsigned int nsectors);
+static ssize_t rd_write(FAR struct inode *inode, const unsigned char *buffer,
+ size_t start_sector, unsigned int nsectors);
+static int rd_geometry(FAR struct inode *inode, struct geometry *geometry);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct block_operations g_bops =
+{
+ rd_open, /* open */
+ rd_close, /* close */
+ rd_read, /* read */
+ rd_write, /* write */
+ rd_geometry, /* geometry */
+ NULL /* ioctl */
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rd_open
+ *
+ * Description: Open the block device
+ *
+ ****************************************************************************/
+
+static int rd_open(FAR struct inode *inode)
+{
+ return OK;
+}
+
+/****************************************************************************
+ * Name: rd_closel
+ *
+ * Description: close the block device
+ *
+ ****************************************************************************/
+
+static int rd_close(FAR struct inode *inode)
+{
+ return OK;
+}
+
+/****************************************************************************
+ * Name: rd_read
+ *
+ * Description: Read the specified numer of sectors
+ *
+ ****************************************************************************/
+
+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)
+ {
+ 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;
+ }
+ }
+ return -EINVAL;
+}
+
+/****************************************************************************
+ * Name: rd_write
+ *
+ * Description: Write the specified number of sectors
+ *
+ ****************************************************************************/
+
+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)
+ {
+ dev = (struct rd_struct_s *)inode->i_private;
+ if (dev &&
+ 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 -EINVAL;
+}
+
+/****************************************************************************
+ * Name: rd_geometry
+ *
+ * Description: Return device geometry
+ *
+ ****************************************************************************/
+
+static int rd_geometry(FAR struct inode *inode, struct geometry *geometry)
+{
+ struct rd_struct_s *dev;
+ if (inode && geometry)
+ {
+ dev = (struct rd_struct_s *)inode->i_private;
+ geometry->geo_available = TRUE;
+ geometry->geo_mediachanged = FALSE;
+ geometry->geo_writeenabled = dev->rd_writeenabled;
+ geometry->geo_nsectors = dev->rd_nsectors;
+ geometry->geo_sectorsize = dev->rd_sectsize;
+ return OK;
+ }
+ return -EINVAL;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rd_register
+ *
+ * Description: Register the a ramdisk
+
+ ****************************************************************************/
+
+int rd_register(int minor, ubyte *buffer, uint32 nsectors, uint16 sectsize,
+ boolean writeenabled)
+{
+ struct rd_struct_s *dev;
+ char devname[16];
+ int ret = -ENOMEM;
+
+ /* Sanity check */
+
+#ifdef CONFIG_DEBUG
+ if (minor < 0 || minor > 255 || !buffer || !nsectors || !sectsize)
+ {
+ return -EINVAL;
+ }
+#endif
+
+ /* Allocate a ramdisk device structure */
+
+ dev = (struct rd_struct_s *)malloc(sizeof(struct rd_struct_s));
+ if (dev)
+ {
+ /* Initialize the ramdisk device structure */
+
+ dev->rd_nsectors = nsectors; /* Number of sectors on device */
+ dev->rd_sectsize = sectsize; /* The size of one sector */
+ dev->rd_writeenabled = writeenabled; /* TRUE: can write to ram disk */
+ dev->rd_buffer = buffer; /* RAM disk backup memory */
+
+ /* Create a ramdisk device name */
+
+ snprintf(devname, 16, "/dev/ram%d", minor);
+
+ /* Inode private data is a reference to the ramdisk device stgructure */
+
+ ret = register_blockdriver(devname, &g_bops, 0, dev);
+ if (ret < 0)
+ {
+ free(dev);
+ }
+ }
+ return ret;
+}
diff --git a/nuttx/examples/README.txt b/nuttx/examples/README.txt
index 47ec67f6f..8ea3fac6c 100644
--- a/nuttx/examples/README.txt
+++ b/nuttx/examples/README.txt
@@ -107,6 +107,9 @@ examples/mount
^^^^^^^^^^^^^^
This contains a simple test of filesystem mountpoints.
+
+ * CONFIG_EXAMPLES_MOUNT_DEVNAME
+ The name of the device to mount. Default: "/dev/ram0"
examples/null
^^^^^^^^^^^^^
diff --git a/nuttx/examples/mount/mount_main.c b/nuttx/examples/mount/mount_main.c
index 978b51dce..bd792ee11 100644
--- a/nuttx/examples/mount/mount_main.c
+++ b/nuttx/examples/mount/mount_main.c
@@ -1,7 +1,7 @@
/****************************************************************************
* mount_main.c
*
- * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -14,7 +14,7 @@
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
- * 3. Neither the name Gregory Nutt nor the names of its contributors may be
+ * 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.
*
@@ -54,6 +54,10 @@
* Definitions
****************************************************************************/
+#ifndef CONFIG_EXAMPLES_MOUNT_DEVNAME
+# define CONFIG_EXAMPLES_MOUNT_DEVNAME "/dev/ram0"
+#endif
+
#define TEST_USE_STAT 1
#define TEST_SHOW_DIRECTORIES 1
#define TEST_USE_STATFS 1
@@ -66,7 +70,7 @@
* Private Data
****************************************************************************/
-static const char g_source[] = "/dev/blkdev";
+static const char g_source[] = CONFIG_EXAMPLES_MOUNT_DEVNAME;
static const char g_mntdir[] = "/mnt";
static const char g_target[] = "/mnt/fs";
static const char g_filesystemtype[] = "vfat";
diff --git a/nuttx/fs/fs_registerblockdriver.c b/nuttx/fs/fs_registerblockdriver.c
index e48f58dc9..b4d89e773 100644
--- a/nuttx/fs/fs_registerblockdriver.c
+++ b/nuttx/fs/fs_registerblockdriver.c
@@ -1,7 +1,7 @@
-/************************************************************
+/****************************************************************************
* fs_registerblockdriver.c
*
- * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -14,7 +14,7 @@
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
- * 3. Neither the name Gregory Nutt nor the names of its contributors may be
+ * 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.
*
@@ -31,11 +31,11 @@
* 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>
@@ -43,58 +43,60 @@
#include <nuttx/fs.h>
#include "fs_internal.h"
-/************************************************************
+/****************************************************************************
* Definitions
- ************************************************************/
+ ****************************************************************************/
-/************************************************************
+/****************************************************************************
* Private Variables
- ************************************************************/
+ ****************************************************************************/
-/************************************************************
+/****************************************************************************
* Public Variables
- ************************************************************/
+ ****************************************************************************/
-/************************************************************
+/****************************************************************************
* Private Functions
- ************************************************************/
+ ****************************************************************************/
-/************************************************************
+/****************************************************************************
* Public Functions
- ************************************************************/
+ ****************************************************************************/
-/************************************************************
+/****************************************************************************
* Name: register_driver
- ************************************************************/
+ ****************************************************************************/
STATUS register_blockdriver(const char *path,
const struct block_operations *bops,
mode_t mode, void *private)
{
struct inode *node;
- STATUS ret = ERROR;
+ STATUS ret = -ENOMEM;
- /* Insert a dummy node -- we need to hold the inode semaphore
- * to do this because we will have a momentarily bad structure.
+ /* Insert an inode for the device driver -- we need to hold the inode semaphore
+ * to prevent access to the tree while we this. This is because we will have a
+ * momentarily bad true until we populate the inode with valid data.
*/
inode_semtake();
node = inode_reserve(path);
if (node != NULL)
{
- /* We have it, now populate it with block driver specific
- * information.
- */
+ /* We have it, now populate it with block driver specific
+ * information.
+ */
- INODE_SET_BLOCK(node);
+ INODE_SET_BLOCK(node);
- node->u.i_bops = bops;
+ node->u.i_bops = bops;
#ifdef CONFIG_FILE_MODE
- node->i_mode = mode;
+ node->i_mode = mode;
#endif
- node->i_private = private;
- ret = OK;
+ node->i_private = private;
+ ret = OK;
}
+
inode_semgive();
return ret;
}
diff --git a/nuttx/include/nuttx/fat.h b/nuttx/include/nuttx/fat.h
index db9a4a902..720e64547 100644
--- a/nuttx/include/nuttx/fat.h
+++ b/nuttx/include/nuttx/fat.h
@@ -1,7 +1,7 @@
-/************************************************************
+/****************************************************************************
* nuttx/fat.h
*
- * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -14,7 +14,7 @@
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
- * 3. Neither the name Gregory Nutt nor the names of its contributors may be
+ * 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.
*
@@ -31,20 +31,20 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- ************************************************************/
+ ****************************************************************************/
-#ifndef __SYS_FAT_H
-#define __SYS_FAT_H
+#ifndef __NUTTX_FAT_H
+#define __NUTTX_FAT_H
-/************************************************************
+/****************************************************************************
* Included Files
- ************************************************************/
+ ****************************************************************************/
#include <sys/types.h>
-/************************************************************
+/****************************************************************************
* Type Definitions
- ************************************************************/
+ ****************************************************************************/
/* File attribute bits in FAT directory entry */
@@ -58,15 +58,15 @@
#define FATATTR_LONGNAME \
(FATATTR_READONLY|FATATTR_HIDDEN|FATATTR_SYSTEM|FATATTR_VOLUMEID)
-/************************************************************
+/****************************************************************************
* Type Definitions
- ************************************************************/
+ ****************************************************************************/
typedef ubyte fat_attrib_t;
-/************************************************************
+/****************************************************************************
* Public Function Prototypes
- ************************************************************/
+ ****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
@@ -87,4 +87,4 @@ EXTERN int fat_setattrib(const char *path, fat_attrib_t setbits, fat_attrib_t cl
}
#endif
-#endif /* __SYS_FAT_H */
+#endif /* __NUTTX_FAT_H */
diff --git a/nuttx/include/nuttx/ramdisk.h b/nuttx/include/nuttx/ramdisk.h
new file mode 100644
index 000000000..839855633
--- /dev/null
+++ b/nuttx/include/nuttx/ramdisk.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+ * nuttx/ramdisk.h
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+#ifndef __NUTTX_RAMDISK_H
+#define __NUTTX_RAMDISK_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/types.h>
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
+/* Non-standard function to register a ramdisk
+ *
+ * minor: Selects suffix of device named /dev/ramN, N={1,2,3...}
+ * nsectors: Number of sectors on device
+ * sectize: The size of one sector
+ * writeenabled: TRUE: can write to ram disk
+ * buffer: RAM disk backup memory
+ */
+
+EXTERN int rd_register(int minor, ubyte *buffer, uint32 nsectors,
+ uint16 sectize, boolean writeenabled);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __NUTTX_RAMDISK_H */