diff --git a/ChangeLog b/ChangeLog index 5cf5bae7822..a19ddd99528 100644 --- a/ChangeLog +++ b/ChangeLog @@ -129,5 +129,6 @@ development board (untested) * Added support for block devices. * Simulated target now exports a VFAT filesystem + * Begin support for VFAT filesystem (not yet functional) * Added mount() and umount() * Started m68322 diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html index b04f266939e..9472259bdaa 100644 --- a/Documentation/NuttX.html +++ b/Documentation/NuttX.html @@ -8,7 +8,7 @@

NuttX RTOS

-

Last Updated: May 12, 2007

+

Last Updated: May 13, 2007

@@ -508,9 +508,9 @@ Other memory: development board (untested) * Added support for block devices. * Simulated target now exports a VFAT filesystem + * Begin support for VFAT filesystem (not yet functional) * Added mount() and umount() * Started m68322 - * Added support for the NXP 214x processor on the mcu123.com lpc214x diff --git a/arch/sim/src/up_blockdevice.c b/arch/sim/src/up_blockdevice.c index fee57c95c52..273cad950d9 100644 --- a/arch/sim/src/up_blockdevice.c +++ b/arch/sim/src/up_blockdevice.c @@ -60,13 +60,13 @@ * Private Function Prototypes ****************************************************************************/ -static int up_open(FAR struct file *filp); -static int up_close(FAR struct file *filp); -static ssize_t up_read(FAR struct file *filp, char *buffer, +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, size_t nsectors); -static ssize_t up_write(FAR struct file *filp, const char *buffer, +static ssize_t up_write(FAR struct inode *inode, const unsigned char *buffer, size_t start_sector, size_t nsectors); -static size_t up_geometry(FAR struct file *filp, struct geometry *geometry); +static int up_geometry(FAR struct inode *inode, struct geometry *geometry); /**************************************************************************** * Private Data @@ -92,7 +92,7 @@ static const struct block_operations g_bops = * ****************************************************************************/ -static int up_open(FAR struct file *filp) +static int up_open(FAR struct inode *inode) { return OK; } @@ -104,7 +104,7 @@ static int up_open(FAR struct file *filp) * ****************************************************************************/ -static int up_close(FAR struct file *filp) +static int up_close(FAR struct inode *inode) { return OK; } @@ -116,10 +116,9 @@ static int up_close(FAR struct file *filp) * ****************************************************************************/ -static ssize_t up_read(FAR struct file *filp, char *buffer, +static ssize_t up_read(FAR struct inode *inode, unsigned char *buffer, size_t start_sector, size_t nsectors) { - struct inode *inode = filp->f_inode; if (inode) { char *src = inode->i_private; @@ -143,10 +142,9 @@ static ssize_t up_read(FAR struct file *filp, char *buffer, * ****************************************************************************/ -static ssize_t up_write(FAR struct file *filp, const char *buffer, +static ssize_t up_write(FAR struct inode *inode, const unsigned char *buffer, size_t start_sector, size_t nsectors) { - struct inode *inode = filp->f_inode; if (inode) { char *dest = inode->i_private; @@ -170,14 +168,15 @@ static ssize_t up_write(FAR struct file *filp, const char *buffer, * ****************************************************************************/ -static size_t up_geometry(FAR struct file *filp, struct geometry *geometry) +static int up_geometry(FAR struct inode *inode, struct geometry *geometry) { - struct inode *inode = filp->f_inode; if (geometry) { - geometry->geo_available = (inode->i_private != NULL); - geometry->geo_nsectors = NSECTORS; - geometry->geo_sectorsize = LOGICAL_SECTOR_SIZE; + 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; diff --git a/configs/sim/defconfig b/configs/sim/defconfig index 9fac3753edd..c61d757fae4 100644 --- a/configs/sim/defconfig +++ b/configs/sim/defconfig @@ -198,7 +198,8 @@ CONFIG_PREALLOC_TIMERS=8 # # FAT filesystem configuration -# CONFIG_FAT - Enable FAT filesystem support +# CONFIG_FS_FAT - Enable FAT filesystem support +# CONFIG_FAT_SECTORSIZE - Max supported sector size CONFIG_FS_FAT=y # diff --git a/include/nuttx/fs.h b/include/nuttx/fs.h index e328ad97897..19c7ba3be7a 100644 --- a/include/nuttx/fs.h +++ b/include/nuttx/fs.h @@ -81,25 +81,30 @@ struct file_operations 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 */ + boolean geo_available; /* TRUE: The device is vailable */ + boolean geo_mediachanged; /* TRUE: The media has changed since last query */ + boolean geo_writeenabled; /* TRUE: It is okay to write to this device */ + 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. + * system. It is used by file systems to perform filesystem transfers. It + * differs from the normal driver vtable in several ways -- most notably in + * that it deals in struct inode vs. struct filep. */ +struct inode; struct block_operations { - int (*open)(FAR struct file *filp); - int (*close)(FAR struct file *filp); - ssize_t (*read)(FAR struct file *filp, char *buffer, + int (*open)(FAR struct inode *inode); + int (*close)(FAR struct inode *inode); + ssize_t (*read)(FAR struct inode *inode, unsigned char *buffer, size_t start_sector, size_t nsectors); - ssize_t (*write)(FAR struct file *filp, const char *buffer, + ssize_t (*write)(FAR struct inode *inode, const unsigned 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 (*geometry)(FAR struct inode *inode, struct geometry *geometry); + int (*ioctl)(FAR struct inode *inode, int cmd, unsigned long arg); }; /* This structure is provided by a filesystem to describe a mount point. @@ -135,6 +140,10 @@ struct mountpt_operations int (*bind)(FAR struct inode *blkdriver, const void *data, void **handle); int (*unbind)(void *handle); + + /* NOTE: More operations will be needed here to support: disk usage stats, stat(), + * sync(), unlink(), mkdir(), chmod(), rename(), etc. + */ }; /* This structure represents one inode in the Nuttx psuedo-file system */