1 个不稳定版本

0.2.0 2020年10月16日
0.1.5 2020年9月6日
0.1.4 2020年7月10日
0.1.2 2020年6月25日

#9 in #sdcard

Download history 25/week @ 2024-02-19 18/week @ 2024-02-26 10/week @ 2024-03-04 14/week @ 2024-03-11 6/week @ 2024-03-18

55 每月下载量
用于 libertyos_kernel

MIT 许可证

64KB
1.5K SLoC

FAT32 文件系统库

这是一个 FAT32 文件系统库,它使用 #![no_std] 并且不使用 alloc

sdio_sdhc 和 WindowsAPI 一起通过测试。

支持的功能

  • 读取
  • 创建文件和目录
  • 写入(覆盖和追加)
  • 删除文件和目录

问题

我的设备支持 std,我能使用这个 crate 吗?

当然可以,但我不建议这样做。你应该使用 std::fs::File 或其他 crate。

你为什么写这个 crate?

为了支持没有 std 的设备和环境,比如

  • 嵌入式设备
  • 引导加载程序

有更多示例吗?

如何测试(仅限 Windows)

  • 编辑 lib.rs 中的 mount() 函数,更改磁盘为 \\\\.\\E:
  • cargotest

如何使用

你需要让你的库实现 BlockDevice trait

pub trait BlockDevice {
    type Error;
    fn read(&self, buf: &mut [u8], address: usize, number_of_blocks: usize) -> Result<(), Self::Error>;
    fn write(&self, buf: &[u8], address: usize, number_of_blocks: usize) -> Result<(), Self::Error>;
}

例如,我使用我的另一个库 sdio_sdhc 来实现

impl BlockDevice for Card {
    type Error = CmdError;

    fn read(&self, buf: &mut [u8], address: usize, number_of_blocks: usize) -> Result<(), Self::Error> {
        if number_of_blocks == 1 {
            self.read_block(buf, address as u32)?
        } else {
            self.read_multi_blocks(buf, address as u32, number_of_blocks as u32)?
        }

        Ok(())
    }

    fn write(&self, buf: &[u8], address: usize, number_of_blocks: usize) -> Result<(), Self::Error> {
        if number_of_blocks == 1 {
            self.write_block(buf, address as u32)?
        } else {
            self.write_multi_blocks(buf, address as u32, number_of_blocks as u32)?
        }

        Ok(())
    }
}

现在 sdio_sdhc 库支持 FAT32 文件系统。然后,将 fat32 库添加到你的应用程序中

# if no feature config, the BUFFER_SIZE is 512 Bytes
fat32 = "0.2"

如果你的卡块大小不同,比如 1024 字节

[dependencies.fat32]
version = "0.2"
default-features = false
features = ["1024"]

然后,你可以进行一些测试

// Card from sdio_sdhc crate
let card = Card::init().unwrap();
// Volume from fat32 crate
let cont = Volume::new(card);
// cd root dir
let root = cont.root_dir();
// create file named test.txt
root.create_file("test.txt").unwrap();
// open file
let mut file = root.open_file("test.txt").unwrap();
// write buffer to file
file.write(&[80; 1234]).unwrap();

如果一切顺利,文件在根目录中创建,大小为 1234 字节。

依赖项