diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-06-01 20:08:20 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-06-01 20:08:20 +0000 |
commit | 7d94dfd30b6a334a440c69707cec9246dc5c0647 (patch) | |
tree | 1278d1fa0ddf74c5719b72d26f9ee1048997d60b | |
parent | e82665a8c9ce3d089e4fea4969aac21689f58947 (diff) | |
download | px4-nuttx-7d94dfd30b6a334a440c69707cec9246dc5c0647.tar.gz px4-nuttx-7d94dfd30b6a334a440c69707cec9246dc5c0647.tar.bz2 px4-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/ChangeLog | 5 | ||||
-rw-r--r-- | nuttx/Documentation/NuttX.html | 56 | ||||
-rw-r--r-- | nuttx/ReleaseNotes | 21 | ||||
-rw-r--r-- | nuttx/arch/sim/src/up_blockdevice.c | 128 | ||||
-rw-r--r-- | nuttx/arch/sim/src/up_initialize.c | 2 | ||||
-rw-r--r-- | nuttx/configs/sim/mount/Make.defs | 4 | ||||
-rw-r--r-- | nuttx/configs/sim/mount/defconfig | 15 | ||||
-rwxr-xr-x | nuttx/configs/sim/mount/setenv.sh | 2 | ||||
-rw-r--r-- | nuttx/drivers/Makefile | 3 | ||||
-rw-r--r-- | nuttx/drivers/ramdisk.c | 250 | ||||
-rw-r--r-- | nuttx/examples/README.txt | 3 | ||||
-rw-r--r-- | nuttx/examples/mount/mount_main.c | 10 | ||||
-rw-r--r-- | nuttx/fs/fs_registerblockdriver.c | 60 | ||||
-rw-r--r-- | nuttx/include/nuttx/fat.h | 30 | ||||
-rw-r--r-- | nuttx/include/nuttx/ramdisk.h | 82 |
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 <spudmonkey@racsa.co.cr> +nuttx-0.3.11 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> - * 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 <spudmonkey@racsa.co.cr> </table> <pre><ul> -nuttx-0.3.11 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> - - * 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 <spudmonkey@racsa.co.cr> pascal-0.1.3 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> 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 */ |