eCosPro® Reference Manual
Prev |  | Next

# Chapter 15. Removable Media Support

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.

Prev | Home | Next
Using the FAT Filesystem | Up | Non-ASCII Character Set Support