Esempio n. 1
0
wxLongLong wxStopWatch::TimeInMicro() const
{
    const wxLongLong elapsed(m_pauseCount ? m_elapsedBeforePause
                                          : GetCurrentClockValue() - m_t0);

    return (elapsed*MICROSECONDS_PER_SECOND)/GetClockFreq();
}
Esempio n. 2
0
void wxStopWatch::Start(long t0)
{
    // Calling Start() makes the stop watch run however many times it was
    // paused before.
    m_pauseCount = 0;

    DoStart();

    m_t0 -= (wxLongLong(t0)*GetClockFreq())/MILLISECONDS_PER_SECOND;
}
Esempio n. 3
0
/**
  \fn            int32_t Control (uint32_t control, uint32_t arg)
  \brief         Control MCI Interface.
  \param[in]     control  Operation
  \param[in]     arg      Argument of operation (optional)
  \return        \ref execution_status
*/
static int32_t Control (uint32_t control, uint32_t arg) {
  uint32_t div, bps, pclk;
  
  if (!(MCI.flags & MCI_POWER)) { return ARM_DRIVER_ERROR; }

  switch (control) {
    case ARM_MCI_BUS_SPEED:
      /* Get peripheral clock and calculate clock divider */
      pclk = GetClockFreq (SDIO_CLK_SEL_PLL1);
      bps  = arg;

      LPC_SDMMC->CLKENA &= ~SDMMC_CLKENA_CCLK_ENABLE;

      if (bps) {
        /* bps = pclk / (2 * div) */
        div   = (pclk + bps - 1) / bps;
        if (div & 1) { div += 1; }

        bps = pclk / div;

        LPC_SDMMC->CLKSRC  =  SDMMC_CLKSRC_CLK_SOURCE (0);
        LPC_SDMMC->CLKDIV  =  SDMMC_CLKDIV_CLK_DIVIDER0 (div >> 1);
        LPC_SDMMC->CLKENA |=  SDMMC_CLKENA_CCLK_ENABLE   |
                              SDMMC_CLKENA_CCLK_LOW_POWER;
      }

      /* Send "update clock registers" command and wait until finished */
      LPC_SDMMC->CMD = SDMMC_CMD_UPDATE_CLOCK_REGISTERS_ONLY |
                       SDMMC_CMD_WAIT_PRVDATA_COMPLETE       |
                       SDMMC_CMD_START_CMD                   ;

      while (LPC_SDMMC->CMD & SDMMC_CMD_START_CMD);

      /* Bus speed configured */
      MCI.flags |= MCI_SETUP;

      return (bps);

    case ARM_MCI_BUS_SPEED_MODE:
      switch (arg) {
        case ARM_MCI_BUS_DEFAULT_SPEED:
          /* Speed mode up to 25/26MHz */
        case ARM_MCI_BUS_HIGH_SPEED:
          /* Speed mode up to 50MHz */
          return ARM_DRIVER_OK;

        default:
          break;
      }
      return ARM_DRIVER_ERROR_UNSUPPORTED;

    case ARM_MCI_BUS_CMD_MODE:
      /* Implement external pull-up control to support MMC cards in open-drain mode */
      /* Default mode is push-pull and is configured in Driver_MCI0.Initialize()    */
      if (arg == ARM_MCI_BUS_CMD_PUSH_PULL) {
        /* Configure external circuit to work in push-pull mode */
      }
      else if (arg == ARM_MCI_BUS_CMD_OPEN_DRAIN) {
        /* Configure external circuit to work in open-drain mode */
      }
      else {
        return ARM_DRIVER_ERROR_UNSUPPORTED;
      }
      break;

    case ARM_MCI_BUS_DATA_WIDTH:
      LPC_SDMMC->CTYPE &= ~(SDMMC_CTYPE_CARD_WIDTH0 | SDMMC_CTYPE_CARD_WIDTH1);

      switch (arg) {
        case ARM_MCI_BUS_DATA_WIDTH_1:
          break;
        case ARM_MCI_BUS_DATA_WIDTH_4:
          LPC_SDMMC->CTYPE |= SDMMC_CTYPE_CARD_WIDTH0;
          break;
        case ARM_MCI_BUS_DATA_WIDTH_8:
          LPC_SDMMC->CTYPE |= SDMMC_CTYPE_CARD_WIDTH1;
          break;
        default:
          return ARM_DRIVER_ERROR_UNSUPPORTED;
      }
      break;

    #if (RTE_SD_RST_PIN_EN)
    case ARM_MCI_CONTROL_RESET:
      if (arg) {
        /* Assert RST_n pin */
        LPC_SDMMC->RST_N = 0;
      }
      else {
        /* Deassert RST_n pin */
        LPC_SDMMC->RST_N = 1;
      }
      break;
    #endif

    case ARM_MCI_CONTROL_CLOCK_IDLE:
      if (arg) {
        /* Clock generation enabled when idle */
        LPC_SDMMC->CLKENA &= ~SDMMC_CLKENA_CCLK_LOW_POWER;
      }
      else {
        /* Clock generation disabled when idle */
        LPC_SDMMC->CLKENA |=  SDMMC_CLKENA_CCLK_LOW_POWER;
      }
      /* Send "update clock registers" command and wait until finished */
      LPC_SDMMC->CMD = SDMMC_CMD_UPDATE_CLOCK_REGISTERS_ONLY |
                       SDMMC_CMD_WAIT_PRVDATA_COMPLETE       |
                       SDMMC_CMD_START_CMD                   ;

      while (LPC_SDMMC->CMD & SDMMC_CMD_START_CMD);
      break;

    case ARM_MCI_DATA_TIMEOUT:
      if (arg > 0xFFFFFF) {
        /* Max timeout @ 50MHz is ~335ms: this could cause */
        /* data timeout issues on slow devices             */
        arg = 0xFFFFFF;
      }
      LPC_SDMMC->TMOUT = (arg << 8) | 0x40;
      break;
    
    case ARM_MCI_MONITOR_SDIO_INTERRUPT:
      MCI.status.sdio_interrupt = 0;
      LPC_SDMMC->INTMASK |= SDMMC_INTMASK_SDIO_INT_MASK;
      break;
    
    case ARM_MCI_CONTROL_READ_WAIT:
      if (arg) {
        /* Assert read wait */
        LPC_SDMMC->CTRL |= SDMMC_CTRL_READ_WAIT;
      }
      else {
        /* Clear read wait */
        LPC_SDMMC->CTRL &= ~SDMMC_CTRL_READ_WAIT;
      }
      break;
    
    case ARM_MCI_DRIVER_STRENGTH:
    default: return ARM_DRIVER_ERROR_UNSUPPORTED;
  }

  return ARM_DRIVER_OK;
}