#mmio #udmabuf #uio

无 std jelly-mem_access

内存映射 I/O 访问库

11 个版本

0.2.0 2024 年 7 月 15 日
0.1.11 2023 年 6 月 20 日
0.1.8 2023 年 3 月 3 日
0.1.7 2023 年 2 月 17 日
0.1.3 2021 年 12 月 27 日

#3 in #mmio

Download history 14/week @ 2024-07-01 122/week @ 2024-07-15 63/week @ 2024-07-29

每月 185 次下载

MIT 许可证

89KB
2K SLoC

内存映射 I/O 访问库

Crates.io MIT licensed

概述

此库旨在访问内存映射 I/O。

它辅助使用 UIO(用户空间 I/O)进行寄存器访问,并提供无 std 的裸机访问。

它还辅助使用 u-dma-buf 进行访问。

MMIO(内存映射 I/O)

在裸机编程中,MMIO 访问可以编写如下

    type RegisterWordSize = u64;
    let mmio_acc = MmioAccessor::<RegisterWordSize>::new(0xffff0000, 0x10000);
    mmio_acc.write_mem_u8(0x00, 0x12);        // addr : 0xffff0000
    mmio_acc.write_mem_u16(0x02, 0x1234);     // addr : 0xffff0002
    mmio_acc.write_reg_u32(0x10, 0x12345678); // addr : 0xffff0080 <= 0x10 * size_of<RegisterWordSize>()
    mmio_acc.read_reg_u32(0x10);              // addr : 0xffff0080 <= 0x10 * size_of<RegisterWordSize>()

UIO(用户空间 I/O)

在 Linux 编程中,UIO 访问可以编写如下

    type RegisterWordSize = usize;
    let uio_num = 1;  // ex.) /dev/uio1
    let uio_acc = MmioAccessor::<RegisterWordSize>::new(uio_num);
    uio_acc.set_irq_enable(true);
    uio_acc.write_reg_u32(0x00, 0x1);
    uio_acc.wait_irq();

您也可以通过指定从 /sys/class/uio 获取的名称来打开它

    let uio_acc = MmioAccessor::<u32>::new_with_name("uio-sample");

u-dma-buf

u-dma-buf 访问在 Linux 编程中可以编写如下

    let udmabuf_num = 4;  // ex.) /dev/udmabuf4
    let udmabuf_acc = UdmabufAccessor::<usize>::new("udmabuf4", false).unwrap();
    println!("udmabuf4 phys addr : 0x{:x}", udmabuf_acc.phys_addr());
    println!("udmabuf4 size      : 0x{:x}", udmabuf_acc.size());
    udmabuf_acc.write_mem_u32(0x00, 0x1234);

依赖项

~0.3–1.1MB
~26K SLoC