* dma: add Mem2Mem to support memory to memory transfer * fmt * update CHANGELOG * removed some debugging * use "gdma" as the selector for support * fix empty else * clippy * Mem2Mem::new now accepts the peripheral to use * mark Mem2Mem::new() unsafe * fmt :-/ * add Mem2MemN values for gdma on non-esp32s3 tested on esp32c3,esp32c6 (will have an esp32h2 in a few days) * support the esp32c2 (esp8684) * DmaEligible trait providing dma peripheral value & safe constructor for Mem2Mem dma. * added hil-test for Mem2Mem * fmt dma_mem2mem test * remove `debug!()` * reset the mem2mem bit (mem_trans_en) in in_conf0 on drop
60 lines
1.7 KiB
Rust
60 lines
1.7 KiB
Rust
//! DMA Mem2Mem Tests
|
|
|
|
//% CHIPS: esp32s3 esp32c2 esp32c3 esp32c6 esp32h2
|
|
|
|
#![no_std]
|
|
#![no_main]
|
|
|
|
use defmt_rtt as _;
|
|
use esp_backtrace as _;
|
|
use esp_hal::{
|
|
clock::ClockControl,
|
|
dma::{Dma, DmaPriority, Mem2Mem},
|
|
dma_buffers,
|
|
peripherals::Peripherals,
|
|
system::SystemControl,
|
|
};
|
|
|
|
const DATA_SIZE: usize = 1024 * 10;
|
|
|
|
#[cfg(test)]
|
|
#[embedded_test::tests]
|
|
mod tests {
|
|
use defmt::assert_eq;
|
|
|
|
use super::*;
|
|
|
|
#[init]
|
|
fn init() {}
|
|
|
|
#[test]
|
|
fn test_internal_mem2mem() {
|
|
let peripherals = Peripherals::take();
|
|
let system = SystemControl::new(peripherals.SYSTEM);
|
|
let _clocks = ClockControl::boot_defaults(system.clock_control).freeze();
|
|
|
|
let (tx_buffer, tx_descriptors, mut rx_buffer, rx_descriptors) = dma_buffers!(DATA_SIZE);
|
|
|
|
let dma = Dma::new(peripherals.DMA);
|
|
let channel = dma.channel0.configure(false, DmaPriority::Priority0);
|
|
#[cfg(any(feature = "esp32c2", feature = "esp32c3", feature = "esp32s3"))]
|
|
let dma_peripheral = peripherals.SPI2;
|
|
#[cfg(not(any(feature = "esp32c2", feature = "esp32c3", feature = "esp32s3")))]
|
|
let dma_peripheral = peripherals.MEM2MEM1;
|
|
|
|
let mut mem2mem = Mem2Mem::new(channel, dma_peripheral, tx_descriptors, rx_descriptors);
|
|
|
|
for i in 0..core::mem::size_of_val(tx_buffer) {
|
|
tx_buffer[i] = (i % 256) as u8;
|
|
}
|
|
let dma_wait = mem2mem.start_transfer(&tx_buffer, &mut rx_buffer).unwrap();
|
|
dma_wait.wait().unwrap();
|
|
// explicitly drop to insure the mem2mem bit is not left set as this causes
|
|
// subsequent dma tests to fail.
|
|
drop(mem2mem);
|
|
for i in 0..core::mem::size_of_val(tx_buffer) {
|
|
assert_eq!(rx_buffer[i], tx_buffer[i]);
|
|
}
|
|
}
|
|
}
|