1 /**
2  * \file
3  *
4  * \brief Component description for FREQM
5  *
6  * Copyright (c) 2016 Atmel Corporation,
7  *                    a wholly owned subsidiary of Microchip Technology Inc.
8  *
9  * \asf_license_start
10  *
11  * \page License
12  *
13  * Licensed under the Apache License, Version 2.0 (the "License");
14  * you may not use this file except in compliance with the License.
15  * You may obtain a copy of the Licence at
16  *
17  *     http://www.apache.org/licenses/LICENSE-2.0
18  *
19  * Unless required by applicable law or agreed to in writing, software
20  * distributed under the License is distributed on an "AS IS" BASIS,
21  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22  * See the License for the specific language governing permissions and
23  * limitations under the License.
24  *
25  * \asf_license_stop
26  *
27  */
28 
29 #ifndef _SAM4L_FREQM_COMPONENT_
30 #define _SAM4L_FREQM_COMPONENT_
31 
32 /* ========================================================================== */
33 /**  SOFTWARE API DEFINITION FOR FREQM */
34 /* ========================================================================== */
35 /** \addtogroup SAM4L_FREQM Frequency Meter */
36 /*@{*/
37 
38 #define FREQM_I7530
39 #define REV_FREQM                   0x311
40 
41 /* -------- FREQM_CTRL : (FREQM Offset: 0x000) ( /W 32) Control register -------- */
42 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
43 typedef union {
44   struct {
45     uint32_t START:1;          /*!< bit:      0  Start frequency measurement        */
46     uint32_t :31;              /*!< bit:  1..31  Reserved                           */
47   } bit;                       /*!< Structure used for bit  access                  */
48   uint32_t reg;                /*!< Type      used for register access              */
49 } FREQM_CTRL_Type;
50 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
51 
52 #define FREQM_CTRL_OFFSET           0x000        /**< \brief (FREQM_CTRL offset) Control register */
53 #define FREQM_CTRL_RESETVALUE       _U_(0x00000000); /**< \brief (FREQM_CTRL reset_value) Control register */
54 
55 #define FREQM_CTRL_START_Pos        0            /**< \brief (FREQM_CTRL) Start frequency measurement */
56 #define FREQM_CTRL_START            (_U_(0x1) << FREQM_CTRL_START_Pos)
57 #define FREQM_CTRL_MASK             _U_(0x00000001) /**< \brief (FREQM_CTRL) MASK Register */
58 
59 /* -------- FREQM_MODE : (FREQM Offset: 0x004) (R/W 32) Mode  register -------- */
60 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
61 typedef union {
62   struct {
63     uint32_t REFSEL:2;         /*!< bit:  0.. 1  Reference Clock Selection          */
64     uint32_t :6;               /*!< bit:  2.. 7  Reserved                           */
65     uint32_t REFNUM:8;         /*!< bit:  8..15  Number of Reference CLock Cycles   */
66     uint32_t CLKSEL:5;         /*!< bit: 16..20  Clock Source Selection             */
67     uint32_t :10;              /*!< bit: 21..30  Reserved                           */
68     uint32_t REFCEN:1;         /*!< bit:     31  Reference Clock Enable             */
69   } bit;                       /*!< Structure used for bit  access                  */
70   uint32_t reg;                /*!< Type      used for register access              */
71 } FREQM_MODE_Type;
72 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
73 
74 #define FREQM_MODE_OFFSET           0x004        /**< \brief (FREQM_MODE offset) Mode  register */
75 #define FREQM_MODE_RESETVALUE       _U_(0x00000000); /**< \brief (FREQM_MODE reset_value) Mode  register */
76 
77 #define FREQM_MODE_REFSEL_Pos       0            /**< \brief (FREQM_MODE) Reference Clock Selection */
78 #define FREQM_MODE_REFSEL_Msk       (_U_(0x3) << FREQM_MODE_REFSEL_Pos)
79 #define FREQM_MODE_REFSEL(value)    (FREQM_MODE_REFSEL_Msk & ((value) << FREQM_MODE_REFSEL_Pos))
80 #define FREQM_MODE_REFNUM_Pos       8            /**< \brief (FREQM_MODE) Number of Reference CLock Cycles */
81 #define FREQM_MODE_REFNUM_Msk       (_U_(0xFF) << FREQM_MODE_REFNUM_Pos)
82 #define FREQM_MODE_REFNUM(value)    (FREQM_MODE_REFNUM_Msk & ((value) << FREQM_MODE_REFNUM_Pos))
83 #define FREQM_MODE_CLKSEL_Pos       16           /**< \brief (FREQM_MODE) Clock Source Selection */
84 #define FREQM_MODE_CLKSEL_Msk       (_U_(0x1F) << FREQM_MODE_CLKSEL_Pos)
85 #define FREQM_MODE_CLKSEL(value)    (FREQM_MODE_CLKSEL_Msk & ((value) << FREQM_MODE_CLKSEL_Pos))
86 #define FREQM_MODE_REFCEN_Pos       31           /**< \brief (FREQM_MODE) Reference Clock Enable */
87 #define FREQM_MODE_REFCEN           (_U_(0x1) << FREQM_MODE_REFCEN_Pos)
88 #define FREQM_MODE_MASK             _U_(0x801FFF03) /**< \brief (FREQM_MODE) MASK Register */
89 
90 /* -------- FREQM_STATUS : (FREQM Offset: 0x008) (R/  32) Status  register -------- */
91 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
92 typedef union {
93   struct {
94     uint32_t BUSY:1;           /*!< bit:      0  Frequency measurement on-going     */
95     uint32_t RCLKBUSY:1;       /*!< bit:      1  Reference Clock busy               */
96     uint32_t :30;              /*!< bit:  2..31  Reserved                           */
97   } bit;                       /*!< Structure used for bit  access                  */
98   uint32_t reg;                /*!< Type      used for register access              */
99 } FREQM_STATUS_Type;
100 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
101 
102 #define FREQM_STATUS_OFFSET         0x008        /**< \brief (FREQM_STATUS offset) Status  register */
103 #define FREQM_STATUS_RESETVALUE     _U_(0x00000000); /**< \brief (FREQM_STATUS reset_value) Status  register */
104 
105 #define FREQM_STATUS_BUSY_Pos       0            /**< \brief (FREQM_STATUS) Frequency measurement on-going */
106 #define FREQM_STATUS_BUSY           (_U_(0x1) << FREQM_STATUS_BUSY_Pos)
107 #define FREQM_STATUS_RCLKBUSY_Pos   1            /**< \brief (FREQM_STATUS) Reference Clock busy */
108 #define FREQM_STATUS_RCLKBUSY       (_U_(0x1) << FREQM_STATUS_RCLKBUSY_Pos)
109 #define FREQM_STATUS_MASK           _U_(0x00000003) /**< \brief (FREQM_STATUS) MASK Register */
110 
111 /* -------- FREQM_VALUE : (FREQM Offset: 0x00C) (R/  32) Value register -------- */
112 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
113 typedef union {
114   struct {
115     uint32_t VALUE:24;         /*!< bit:  0..23  Measured frequency                 */
116     uint32_t :8;               /*!< bit: 24..31  Reserved                           */
117   } bit;                       /*!< Structure used for bit  access                  */
118   uint32_t reg;                /*!< Type      used for register access              */
119 } FREQM_VALUE_Type;
120 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
121 
122 #define FREQM_VALUE_OFFSET          0x00C        /**< \brief (FREQM_VALUE offset) Value register */
123 #define FREQM_VALUE_RESETVALUE      _U_(0x00000000); /**< \brief (FREQM_VALUE reset_value) Value register */
124 
125 #define FREQM_VALUE_VALUE_Pos       0            /**< \brief (FREQM_VALUE) Measured frequency */
126 #define FREQM_VALUE_VALUE_Msk       (_U_(0xFFFFFF) << FREQM_VALUE_VALUE_Pos)
127 #define FREQM_VALUE_VALUE(value)    (FREQM_VALUE_VALUE_Msk & ((value) << FREQM_VALUE_VALUE_Pos))
128 #define FREQM_VALUE_MASK            _U_(0x00FFFFFF) /**< \brief (FREQM_VALUE) MASK Register */
129 
130 /* -------- FREQM_IER : (FREQM Offset: 0x010) ( /W 32) Interrupt Enable Register -------- */
131 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
132 typedef union {
133   struct {
134     uint32_t DONE:1;           /*!< bit:      0  Frequency measurment done          */
135     uint32_t RCLKRDY:1;        /*!< bit:      1  Reference Clock ready              */
136     uint32_t :30;              /*!< bit:  2..31  Reserved                           */
137   } bit;                       /*!< Structure used for bit  access                  */
138   uint32_t reg;                /*!< Type      used for register access              */
139 } FREQM_IER_Type;
140 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
141 
142 #define FREQM_IER_OFFSET            0x010        /**< \brief (FREQM_IER offset) Interrupt Enable Register */
143 #define FREQM_IER_RESETVALUE        _U_(0x00000000); /**< \brief (FREQM_IER reset_value) Interrupt Enable Register */
144 
145 #define FREQM_IER_DONE_Pos          0            /**< \brief (FREQM_IER) Frequency measurment done */
146 #define FREQM_IER_DONE              (_U_(0x1) << FREQM_IER_DONE_Pos)
147 #define FREQM_IER_RCLKRDY_Pos       1            /**< \brief (FREQM_IER) Reference Clock ready */
148 #define FREQM_IER_RCLKRDY           (_U_(0x1) << FREQM_IER_RCLKRDY_Pos)
149 #define FREQM_IER_MASK              _U_(0x00000003) /**< \brief (FREQM_IER) MASK Register */
150 
151 /* -------- FREQM_IDR : (FREQM Offset: 0x014) ( /W 32) Interrupt Diable Register -------- */
152 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
153 typedef union {
154   struct {
155     uint32_t DONE:1;           /*!< bit:      0  Frequency measurment done          */
156     uint32_t RCLKRDY:1;        /*!< bit:      1  Reference Clock ready              */
157     uint32_t :30;              /*!< bit:  2..31  Reserved                           */
158   } bit;                       /*!< Structure used for bit  access                  */
159   uint32_t reg;                /*!< Type      used for register access              */
160 } FREQM_IDR_Type;
161 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
162 
163 #define FREQM_IDR_OFFSET            0x014        /**< \brief (FREQM_IDR offset) Interrupt Diable Register */
164 #define FREQM_IDR_RESETVALUE        _U_(0x00000000); /**< \brief (FREQM_IDR reset_value) Interrupt Diable Register */
165 
166 #define FREQM_IDR_DONE_Pos          0            /**< \brief (FREQM_IDR) Frequency measurment done */
167 #define FREQM_IDR_DONE              (_U_(0x1) << FREQM_IDR_DONE_Pos)
168 #define FREQM_IDR_RCLKRDY_Pos       1            /**< \brief (FREQM_IDR) Reference Clock ready */
169 #define FREQM_IDR_RCLKRDY           (_U_(0x1) << FREQM_IDR_RCLKRDY_Pos)
170 #define FREQM_IDR_MASK              _U_(0x00000003) /**< \brief (FREQM_IDR) MASK Register */
171 
172 /* -------- FREQM_IMR : (FREQM Offset: 0x018) (R/  32) Interrupt Mask Register -------- */
173 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
174 typedef union {
175   struct {
176     uint32_t DONE:1;           /*!< bit:      0  Frequency measurment done          */
177     uint32_t RCLKRDY:1;        /*!< bit:      1  Reference Clock ready              */
178     uint32_t :30;              /*!< bit:  2..31  Reserved                           */
179   } bit;                       /*!< Structure used for bit  access                  */
180   uint32_t reg;                /*!< Type      used for register access              */
181 } FREQM_IMR_Type;
182 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
183 
184 #define FREQM_IMR_OFFSET            0x018        /**< \brief (FREQM_IMR offset) Interrupt Mask Register */
185 #define FREQM_IMR_RESETVALUE        _U_(0x00000000); /**< \brief (FREQM_IMR reset_value) Interrupt Mask Register */
186 
187 #define FREQM_IMR_DONE_Pos          0            /**< \brief (FREQM_IMR) Frequency measurment done */
188 #define FREQM_IMR_DONE              (_U_(0x1) << FREQM_IMR_DONE_Pos)
189 #define FREQM_IMR_RCLKRDY_Pos       1            /**< \brief (FREQM_IMR) Reference Clock ready */
190 #define FREQM_IMR_RCLKRDY           (_U_(0x1) << FREQM_IMR_RCLKRDY_Pos)
191 #define FREQM_IMR_MASK              _U_(0x00000003) /**< \brief (FREQM_IMR) MASK Register */
192 
193 /* -------- FREQM_ISR : (FREQM Offset: 0x01C) (R/  32) Interrupt Status Register -------- */
194 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
195 typedef union {
196   struct {
197     uint32_t DONE:1;           /*!< bit:      0  Frequency measurment done          */
198     uint32_t RCLKRDY:1;        /*!< bit:      1  Reference Clock ready              */
199     uint32_t :30;              /*!< bit:  2..31  Reserved                           */
200   } bit;                       /*!< Structure used for bit  access                  */
201   uint32_t reg;                /*!< Type      used for register access              */
202 } FREQM_ISR_Type;
203 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
204 
205 #define FREQM_ISR_OFFSET            0x01C        /**< \brief (FREQM_ISR offset) Interrupt Status Register */
206 #define FREQM_ISR_RESETVALUE        _U_(0x00000000); /**< \brief (FREQM_ISR reset_value) Interrupt Status Register */
207 
208 #define FREQM_ISR_DONE_Pos          0            /**< \brief (FREQM_ISR) Frequency measurment done */
209 #define FREQM_ISR_DONE              (_U_(0x1) << FREQM_ISR_DONE_Pos)
210 #define FREQM_ISR_RCLKRDY_Pos       1            /**< \brief (FREQM_ISR) Reference Clock ready */
211 #define FREQM_ISR_RCLKRDY           (_U_(0x1) << FREQM_ISR_RCLKRDY_Pos)
212 #define FREQM_ISR_MASK              _U_(0x00000003) /**< \brief (FREQM_ISR) MASK Register */
213 
214 /* -------- FREQM_ICR : (FREQM Offset: 0x020) ( /W 32) Interrupt Clear Register -------- */
215 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
216 typedef union {
217   struct {
218     uint32_t DONE:1;           /*!< bit:      0  Frequency measurment done          */
219     uint32_t RCLKRDY:1;        /*!< bit:      1  Reference Clock ready              */
220     uint32_t :30;              /*!< bit:  2..31  Reserved                           */
221   } bit;                       /*!< Structure used for bit  access                  */
222   uint32_t reg;                /*!< Type      used for register access              */
223 } FREQM_ICR_Type;
224 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
225 
226 #define FREQM_ICR_OFFSET            0x020        /**< \brief (FREQM_ICR offset) Interrupt Clear Register */
227 #define FREQM_ICR_RESETVALUE        _U_(0x00000000); /**< \brief (FREQM_ICR reset_value) Interrupt Clear Register */
228 
229 #define FREQM_ICR_DONE_Pos          0            /**< \brief (FREQM_ICR) Frequency measurment done */
230 #define FREQM_ICR_DONE              (_U_(0x1) << FREQM_ICR_DONE_Pos)
231 #define FREQM_ICR_RCLKRDY_Pos       1            /**< \brief (FREQM_ICR) Reference Clock ready */
232 #define FREQM_ICR_RCLKRDY           (_U_(0x1) << FREQM_ICR_RCLKRDY_Pos)
233 #define FREQM_ICR_MASK              _U_(0x00000003) /**< \brief (FREQM_ICR) MASK Register */
234 
235 /* -------- FREQM_VERSION : (FREQM Offset: 0x3FC) (R/  32) Version Register -------- */
236 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
237 typedef union {
238   struct {
239     uint32_t VERSION:12;       /*!< bit:  0..11  Version number                     */
240     uint32_t :4;               /*!< bit: 12..15  Reserved                           */
241     uint32_t VARIANT:4;        /*!< bit: 16..19  Variant number                     */
242     uint32_t :12;              /*!< bit: 20..31  Reserved                           */
243   } bit;                       /*!< Structure used for bit  access                  */
244   uint32_t reg;                /*!< Type      used for register access              */
245 } FREQM_VERSION_Type;
246 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
247 
248 #define FREQM_VERSION_OFFSET        0x3FC        /**< \brief (FREQM_VERSION offset) Version Register */
249 #define FREQM_VERSION_RESETVALUE    _U_(0x00000311); /**< \brief (FREQM_VERSION reset_value) Version Register */
250 
251 #define FREQM_VERSION_VERSION_Pos   0            /**< \brief (FREQM_VERSION) Version number */
252 #define FREQM_VERSION_VERSION_Msk   (_U_(0xFFF) << FREQM_VERSION_VERSION_Pos)
253 #define FREQM_VERSION_VERSION(value) (FREQM_VERSION_VERSION_Msk & ((value) << FREQM_VERSION_VERSION_Pos))
254 #define FREQM_VERSION_VARIANT_Pos   16           /**< \brief (FREQM_VERSION) Variant number */
255 #define FREQM_VERSION_VARIANT_Msk   (_U_(0xF) << FREQM_VERSION_VARIANT_Pos)
256 #define FREQM_VERSION_VARIANT(value) (FREQM_VERSION_VARIANT_Msk & ((value) << FREQM_VERSION_VARIANT_Pos))
257 #define FREQM_VERSION_MASK          _U_(0x000F0FFF) /**< \brief (FREQM_VERSION) MASK Register */
258 
259 /** \brief FREQM hardware registers */
260 #if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
261 typedef struct {
262   __O  uint32_t CTRL;        /**< \brief Offset: 0x000 ( /W 32) Control register */
263   __IO uint32_t MODE;        /**< \brief Offset: 0x004 (R/W 32) Mode  register */
264   __I  uint32_t STATUS;      /**< \brief Offset: 0x008 (R/  32) Status  register */
265   __I  uint32_t VALUE;       /**< \brief Offset: 0x00C (R/  32) Value register */
266   __O  uint32_t IER;         /**< \brief Offset: 0x010 ( /W 32) Interrupt Enable Register */
267   __O  uint32_t IDR;         /**< \brief Offset: 0x014 ( /W 32) Interrupt Diable Register */
268   __I  uint32_t IMR;         /**< \brief Offset: 0x018 (R/  32) Interrupt Mask Register */
269   __I  uint32_t ISR;         /**< \brief Offset: 0x01C (R/  32) Interrupt Status Register */
270   __O  uint32_t ICR;         /**< \brief Offset: 0x020 ( /W 32) Interrupt Clear Register */
271        RoReg8   Reserved1[0x3D8];
272   __I  uint32_t VERSION;     /**< \brief Offset: 0x3FC (R/  32) Version Register */
273 } Freqm;
274 #endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */
275 
276 /*@}*/
277 
278 #endif /* _SAM4L_FREQM_COMPONENT_ */
279