takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /* mbed Microcontroller Library
kadonotakashi 0:8fdf9a60065b 2 * Copyright (c) 2006-2012 ARM Limited
kadonotakashi 0:8fdf9a60065b 3 *
kadonotakashi 0:8fdf9a60065b 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
kadonotakashi 0:8fdf9a60065b 5 * of this software and associated documentation files (the "Software"), to deal
kadonotakashi 0:8fdf9a60065b 6 * in the Software without restriction, including without limitation the rights
kadonotakashi 0:8fdf9a60065b 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
kadonotakashi 0:8fdf9a60065b 8 * copies of the Software, and to permit persons to whom the Software is
kadonotakashi 0:8fdf9a60065b 9 * furnished to do so, subject to the following conditions:
kadonotakashi 0:8fdf9a60065b 10 *
kadonotakashi 0:8fdf9a60065b 11 * The above copyright notice and this permission notice shall be included in
kadonotakashi 0:8fdf9a60065b 12 * all copies or substantial portions of the Software.
kadonotakashi 0:8fdf9a60065b 13 *
kadonotakashi 0:8fdf9a60065b 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kadonotakashi 0:8fdf9a60065b 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kadonotakashi 0:8fdf9a60065b 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kadonotakashi 0:8fdf9a60065b 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kadonotakashi 0:8fdf9a60065b 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kadonotakashi 0:8fdf9a60065b 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
kadonotakashi 0:8fdf9a60065b 20 * SOFTWARE.
kadonotakashi 0:8fdf9a60065b 21 */
kadonotakashi 0:8fdf9a60065b 22 #ifndef MBED_FATFILESYSTEM_H
kadonotakashi 0:8fdf9a60065b 23 #define MBED_FATFILESYSTEM_H
kadonotakashi 0:8fdf9a60065b 24
kadonotakashi 0:8fdf9a60065b 25 #include "FileSystem.h"
kadonotakashi 0:8fdf9a60065b 26 #include "BlockDevice.h"
kadonotakashi 0:8fdf9a60065b 27 #include "FileHandle.h"
kadonotakashi 0:8fdf9a60065b 28 #include "ff.h"
kadonotakashi 0:8fdf9a60065b 29 #include <stdint.h>
kadonotakashi 0:8fdf9a60065b 30 #include "PlatformMutex.h"
kadonotakashi 0:8fdf9a60065b 31
kadonotakashi 0:8fdf9a60065b 32
kadonotakashi 0:8fdf9a60065b 33 /**
kadonotakashi 0:8fdf9a60065b 34 * FATFileSystem based on ChaN's Fat Filesystem library v0.8
kadonotakashi 0:8fdf9a60065b 35 *
kadonotakashi 0:8fdf9a60065b 36 * Synchronization level: Thread safe
kadonotakashi 0:8fdf9a60065b 37 */
kadonotakashi 0:8fdf9a60065b 38 class FATFileSystem : public mbed::FileSystem {
kadonotakashi 0:8fdf9a60065b 39 public:
kadonotakashi 0:8fdf9a60065b 40 /** Lifetime of the FATFileSystem
kadonotakashi 0:8fdf9a60065b 41 *
kadonotakashi 0:8fdf9a60065b 42 * @param name Name to add filesystem to tree as
kadonotakashi 0:8fdf9a60065b 43 * @param bd BlockDevice to mount, may be passed instead to mount call
kadonotakashi 0:8fdf9a60065b 44 */
kadonotakashi 0:8fdf9a60065b 45 FATFileSystem(const char *name = NULL, BlockDevice *bd = NULL);
kadonotakashi 0:8fdf9a60065b 46 virtual ~FATFileSystem();
kadonotakashi 0:8fdf9a60065b 47
kadonotakashi 0:8fdf9a60065b 48 /** Formats a logical drive, FDISK partitioning rule.
kadonotakashi 0:8fdf9a60065b 49 *
kadonotakashi 0:8fdf9a60065b 50 * The block device to format should be mounted when this function is called.
kadonotakashi 0:8fdf9a60065b 51 *
kadonotakashi 0:8fdf9a60065b 52 * @param bd
kadonotakashi 0:8fdf9a60065b 53 * This is the block device that will be formatted.
kadonotakashi 0:8fdf9a60065b 54 *
kadonotakashi 0:8fdf9a60065b 55 * @param cluster_size
kadonotakashi 0:8fdf9a60065b 56 * This is the number of bytes per cluster. A larger cluster size will decrease
kadonotakashi 0:8fdf9a60065b 57 * the overhead of the FAT table, but also increase the minimum file size. The
kadonotakashi 0:8fdf9a60065b 58 * cluster_size must be a multiple of the underlying device's allocation unit
kadonotakashi 0:8fdf9a60065b 59 * and is currently limited to a max of 32,768 bytes. If zero, a cluster size
kadonotakashi 0:8fdf9a60065b 60 * will be determined from the device's allocation unit. Defaults to zero.
kadonotakashi 0:8fdf9a60065b 61 *
kadonotakashi 0:8fdf9a60065b 62 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 63 */
kadonotakashi 0:8fdf9a60065b 64 static int format(BlockDevice *bd, bd_size_t cluster_size = 0);
kadonotakashi 0:8fdf9a60065b 65
kadonotakashi 0:8fdf9a60065b 66 /** Mounts a filesystem to a block device
kadonotakashi 0:8fdf9a60065b 67 *
kadonotakashi 0:8fdf9a60065b 68 * @param bd BlockDevice to mount to
kadonotakashi 0:8fdf9a60065b 69 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 70 */
kadonotakashi 0:8fdf9a60065b 71 virtual int mount(BlockDevice *bd);
kadonotakashi 0:8fdf9a60065b 72
kadonotakashi 0:8fdf9a60065b 73 /** Unmounts a filesystem from the underlying block device
kadonotakashi 0:8fdf9a60065b 74 *
kadonotakashi 0:8fdf9a60065b 75 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 76 */
kadonotakashi 0:8fdf9a60065b 77 virtual int unmount();
kadonotakashi 0:8fdf9a60065b 78
kadonotakashi 0:8fdf9a60065b 79 /** Reformats a filesystem, results in an empty and mounted filesystem
kadonotakashi 0:8fdf9a60065b 80 *
kadonotakashi 0:8fdf9a60065b 81 * @param bd
kadonotakashi 0:8fdf9a60065b 82 * BlockDevice to reformat and mount. If NULL, the mounted
kadonotakashi 0:8fdf9a60065b 83 * block device will be used.
kadonotakashi 0:8fdf9a60065b 84 * Note: if mount fails, bd must be provided.
kadonotakashi 0:8fdf9a60065b 85 * Default: NULL
kadonotakashi 0:8fdf9a60065b 86 *
kadonotakashi 0:8fdf9a60065b 87 * @param allocation_unit
kadonotakashi 0:8fdf9a60065b 88 * This is the number of bytes per cluster size. The valid value is N
kadonotakashi 0:8fdf9a60065b 89 * times the sector size. N is a power of 2 from 1 to 128 for FAT
kadonotakashi 0:8fdf9a60065b 90 * volume and upto 16MiB for exFAT volume. If zero is given,
kadonotakashi 0:8fdf9a60065b 91 * the default allocation unit size is selected by the underlying
kadonotakashi 0:8fdf9a60065b 92 * filesystem, which depends on the volume size.
kadonotakashi 0:8fdf9a60065b 93 *
kadonotakashi 0:8fdf9a60065b 94 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 95 */
kadonotakashi 0:8fdf9a60065b 96 virtual int reformat(BlockDevice *bd, int allocation_unit);
kadonotakashi 0:8fdf9a60065b 97
kadonotakashi 0:8fdf9a60065b 98 /** Reformats a filesystem, results in an empty and mounted filesystem
kadonotakashi 0:8fdf9a60065b 99 *
kadonotakashi 0:8fdf9a60065b 100 * @param bd BlockDevice to reformat and mount. If NULL, the mounted
kadonotakashi 0:8fdf9a60065b 101 * block device will be used.
kadonotakashi 0:8fdf9a60065b 102 * Note: if mount fails, bd must be provided.
kadonotakashi 0:8fdf9a60065b 103 * Default: NULL
kadonotakashi 0:8fdf9a60065b 104 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 105 */
kadonotakashi 0:8fdf9a60065b 106 virtual int reformat(BlockDevice *bd = NULL)
kadonotakashi 0:8fdf9a60065b 107 {
kadonotakashi 0:8fdf9a60065b 108 // required for virtual inheritance shenanigans
kadonotakashi 0:8fdf9a60065b 109 return reformat(bd, 0);
kadonotakashi 0:8fdf9a60065b 110 }
kadonotakashi 0:8fdf9a60065b 111
kadonotakashi 0:8fdf9a60065b 112 /** Remove a file from the filesystem.
kadonotakashi 0:8fdf9a60065b 113 *
kadonotakashi 0:8fdf9a60065b 114 * @param path The name of the file to remove.
kadonotakashi 0:8fdf9a60065b 115 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 116 */
kadonotakashi 0:8fdf9a60065b 117 virtual int remove(const char *path);
kadonotakashi 0:8fdf9a60065b 118
kadonotakashi 0:8fdf9a60065b 119 /** Rename a file in the filesystem.
kadonotakashi 0:8fdf9a60065b 120 *
kadonotakashi 0:8fdf9a60065b 121 * @param path The name of the file to rename.
kadonotakashi 0:8fdf9a60065b 122 * @param newpath The name to rename it to
kadonotakashi 0:8fdf9a60065b 123 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 124 */
kadonotakashi 0:8fdf9a60065b 125 virtual int rename(const char *path, const char *newpath);
kadonotakashi 0:8fdf9a60065b 126
kadonotakashi 0:8fdf9a60065b 127 /** Store information about the file in a stat structure
kadonotakashi 0:8fdf9a60065b 128 *
kadonotakashi 0:8fdf9a60065b 129 * @param path The name of the file to find information about
kadonotakashi 0:8fdf9a60065b 130 * @param st The stat buffer to write to
kadonotakashi 0:8fdf9a60065b 131 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 132 */
kadonotakashi 0:8fdf9a60065b 133 virtual int stat(const char *path, struct stat *st);
kadonotakashi 0:8fdf9a60065b 134
kadonotakashi 0:8fdf9a60065b 135 /** Create a directory in the filesystem.
kadonotakashi 0:8fdf9a60065b 136 *
kadonotakashi 0:8fdf9a60065b 137 * @param path The name of the directory to create.
kadonotakashi 0:8fdf9a60065b 138 * @param mode The permissions with which to create the directory
kadonotakashi 0:8fdf9a60065b 139 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 140 */
kadonotakashi 0:8fdf9a60065b 141 virtual int mkdir(const char *path, mode_t mode);
kadonotakashi 0:8fdf9a60065b 142
kadonotakashi 0:8fdf9a60065b 143 /** Store information about the mounted filesystem in a statvfs structure
kadonotakashi 0:8fdf9a60065b 144 *
kadonotakashi 0:8fdf9a60065b 145 * @param path The name of the file to find information about
kadonotakashi 0:8fdf9a60065b 146 * @param buf The stat buffer to write to
kadonotakashi 0:8fdf9a60065b 147 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 148 */
kadonotakashi 0:8fdf9a60065b 149 virtual int statvfs(const char *path, struct statvfs *buf);
kadonotakashi 0:8fdf9a60065b 150
kadonotakashi 0:8fdf9a60065b 151 protected:
kadonotakashi 0:8fdf9a60065b 152 /** Open a file on the filesystem
kadonotakashi 0:8fdf9a60065b 153 *
kadonotakashi 0:8fdf9a60065b 154 * @param file Destination for the handle to a newly created file
kadonotakashi 0:8fdf9a60065b 155 * @param path The name of the file to open
kadonotakashi 0:8fdf9a60065b 156 * @param flags The flags to open the file in, one of O_RDONLY, O_WRONLY, O_RDWR,
kadonotakashi 0:8fdf9a60065b 157 * bitwise or'd with one of O_CREAT, O_TRUNC, O_APPEND
kadonotakashi 0:8fdf9a60065b 158 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 159 */
kadonotakashi 0:8fdf9a60065b 160 virtual int file_open(mbed::fs_file_t *file, const char *path, int flags);
kadonotakashi 0:8fdf9a60065b 161
kadonotakashi 0:8fdf9a60065b 162 /** Close a file
kadonotakashi 0:8fdf9a60065b 163 *
kadonotakashi 0:8fdf9a60065b 164 * @param file File handle
kadonotakashi 0:8fdf9a60065b 165 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 166 */
kadonotakashi 0:8fdf9a60065b 167 virtual int file_close(mbed::fs_file_t file);
kadonotakashi 0:8fdf9a60065b 168
kadonotakashi 0:8fdf9a60065b 169 /** Read the contents of a file into a buffer
kadonotakashi 0:8fdf9a60065b 170 *
kadonotakashi 0:8fdf9a60065b 171 * @param file File handle
kadonotakashi 0:8fdf9a60065b 172 * @param buffer The buffer to read in to
kadonotakashi 0:8fdf9a60065b 173 * @param len The number of bytes to read
kadonotakashi 0:8fdf9a60065b 174 * @return The number of bytes read, 0 at end of file, negative error on failure
kadonotakashi 0:8fdf9a60065b 175 */
kadonotakashi 0:8fdf9a60065b 176 virtual ssize_t file_read(mbed::fs_file_t file, void *buffer, size_t len);
kadonotakashi 0:8fdf9a60065b 177
kadonotakashi 0:8fdf9a60065b 178 /** Write the contents of a buffer to a file
kadonotakashi 0:8fdf9a60065b 179 *
kadonotakashi 0:8fdf9a60065b 180 * @param file File handle
kadonotakashi 0:8fdf9a60065b 181 * @param buffer The buffer to write from
kadonotakashi 0:8fdf9a60065b 182 * @param len The number of bytes to write
kadonotakashi 0:8fdf9a60065b 183 * @return The number of bytes written, negative error on failure
kadonotakashi 0:8fdf9a60065b 184 */
kadonotakashi 0:8fdf9a60065b 185 virtual ssize_t file_write(mbed::fs_file_t file, const void *buffer, size_t len);
kadonotakashi 0:8fdf9a60065b 186
kadonotakashi 0:8fdf9a60065b 187 /** Flush any buffers associated with the file
kadonotakashi 0:8fdf9a60065b 188 *
kadonotakashi 0:8fdf9a60065b 189 * @param file File handle
kadonotakashi 0:8fdf9a60065b 190 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 191 */
kadonotakashi 0:8fdf9a60065b 192 virtual int file_sync(mbed::fs_file_t file);
kadonotakashi 0:8fdf9a60065b 193
kadonotakashi 0:8fdf9a60065b 194 /** Move the file position to a given offset from from a given location
kadonotakashi 0:8fdf9a60065b 195 *
kadonotakashi 0:8fdf9a60065b 196 * @param file File handle
kadonotakashi 0:8fdf9a60065b 197 * @param offset The offset from whence to move to
kadonotakashi 0:8fdf9a60065b 198 * @param whence The start of where to seek
kadonotakashi 0:8fdf9a60065b 199 * SEEK_SET to start from beginning of file,
kadonotakashi 0:8fdf9a60065b 200 * SEEK_CUR to start from current position in file,
kadonotakashi 0:8fdf9a60065b 201 * SEEK_END to start from end of file
kadonotakashi 0:8fdf9a60065b 202 * @return The new offset of the file
kadonotakashi 0:8fdf9a60065b 203 */
kadonotakashi 0:8fdf9a60065b 204 virtual off_t file_seek(mbed::fs_file_t file, off_t offset, int whence);
kadonotakashi 0:8fdf9a60065b 205
kadonotakashi 0:8fdf9a60065b 206 /** Get the file position of the file
kadonotakashi 0:8fdf9a60065b 207 *
kadonotakashi 0:8fdf9a60065b 208 * @param file File handle
kadonotakashi 0:8fdf9a60065b 209 * @return The current offset in the file
kadonotakashi 0:8fdf9a60065b 210 */
kadonotakashi 0:8fdf9a60065b 211 virtual off_t file_tell(mbed::fs_file_t file);
kadonotakashi 0:8fdf9a60065b 212
kadonotakashi 0:8fdf9a60065b 213 /** Get the size of the file
kadonotakashi 0:8fdf9a60065b 214 *
kadonotakashi 0:8fdf9a60065b 215 * @param file File handle
kadonotakashi 0:8fdf9a60065b 216 * @return Size of the file in bytes
kadonotakashi 0:8fdf9a60065b 217 */
kadonotakashi 0:8fdf9a60065b 218 virtual off_t file_size(mbed::fs_file_t file);
kadonotakashi 0:8fdf9a60065b 219
kadonotakashi 0:8fdf9a60065b 220 /** Open a directory on the filesystem
kadonotakashi 0:8fdf9a60065b 221 *
kadonotakashi 0:8fdf9a60065b 222 * @param dir Destination for the handle to the directory
kadonotakashi 0:8fdf9a60065b 223 * @param path Name of the directory to open
kadonotakashi 0:8fdf9a60065b 224 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 225 */
kadonotakashi 0:8fdf9a60065b 226 virtual int dir_open(mbed::fs_dir_t *dir, const char *path);
kadonotakashi 0:8fdf9a60065b 227
kadonotakashi 0:8fdf9a60065b 228 /** Close a directory
kadonotakashi 0:8fdf9a60065b 229 *
kadonotakashi 0:8fdf9a60065b 230 * @param dir Dir handle
kadonotakashi 0:8fdf9a60065b 231 * @return 0 on success, negative error code on failure
kadonotakashi 0:8fdf9a60065b 232 */
kadonotakashi 0:8fdf9a60065b 233 virtual int dir_close(mbed::fs_dir_t dir);
kadonotakashi 0:8fdf9a60065b 234
kadonotakashi 0:8fdf9a60065b 235 /** Read the next directory entry
kadonotakashi 0:8fdf9a60065b 236 *
kadonotakashi 0:8fdf9a60065b 237 * @param dir Dir handle
kadonotakashi 0:8fdf9a60065b 238 * @param ent The directory entry to fill out
kadonotakashi 0:8fdf9a60065b 239 * @return 1 on reading a filename, 0 at end of directory, negative error on failure
kadonotakashi 0:8fdf9a60065b 240 */
kadonotakashi 0:8fdf9a60065b 241 virtual ssize_t dir_read(mbed::fs_dir_t dir, struct dirent *ent);
kadonotakashi 0:8fdf9a60065b 242
kadonotakashi 0:8fdf9a60065b 243 /** Set the current position of the directory
kadonotakashi 0:8fdf9a60065b 244 *
kadonotakashi 0:8fdf9a60065b 245 * @param dir Dir handle
kadonotakashi 0:8fdf9a60065b 246 * @param offset Offset of the location to seek to,
kadonotakashi 0:8fdf9a60065b 247 * must be a value returned from dir_tell
kadonotakashi 0:8fdf9a60065b 248 */
kadonotakashi 0:8fdf9a60065b 249 virtual void dir_seek(mbed::fs_dir_t dir, off_t offset);
kadonotakashi 0:8fdf9a60065b 250
kadonotakashi 0:8fdf9a60065b 251 /** Get the current position of the directory
kadonotakashi 0:8fdf9a60065b 252 *
kadonotakashi 0:8fdf9a60065b 253 * @param dir Dir handle
kadonotakashi 0:8fdf9a60065b 254 * @return Position of the directory that can be passed to dir_rewind
kadonotakashi 0:8fdf9a60065b 255 */
kadonotakashi 0:8fdf9a60065b 256 virtual off_t dir_tell(mbed::fs_dir_t dir);
kadonotakashi 0:8fdf9a60065b 257
kadonotakashi 0:8fdf9a60065b 258 /** Rewind the current position to the beginning of the directory
kadonotakashi 0:8fdf9a60065b 259 *
kadonotakashi 0:8fdf9a60065b 260 * @param dir Dir handle
kadonotakashi 0:8fdf9a60065b 261 */
kadonotakashi 0:8fdf9a60065b 262 virtual void dir_rewind(mbed::fs_dir_t dir);
kadonotakashi 0:8fdf9a60065b 263
kadonotakashi 0:8fdf9a60065b 264 private:
kadonotakashi 0:8fdf9a60065b 265 FATFS _fs; // Work area (file system object) for logical drive
kadonotakashi 0:8fdf9a60065b 266 char _fsid[sizeof("0:")];
kadonotakashi 0:8fdf9a60065b 267 int _id;
kadonotakashi 0:8fdf9a60065b 268
kadonotakashi 0:8fdf9a60065b 269 protected:
kadonotakashi 0:8fdf9a60065b 270 virtual void lock();
kadonotakashi 0:8fdf9a60065b 271 virtual void unlock();
kadonotakashi 0:8fdf9a60065b 272 virtual int mount(BlockDevice *bd, bool mount);
kadonotakashi 0:8fdf9a60065b 273 };
kadonotakashi 0:8fdf9a60065b 274
kadonotakashi 0:8fdf9a60065b 275 #endif