use core::sync::atomic::{AtomicUsize, Ordering};
static DWC2_BASE_VIRT: AtomicUsize = AtomicUsize::new(0);
pub type UsbDmaToPhysFn = fn(*const u8) -> u32;
static USB_DMA_TO_PHYS: AtomicUsize = AtomicUsize::new(0);
#[inline]
pub fn set_dwc2_base_virt(addr: usize) {
DWC2_BASE_VIRT.store(addr, Ordering::SeqCst);
}
#[inline]
pub fn dwc2_base_virt() -> usize {
DWC2_BASE_VIRT.load(Ordering::SeqCst)
}
pub fn set_usb_dma_to_phys_fn(f: Option<UsbDmaToPhysFn>) {
let bits = f.map(|p| p as usize).unwrap_or(0);
USB_DMA_TO_PHYS.store(bits, Ordering::SeqCst);
}
#[inline]
pub fn usb_dma_phys_for(ptr: *const u8) -> u32 {
let bits = USB_DMA_TO_PHYS.load(Ordering::SeqCst);
if bits == 0 {
ptr as usize as u32
} else {
let fp: UsbDmaToPhysFn =
unsafe { core::mem::transmute::<usize, UsbDmaToPhysFn>(bits) };
fp(ptr)
}
}