diff options
| author | Bdale Garbee <bdale@gag.com> | 2014-06-15 17:47:41 -0600 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2014-06-15 17:47:41 -0600 | 
| commit | c5cfc0d6e507d093987741b6ffaf69ebb24caa4b (patch) | |
| tree | a75b83343939e96592ac07178f2011d82ea6ded8 /src/cc1111/ao_timer.c | |
| parent | 1b3d07ede530fa40cb7257fb1725c969ba60e0f0 (diff) | |
| parent | 9ab3a1de95b705783c31a7e16447f52c10b6b480 (diff) | |
Merge branch 'branch-1.4' into debian
Diffstat (limited to 'src/cc1111/ao_timer.c')
| -rw-r--r-- | src/cc1111/ao_timer.c | 40 | 
1 files changed, 36 insertions, 4 deletions
diff --git a/src/cc1111/ao_timer.c b/src/cc1111/ao_timer.c index 75cc4ce8..2fbc6621 100644 --- a/src/cc1111/ao_timer.c +++ b/src/cc1111/ao_timer.c @@ -83,25 +83,57 @@ ao_timer_init(void)  	T1CTL = T1CTL_MODE_MODULO | T1CTL_DIV_8;  } +#ifndef NEEDS_CC1111_CLOCK_HACK +#define NEEDS_CC1111_CLOCK_HACK		1 +#endif + +#if NEEDS_CC1111_CLOCK_HACK +static void +ao_clock_delay(void) +{ +	uint16_t	i = 0; + +	while (--i) +		ao_arch_nop(); +} +#endif +  /*   * AltOS always cranks the clock to the max frequency   */  void  ao_clock_init(void)  { +#if NEEDS_CC1111_CLOCK_HACK +	/* Power up both oscillators */ +	SLEEP &= ~(SLEEP_OSC_PD); + +	/* Switch to the HFRC oscillator */ +	CLKCON = (CLKCON & ~CLKCON_OSC_MASK) | (CLKCON_OSC_RC); + +	/* Wait for the HFRC oscillator to be stable */ +	while (!(SLEEP & SLEEP_HFRC_STB)) +		; + +	/* Delay for 'a while' waiting for the crystal to +	 * stabilize -- the XOSC_STB bit isn't reliable +	 * +	 *  http://www.ti.com/lit/er/swrz022c/swrz022c.pdf +	 */ + +	ao_clock_delay(); +#endif +  	/* Switch system clock to crystal oscilator */  	CLKCON = (CLKCON & ~CLKCON_OSC_MASK) | (CLKCON_OSC_XTAL); +	/* Wait for the HFRC oscillator to be stable */  	while (!(SLEEP & SLEEP_XOSC_STB))  		;  	/* Power down the unused HFRC oscillator */  	SLEEP |= SLEEP_OSC_PD; -	/* Wait for HFRC to power down */ -	while ((SLEEP & SLEEP_HFRC_STB) != 0) -		; -	  	/* Crank up the timer tick and system clock speed */  	CLKCON = ((CLKCON & ~(CLKCON_TICKSPD_MASK | CLKCON_CLKSPD_MASK)) |  		  (CLKCON_TICKSPD_1 | CLKCON_CLKSPD_1));  | 
