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

no-std dma-api

Trait for DMA alloc and some collections

16 releases

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

#548 in Embedded development

Download history 90/week @ 2024-12-11 15/week @ 2024-12-18 24/week @ 2024-12-25 8/week @ 2025-01-01 64/week @ 2025-01-08 82/week @ 2025-01-15 38/week @ 2025-01-22 24/week @ 2025-01-29 64/week @ 2025-02-05 45/week @ 2025-02-12 308/week @ 2025-02-19 66/week @ 2025-02-26 26/week @ 2025-03-05 173/week @ 2025-03-12 47/week @ 2025-03-19 22/week @ 2025-03-26

280 downloads per month
Used in 5 crates (2 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