Exemplo n.º 1
0
//------------------------------------------------------------------------------
INT usleep(ULONG usecs_p)
{
    UINT64          startTime = alt_globaltmr_get64();
    UINT32          timerPrescaler = alt_globaltmr_prescaler_get() + 1;
    UINT64          endTime;
    alt_freq_t      timerClkSrc;

    alt_clk_freq_get(ALT_CLK_MPU_PERIPH, &timerClkSrc);
    endTime = startTime + usecs_p * ((timerClkSrc / timerPrescaler) / 1000000);

    while (alt_globaltmr_get64() < endTime);
    return 0;
}
Exemplo n.º 2
0
static bool altera_cyclone_v_uart_probe(
  rtems_termios_device_context *base,
  uint32_t uart_set_mask
)
{
  ns16550_context *ctx = (ns16550_context *) base;
  bool            ret           = true;
  uint32_t        ucr;
  ALT_STATUS_CODE sc;
  void*           location = (void *) ctx->port;

  /* The ALT_CLK_L4_SP is required for all SoCFPGA UARTs. 
   * Check that it's enabled. */
  if ( alt_clk_is_enabled(ALT_CLK_L4_SP) != ALT_E_TRUE ) {
    ret = false;
  }

  if ( ret ) {
    sc = alt_clk_freq_get(ALT_CLK_L4_SP, &ctx->clock);
    if ( sc != ALT_E_SUCCESS ) {
      ret = false;
    }
  }

  if ( ret ) {
    // Bring UART out of reset.
    alt_clrbits_word(ALT_RSTMGR_PERMODRST_ADDR, uart_set_mask);

    // Verify the UCR (UART Component Version)
    ucr = alt_read_word( ALT_UART_UCV_ADDR( location ) );
    if ( ucr != ALT_UART_UCV_UART_COMPONENT_VER_RESET ) {
      ret = false;
    }
  }

  if ( ret ) {
    // Write SRR::UR (Shadow Reset Register :: UART Reset)
    alt_write_word( ALT_UART_SRR_ADDR( location ), ALT_UART_SRR_UR_SET_MSK );

    // Read the MSR to work around case:119085.
    (void)alt_read_word( ALT_UART_MSR_ADDR( location ) );

    ret = ns16550_probe( base );
  }

  return ret;
}
Exemplo n.º 3
0
//------------------------------------------------------------------------------
static inline UINT64 getTimerCurrentScaledCount(ALT_GPT_TIMER_t timerId_p,
                                                UINT32   scalingFactor_p)
{
    UINT64          timeStamp_l = 0;
    UINT64          timeStamp_h = 0;
    UINT64          timeStamp = 0;
    UINT64          scaledTime = 0;
    ALT_CLK_t       clkSrc = ALT_CLK_UNKNOWN;
    UINT32          preScaler = 0;
    UINT32          freq = 1;

    preScaler = alt_gpt_prescaler_get(timerId_p);
    if (preScaler <= UINT8_MAX)
    {
        if (timerId_p == ALT_GPT_CPU_GLOBAL_TMR)    // Global Timer
        {
            alt_globaltmr_get((UINT32*)&timeStamp_h, (UINT32*)&timeStamp_l);
            clkSrc = ALT_CLK_MPU_PERIPH;
        }
        else
        {
            scaledTime = 0;
            goto Exit;
        }

        if (alt_clk_freq_get(clkSrc, &freq) == ALT_E_SUCCESS)
        {
            timeStamp_l *= (preScaler + 1);
            timeStamp_h *= (preScaler + 1);
            timeStamp_l *= scalingFactor_p;
            timeStamp_h *= scalingFactor_p;
            timeStamp = (UINT64)((((timeStamp_h << 32) & ~UINT32_MAX) |
                                   timeStamp_l) / freq);
            scaledTime = (timeStamp > UINT64_MAX) ? UINT64_MAX : (UINT64)timeStamp;
        }
    }

Exit:
    return scaledTime;
}
Exemplo n.º 4
0
//------------------------------------------------------------------------------
static inline UINT64 getTimerMaxScaledCount(ALT_GPT_TIMER_t timerId_p,
                                            UINT32 scalingFactor_p)
{
    UINT64          maxScaledTime = 0;
    UINT32          freq = 1;
    UINT64          maxTimeStampLow = 0;
    UINT64          maxTimeStampHigh = 0;
    UINT64          maxTimeStamp = 0;
    UINT32          preScaler = 0;
    ALT_CLK_t       clkSrc;

    preScaler = alt_gpt_prescaler_get(timerId_p);

    if (timerId_p == ALT_GPT_CPU_GLOBAL_TMR)
    {
        clkSrc = ALT_CLK_MPU_PERIPH;
        maxTimeStampLow = (UINT64)UINT32_MAX;
        maxTimeStampHigh = (UINT64)UINT32_MAX;
    }
    else
    {
        goto Exit;
    }

    if (alt_clk_freq_get(clkSrc, &freq) == ALT_E_SUCCESS)
    {
        maxTimeStampLow *= (preScaler + 1);
        maxTimeStampHigh *= (preScaler + 1);
        maxTimeStampLow *= scalingFactor_p;
        maxTimeStampHigh *= scalingFactor_p;
        maxTimeStamp = (UINT64)((((maxTimeStampHigh << 32) & ~UINT32_MAX) |
                                  maxTimeStampLow) / freq);

        maxScaledTime = (maxTimeStamp > UINT64_MAX) ? UINT64_MAX : (UINT64) maxTimeStamp;
    }

Exit:
    return maxScaledTime;
}
Exemplo n.º 5
0
//------------------------------------------------------------------------------
static inline UINT64 getTimerTicksFromScaled(ALT_GPT_TIMER_t timerId_p,
                                             UINT32 scalingFactor_p,
                                             UINT32 scaledTimeDuration_p)
{
    UINT64          ticks = 0;                      // value to return
    ALT_CLK_t       clkSrc = ALT_CLK_UNKNOWN;
    UINT32          preScaler = 0;
    UINT32          freq = 1;

    preScaler = alt_gpt_prescaler_get(timerId_p);
    if (preScaler <= UINT8_MAX)
    {
        if (timerId_p == ALT_GPT_CPU_GLOBAL_TMR)    // Global Timer
        {
            ticks = 1;
            clkSrc = ALT_CLK_MPU_PERIPH;
        }
        else
        {
            ticks = 0;
            goto Exit;
        }

        if (alt_clk_freq_get(clkSrc, &freq) == ALT_E_SUCCESS)
        {
            // clock ticks per second
            ticks *= freq;

            // total clock ticks
            ticks *= (UINT64)(scaledTimeDuration_p / scalingFactor_p);

            // convert into timer ticks
            ticks /= (preScaler + 1);
        }
    }

Exit:
    return ticks;
}