38 lines
1.2 KiB
Rust
38 lines
1.2 KiB
Rust
|
|
use alloc::{collections::BTreeMap, string::String, vec::Vec};
|
|
use libcortex_a9::{mutex::Mutex, cache::dcci_slice};
|
|
use crate::kernel::DmaRecorder;
|
|
|
|
const ALIGNMENT: usize = 16 * 8;
|
|
|
|
static DMA_RECORD_STORE: Mutex<BTreeMap<String, (u32, Vec<u8>, i64)>> = Mutex::new(BTreeMap::new());
|
|
|
|
|
|
pub fn put_record(mut recorder: DmaRecorder) {
|
|
recorder.buffer.reserve(ALIGNMENT - 1);
|
|
let original_length = recorder.buffer.len();
|
|
let padding = ALIGNMENT - recorder.buffer.as_ptr() as usize % ALIGNMENT;
|
|
let padding = if padding == ALIGNMENT { 0 } else { padding };
|
|
for _ in 0..padding {
|
|
recorder.buffer.push(0);
|
|
}
|
|
// trailing zero to indicate end of buffer
|
|
recorder.buffer.push(0);
|
|
recorder.buffer.copy_within(0..original_length, padding);
|
|
dcci_slice(&recorder.buffer);
|
|
|
|
let ptr = recorder.buffer[padding..].as_ptr() as u32;
|
|
|
|
DMA_RECORD_STORE
|
|
.lock()
|
|
.insert(recorder.name, (ptr, recorder.buffer, recorder.duration));
|
|
}
|
|
|
|
pub fn erase(name: String) {
|
|
DMA_RECORD_STORE.lock().remove(&name);
|
|
}
|
|
|
|
pub fn retrieve(name: String) -> Option<(i32, i64)> {
|
|
let (ptr, _v, duration) = DMA_RECORD_STORE.lock().get(&name)?.clone();
|
|
Some((ptr as i32, duration))
|
|
} |