/** * Reset MCI HW interface and disable it. * \param keepSettings Keep old register settings, including * _MR, _SDCR, _DTOR, _CSTOR, _DMA and _CFG. */ void MCI_Reset(Mcid *pMci, uint8_t keepSettings) { Hsmci *pMciHw = pMci->pMciHw; uint32_t mciDis; assert(pMci); assert(pMci->pMciHw); pmc_enable_periph_clk(pMci->mciId); mciDis = pmc_is_periph_clk_enabled( pMci->mciId ); if (keepSettings) { uint32_t mr, sdcr, dtor, cstor; uint32_t cfg; mr = pMciHw->HSMCI_MR; sdcr = pMciHw->HSMCI_SDCR; dtor = pMciHw->HSMCI_DTOR; cstor = pMciHw->HSMCI_CSTOR; cfg = pMciHw->HSMCI_CFG; MCI_RESET(pMciHw); MCI_Disable(pMciHw); pMciHw->HSMCI_MR = mr; pMciHw->HSMCI_SDCR = sdcr; pMciHw->HSMCI_DTOR = dtor; pMciHw->HSMCI_CSTOR = cstor; pMciHw->HSMCI_CFG = cfg; } else { MCI_RESET(pMciHw); MCI_Disable(pMciHw); } if ( mciDis ) { // pmc_disable_periph_clk( pMci->mciId ) ; } }
/** * Reset MCI HW interface and disable it. * \param keepSettings Keep old register settings, including * _MR, _SDCR, _DTOR, _CSTOR, _DMA and _CFG. */ void MCI_Reset(Mcid *pMci, uint8_t keepSettings) { Hsmci *pMciHw = pMci->pMciHw; uint8_t mciDis; assert(pMci); assert(pMci->pMciHw); PMC_EnablePeripheral(pMci->mciId); mciDis = PMC_IsPeriphEnabled(pMci->mciId); if (keepSettings) { uint32_t mr, sdcr, dtor, cstor; uint32_t cfg; mr = pMciHw->HSMCI_MR; sdcr = pMciHw->HSMCI_SDCR; dtor = pMciHw->HSMCI_DTOR; cstor = pMciHw->HSMCI_CSTOR; cfg = pMciHw->HSMCI_CFG; MCI_RESET(pMciHw); MCI_Disable(pMciHw); pMciHw->HSMCI_MR = mr; pMciHw->HSMCI_SDCR = sdcr; pMciHw->HSMCI_DTOR = dtor; pMciHw->HSMCI_CSTOR = cstor; pMciHw->HSMCI_CFG = cfg; } else { MCI_RESET(pMciHw); MCI_Disable(pMciHw); } if ( mciDis ) { PMC_DisablePeripheral( pMci->mciId ) ; } }
/** * Initialize MCI driver. */ void MCID_Init(sMcid *pMcid, Hsmci *pMci, uint8_t bID, uint32_t dwMck, sXdmad *pXdmad, uint8_t bPolling) { uint16_t clkDiv; assert(pMcid); assert(pMci); /* Initialize driver struct */ pMcid->pMciHw = pMci; pMcid->pCmd = NULL; pMcid->pXdmad = pXdmad; pMcid->dwDmaCh = XDMAD_ALLOC_FAILED; pMcid->dwXfrNdx = 0; pMcid->dwMck = dwMck; pMcid->bID = bID; pMcid->bPolling = bPolling; pMcid->bState = MCID_IDLE; _PeripheralEnable( bID ); MCI_RESET( pMci ); MCI_DISABLE ( pMci ); HSMCI_DisableIt( pMci, 0xFFFFFFFF ); HSMCI_ConfigureDataTO( pMci, HSMCI_DTOR_DTOCYC(0xFF) |HSMCI_DTOR_DTOMUL_1048576 ); HSMCI_ConfigureCompletionTO( pMci , HSMCI_CSTOR_CSTOCYC(0xFF) |HSMCI_CSTOR_CSTOMUL_1048576 ); /* Set the Mode Register: 400KHz */ clkDiv = (dwMck / (MCI_INITIAL_SPEED << 1)) - 1; HSMCI_ConfigureMode( pMci, (clkDiv | HSMCI_MR_PWSDIV(0x7)) ); HSMCI_Enable( pMci ); HSMCI_Configure( pMci, HSMCI_CFG_FIFOMODE | HSMCI_CFG_FERRCTRL ); /* Enable DMA */ HSMCI_EnableDma( pMci, 1 ); //_PeripheralDisable( bID ); }