SimpleKernel 1.17.0
Loading...
Searching...
No Matches
fatfs.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <ff.h>
8
9#include <array>
10#include <cstdint>
11
12#include "block_device.hpp"
13#include "filesystem.hpp"
14#include "vfs.hpp"
15
16namespace fatfs {
17
26 public:
28 static constexpr uint32_t kRootDirPermissions = 0755U;
30 static constexpr uint32_t kDefaultFilePermissions = 0644U;
32 static constexpr size_t kPathBufSize = 512;
34 static constexpr size_t kMaxInodes = 256;
36 static constexpr size_t kMaxOpenFiles = 16;
38 static constexpr size_t kMaxOpenDirs = 8;
39
45 explicit FatFsFileSystem(uint8_t volume_id);
46
49 ~FatFsFileSystem() override;
52 auto operator=(const FatFsFileSystem&) -> FatFsFileSystem& = delete;
55
59 [[nodiscard]] auto GetName() const -> const char* override;
60
68 auto Mount(vfs::BlockDevice* device) -> Expected<vfs::Inode*> override;
69
75 auto Unmount() -> Expected<void> override;
76
81 auto Sync() -> Expected<void> override;
82
87 auto AllocateInode() -> Expected<vfs::Inode*> override;
88
96 auto FreeInode(vfs::Inode* inode) -> Expected<void> override;
97
101 [[nodiscard]] auto GetFileOps() -> vfs::FileOps* override;
102
111 auto OpenFil(vfs::Inode* inode, vfs::OpenFlags open_flags) -> Expected<void>;
112
118 static auto SetBlockDevice(uint8_t pdrv, vfs::BlockDevice* device) -> void;
119
125 [[nodiscard]] static auto GetBlockDevice(uint8_t pdrv) -> vfs::BlockDevice*;
126
130 class FatFsInodeOps : public vfs::InodeOps {
131 public:
132 explicit FatFsInodeOps(FatFsFileSystem* fs) : fs_(fs) {}
133
140 auto Lookup(vfs::Inode* dir, const char* name)
141 -> Expected<vfs::Inode*> override;
142
150 auto Create(vfs::Inode* dir, const char* name, vfs::FileType type)
151 -> Expected<vfs::Inode*> override;
152
159 auto Unlink(vfs::Inode* dir, const char* name) -> Expected<void> override;
160
167 auto Mkdir(vfs::Inode* dir, const char* name)
168 -> Expected<vfs::Inode*> override;
169
176 auto Rmdir(vfs::Inode* dir, const char* name) -> Expected<void> override;
177
178 private:
180 };
181
185 class FatFsFileOps : public vfs::FileOps {
186 public:
187 explicit FatFsFileOps(FatFsFileSystem* fs) : fs_(fs) {}
188
196 auto Read(vfs::File* file, void* buf, size_t count)
197 -> Expected<size_t> override;
198
206 auto Write(vfs::File* file, const void* buf, size_t count)
207 -> Expected<size_t> override;
208
216 auto Seek(vfs::File* file, int64_t offset, vfs::SeekWhence whence)
217 -> Expected<uint64_t> override;
218
224 auto Close(vfs::File* file) -> Expected<void> override;
225
233 auto ReadDir(vfs::File* file, vfs::DirEntry* dirent, size_t count)
234 -> Expected<size_t> override;
235
236 private:
238 };
239
240 friend class FatFsInodeOps;
241 friend class FatFsFileOps;
242
243 private:
245 uint8_t volume_id_;
251 bool mounted_{false};
252
254 struct FatInode {
257 std::array<char, kPathBufSize> path{};
259 FIL* fil = nullptr;
261 bool in_use = false;
263 DIR* dir = nullptr;
264 };
265
266 std::array<FatInode, kMaxInodes> inodes_;
267
270 FIL fil;
271 bool in_use = false;
272 };
273
274 std::array<FatFileHandle, kMaxOpenFiles> fil_pool_;
275
278 DIR dir;
279 bool in_use = false;
280 };
281
282 std::array<FatDirHandle, kMaxOpenDirs> dir_pool_;
283
288
290 static std::array<vfs::BlockDevice*, FF_VOLUMES> block_devices_;
291
296 [[nodiscard]] auto AllocateFatInode() -> FatInode*;
297
302 auto FreeFatInode(FatInode* fi) -> void;
303
308 [[nodiscard]] auto AllocateFil() -> FIL*;
309
314 auto FreeFil(FIL* fil) -> void;
315
320 [[nodiscard]] auto AllocateDir() -> DIR*;
321
326 auto FreeDir(DIR* dir) -> void;
327};
328
329} // namespace fatfs
FatFS 文件操作实现
Definition fatfs.hpp:185
auto Close(vfs::File *file) -> Expected< void > override
关闭文件,释放底层 FIL 对象
Definition fatfs.cpp:458
auto Read(vfs::File *file, void *buf, size_t count) -> Expected< size_t > override
从文件读取数据
Definition fatfs.cpp:396
auto Seek(vfs::File *file, int64_t offset, vfs::SeekWhence whence) -> Expected< uint64_t > override
移动文件读写位置
Definition fatfs.cpp:429
auto Write(vfs::File *file, const void *buf, size_t count) -> Expected< size_t > override
向文件写入数据
Definition fatfs.cpp:412
FatFsFileOps(FatFsFileSystem *fs)
Definition fatfs.hpp:187
auto ReadDir(vfs::File *file, vfs::DirEntry *dirent, size_t count) -> Expected< size_t > override
读取目录条目
Definition fatfs.cpp:478
FatFS inode 操作实现
Definition fatfs.hpp:130
FatFsInodeOps(FatFsFileSystem *fs)
Definition fatfs.hpp:132
FatFS VFS 适配器
Definition fatfs.hpp:25
uint8_t volume_id_
FatFS 逻辑驱动器号
Definition fatfs.hpp:245
FatFsFileSystem(const FatFsFileSystem &)=delete
auto FreeInode(vfs::Inode *inode) -> Expected< void > override
释放 inode
Definition fatfs.cpp:196
std::array< FatFileHandle, kMaxOpenFiles > fil_pool_
Definition fatfs.hpp:274
auto AllocateFatInode() -> FatInode *
从 inode 池中分配一个空闲槽位
Definition fatfs.cpp:207
auto FreeFil(FIL *fil) -> void
归还 FIL 对象到池中
Definition fatfs.cpp:235
static auto SetBlockDevice(uint8_t pdrv, vfs::BlockDevice *device) -> void
注册块设备(由 Mount 调用,供 diskio.cpp 的 C 回调使用)
Definition fatfs.cpp:78
auto AllocateFil() -> FIL *
从 FIL 池中分配一个空闲 FIL 对象
Definition fatfs.cpp:224
auto operator=(const FatFsFileSystem &) -> FatFsFileSystem &=delete
bool mounted_
当前卷是否已挂载
Definition fatfs.hpp:251
static std::array< vfs::BlockDevice *, FF_VOLUMES > block_devices_
每卷块设备注册表(静态,供 diskio.cpp C 回调访问)
Definition fatfs.hpp:290
static constexpr size_t kMaxOpenFiles
同时打开文件数上限
Definition fatfs.hpp:36
auto Unmount() -> Expected< void > override
卸载 FatFS 卷
Definition fatfs.cpp:155
~FatFsFileSystem() override
Definition fatfs.cpp:101
auto FreeDir(DIR *dir) -> void
归还 DIR 对象到池中
Definition fatfs.cpp:255
FatFsInodeOps inode_ops_
inode 操作单例
Definition fatfs.hpp:285
static constexpr uint32_t kRootDirPermissions
根目录权限位
Definition fatfs.hpp:28
FatFsFileOps file_ops_
文件操作单例
Definition fatfs.hpp:287
static constexpr size_t kPathBufSize
路径缓冲区大小(字节)
Definition fatfs.hpp:32
static constexpr uint32_t kDefaultFilePermissions
普通文件默认权限位
Definition fatfs.hpp:30
vfs::Inode * root_inode_
根目录 inode(Mount 时设置)
Definition fatfs.hpp:249
auto AllocateDir() -> DIR *
从 DIR 池中分配一个空闲 DIR 对象
Definition fatfs.cpp:244
static auto GetBlockDevice(uint8_t pdrv) -> vfs::BlockDevice *
获取指定驱动器的块设备
Definition fatfs.cpp:85
auto Sync() -> Expected< void > override
刷新所有脏缓冲区
Definition fatfs.cpp:177
static constexpr size_t kMaxInodes
inode 池容量
Definition fatfs.hpp:34
auto FreeFatInode(FatInode *fi) -> void
释放 inode 池槽位
Definition fatfs.cpp:218
auto AllocateInode() -> Expected< vfs::Inode * > override
分配新 inode(由 FatFS FILINFO 快照支撑)
Definition fatfs.cpp:185
std::array< FatDirHandle, kMaxOpenDirs > dir_pool_
Definition fatfs.hpp:282
auto GetFileOps() -> vfs::FileOps *override
返回本文件系统的 FileOps 实例
Definition fatfs.cpp:205
auto OpenFil(vfs::Inode *inode, vfs::OpenFlags open_flags) -> Expected< void >
为 inode 打开底层 FatFS FIL 对象
Definition fatfs.cpp:264
auto Mount(vfs::BlockDevice *device) -> Expected< vfs::Inode * > override
挂载 FatFS 卷
Definition fatfs.cpp:109
auto operator=(FatFsFileSystem &&) -> FatFsFileSystem &=delete
static constexpr size_t kMaxOpenDirs
同时打开目录数上限
Definition fatfs.hpp:38
std::array< FatInode, kMaxInodes > inodes_
Definition fatfs.hpp:266
auto GetName() const -> const char *override
返回 "fatfs"
Definition fatfs.cpp:107
FatFsFileSystem(FatFsFileSystem &&)=delete
FATFS fatfs_obj_
FatFS 文件系统对象(每卷一个)
Definition fatfs.hpp:247
File 操作接口
文件系统类型基类
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
FileType
文件类型
Definition vfs_types.hpp:22
SeekWhence
文件 seek 基准
Definition vfs_types.hpp:94
FatFS inode 私有数据
Definition fatfs.hpp:254
std::array< char, kPathBufSize > path
卷内绝对路径(供 FatFS 操作使用)
Definition fatfs.hpp:257
bool in_use
该槽位是否在使用
Definition fatfs.hpp:261
FIL * fil
FIL 对象(普通文件打开时使用);目录或未使用时为 nullptr.
Definition fatfs.hpp:259
DIR * dir
DIR 对象(目录迭代状态);未迭代时为 nullptr.
Definition fatfs.hpp:263
目录项结构(用于 readdir)
File — 打开的文件实例(每次 open 产生一个)
Definition vfs.hpp:65
Inode — 文件元数据(独立于路径名)
Definition vfs.hpp:16