SimpleKernel 1.17.0
Loading...
Searching...
No Matches
diskio.cpp
Go to the documentation of this file.
1
5// ff.h 必须在 diskio.h 之前包含
6// clang-format off
7#include <ff.h>
8#include <diskio.h>
9// clang-format on
10
11#include "fatfs.hpp"
12#include "kernel_log.hpp"
13
14extern "C" {
15
22auto get_fattime() -> DWORD { return 0; }
23
30auto disk_status(BYTE pdrv) -> DSTATUS {
31 if (fatfs::FatFsFileSystem::GetBlockDevice(pdrv) == nullptr) {
32 return STA_NOINIT;
33 }
34 return 0;
35}
36
44auto disk_initialize(BYTE pdrv) -> DSTATUS {
45 if (fatfs::FatFsFileSystem::GetBlockDevice(pdrv) == nullptr) {
46 return STA_NOINIT;
47 }
48 return 0;
49}
50
60auto disk_read(BYTE pdrv, BYTE* buff, LBA_t sector, UINT count) -> DRESULT {
62 if (dev == nullptr) {
63 return RES_NOTRDY;
64 }
65 auto result = dev->ReadSectors(sector, static_cast<uint32_t>(count), buff);
66 if (!result) {
67 klog::Err("disk_read: pdrv={} sector={} count={} failed",
68 static_cast<unsigned>(pdrv), static_cast<uint64_t>(sector),
69 static_cast<unsigned>(count));
70 return RES_ERROR;
71 }
72 return RES_OK;
73}
74
84auto disk_write(BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count)
85 -> DRESULT {
87 if (dev == nullptr) {
88 return RES_NOTRDY;
89 }
90 auto result = dev->WriteSectors(sector, static_cast<uint32_t>(count), buff);
91 if (!result) {
92 klog::Err("disk_write: pdrv={} sector={} count={} failed",
93 static_cast<unsigned>(pdrv), static_cast<uint64_t>(sector),
94 static_cast<unsigned>(count));
95 return RES_ERROR;
96 }
97 return RES_OK;
98}
99
108auto disk_ioctl(BYTE pdrv, BYTE cmd, void* buff) -> DRESULT {
110 if (dev == nullptr) {
111 return RES_NOTRDY;
112 }
113 switch (cmd) {
114 case CTRL_SYNC: {
115 auto r = dev->Flush();
116 return r ? RES_OK : RES_ERROR;
117 }
118 case GET_SECTOR_COUNT:
119 if (buff == nullptr) {
120 return RES_PARERR;
121 }
122 static_cast<LBA_t*>(buff)[0] = static_cast<LBA_t>(dev->GetSectorCount());
123 return RES_OK;
124 case GET_SECTOR_SIZE:
125 if (buff == nullptr) {
126 return RES_PARERR;
127 }
128 static_cast<WORD*>(buff)[0] = static_cast<WORD>(dev->GetSectorSize());
129 return RES_OK;
130 case GET_BLOCK_SIZE:
131 if (buff == nullptr) {
132 return RES_PARERR;
133 }
134 static_cast<DWORD*>(buff)[0] = 1;
135 return RES_OK;
136 case CTRL_TRIM:
137 return RES_OK; // TRIM 不是必需的
138 default:
139 return RES_PARERR;
140 }
141}
142}
static auto GetBlockDevice(uint8_t pdrv) -> vfs::BlockDevice *
获取指定驱动器的块设备
Definition fatfs.cpp:85
auto disk_initialize(BYTE pdrv) -> DSTATUS
初始化磁盘驱动器。
Definition diskio.cpp:44
auto disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) -> DRESULT
执行磁盘 I/O 控制操作。
Definition diskio.cpp:108
auto get_fattime() -> DWORD
返回 FAT 时间戳。无 RTC 时返回 0(epoch)。
Definition diskio.cpp:22
auto disk_write(BYTE pdrv, const BYTE *buff, LBA_t sector, UINT count) -> DRESULT
向磁盘写入扇区。
Definition diskio.cpp:84
auto disk_read(BYTE pdrv, BYTE *buff, LBA_t sector, UINT count) -> DRESULT
从磁盘读取扇区。
Definition diskio.cpp:60
auto disk_status(BYTE pdrv) -> DSTATUS
查询磁盘驱动器状态。
Definition diskio.cpp:30
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志