Beispiel #1
0
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();
}
Beispiel #2
0
/**
 * 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;
}
Beispiel #3
0
//------------------------------------------------------------------------------
/// 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;
}