diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 816ba194bd..a2dd5edf64 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -383,6 +383,7 @@ config ARCH_CHIP_SAMV7 select ARCH_HAVE_SPI_CS_CONTROL select ARM_HAVE_MPU_UNIFIED select ARMV7M_HAVE_STACKCHECK + select ARCH_HAVE_ADJTIME ---help--- Atmel SAMV7 (ARM Cortex-M7) architectures diff --git a/arch/arm/src/samv7/sam_timerisr.c b/arch/arm/src/samv7/sam_timerisr.c index 8a1cedea0f..5fec962cd4 100644 --- a/arch/arm/src/samv7/sam_timerisr.c +++ b/arch/arm/src/samv7/sam_timerisr.c @@ -93,6 +93,69 @@ static int sam_timerisr(int irq, uint32_t *regs, void *arg) * Public Functions ****************************************************************************/ +#ifdef CONFIG_CLOCK_ADJTIME + +/**************************************************************************** + * Function: up_adj_timer_period + * + * Description: + * Adjusts timer period. This call is used when adjusting timer period as + * defined in adjtime() function. + * + * Input Parameters: + * period_inc_usec - period adjustment in usec (reset to default value + * if 0) + * + ****************************************************************************/ + +void up_adj_timer_period(long long period_inc_usec) +{ + uint32_t period; + long long period_inc; + + if (period_inc_usec == 0) + { + period_inc = 0; + } + else + { + period_inc = (SAM_SYSTICK_CLOCK / 1000000) * period_inc_usec - 1; + } + + period = SYSTICK_RELOAD + period_inc; + + /* Check whether period is at maximum value. */ + + if (period > 0x00ffffff) + { + period = 0x00ffffff; + } + + putreg32(period, NVIC_SYSTICK_RELOAD); +} + +/**************************************************************************** + * Function: up_get_timer_period + * + * Description: + * This function returns the timer period in usec. + * + * Input Parameters: + * period_usec - returned timer period in usec + * + ****************************************************************************/ + +void up_get_timer_period(long long *period_usec) +{ + uint32_t period; + + period = getreg32(NVIC_SYSTICK_RELOAD); + + *period_usec = ((period + 1) / (SAM_SYSTICK_CLOCK / 1000000)); +} + +#endif + /**************************************************************************** * Function: up_timer_initialize *