The FAT filesystem has support for Removable Media, which is implemented in conjunction with support in the FILEIO package, the generic DISKIO layer and the hardware disk driver. At present, only the JUNGO USB mass storage device contains the necessary support.
To support Removable media, application code, or the automounter, should register a disk event callback to capture device insertion and removal. When an insert event is detected, an attempt to mount the filesystem should be made. If this is successful, then the files on the device can be accessed.
When the device is removed the hardware driver will reject all IO
operations with an EIO response. The filesystem will propagate these
errors back to any current file IO operations which will result in
read() or write() returning
an EIO error. Application code should be ready for this to happen.
A disk event callback will also be delivered and the application
should arrange to call umount_force() to force
the filesystem to be unmounted. The FAT filesystem handles this by
releasing all resources and detaching from the disk device.
To help applications indicate to the user whether the medium may be removed (by means of a LED or an on-screen icon) the FAT filesystem supports the filesystem callback mechanism defined in the FILEIO package. This relies on the following definitions in fileio.h:
typedef void cyg_fs_callback( cyg_int32 event, CYG_ADDRWORD data );
struct cyg_fs_callback_info
{
cyg_fs_callback *callback; // Callback function
CYG_ADDRWORD data; // User data value
};
// Callback events
#define CYG_FS_CALLBACK_SAFE 1 // The filesystem is up to date on disk
#define CYG_FS_CALLBACK_UNSAFE 2 // The filesystem is not up to date |
A callback function may be registered after a filesystem has been
mounted by using cyg_fs_setinfo() as follows:
struct cyg_fs_callback_info callback;
...
callback.callback = fs_callback;
callback.data = my_data;
err = cyg_fs_setinfo("/disk0", FS_INFO_CALLBACK, &callback, sizeof(callback)); |
Following this, whenever the filesystem has dirty cache blocks that
are not up to date on the disk, fs_callback()
will be called with event set to
CYG_FS_CALLBACK_UNSAFE. When all blocks become up
to date on disk it will be called with
CYG_FS_CALLBACK_SAFE.