Add structures to manage block drivers

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@207 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2007-05-09 00:05:15 +00:00
parent 6a2863c3fd
commit 8bdcd7c208

View File

@ -1,5 +1,5 @@
/************************************************************ /****************************************************************************
* fs.h * nutts/fs.h
* *
* Copyright (C) 2007 Gregory Nutt. All rights reserved. * Copyright (C) 2007 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr> * 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 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
* *
************************************************************/ ****************************************************************************/
#ifndef __FS_H #ifndef __NUTTX_FS_H
#define __FS_H #define __NUTTX_FS_H
/************************************************************ /****************************************************************************
* Included Files * Included Files
************************************************************/ ****************************************************************************/
#include <sys/types.h> #include <sys/types.h>
#include <semaphore.h> #include <semaphore.h>
#include <nuttx/compiler.h> #include <nuttx/compiler.h>
/************************************************************ /****************************************************************************
* Definitions * Definitions
************************************************************/ ****************************************************************************/
/************************************************************ /****************************************************************************
* Type Definitions * Type Definitions
************************************************************/ ****************************************************************************/
/* This structure is provided by filesystems when they are /* This structure is provided by devices when they are registered with the
* registered with the system. It is used to call back to * system. It is used to call back to perform device specific operations.
* perform fs/device specific operations.
*/ */
struct file; struct file;
struct file_operations struct file_operations
{ {
int (*open)(FAR struct file *); int (*open)(FAR struct file *filp);
int (*close)(FAR struct file *); int (*close)(FAR struct file *filp);
ssize_t (*read)(FAR struct file *, char *, size_t); ssize_t (*read)(FAR struct file *filp, char *buffer, size_t buflen);
ssize_t (*write)(FAR struct file *, const char *, size_t); 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); 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 */ /* This structure represents one inode in the Nuttx psuedo-file system */
struct inode struct inode
{ {
FAR struct inode *i_peer; /* Pointer to inode at same level */ FAR struct inode *i_peer; /* Pointer to same level inode */
FAR struct inode *i_child; /* Pointer to inode at lower level */ FAR struct inode *i_child; /* Pointer to lower level inode */
struct file_operations *i_ops; /* Driver file operations for inode */ sint16 i_crefs; /* References to inode */
sint16 i_crefs; /* References to inode */ uint16 i_flags; /* flags for 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 #ifdef CONFIG_FILE_MODE
mode_t i_mode; /* Access mode flags */ mode_t i_mode; /* Access mode flags */
#endif #endif
FAR void *i_private; /* Driver private data */ FAR void *i_private; /* Driver private data */
char i_name[1]; /* Name of inode (variable length) */ char i_name[1]; /* Name of inode (variable) */
}; };
#define FSNODE_SIZE(n) (sizeof(struct inode) + (n)) #define FSNODE_SIZE(n) (sizeof(struct inode) + (n))
/* This is the underlying representation of a ropen file. /* This is the underlying representation of an open file. A file
* A file descriptor is an index into an array of such types. * descriptor is an index into an array of such types. The type associates
* The type associates the file descriptor to the file state * the file descriptor to the file state and to a set of inode operations.
* and to a set of inode operations.
*/ */
struct file struct file
@ -95,6 +140,7 @@ struct file
int f_oflags; /* Open mode flags */ int f_oflags; /* Open mode flags */
off_t f_pos; /* File position */ off_t f_pos; /* File position */
FAR struct inode *f_inode; /* Driver interface */ 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 */ /* This defines a list of files indexed by the file descriptor */
@ -142,9 +188,9 @@ struct streamlist
}; };
#endif /* CONFIG_NFILE_STREAMS */ #endif /* CONFIG_NFILE_STREAMS */
/************************************************************ /****************************************************************************
* Global Function Prototypes * Global Function Prototypes
************************************************************/ ****************************************************************************/
#undef EXTERN #undef EXTERN
#if defined(__cplusplus) #if defined(__cplusplus)
@ -154,23 +200,37 @@ extern "C" {
#define EXTERN extern #define EXTERN extern
#endif #endif
/* fs_inode.c ***********************************************/ /* fs_inode.c ***************************************************************/
/* These interfaces are used by drivers to register their /* These interfaces are used by drivers to register their
* inodes in the inode tree. * inodes in the inode tree.
*/ */
EXTERN void weak_function fs_initialize(void); 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); EXTERN int inode_checkflags(FAR struct inode *inode, int oflags);
/* fs_files.c ***********************************************/ /* fs_files.c ***************************************************************/
#if CONFIG_NFILE_DESCRIPTORS >0 #if CONFIG_NFILE_DESCRIPTORS >0
EXTERN FAR struct filelist *files_alloclist(void); 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); EXTERN int files_dup(FAR struct file *filep1, FAR struct file *filep2);
#endif #endif
/* lib_fopen.c **********************************************/ /* lib_fopen.c **************************************************************/
/* Used by the OS to clone stdin, stdout, stderr */ /* 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); FAR struct streamlist *slist);
#endif #endif
/* lib_fflush.c *********************************************/ /* lib_fflush.c *************************************************************/
#if CONFIG_NFILE_STREAMS > 0 #if CONFIG_NFILE_STREAMS > 0
EXTERN void lib_flushall(FAR struct streamlist *list); EXTERN void lib_flushall(FAR struct streamlist *list);
#endif #endif
/* drivers **************************************************/ /* drivers ******************************************************************/
/* Call in of these to register the corresponding default /* Call in of these to register the corresponding default
* default drivers in the drivers/ subdirectory * default drivers in the drivers/ subdirectory
@ -210,4 +270,4 @@ EXTERN void devnull_register(void);
} }
#endif #endif
#endif /* __FS_H */ #endif /* __NUTTX_FS_H */