Exemplo n.º 1
0
static BOOL Init (void) {
  /* Initialize MCI interface. */
  uint32_t i;
  
  CmdBusMode = 0;                       /* Cmd line set to open drain mode    */

  /* Enable PIOA, MCI and DMA clock. */
  PMC->PMC_WPMR  = PMC_WPDIS_KEY;       /* Disable PMC write protection       */
  PMC->PMC_PCER0 = PMC_PCER0_PID11 |    /* Parallel I/O Controller A clock    */
                   PMC_PCER0_PID18 ;    /* Multimedia Card Interface clock    */
  PMC->PMC_WPMR  = PMC_WPEN_KEY;        /* Enable PMC write protection        */
  
  /* Configure I/O pins */
  PIOA->PIO_WPMR = PIO_WPDIS_KEY;       /* Disable PIO write protection       */
  
  PIOA->PIO_IDR  = PIO_IDR_PIN_MSK;
  PIOA->PIO_PDR  = PIO_PDR_PIN_MSK;
  PIOA->PIO_PUER = PIO_PUER_PIN_MSK;

  /* Assign memory card I/O lines to peripheral C (HSMCI) */
  PIOA->PIO_ABCDSR[0] &= ~PIO_ABCDSR_PIN_MSK;
  PIOA->PIO_ABCDSR[1] |=  PIO_ABCDSR_PIN_MSK;
  
  PIOA->PIO_WPMR = PIO_WPEN_KEY;        /* Enable PIO write protection        */
  
  /* Disable HSMCI write protection */
  HSMCI->HSMCI_WPMR = HSMCI_WPDIS_KEY;

  /* Initialize HSMCI peripheral */
  HSMCI->HSMCI_CR   = HSMCI_CR_SWRST;
  HSMCI->HSMCI_CR   = HSMCI_CR_PWSDIS | HSMCI_CR_MCIDIS;
  HSMCI->HSMCI_IDR  = 0xFCFFF1FF;
  HSMCI->HSMCI_DTOR = HSMCI_DTOR_DTOMUL_1048576   | HSMCI_DTOR_DTOCYC(15);
  HSMCI->HSMCI_CSTOR= HSMCI_CSTOR_CSTOMUL_1048576 | HSMCI_CSTOR_CSTOCYC (1);
  HSMCI->HSMCI_CFG  = HSMCI_CFG_HSMODE | HSMCI_CFG_FERRCTRL | HSMCI_CFG_FIFOMODE;
  HSMCI->HSMCI_MR   = HSMCI_MR_PDCMODE | HSMCI_MR_WRPROOF   |
                      HSMCI_MR_RDPROOF | HSMCI_MR_PWSDIV (7);

  /* Enable HSMCI write protection */
  HSMCI->HSMCI_WPMR = HSMCI_WPEN_KEY;
  
  /* Enable HSMCI */
  HSMCI->HSMCI_CR   = HSMCI_CR_MCIEN;

  /* Send 74 clock cycles for memory card initialization sequence */
  HSMCI->HSMCI_CMDR = HSMCI_CMDR_SPCMD_INIT;
  for (i = HSMCI_TOUT; i; i--) {
    if (HSMCI->HSMCI_SR & HSMCI_SR_CMDRDY) {
      return (__TRUE);
    }
  }
  return (__FALSE);
}
Exemplo n.º 2
0
/**
 * 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 );
}