summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-05-09 00:05:15 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-05-09 00:05:15 +0000
commit85858bfb91e060906476d4083d71f56e3512bf83 (patch)
treed381f652c11d832050deff47f11260128a07e54d
parent039a51bde4bc3f21fe68c3f4cff966fde2532faa (diff)
downloadnuttx-85858bfb91e060906476d4083d71f56e3512bf83.tar.gz
nuttx-85858bfb91e060906476d4083d71f56e3512bf83.tar.bz2
nuttx-85858bfb91e060906476d4083d71f56e3512bf83.zip
Add structures to manage block drivers
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@207 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/include/nuttx/fs.h146
1 files changed, 103 insertions, 43 deletions
diff --git a/nuttx/include/nuttx/fs.h b/nuttx/include/nuttx/fs.h
index 7e0eb8980..af9fd924b 100644
--- a/nuttx/include/nuttx/fs.h
+++ b/nuttx/include/nuttx/fs.h
@@ -1,5 +1,5 @@
-/************************************************************
- * fs.h
+/****************************************************************************
+ * nutts/fs.h
*
* Copyright (C) 2007 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
@@ -31,63 +31,108 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- ************************************************************/
+ ****************************************************************************/
-#ifndef __FS_H
-#define __FS_H
+#ifndef __NUTTX_FS_H
+#define __NUTTX_FS_H
-/************************************************************
+/****************************************************************************
* Included Files
- ************************************************************/
+ ****************************************************************************/
#include <sys/types.h>
#include <semaphore.h>
#include <nuttx/compiler.h>
-/************************************************************
+/****************************************************************************
* Definitions
- ************************************************************/
+ ****************************************************************************/
-/************************************************************
+/****************************************************************************
* Type Definitions
- ************************************************************/
+ ****************************************************************************/
-/* This structure is provided by filesystems when they are
- * registered with the system. It is used to call back to
- * perform fs/device specific operations.
+/* This structure is provided by devices when they are registered with the
+ * system. It is used to call back to perform device specific operations.
*/
struct file;
struct file_operations
{
- int (*open)(FAR struct file *);
- int (*close)(FAR struct file *);
- ssize_t (*read)(FAR struct file *, char *, size_t);
- ssize_t (*write)(FAR struct file *, const char *, size_t);
+ int (*open)(FAR struct file *filp);
+ int (*close)(FAR struct file *filp);
+ ssize_t (*read)(FAR struct file *filp, char *buffer, size_t buflen);
+ ssize_t (*write)(FAR struct file *filp, const char *buffer, size_t buflen);
+ off_t (*seek)(FAR struct file *filp, off_t offset, int whence);
+ int (*ioctl)(FAR struct file *filp, int cmd, unsigned long arg);
+};
+
+/* This structure provides information about the state of a block driver */
+
+struct geometry
+{
+ boolean geo_available; /* False if the device is not available */
+ size_t geo_nsectors; /* Number of sectors on the device */
+ size_t geo_sectorsize; /* Size of one sector */
+};
+
+/* This structure is provided by block devices when they register with the
+ * system. It is used by file systems to perform filesystem transfers.
+ */
+
+struct block_operations
+{
+ int (*open)(FAR struct file *filp);
+ int (*close)(FAR struct file *filp);
+ ssize_t (*read)(FAR struct file *filp, char *buffer,
+ size_t start_sector, size_t nsectors);
+ ssize_t (*write)(FAR struct file *filp, const char *buffer,
+ size_t start_sector, size_t nsectors);
+ size_t (*geometry)(FAR struct file *filp, struct geometry *geometry);
int (*ioctl)(FAR struct file *, int, unsigned long);
};
+/* This structure is provided by a filesystem to describe a mount point.
+ * Note that this structure differs from file_operations ONLY in the form of
+ * the open method. Once the file is opened, it can be accessed either as a
+ * struct file_operations or struct mountpt_operations
+ */
+
+struct mountpt_operations
+{
+ int (*open)(FAR struct file *filp, const char *rel_path);
+ int (*close)(FAR struct file *filp);
+ ssize_t (*read)(FAR struct file *filp, char *buffer, size_t buflen);
+ ssize_t (*write)(FAR struct file *filp, const char *buffer, size_t buflen);
+ off_t (*seek)(FAR struct file *filp, off_t offset, int whence);
+ int (*ioctl)(FAR struct file *filp, int cmd, unsigned long arg);
+};
+
/* This structure represents one inode in the Nuttx psuedo-file system */
struct inode
{
- FAR struct inode *i_peer; /* Pointer to inode at same level */
- FAR struct inode *i_child; /* Pointer to inode at lower level */
- struct file_operations *i_ops; /* Driver file operations for inode */
- sint16 i_crefs; /* References to inode */
- uint16 i_flags; /* flags for inode */
+ FAR struct inode *i_peer; /* Pointer to same level inode */
+ FAR struct inode *i_child; /* Pointer to lower level inode */
+ sint16 i_crefs; /* References to inode */
+ uint16 i_flags; /* flags for inode */
+ union
+ {
+ const struct file_operations *i_ops; /* Driver operations for inode */
+ const struct block_operations *i_bops; /* Block driver operations */
+ const struct mountpt_operations *i_mops; /* Operations on a mountpoint */
+ } u;
#ifdef CONFIG_FILE_MODE
- mode_t i_mode; /* Access mode flags */
+ mode_t i_mode; /* Access mode flags */
#endif
- FAR void *i_private; /* Driver private data */
- char i_name[1]; /* Name of inode (variable length) */
+ FAR void *i_private; /* Driver private data */
+ char i_name[1]; /* Name of inode (variable) */
};
#define FSNODE_SIZE(n) (sizeof(struct inode) + (n))
-/* This is the underlying representation of a ropen file.
- * A file descriptor is an index into an array of such types.
- * The type associates the file descriptor to the file state
- * and to a set of inode operations.
+/* This is the underlying representation of an open file. A file
+ * descriptor is an index into an array of such types. The type associates
+ * the file descriptor to the file state and to a set of inode operations.
*/
struct file
@@ -95,6 +140,7 @@ struct file
int f_oflags; /* Open mode flags */
off_t f_pos; /* File position */
FAR struct inode *f_inode; /* Driver interface */
+ void *f_priv; /* Per file driver private data */
};
/* This defines a list of files indexed by the file descriptor */
@@ -142,9 +188,9 @@ struct streamlist
};
#endif /* CONFIG_NFILE_STREAMS */
-/************************************************************
+/****************************************************************************
* Global Function Prototypes
- ************************************************************/
+ ****************************************************************************/
#undef EXTERN
#if defined(__cplusplus)
@@ -154,23 +200,37 @@ extern "C" {
#define EXTERN extern
#endif
-/* fs_inode.c ***********************************************/
+/* fs_inode.c ***************************************************************/
/* These interfaces are used by drivers to register their
* inodes in the inode tree.
*/
EXTERN void weak_function fs_initialize(void);
-EXTERN STATUS register_inode(const char *path,
- struct file_operations *fops,
- mode_t mode, void *private);
-EXTERN STATUS unregister_inode(const char *path);
-/* fs_open.c ************************************************/
+/* fs_registerdriver.c ******************************************************/
+
+EXTERN STATUS register_driver(const char *path,
+ const struct file_operations *fops,
+ mode_t mode, void *private);
+
+/* fs_registerdriver.c ******************************************************/
+
+EXTERN STATUS register_blockdriver(const char *path,
+ const struct block_operations *bops,
+ mode_t mode, void *private);
+
+/* fs_inoderemove.c *********************************************************/
+
+EXTERN STATUS inode_remove(const char *path);
+#define unregister_driver(p) inode_remove(p)
+#define unregister_blockdriver(p) inode_remove(p)
+
+/* fs_open.c ****************************************************************/
EXTERN int inode_checkflags(FAR struct inode *inode, int oflags);
-/* fs_files.c ***********************************************/
+/* fs_files.c ***************************************************************/
#if CONFIG_NFILE_DESCRIPTORS >0
EXTERN FAR struct filelist *files_alloclist(void);
@@ -179,7 +239,7 @@ EXTERN int files_releaselist(FAR struct filelist *list);
EXTERN int files_dup(FAR struct file *filep1, FAR struct file *filep2);
#endif
-/* lib_fopen.c **********************************************/
+/* lib_fopen.c **************************************************************/
/* Used by the OS to clone stdin, stdout, stderr */
@@ -190,13 +250,13 @@ EXTERN FAR struct file_struct *lib_fdopen(int fd,
FAR struct streamlist *slist);
#endif
-/* lib_fflush.c *********************************************/
+/* lib_fflush.c *************************************************************/
#if CONFIG_NFILE_STREAMS > 0
EXTERN void lib_flushall(FAR struct streamlist *list);
#endif
-/* drivers **************************************************/
+/* drivers ******************************************************************/
/* Call in of these to register the corresponding default
* default drivers in the drivers/ subdirectory
@@ -210,4 +270,4 @@ EXTERN void devnull_register(void);
}
#endif
-#endif /* __FS_H */
+#endif /* __NUTTX_FS_H */