#dma #collection #api #memory #cache #allocator #os

no-std dma-api

Trait for DMA alloc and some collections

16 releases

new 0.3.0 Mar 14, 2025
0.2.2 Feb 21, 2025
0.2.0 Dec 10, 2024
0.1.11 Dec 3, 2024
0.1.10 Nov 26, 2024

#572 in Embedded development

Download history 450/week @ 2024-11-24 271/week @ 2024-12-01 205/week @ 2024-12-08 36/week @ 2024-12-15 23/week @ 2024-12-22 8/week @ 2024-12-29 44/week @ 2025-01-05 63/week @ 2025-01-12 68/week @ 2025-01-19 28/week @ 2025-01-26 60/week @ 2025-02-02 36/week @ 2025-02-09 287/week @ 2025-02-16 79/week @ 2025-02-23 49/week @ 2025-03-02 87/week @ 2025-03-09

506 downloads per month
Used in 5 crates (3 directly)

MIT license

18KB
456 lines

DMA API

Rust

Example

use dma_api::*;

// ----- Driver Side -----

// use global allocator to alloc `to device` type memory
let mut dma: DVec<u32> = DVec::zeros(10, 0x1000, Direction::ToDevice).unwrap();
// flush cache to memory.
dma.set(0, 1);

// do nothing with cache
let o = dma.get(0).unwrap();

assert_eq!(o, 1);


// ----- OS Side -----

struct Impled;

impl Impl for Impled {
    fn map(addr: std::ptr::NonNull<u8>, size: usize, direction: Direction) -> u64 {
        println!("map @{:?}, size {size:#x}, {direction:?}", addr);
        addr.as_ptr() as usize as _
    }

    fn unmap(addr: std::ptr::NonNull<u8>, size: usize) {
        println!("unmap @{:?}, size {size:#x}", addr);
    }

    fn flush(addr: std::ptr::NonNull<u8>, size: usize) {
        println!("flush @{:?}, size {size:#x}", addr);
    }

    fn invalidate(addr: std::ptr::NonNull<u8>, size: usize) {
        println!("invalidate @{:?}, size {size:#x}", addr);
    }
}

set_impl!(Impled);

// then you can do some thing with the driver.

No runtime deps

Features