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

no-std dma-api

Trait for DMA alloc and some collections

15 releases

new 0.2.2 Feb 21, 2025
0.2.1 Feb 21, 2025
0.2.0 Dec 10, 2024
0.1.11 Dec 3, 2024
0.1.10 Nov 26, 2024

#393 in Embedded development

Download history 389/week @ 2024-11-19 440/week @ 2024-11-26 259/week @ 2024-12-03 214/week @ 2024-12-10 17/week @ 2024-12-17 26/week @ 2024-12-24 7/week @ 2024-12-31 62/week @ 2025-01-07 75/week @ 2025-01-14 45/week @ 2025-01-21 22/week @ 2025-01-28 63/week @ 2025-02-04 42/week @ 2025-02-11

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

MIT license

16KB
407 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