pub struct DeviceDma { /* private fields */ }Expand description
DMA 设备操作接口。
DeviceDma 是用于执行 DMA 操作的主要入口点,封装了平台特定的
DmaOp 实现,并提供了分配、映射和管理 DMA 内存的方法。
§创建
使用 DeviceDma::new() 创建实例,需要提供:
dma_mask: 设备可寻址的地址掩码(如0xFFFFFFFF表示 32 位设备)osal: 实现DmaOptrait 的平台抽象层
§示例
ⓘ
use dma_api::DeviceDma;
let device = DeviceDma::new(0xFFFFFFFF, &my_dma_impl);Implementations§
Source§impl DeviceDma
impl DeviceDma
Sourcepub fn flush(&self, addr: NonNull<u8>, size: usize)
pub fn flush(&self, addr: NonNull<u8>, size: usize)
刷新 CPU 缓存到内存(clean 操作)。
将指定地址范围的 CPU 缓存数据写回到内存,确保设备可以读取到最新数据。
用于 ToDevice 和 Bidirectional 方向的 DMA 传输前。
§参数
addr: 内存起始地址size: 内存大小(字节)
Sourcepub fn invalidate(&self, addr: NonNull<u8>, size: usize)
pub fn invalidate(&self, addr: NonNull<u8>, size: usize)
使 CPU 缓存失效(invalidate 操作)。
使指定地址范围的 CPU 缓存失效,强制 CPU 从内存重新读取数据。
用于 FromDevice 和 Bidirectional 方向的 DMA 传输后。
§参数
addr: 内存起始地址size: 内存大小(字节)
Sourcepub fn flush_invalidate(&self, addr: NonNull<u8>, size: usize)
pub fn flush_invalidate(&self, addr: NonNull<u8>, size: usize)
Sourcepub fn array_zero<T>(
&self,
size: usize,
direction: DmaDirection,
) -> Result<DArray<T>, DmaError>
pub fn array_zero<T>( &self, size: usize, direction: DmaDirection, ) -> Result<DArray<T>, DmaError>
Sourcepub fn array_zero_with_align<T>(
&self,
size: usize,
align: usize,
direction: DmaDirection,
) -> Result<DArray<T>, DmaError>
pub fn array_zero_with_align<T>( &self, size: usize, align: usize, direction: DmaDirection, ) -> Result<DArray<T>, DmaError>
创建指定对齐的 DMA 数组。
分配一个指定大小和对齐要求的 DMA 可访问数组,内存初始化为零。
§类型参数
T: 数组元素类型,必须是Sized并且实现了Default
§参数
size: 数组长度(元素个数)align: 对齐字节数(至少等于core::mem::align_of::<T>())direction: DMA 传输方向,决定缓存同步策略
§返回
成功时返回 DArray<T> 容器,失败时返回 DmaError
§示例
ⓘ
// 创建 64 字节对齐的数组
let dma_array = device
.array_zero_with_align::<u32>(100, 64, DmaDirection::FromDevice)?;Sourcepub fn box_zero<T>(&self, direction: DmaDirection) -> Result<DBox<T>, DmaError>
pub fn box_zero<T>(&self, direction: DmaDirection) -> Result<DBox<T>, DmaError>
创建默认对齐的 DMA Box。
分配一个 DMA 可访问的单值容器,内存初始化为零。 适合存储 DMA 描述符、配置结构等单个对象。
§类型参数
T: 存储的值类型,必须是Sized并且实现了Default
§参数
direction: DMA 传输方向,决定缓存同步策略
§返回
成功时返回 DBox<T> 容器,失败时返回 DmaError
§示例
ⓘ
#[derive(Default)]
struct Descriptor {
addr: u64,
length: u32,
}
let dma_desc = device.box_zero::<Descriptor>(DmaDirection::ToDevice)?;Sourcepub fn box_zero_with_align<T>(
&self,
align: usize,
direction: DmaDirection,
) -> Result<DBox<T>, DmaError>
pub fn box_zero_with_align<T>( &self, align: usize, direction: DmaDirection, ) -> Result<DBox<T>, DmaError>
Sourcepub fn map_single_array<T>(
&self,
buff: &[T],
align: usize,
direction: DmaDirection,
) -> Result<SArrayPtr<T>, DmaError>
pub fn map_single_array<T>( &self, buff: &[T], align: usize, direction: DmaDirection, ) -> Result<SArrayPtr<T>, DmaError>
映射现有缓冲区为 DMA 可访问。
将已存在的缓冲区(如栈数组或堆分配的 slice)映射为 DMA 可访问区域。
返回的 SArrayPtr 在离开作用域时自动解除映射。
§缓存同步
重要: 此方法创建的映射不会自动同步缓存。
你必须手动调用 SArrayPtr 的方法进行缓存同步:
to_vec(): 读取前自动失效整个范围copy_from_slice(): 写入后自动刷新整个范围
§类型参数
T: 数组元素类型
§参数
buff: 要映射的缓冲区切片align: 对齐字节数direction: DMA 传输方向,决定手动缓存同步的行为
§返回
成功时返回 SArrayPtr<T> 映射句柄,失败时返回 DmaError
§示例
ⓘ
let mut buffer = [0u8; 4096];
// 映射用于 DMA 写入
let mapping = device.map_single_array(&buffer, 64, DmaDirection::ToDevice)?;
// 必须手动刷新缓存
mapping.copy_from_slice(&data);
// ... 启动 DMA 传输 ...
// 映射在作用域结束时自动解映射Trait Implementations§
Auto Trait Implementations§
impl Freeze for DeviceDma
impl !RefUnwindSafe for DeviceDma
impl Send for DeviceDma
impl Sync for DeviceDma
impl Unpin for DeviceDma
impl !UnwindSafe for DeviceDma
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more