//------------------------------------------------------------------------------ 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; }
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; }
//------------------------------------------------------------------------------ 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; }
//------------------------------------------------------------------------------ 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; }
//------------------------------------------------------------------------------ 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; }