The MasterStream trait is used for Master DMA (MDMA) operations. It provides fine-grained control over source/destination addresses, burst sizes, and trigger modes.
Safety Warnings:
set_source_address / set_destination_address: Must have the same alignment as configured for the transfer.set_source_burst_size / set_destination_burst_size: Must be less than the transfer length.set_transfer_length / set_block_bytes: Must be a multiple of both the source and destination size.set_source_offset / set_destination_offset: If the source/destination is TCM/AHB and the burst is not a single transfer, the address must be aligned with the offset.
Key Features:
- Triggering: Set software/hardware triggers (
set_software_triggered, set_trigger_selection) and trigger modes (set_trigger_mode). - Transfer Details: Manage block bytes (
set_block_bytes, get_block_bytes) and source/destination sizes and offsets. - Interrupts: Manage buffer transfer complete (
tcie), block transfer complete (btie), and block repeat transfer complete (brtie) interrupts.
pub trait MasterStream: Stream + Sealed {
unsafe fn set_source_address(&mut self, value: usize);
unsafe fn set_destination_address(&mut self, value: usize);
unsafe fn set_source_burst_size(&mut self, value: u8);
unsafe fn set_destination_burst_size(&mut self, value: u8);
fn get_source_burst_size() -> u8;
fn get_destination_burst_size() -> u8;
fn set_software_triggered(&mut self, sw_triggered: bool);
fn set_trigger_selection(&mut self, trigger: u8);
fn set_trigger_mode(&mut self, trigger_mode: mdma::MdmaTrigger);
unsafe fn set_transfer_length(&mut self, value: u8);
fn get_transfer_length() -> u8;
unsafe fn set_block_bytes(&mut self, value: u32);
fn get_block_bytes() -> u32;
fn source_destination_size_offset(
config: &Self::Config,
peripheral_size: mdma::MdmaSize,
memory_size: mdma::MdmaSize,
direction: DmaDirection,
) -> ((mdma::MdmaSize, mdma::MdmaSize), (mdma::MdmaSize, mdma::MdmaSize));
unsafe fn set_source_size(&mut self, size: mdma::MdmaSize);
fn get_source_size() -> mdma::MdmaSize;
unsafe fn set_source_offset(&mut self, offset: mdma::MdmaSize);
unsafe fn set_destination_size(&mut self, size: mdma::MdmaSize);
fn get_destination_size() -> mdma::MdmaSize;
unsafe fn set_destination_offset(&mut self, offset: mdma::MdmaSize);
fn set_buffer_transfer_complete_interrupt_enable(&mut self, buffer_transfer_complete_interrupt: bool);
fn clear_buffer_transfer_complete_interrupt(&mut self);
fn get_buffer_transfer_complete_flag() -> bool;
fn set_block_transfer_complete_interrupt_enable(&mut self, transfer_complete_interrupt: bool);
fn clear_block_transfer_complete_interrupt(&mut self);
fn get_block_transfer_complete_flag() -> bool;
fn set_block_repeat_transfer_complete_interrupt_enable(&mut self, transfer_complete_interrupt: bool);
fn clear_block_repeat_transfer_complete_interrupt(&mut self);
fn get_block_repeat_transfer_complete_flag() -> bool;
}