void host_platform_enable_high_speed_sdio( void ) { // no! MCI_EnableHsMode(&MCI_Driver, 1); // this function is really puzzling me, observing the scope and no change there // real speed = MCK / divisor // where divisor is : 2,4,6,8,10, etc. /* DIV MCI FREQ 2 32000000 4 16000000 6 10666667 8 8000000 10 6400000 12 14 16 */ MCI_SetSpeed( &sdio_driver, 50000000, CPU_CLOCK_HZ ); /* Enable high-speed mode */ MCI_EnableHsMode( &sdio_driver, 1 ); MCI_SetBusWidth( &sdio_driver, HSMCI_SDCR_SDCBUS_4 ); // 10: 4-bit /* Enable SDIO RX interrupt */ enable_sdio_rx_irq(); }
/** * IO control functions */ uint32_t MCID_IOCtrl(sMcid *pMcid, uint32_t bCtl, uint32_t param) { Hsmci *pMciHw = pMcid->pMciHw; assert(pMcid); assert(pMcid->pMciHw); //mciDis = _PeripheralEnable(pMcid->bID); switch (bCtl) { case SDMMC_IOCTL_BUSY_CHECK: *(uint32_t*)param = !MCID_IsCmdCompleted(pMcid); break; case SDMMC_IOCTL_POWER: return SDMMC_ERROR_NOT_SUPPORT; case SDMMC_IOCTL_RESET: MCID_Reset(pMcid); return SDMMC_SUCCESS; case SDMMC_IOCTL_CANCEL_CMD: return MCID_CancelCmd(pMcid); case SDMMC_IOCTL_SET_CLOCK: *(uint32_t*)param = MCI_SetSpeed(pMcid, *(uint32_t*)param, pMcid->dwMck); break; case SDMMC_IOCTL_SET_HSMODE: HSMCI_HsEnable( pMciHw, *(uint32_t*)param ); *(uint32_t*)param = HSMCI_IsHsEnabled( pMciHw ); break; case SDMMC_IOCTL_SET_BUSMODE: HSMCI_SetBusWidth( pMciHw, *(uint32_t*)param ); break; case SDMMC_IOCTL_GET_BUSMODE: //*(uint32_t*)param = 8; /* Max 4-bit bus */ break; case SDMMC_IOCTL_GET_HSMODE: *(uint32_t*)param = 1; /* Supported */ break; default: return SDMMC_ERROR_NOT_SUPPORT; } return SDMMC_OK; }
//------------------------------------------------------------------------------ /// Initializes a Media instance and the associated physical interface /// \param media Pointer to the Media instance to initialize /// \return 1 if success. //------------------------------------------------------------------------------ unsigned char MEDSdusb_Initialize(Media *media, unsigned char mciID) { TRACE_INFO("MEDSdusb init\n\r"); // Initialize SDcard //-------------------------------------------------------------------------- if (!CardIsConnected(mciID)) return 0; // Configure SDcard pins ConfigurePIO(mciID); #if defined(MCI2_INTERFACE) DMAD_Initialize(BOARD_MCI_DMA_CHANNEL, DMAD_NO_DEFAULT_IT); #endif // Initialize the MCI driver if(mciID == 0) { IRQ_ConfigureIT(BOARD_SD_MCI_ID, MCI0_IRQ_PRIORITY, MCI0_IrqHandler); MCI_Init(mciDrv, BOARD_SD_MCI_BASE, BOARD_SD_MCI_ID, BOARD_SD_SLOT, MCI_INTERRUPT_MODE); IRQ_EnableIT(BOARD_SD_MCI_ID); } else { #ifdef BOARD_SD_MCI1_ID IRQ_ConfigureIT(BOARD_SD_MCI1_ID, MCI0_IRQ_PRIORITY, MCI0_IrqHandler); MCI_Init(mciDrv, BOARD_SD_MCI1_BASE, BOARD_SD_MCI1_ID, BOARD_SD_SLOT, MCI_INTERRUPT_MODE); IRQ_EnableIT(BOARD_SD_MCI1_ID); #else TRACE_ERROR("SD/MMC card initialization failed (MCI1 not supported)\n\r"); #endif } #if MCI_BUSY_CHECK_FIX && defined(BOARD_SD_DAT0) MCI_SetBusyFix(mciDrv, &pinSdDAT0); #endif // Initialize the SD card driver if (SD_Init(sdDrv, (SdDriver *)mciDrv)) { TRACE_ERROR("SD/MMC card initialization failed\n\r"); return 0; } else { TRACE_INFO("SD/MMC card initialization successful\n\r"); TRACE_INFO("Card size: %d MB\n\r", (int)(MMC_GetTotalSizeKB(sdDrv)/1024)); } MCI_SetSpeed(mciDrv, sdDrv->transSpeed, sdDrv->transSpeed, BOARD_MCK); // Initialize media fields //-------------------------------------------------------------------------- media->interface = sdDrv; media->write = MEDSdusb_Write; media->read = MEDSdusb_Read; media->lock = 0; media->unlock = 0; media->handler = 0; media->flush = 0; media->blockSize = SD_BLOCK_SIZE; media->baseAddress = 0; media->size = SD_TOTAL_BLOCK(sdDrv); media->mappedRD = 0; media->mappedWR = 0; media->writeProtected = CardIsProtected(mciID); media->removable = 1; media->state = MED_STATE_READY; media->transfer.data = 0; media->transfer.address = 0; media->transfer.length = 0; media->transfer.callback = 0; media->transfer.argument = 0; return 1; }