Merge pull request #410 from ADVANSEE/cc2538-sys_ctrl
cc2538: sys_ctrl: Make it possible to use the 32-kHz crystal
This commit is contained in:
commit
d08a87880c
|
@ -35,20 +35,39 @@
|
||||||
* \file
|
* \file
|
||||||
* Implementation of the cc2538 System Control driver
|
* Implementation of the cc2538 System Control driver
|
||||||
*/
|
*/
|
||||||
|
#include "contiki.h"
|
||||||
#include "reg.h"
|
#include "reg.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "dev/sys-ctrl.h"
|
#include "dev/sys-ctrl.h"
|
||||||
|
#include "dev/gpio.h"
|
||||||
|
#include "dev/ioc.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if SYS_CTRL_OSC32K_USE_XTAL
|
||||||
|
#define SYS_CTRL_OSCS 0
|
||||||
|
#else
|
||||||
|
#define SYS_CTRL_OSCS SYS_CTRL_CLOCK_CTRL_OSC32K
|
||||||
|
#endif
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
sys_ctrl_init()
|
sys_ctrl_init()
|
||||||
{
|
{
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
|
|
||||||
|
#if SYS_CTRL_OSC32K_USE_XTAL
|
||||||
|
/* Set the XOSC32K_Q pads to analog for crystal */
|
||||||
|
GPIO_SOFTWARE_CONTROL(GPIO_PORT_TO_BASE(GPIO_D_NUM), GPIO_PIN_MASK(6));
|
||||||
|
GPIO_SET_INPUT(GPIO_PORT_TO_BASE(GPIO_D_NUM), GPIO_PIN_MASK(6));
|
||||||
|
ioc_set_over(GPIO_D_NUM, 6, IOC_OVERRIDE_ANA);
|
||||||
|
GPIO_SOFTWARE_CONTROL(GPIO_PORT_TO_BASE(GPIO_D_NUM), GPIO_PIN_MASK(7));
|
||||||
|
GPIO_SET_INPUT(GPIO_PORT_TO_BASE(GPIO_D_NUM), GPIO_PIN_MASK(7));
|
||||||
|
ioc_set_over(GPIO_D_NUM, 7, IOC_OVERRIDE_ANA);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Desired Clock Ctrl configuration:
|
* Desired Clock Ctrl configuration:
|
||||||
* 32KHz source: RC
|
* 32KHz source: RC or crystal, according to SYS_CTRL_OSC32K_USE_XTAL
|
||||||
* System Clock: 32 MHz
|
* System Clock: 32 MHz
|
||||||
* Power Down Unused
|
* Power Down Unused
|
||||||
* I/O Div: 16MHz
|
* I/O Div: 16MHz
|
||||||
|
@ -56,11 +75,18 @@ sys_ctrl_init()
|
||||||
* Rest: Don't care
|
* Rest: Don't care
|
||||||
*/
|
*/
|
||||||
|
|
||||||
val = SYS_CTRL_CLOCK_CTRL_OSC32K | SYS_CTRL_CLOCK_CTRL_OSC_PD
|
val = SYS_CTRL_OSCS | SYS_CTRL_CLOCK_CTRL_OSC_PD
|
||||||
| SYS_CTRL_CLOCK_CTRL_IO_DIV_16MHZ | SYS_CTRL_CLOCK_CTRL_SYS_DIV_16MHZ;
|
| SYS_CTRL_CLOCK_CTRL_IO_DIV_16MHZ | SYS_CTRL_CLOCK_CTRL_SYS_DIV_16MHZ;
|
||||||
REG(SYS_CTRL_CLOCK_CTRL) = val;
|
REG(SYS_CTRL_CLOCK_CTRL) = val;
|
||||||
|
|
||||||
while((REG(SYS_CTRL_CLOCK_STA) & SYS_CTRL_CLOCK_STA_OSC) != 0);
|
while((REG(SYS_CTRL_CLOCK_STA) & (SYS_CTRL_CLOCK_STA_OSC32K |
|
||||||
|
SYS_CTRL_CLOCK_STA_OSC)) != SYS_CTRL_OSCS);
|
||||||
|
|
||||||
|
#if SYS_CTRL_OSC32K_USE_XTAL
|
||||||
|
/* Wait for the 32-kHz crystal oscillator to stabilize */
|
||||||
|
while(REG(SYS_CTRL_CLOCK_STA) & SYS_CTRL_CLOCK_STA_SYNC_32K);
|
||||||
|
while(!(REG(SYS_CTRL_CLOCK_STA) & SYS_CTRL_CLOCK_STA_SYNC_32K));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
|
|
|
@ -228,11 +228,26 @@
|
||||||
#define SYS_CTRL_PMCTL_PM0 0x00000000 /**< PM0 */
|
#define SYS_CTRL_PMCTL_PM0 0x00000000 /**< PM0 */
|
||||||
/** @} */
|
/** @} */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
/** \name SysCtrl 32-kHz oscillator selection
|
||||||
|
*
|
||||||
|
* Prefer the crystal oscillator for time accuracy, and the RC oscillator for
|
||||||
|
* cost and power consumption
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/* Defaults to RC oscillator unless the configuration tells us otherwise */
|
||||||
|
#ifdef SYS_CTRL_CONF_OSC32K_USE_XTAL
|
||||||
|
#define SYS_CTRL_OSC32K_USE_XTAL SYS_CTRL_CONF_OSC32K_USE_XTAL
|
||||||
|
#else
|
||||||
|
#define SYS_CTRL_OSC32K_USE_XTAL 0
|
||||||
|
#endif
|
||||||
|
/** @} */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
/** \name SysCtrl functions
|
/** \name SysCtrl functions
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
/** \brief Initialises the System Control Driver. The main purpose of this
|
/** \brief Initialises the System Control Driver. The main purpose of this
|
||||||
* function is to power up and select clocks and oscillators */
|
* function is to power up and select clocks and oscillators
|
||||||
|
* \note This function depends on ioc_init() having been called beforehand. */
|
||||||
void sys_ctrl_init();
|
void sys_ctrl_init();
|
||||||
|
|
||||||
/** \brief Generates a warm reset through the SYS_CTRL_PWRDBG register */
|
/** \brief Generates a warm reset through the SYS_CTRL_PWRDBG register */
|
||||||
|
|
|
@ -127,12 +127,12 @@ int
|
||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
nvic_init();
|
nvic_init();
|
||||||
|
ioc_init();
|
||||||
sys_ctrl_init();
|
sys_ctrl_init();
|
||||||
clock_init();
|
clock_init();
|
||||||
lpm_init();
|
lpm_init();
|
||||||
rtimer_init();
|
rtimer_init();
|
||||||
gpio_init();
|
gpio_init();
|
||||||
ioc_init();
|
|
||||||
|
|
||||||
leds_init();
|
leds_init();
|
||||||
fade(LEDS_YELLOW);
|
fade(LEDS_YELLOW);
|
||||||
|
|
Loading…
Reference in a new issue