use core::ptr::{read_volatile, write_volatile};
use crate::usb::platform;
use super::regs::{Cv182xUsb2Phy, Dwc2HostChannel, Dwc2Regs, DWC2_MAX_HOST_CHANNELS};
#[inline(always)]
pub unsafe fn read32(addr: usize) -> u32 {
unsafe { read_volatile(addr as *const u32) }
}
#[inline(always)]
pub unsafe fn write32(addr: usize, val: u32) {
unsafe { write_volatile(addr as *mut u32, val) }
}
#[allow(dead_code)]
#[inline(always)]
pub unsafe fn modify32(addr: usize, mask: u32, bits: u32) {
let v = unsafe { read32(addr) };
unsafe { write32(addr, (v & !mask) | (bits & mask)) }
}
#[inline]
pub fn dwc2_regs() -> Option<&'static Dwc2Regs> {
let base = platform::dwc2_base_virt();
if base == 0 {
return None;
}
Some(unsafe { &*(base as *const Dwc2Regs) })
}
#[inline]
pub fn dwc2_channel(ch: u32) -> Option<&'static Dwc2HostChannel> {
let regs = dwc2_regs()?;
let idx = ch as usize;
if idx >= DWC2_MAX_HOST_CHANNELS {
return None;
}
Some(®s.hc[idx])
}
#[cfg(feature = "cv182x-host")]
#[inline]
pub fn cv182x_phy_regs() -> &'static Cv182xUsb2Phy {
const CV182X_USB2_PHY_MMIO: usize = 0x0300_6000;
unsafe { &*(CV182X_USB2_PHY_MMIO as *const Cv182xUsb2Phy) }
}
#[cfg(not(feature = "cv182x-host"))]
#[allow(dead_code)]
#[inline]
pub(crate) fn _phantom_phy() -> *const Cv182xUsb2Phy {
core::ptr::null()
}