use core::arch::asm;
use bitflags::bitflags;
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum MCIId {
MCI0,
MCI1,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum MCIFifoDepth {
Depth8 = 23,
Depth16 = 24,
Depth32 = 25,
Depth64 = 26,
Depth128 = 27,
}
bitflags! {
#[derive(Debug, Clone, Copy)]
pub struct MCICmdFlag: u32 {
const NEED_INIT = 0x1;
const EXP_RESP = 0x2;
const EXP_LONG_RESP = 0x4;
const NEED_RESP_CRC = 0x8;
const EXP_DATA = 0x10;
const WRITE_DATA = 0x20;
const READ_DATA = 0x40;
const NEED_AUTO_STOP = 0x80;
const ADTC = 0x100;
const SWITCH_VOLTAGE = 0x200;
const ABORT = 0x400;
const AUTO_CMD12 = 0x800;
}
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum MCITransMode {
DMA,
PIO,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum MCIIntrType {
GeneralIntr,
DmaIntr,
}
#[derive(Debug, PartialEq)]
pub enum FsDifEvtType {
CardDetected = 0,
CmdDone,
DataDone,
SdioIrq,
ErrOccured,
NumOfEvt,
}
#[derive(Debug, PartialEq)]
pub enum MCIClkSpeed {
ClkSpeed400KHz = 400_000,
ClkSpeed25Mhz = 25_000_000,
ClkSpeed26Mhz = 26_000_000,
ClkSpeed50Mhz = 50_000_000,
ClkSpeed52Mhz = 52_000_000,
ClkSpeed66Mhz = 66_000_000,
ClkSpeed100Mhz = 100_000_000,
}
impl From<u32> for MCIClkSpeed {
fn from(value: u32) -> Self {
match value {
400_000 => MCIClkSpeed::ClkSpeed400KHz,
25_000_000 => MCIClkSpeed::ClkSpeed25Mhz,
26_000_000 => MCIClkSpeed::ClkSpeed26Mhz,
50_000_000 => MCIClkSpeed::ClkSpeed50Mhz,
52_000_000 => MCIClkSpeed::ClkSpeed52Mhz,
66_000_000 => MCIClkSpeed::ClkSpeed66Mhz,
100_000_000 => MCIClkSpeed::ClkSpeed100Mhz,
_ => panic!("Invalid clock speed"),
}
}
}
#[inline(always)]
pub unsafe fn dsb() {
unsafe {
core::arch::asm!("dsb sy");
core::arch::asm!("isb sy");
}
}
#[inline(always)]
pub unsafe fn flush(addr: *const u8, size: usize) {
unsafe {
let mut addr = addr as usize;
let end = addr + size;
while addr < end {
asm!("dc civac, {0}", in(reg) addr, options(nostack, preserves_flags));
addr += 64;
}
dsb();
}
}
#[inline(always)]
pub unsafe fn invalidate(addr: *const u8, size: usize) {
unsafe {
const CACHE_LINE_SIZE: usize = 64;
let start_addr = (addr as usize) & !(CACHE_LINE_SIZE - 1);
let end_addr = (addr as usize + size + CACHE_LINE_SIZE - 1) & !(CACHE_LINE_SIZE - 1);
let mut current_addr = start_addr;
while current_addr < end_addr {
asm!("dc ivac, {0}", in(reg) current_addr, options(nostack, preserves_flags));
current_addr += CACHE_LINE_SIZE;
}
asm!("dsb sy");
asm!("isb");
}
}
pub const FSDIF_CNTRL_OFFSET: u32 = 0x00;
pub const FSDIF_PWREN_OFFSET: u32 = 0x04;
pub const FSDIF_CLKDIV_OFFSET: u32 = 0x08;
pub const FSDIF_CLKENA_OFFSET: u32 = 0x10;
pub const FSDIF_TMOUT_OFFSET: u32 = 0x14;
pub const FSDIF_CTYPE_OFFSET: u32 = 0x18;
pub const FSDIF_BLK_SIZ_OFFSET: u32 = 0x1C;
pub const FSDIF_BYT_CNT_OFFSET: u32 = 0x20;
pub const FSDIF_INT_MASK_OFFSET: u32 = 0x24;
pub const FSDIF_CMD_ARG_OFFSET: u32 = 0x28;
pub const FSDIF_CMD_OFFSET: u32 = 0x2C;
pub const FSDIF_RESP0_OFFSET: u32 = 0x30;
pub const FSDIF_RESP1_OFFSET: u32 = 0x34;
pub const FSDIF_RESP2_OFFSET: u32 = 0x38;
pub const FSDIF_RESP3_OFFSET: u32 = 0x3C;
pub const FSDIF_MASKED_INTS_OFFSET: u32 = 0x40;
pub const FSDIF_RAW_INTS_OFFSET: u32 = 0x44;
pub const FSDIF_STATUS_OFFSET: u32 = 0x48;
pub const FSDIF_FIFOTH_OFFSET: u32 = 0x4C;
pub const FSDIF_CARD_DETECT_OFFSET: u32 = 0x50;
pub const FSDIF_CARD_WRTPRT_OFFSET: u32 = 0x54;
pub const FSDIF_CKSTS_OFFSET: u32 = 0x58;
pub const FSDIF_TRAN_CARD_CNT_OFFSET: u32 = 0x5C;
pub const FSDIF_TRAN_FIFO_CNT_OFFSET: u32 = 0x60;
pub const FSDIF_DEBNCE_OFFSET: u32 = 0x64;
pub const FSDIF_UID_OFFSET: u32 = 0x68;
pub const FSDIF_VID_OFFSET: u32 = 0x6C;
pub const FSDIF_HWCONF_OFFSET: u32 = 0x70;
pub const FSDIF_UHS_REG_OFFSET: u32 = 0x74;
pub const FSDIF_CARD_RESET_OFFSET: u32 = 0x78;
pub const FSDIF_BUS_MODE_OFFSET: u32 = 0x80;
pub const FSDIF_DESC_LIST_ADDRL_OFFSET: u32 = 0x88;
pub const FSDIF_DESC_LIST_ADDRH_OFFSET: u32 = 0x8C;
pub const FSDIF_DMAC_STATUS_OFFSET: u32 = 0x90;
pub const FSDIF_DMAC_INT_EN_OFFSET: u32 = 0x94;
pub const FSDIF_CUR_DESC_ADDRL_OFFSET: u32 = 0x98;
pub const FSDIF_CUR_DESC_ADDRH_OFFSET: u32 = 0x9C;
pub const FSDIF_CUR_BUF_ADDRL_OFFSET: u32 = 0xA0;
pub const FSDIF_CUR_BUF_ADDRH_OFFSET: u32 = 0xA4;
pub const FSDIF_CARD_THRCTL_OFFSET: u32 = 0x100;
pub const FSDIF_CLK_SRC_OFFSET: u32 = 0x108;
pub const FSDIF_EMMC_DDR_REG_OFFSET: u32 = 0x10C;
pub const FSDIF_ENABLE_SHIFT_OFFSET: u32 = 0x110;
pub const FSDIF_DATA_OFFSET: u32 = 0x200;
pub const RETRIES_TIMEOUT: usize = 50000;
pub const FSDIF_DELAY_US: u32 = 5;
pub const MCI_MAX_FIFO_CNT: u32 = 0x800;
pub const FSL_SDMMC_MAX_CMD_RETRIES: u32 = 10;
pub const FSDIF0_ID: u32 = 0;
pub const FSDIF1_ID: u32 = 1;
pub const FT_COMPONENT_IS_READY: u32 = 0x11111111;
pub const FSDIF_IDMAC_DES0_DIC: u32 = 1 << 1;
pub const FSDIF_IDMAC_DES0_LD: u32 = 1 << 2;
pub const FSDIF_IDMAC_DES0_FD: u32 = 1 << 3;
pub const FSDIF_IDMAC_DES0_CH: u32 = 1 << 4;
pub const FSDIF_IDMAC_DES0_ER: u32 = 1 << 5;
pub const FSDIF_IDMAC_DES0_CES: u32 = 1 << 30;
pub const FSDIF_IDMAC_DES0_OWN: u32 = 1 << 31;
pub const FSDIF_IDMAC_MAX_BUF_SIZE: u32 = 0x1000;