Blame view

RIOT/cpu/cc2538/include/cc2538_sys_ctrl.h 8.17 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
  /*
   * 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.
   */
  
  /**
   * @defgroup        cpu_cc2538_sysctrl CC2538 System Control
   * @ingroup         cpu_cc2538_regs
   * @{
   *
   * @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 {
  
      /**
       * @brief Clock control register
       */
      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;
      } cc2538_sys_ctrl_clk_ctrl;
  
      /**
       * @brief Clock status register
       */
      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_sys_ctrl_clk_sta;
  
      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]. */
  
      /**
       * @brief UART module clock register - active mode
       */
      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;
      } cc2538_sys_ctrl_unnamed1;
  
      /**
       * @brief UART module clock register - sleep mode
       */
      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;
      } cc2538_sys_ctrl_unnamed2;
  
      /**
       * @brief UART module clock register - PM0 mode
       */
      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_sys_ctrl_unnamed3;
  
      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->cc2538_sys_ctrl_clk_ctrl.CLOCK_CTRLbits.OSC ? \
                             RCOSC16M_FREQ : XOSC32M_FREQ) >> \
                                  SYS_CTRL->cc2538_sys_ctrl_clk_ctrl.CLOCK_CTRLbits.SYS_DIV )
  
  #ifdef __cplusplus
  } /* end extern "C" */
  #endif
  
  #endif /* CC2538_SYS_CTRL_H */
  
  /** @} */