Contiki-NG
|
Files | |
file | clock.c |
Clock driver implementation for the TI cc2538. | |
Functions | |
void | clock_init (void) |
Arch-specific implementation of clock_init for the cc2538. | |
clock_time_t | clock_time (void) |
Get the current clock time. | |
void | clock_set_seconds (unsigned long sec) |
Set the value of the platform seconds. | |
unsigned long | clock_seconds (void) |
Get the current value of the platform seconds. | |
void | clock_wait (clock_time_t i) |
Wait for a given number of ticks. | |
void | clock_delay_usec (uint16_t dt) |
Delay a given number of microseconds. | |
void | clock_delay (unsigned int i) |
Obsolete delay function but we implement it here since some code still uses it. | |
static void | update_ticks (void) |
Update the software clock ticks and seconds. | |
void | clock_adjust (void) |
Adjust the clock following missed SysTick ISRs. | |
void | clock_isr (void) |
The clock Interrupt Service Routine. | |
Implementation of the clock module for the cc2538
To implement the clock functionality, we use the SysTick peripheral on the cortex-M3. We run the system clock at a configurable speed and set the SysTick to give us 128 interrupts / sec. However, the Sleep Timer counter value is used for the number of elapsed ticks in order to avoid a significant time drift caused by PM1/2. Contrary to the Sleep Timer, the SysTick peripheral is indeed frozen during PM1/2, so adjusting upon wake-up a tick counter based on this peripheral would hardly be accurate.
void clock_adjust | ( | void | ) |
Adjust the clock following missed SysTick ISRs.
This function is useful when coming out of PM1/2, during which the system clock is stopped. We adjust the clock counters like after any SysTick ISR.
Definition at line 224 of file clock.c.
References update_ticks().
void clock_delay_usec | ( | uint16_t | dt | ) |
Delay a given number of microseconds.
dt | How many microseconds to delay. |
< GPTIMER0
< GPTM Timer A interval load
< GPTIMER0
< GPTM control
< Timer A enable
< GPTIMER0
< GPTM control
< Timer A enable
Definition at line 150 of file clock.c.
References GPT_0_BASE, GPTIMER_CTL, GPTIMER_CTL_TAEN, and GPTIMER_TAILR.
Referenced by clock_delay(), dht22_read(), i2c_init(), i2c_master_command(), mp3_wtv020sd_gpio_next(), mp3_wtv020sd_reset(), pm_reset_system(), and rtcc_set_autocalibration().
void clock_init | ( | void | ) |
Arch-specific implementation of clock_init for the cc2538.
Initialize the clock library.
We initialise the SysTick to fire 128 interrupts per second, giving us a value of 128 for CLOCK_SECOND
We also initialise GPT0:Timer A, which is used by clock_delay_usec(). We use 16-bit range (individual), count-down, one-shot, no interrupts. The prescaler is computed according to the system clock in order to get 1 tick per usec.
< GPT[3:0] clocks - active mode
< GPT0 clock enable, CPU running
< GPTIMER0
< GPTM control
< GPTIMER0
< GPTM configuration
< GPTIMER0
< GPTM Timer A mode
< GPTIMER0
< GPTM Timer A prescale
Definition at line 93 of file clock.c.
References GPT_0_BASE, GPTIMER_CFG, GPTIMER_CTL, GPTIMER_TAMR, GPTIMER_TAPR, SYS_CTRL_RCGCGPT, and SYS_CTRL_RCGCGPT_GPT0.
Referenced by soc_init().
void clock_isr | ( | void | ) |
The clock Interrupt Service Routine.
It polls the etimer process if an etimer has expired. It also updates the software clock tick and seconds counter.
Definition at line 242 of file clock.c.
References update_ticks().
unsigned long clock_seconds | ( | void | ) |
Get the current value of the platform seconds.
This could be the number of seconds since startup, or since a standard epoch.
Definition at line 130 of file clock.c.
References RTIMER_SECOND.
Referenced by newdata(), resolv_lookup(), resolv_query(), stimer_elapsed(), stimer_expired(), stimer_remaining(), stimer_restart(), stimer_set(), tsch_cs_channel_stats_updated(), tsch_cs_process(), and uip_nameserver_update().
void clock_set_seconds | ( | unsigned long | sec | ) |
Set the value of the platform seconds.
sec | The value to set. |
Definition at line 124 of file clock.c.
References RTIMER_SECOND.
clock_time_t clock_time | ( | void | ) |
Get the current clock time.
This function returns the current system clock time.
Definition at line 118 of file clock.c.
Referenced by clock_wait(), mac_sequence_is_duplicate(), mac_sequence_register_seqno(), rpl_dag_update_state(), rpl_neighbor_snprint(), rtimer_arch_schedule(), timer_expired(), timer_remaining(), timer_restart(), timer_set(), tsch_get_network_uptime_ticks(), tsch_slot_operation_sync(), and tz_api_poll().
void clock_wait | ( | clock_time_t | t | ) |
Wait for a given number of ticks.
t | How many ticks. |
Definition at line 136 of file clock.c.
References clock_time(), and start().
Referenced by platform_init_stage_two().
|
static |
Update the software clock ticks and seconds.
This function is used to update the software tick counters whenever the system clock might have changed, which can occur upon a SysTick ISR or upon wake-up from PM1/2.
For the software clock ticks counter, the Sleep Timer counter value is used as the base tick value, and extended to a 64-bit value thanks to a detection of wraparounds.
For the seconds counter, the changes of the Sleep Timer counter value are added to the reference time, which is either the startup time or the value passed to clock_set_seconds().
This function polls the etimer process if an etimer has expired.
Definition at line 187 of file clock.c.
References etimer_pending(), etimer_request_poll(), and RTIMER_NOW.
Referenced by clock_adjust(), and clock_isr().