mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
146 lines
7.6 KiB
C
146 lines
7.6 KiB
C
/*
|
|
* Copyright (C) 2014 Loci Controls Inc.
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License v2.1. See the file LICENSE in the top level
|
|
* directory for more details.
|
|
*/
|
|
|
|
/**
|
|
* @ingroup cpu_cc2538
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief CC2538 System Control interface
|
|
*
|
|
* @author Ian Martin <ian@locicontrols.com>
|
|
*/
|
|
|
|
#ifndef CC2538_SYS_CTRL_H
|
|
#define CC2538_SYS_CTRL_H
|
|
|
|
#include "cc2538.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief System Control component registers
|
|
*/
|
|
typedef struct {
|
|
union {
|
|
cc2538_reg_t CLOCK_CTRL; /**< Clock control register */
|
|
struct {
|
|
cc2538_reg_t SYS_DIV : 3; /**< System clock rate setting */
|
|
cc2538_reg_t RESERVED1 : 5; /**< Reserved bits */
|
|
cc2538_reg_t IO_DIV : 3; /**< I/O clock rate setting */
|
|
cc2538_reg_t RESERVED2 : 5; /**< Reserved bits */
|
|
cc2538_reg_t OSC : 1; /**< System clock oscillator selection */
|
|
cc2538_reg_t OSC_PD : 1; /**< Oscillator power-down */
|
|
cc2538_reg_t RESERVED3 : 3; /**< Reserved bits */
|
|
cc2538_reg_t AMP_DET : 1; /**< Amplitude detector of XOSC during power up */
|
|
cc2538_reg_t RESERVED4 : 2; /**< Reserved bits */
|
|
cc2538_reg_t OSC32K : 1; /**< 32-kHz clock oscillator selection */
|
|
cc2538_reg_t OSC32K_CADIS : 1; /**< Disable calibration 32-kHz RC oscillator */
|
|
cc2538_reg_t RESERVED5 : 6; /**< Reserved bits */
|
|
} CLOCK_CTRLbits;
|
|
};
|
|
|
|
union {
|
|
cc2538_reg_t CLOCK_STA; /**< Clock status register */
|
|
struct {
|
|
cc2538_reg_t SYS_DIV : 3; /**< Current functional frequency for system clock */
|
|
cc2538_reg_t RESERVED6 : 5; /**< Reserved bits */
|
|
cc2538_reg_t IO_DIV : 3; /**< Current functional frequency for IO_CLK */
|
|
cc2538_reg_t RESERVED7 : 5; /**< Reserved bits */
|
|
cc2538_reg_t OSC : 1; /**< Current clock source selected */
|
|
cc2538_reg_t OSC_PD : 1; /**< Oscillator power-down */
|
|
cc2538_reg_t HSOSC_STB : 1; /**< HSOSC stable status */
|
|
cc2538_reg_t XOSC_STB : 1; /**< XOSC stable status */
|
|
cc2538_reg_t SOURCE_CHANGE : 1; /**< System clock source change */
|
|
cc2538_reg_t RESERVED8 : 1; /**< Reserved bits */
|
|
cc2538_reg_t RST : 2; /**< Last source of reset */
|
|
cc2538_reg_t OSC32K : 1; /**< Current 32-kHz clock oscillator selected */
|
|
cc2538_reg_t OSC32K_CALDIS : 1; /**< Disable calibration 32-kHz RC oscillator */
|
|
cc2538_reg_t SYNC_32K : 1; /**< 32-kHz clock source synced to undivided system clock (16 or 32 MHz) */
|
|
cc2538_reg_t RESERVED9 : 5; /**< Reserved bits */
|
|
} CLOCK_STAbits;
|
|
};
|
|
|
|
cc2538_reg_t RCGCGPT; /**< Module clocks for GPT[3:0] when the CPU is in active (run) mode */
|
|
cc2538_reg_t SCGCGPT; /**< Module clocks for GPT[3:0] when the CPU is in sleep mode */
|
|
cc2538_reg_t DCGCGPT; /**< Module clocks for GPT[3:0] when the CPU is in PM0 */
|
|
cc2538_reg_t SRGPT; /**< Reset for GPT[3:0]. */
|
|
cc2538_reg_t RCGCSSI; /**< Module clocks for SSI[1:0] when the CPU is in active (run) mode */
|
|
cc2538_reg_t SCGCSSI; /**< Module clocks for SSI[1:0] when the CPU is insSleep mode */
|
|
cc2538_reg_t DCGCSSI; /**< Module clocks for SSI[1:0] when the CPU is in PM0 */
|
|
cc2538_reg_t SRSSI; /**< Reset for SSI[1:0]. */
|
|
|
|
union {
|
|
cc2538_reg_t RCGCUART; /**< Module clocks for UART[1:0] when the CPU is in active (run) mode */
|
|
struct {
|
|
cc2538_reg_t UART0 : 1; /**< Enable UART0 clock in active (run) mode */
|
|
cc2538_reg_t UART1 : 1; /**< Enable UART1 clock in active (run) mode */
|
|
cc2538_reg_t RESERVED : 30; /**< Reserved bits */
|
|
} RCGCUARTbits;
|
|
};
|
|
|
|
union {
|
|
cc2538_reg_t SCGCUART; /**< Module clocks for UART[1:0] when the CPU is in sleep mode */
|
|
struct {
|
|
cc2538_reg_t UART0 : 1; /**< Enable UART0 clock in sleep mode */
|
|
cc2538_reg_t UART1 : 1; /**< Enable UART1 clock in sleep mode */
|
|
cc2538_reg_t RESERVED : 30; /**< Reserved bits */
|
|
} SCGCUARTbits;
|
|
};
|
|
|
|
union {
|
|
cc2538_reg_t DCGCUART; /**< Module clocks for UART[1:0] when the CPU is in PM0 */
|
|
struct {
|
|
cc2538_reg_t UART0 : 1; /**< Enable UART0 clock in PM0 */
|
|
cc2538_reg_t UART1 : 1; /**< Enable UART1 clock in PM0 */
|
|
cc2538_reg_t RESERVED : 30; /**< Reserved bits */
|
|
} DCGCUARTbits;
|
|
};
|
|
|
|
cc2538_reg_t SRUART; /**< Reset for UART[1:0]. */
|
|
cc2538_reg_t RCGCI2C; /**< Module clocks for I2C when the CPU is in active (run) mode */
|
|
cc2538_reg_t SCGCI2C; /**< Module clocks for I2C when the CPU is in sleep mode */
|
|
cc2538_reg_t DCGCI2C; /**< Module clocks for I2C when the CPU is in PM0 */
|
|
cc2538_reg_t SRI2C; /**< Reset for I2C. */
|
|
cc2538_reg_t RCGCSEC; /**< Module clocks for the security module when the CPU is in active (run) mode */
|
|
cc2538_reg_t SCGCSEC; /**< Module clocks for the security module when the CPU is in sleep mode */
|
|
cc2538_reg_t DCGCSEC; /**< Module clocks for the security module when the CPU is in PM0 */
|
|
cc2538_reg_t SRSEC; /**< Reset for the security module. */
|
|
cc2538_reg_t PMCTL; /**< Power mode. */
|
|
cc2538_reg_t SRCRC; /**< CRC on state retention. */
|
|
cc2538_reg_t RESERVED10[5]; /**< Reserved bits */
|
|
cc2538_reg_t PWRDBG; /**< Power debug register */
|
|
cc2538_reg_t RESERVED11[2]; /**< Reserved bits */
|
|
cc2538_reg_t CLD; /**< This register controls the clock loss detection feature. */
|
|
cc2538_reg_t RESERVED12[4]; /**< Reserved bits */
|
|
cc2538_reg_t IWE; /**< This register controls interrupt wake-up. */
|
|
cc2538_reg_t I_MAP; /**< This register selects which interrupt map to be used. */
|
|
cc2538_reg_t RESERVED13[3]; /**< Reserved bits */
|
|
cc2538_reg_t RCGCRFC; /**< This register defines the module clocks for RF CORE when the CPU is in active (run) mode */
|
|
cc2538_reg_t SCGCRFC; /**< This register defines the module clocks for RF CORE when the CPU is in sleep mode */
|
|
cc2538_reg_t DCGCRFC; /**< This register defines the module clocks for RF CORE when the CPU is in PM0 */
|
|
cc2538_reg_t EMUOVR; /**< This register defines the emulator override controls for power mode and peripheral clock gate. */
|
|
} cc2538_sys_ctrl_t;
|
|
|
|
#define SYS_CTRL ( (cc2538_sys_ctrl_t*)0x400d2000 ) /**< One and only instance of the System Control module */
|
|
|
|
/**
|
|
* @brief Compute the current system clock frequency based on the SYS_CTRL register states
|
|
*/
|
|
#define sys_clock_freq() ( (SYS_CTRL->CLOCK_CTRLbits.OSC? RCOSC16M_FREQ : XOSC32M_FREQ) >> SYS_CTRL->CLOCK_CTRLbits.SYS_DIV )
|
|
|
|
#ifdef __cplusplus
|
|
} /* end extern "C" */
|
|
#endif
|
|
|
|
#endif /* CC2538_SYS_CTRL_H */
|
|
|
|
/** @} */
|