11 releases
0.2.0 | Jul 15, 2024 |
---|---|
0.1.11 | Jun 20, 2023 |
0.1.8 | Mar 3, 2023 |
0.1.7 | Feb 17, 2023 |
0.1.3 | Dec 27, 2021 |
#242 in Embedded development
626 downloads per month
89KB
2K
SLoC
Memory Mapped I/O Access Library
Overview
This library is designed for accessing memory-mapped I/O.
It assists with register access using UIO (User Space I/O) and offers bare-metal access with no_std.
It also assists access using u-dma-buf.
MMIO(Memory Mapped I/O)
MMIO access in bare-metal programming can be written as follows:
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(Userspace I/O)
UIO access in Linux programming can be written as follows:
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();
You can also open it by specifying a name obtained from /sys/class/uio:
let uio_acc = MmioAccessor::<u32>::new_with_name("uio-sample");
u-dma-buf
u-dma-buf access in Linux programming can be written as follows:
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);
Dependencies
~0.2–1MB
~25K SLoC