xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/cs.c (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald  * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald  * All rights reserved.
4*5fd0122aSMatthias Ringwald  *
5*5fd0122aSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald  * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald  * are met:
8*5fd0122aSMatthias Ringwald  *
9*5fd0122aSMatthias Ringwald  * *  Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald  *
12*5fd0122aSMatthias Ringwald  * *  Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald  *
16*5fd0122aSMatthias Ringwald  * *  Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald  *    its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald  *    from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald  *
20*5fd0122aSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald  * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald /* Standard Includes */
33*5fd0122aSMatthias Ringwald #include <stdint.h>
34*5fd0122aSMatthias Ringwald 
35*5fd0122aSMatthias Ringwald /* DriverLib Includes */
36*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/cs.h>
37*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
38*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
39*5fd0122aSMatthias Ringwald 
40*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_SYSCTL_A__
41*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/sysctl_a.h>
42*5fd0122aSMatthias Ringwald #else
43*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/sysctl.h>
44*5fd0122aSMatthias Ringwald #endif
45*5fd0122aSMatthias Ringwald 
46*5fd0122aSMatthias Ringwald /* Statics */
47*5fd0122aSMatthias Ringwald static uint32_t hfxtFreq;
48*5fd0122aSMatthias Ringwald static uint32_t lfxtFreq;
49*5fd0122aSMatthias Ringwald 
50*5fd0122aSMatthias Ringwald #ifdef DEBUG
51*5fd0122aSMatthias Ringwald 
_CSIsClockDividerValid(uint8_t divider)52*5fd0122aSMatthias Ringwald bool _CSIsClockDividerValid(uint8_t divider)
53*5fd0122aSMatthias Ringwald {
54*5fd0122aSMatthias Ringwald     return ((divider == CS_CLOCK_DIVIDER_1) || (divider == CS_CLOCK_DIVIDER_2)
55*5fd0122aSMatthias Ringwald             || (divider == CS_CLOCK_DIVIDER_4) || (divider == CS_CLOCK_DIVIDER_8)
56*5fd0122aSMatthias Ringwald             || (divider == CS_CLOCK_DIVIDER_16) || (divider == CS_CLOCK_DIVIDER_32)
57*5fd0122aSMatthias Ringwald             || (divider == CS_CLOCK_DIVIDER_64) || (divider == CS_CLOCK_DIVIDER_128));
58*5fd0122aSMatthias Ringwald }
59*5fd0122aSMatthias Ringwald 
60*5fd0122aSMatthias Ringwald #endif
61*5fd0122aSMatthias Ringwald 
_CSGetHFXTFrequency()62*5fd0122aSMatthias Ringwald static uint32_t _CSGetHFXTFrequency()
63*5fd0122aSMatthias Ringwald {
64*5fd0122aSMatthias Ringwald     if (hfxtFreq >= CS_1MHZ && hfxtFreq <= CS_4MHZ)
65*5fd0122aSMatthias Ringwald         return CS_CTL2_HFXTFREQ_0;
66*5fd0122aSMatthias Ringwald     else if (hfxtFreq > CS_4MHZ && hfxtFreq <= CS_8MHZ)
67*5fd0122aSMatthias Ringwald         return CS_CTL2_HFXTFREQ_1;
68*5fd0122aSMatthias Ringwald     else if (hfxtFreq > CS_8MHZ && hfxtFreq <= CS_16MHZ)
69*5fd0122aSMatthias Ringwald         return CS_CTL2_HFXTFREQ_2;
70*5fd0122aSMatthias Ringwald     else if (hfxtFreq > CS_16MHZ && hfxtFreq <= CS_24MHZ)
71*5fd0122aSMatthias Ringwald         return CS_CTL2_HFXTFREQ_3;
72*5fd0122aSMatthias Ringwald     else if (hfxtFreq > CS_24MHZ && hfxtFreq <= CS_32MHZ)
73*5fd0122aSMatthias Ringwald         return CS_CTL2_HFXTFREQ_4;
74*5fd0122aSMatthias Ringwald     else if (hfxtFreq > CS_32MHZ && hfxtFreq <= CS_40MHZ)
75*5fd0122aSMatthias Ringwald         return CS_CTL2_HFXTFREQ_5;
76*5fd0122aSMatthias Ringwald     else if (hfxtFreq > CS_40MHZ && hfxtFreq <= CS_48MHZ)
77*5fd0122aSMatthias Ringwald         return CS_CTL2_HFXTFREQ_6;
78*5fd0122aSMatthias Ringwald     else
79*5fd0122aSMatthias Ringwald     {
80*5fd0122aSMatthias Ringwald         ASSERT(false);
81*5fd0122aSMatthias Ringwald         return 0;
82*5fd0122aSMatthias Ringwald     }
83*5fd0122aSMatthias Ringwald 
84*5fd0122aSMatthias Ringwald }
85*5fd0122aSMatthias Ringwald 
_CSGetDividerValue(uint32_t wDivider)86*5fd0122aSMatthias Ringwald static uint32_t _CSGetDividerValue(uint32_t wDivider)
87*5fd0122aSMatthias Ringwald {
88*5fd0122aSMatthias Ringwald     switch (wDivider)
89*5fd0122aSMatthias Ringwald     {
90*5fd0122aSMatthias Ringwald     case CS_CLOCK_DIVIDER_1:
91*5fd0122aSMatthias Ringwald         return 1;
92*5fd0122aSMatthias Ringwald     case CS_CLOCK_DIVIDER_2:
93*5fd0122aSMatthias Ringwald         return 2;
94*5fd0122aSMatthias Ringwald     case CS_CLOCK_DIVIDER_4:
95*5fd0122aSMatthias Ringwald         return 4;
96*5fd0122aSMatthias Ringwald     case CS_CLOCK_DIVIDER_8:
97*5fd0122aSMatthias Ringwald         return 8;
98*5fd0122aSMatthias Ringwald     case CS_CLOCK_DIVIDER_16:
99*5fd0122aSMatthias Ringwald         return 16;
100*5fd0122aSMatthias Ringwald     case CS_CLOCK_DIVIDER_32:
101*5fd0122aSMatthias Ringwald         return 32;
102*5fd0122aSMatthias Ringwald     case CS_CLOCK_DIVIDER_64:
103*5fd0122aSMatthias Ringwald         return 64;
104*5fd0122aSMatthias Ringwald     case CS_CLOCK_DIVIDER_128:
105*5fd0122aSMatthias Ringwald         return 128;
106*5fd0122aSMatthias Ringwald     default:
107*5fd0122aSMatthias Ringwald         ASSERT(false);
108*5fd0122aSMatthias Ringwald         return 1;
109*5fd0122aSMatthias Ringwald     }
110*5fd0122aSMatthias Ringwald }
111*5fd0122aSMatthias Ringwald 
_CSComputeCLKFrequency(uint32_t wClockSource,uint32_t wDivider)112*5fd0122aSMatthias Ringwald static uint32_t _CSComputeCLKFrequency(uint32_t wClockSource, uint32_t wDivider)
113*5fd0122aSMatthias Ringwald {
114*5fd0122aSMatthias Ringwald     uint_fast8_t bDivider;
115*5fd0122aSMatthias Ringwald 
116*5fd0122aSMatthias Ringwald     bDivider = _CSGetDividerValue(wDivider);
117*5fd0122aSMatthias Ringwald 
118*5fd0122aSMatthias Ringwald     switch (wClockSource)
119*5fd0122aSMatthias Ringwald     {
120*5fd0122aSMatthias Ringwald     case CS_LFXTCLK_SELECT:
121*5fd0122aSMatthias Ringwald     {
122*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(CS->IFG, CS_IFG_LFXTIFG_OFS))
123*5fd0122aSMatthias Ringwald         {
124*5fd0122aSMatthias Ringwald             CS_clearInterruptFlag(CS_LFXT_FAULT);
125*5fd0122aSMatthias Ringwald 
126*5fd0122aSMatthias Ringwald             if (BITBAND_PERI(CS->IFG, CS_IFG_LFXTIFG_OFS))
127*5fd0122aSMatthias Ringwald             {
128*5fd0122aSMatthias Ringwald                 if (BITBAND_PERI(CS->CLKEN, CS_CLKEN_REFOFSEL_OFS))
129*5fd0122aSMatthias Ringwald                     return (128000 / bDivider);
130*5fd0122aSMatthias Ringwald                 else
131*5fd0122aSMatthias Ringwald                     return (32768 / bDivider);
132*5fd0122aSMatthias Ringwald             }
133*5fd0122aSMatthias Ringwald         }
134*5fd0122aSMatthias Ringwald         return lfxtFreq / bDivider;
135*5fd0122aSMatthias Ringwald     }
136*5fd0122aSMatthias Ringwald     case CS_HFXTCLK_SELECT:
137*5fd0122aSMatthias Ringwald     {
138*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(CS->IFG, CS_IFG_HFXTIFG_OFS))
139*5fd0122aSMatthias Ringwald         {
140*5fd0122aSMatthias Ringwald             CS_clearInterruptFlag(CS_HFXT_FAULT);
141*5fd0122aSMatthias Ringwald 
142*5fd0122aSMatthias Ringwald             if (BITBAND_PERI(CS->IFG, CS_IFG_HFXTIFG_OFS))
143*5fd0122aSMatthias Ringwald             {
144*5fd0122aSMatthias Ringwald                 if (BITBAND_PERI(CS->CLKEN, CS_CLKEN_REFOFSEL_OFS))
145*5fd0122aSMatthias Ringwald                     return (128000 / bDivider);
146*5fd0122aSMatthias Ringwald                 else
147*5fd0122aSMatthias Ringwald                     return (32768 / bDivider);
148*5fd0122aSMatthias Ringwald             }
149*5fd0122aSMatthias Ringwald         }
150*5fd0122aSMatthias Ringwald         return hfxtFreq / bDivider;
151*5fd0122aSMatthias Ringwald     }
152*5fd0122aSMatthias Ringwald     case CS_VLOCLK_SELECT:
153*5fd0122aSMatthias Ringwald         return CS_VLOCLK_FREQUENCY / bDivider;
154*5fd0122aSMatthias Ringwald     case CS_REFOCLK_SELECT:
155*5fd0122aSMatthias Ringwald     {
156*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(CS->CLKEN, CS_CLKEN_REFOFSEL_OFS))
157*5fd0122aSMatthias Ringwald             return (128000 / bDivider);
158*5fd0122aSMatthias Ringwald         else
159*5fd0122aSMatthias Ringwald             return (32768 / bDivider);
160*5fd0122aSMatthias Ringwald     }
161*5fd0122aSMatthias Ringwald     case CS_DCOCLK_SELECT:
162*5fd0122aSMatthias Ringwald         return (CS_getDCOFrequency() / bDivider);
163*5fd0122aSMatthias Ringwald     case CS_MODOSC_SELECT:
164*5fd0122aSMatthias Ringwald         return CS_MODCLK_FREQUENCY / bDivider;
165*5fd0122aSMatthias Ringwald     default:
166*5fd0122aSMatthias Ringwald         ASSERT(false);
167*5fd0122aSMatthias Ringwald         return 0;
168*5fd0122aSMatthias Ringwald     }
169*5fd0122aSMatthias Ringwald }
170*5fd0122aSMatthias Ringwald 
171*5fd0122aSMatthias Ringwald //******************************************************************************
172*5fd0122aSMatthias Ringwald // Internal function for getting DCO nominal frequency
173*5fd0122aSMatthias Ringwald //******************************************************************************
_CSGetDOCFrequency(void)174*5fd0122aSMatthias Ringwald static uint32_t _CSGetDOCFrequency(void)
175*5fd0122aSMatthias Ringwald {
176*5fd0122aSMatthias Ringwald     uint32_t dcoFreq;
177*5fd0122aSMatthias Ringwald 
178*5fd0122aSMatthias Ringwald     switch (CS->CTL0 & CS_CTL0_DCORSEL_MASK)
179*5fd0122aSMatthias Ringwald     {
180*5fd0122aSMatthias Ringwald     case CS_CTL0_DCORSEL_0:
181*5fd0122aSMatthias Ringwald         dcoFreq = 1500000;
182*5fd0122aSMatthias Ringwald         break;
183*5fd0122aSMatthias Ringwald     case CS_CTL0_DCORSEL_1:
184*5fd0122aSMatthias Ringwald         dcoFreq = 3000000;
185*5fd0122aSMatthias Ringwald         break;
186*5fd0122aSMatthias Ringwald     case CS_CTL0_DCORSEL_2:
187*5fd0122aSMatthias Ringwald         dcoFreq = 6000000;
188*5fd0122aSMatthias Ringwald         break;
189*5fd0122aSMatthias Ringwald     case CS_CTL0_DCORSEL_3:
190*5fd0122aSMatthias Ringwald         dcoFreq = 12000000;
191*5fd0122aSMatthias Ringwald         break;
192*5fd0122aSMatthias Ringwald     case CS_CTL0_DCORSEL_4:
193*5fd0122aSMatthias Ringwald         dcoFreq = 24000000;
194*5fd0122aSMatthias Ringwald         break;
195*5fd0122aSMatthias Ringwald     case CS_CTL0_DCORSEL_5:
196*5fd0122aSMatthias Ringwald         dcoFreq = 48000000;
197*5fd0122aSMatthias Ringwald         break;
198*5fd0122aSMatthias Ringwald     default:
199*5fd0122aSMatthias Ringwald         dcoFreq = 0;
200*5fd0122aSMatthias Ringwald     }
201*5fd0122aSMatthias Ringwald 
202*5fd0122aSMatthias Ringwald     return (dcoFreq);
203*5fd0122aSMatthias Ringwald }
204*5fd0122aSMatthias Ringwald 
CS_setExternalClockSourceFrequency(uint32_t lfxt_XT_CLK_frequency,uint32_t hfxt_XT_CLK_frequency)205*5fd0122aSMatthias Ringwald void CS_setExternalClockSourceFrequency(uint32_t lfxt_XT_CLK_frequency,
206*5fd0122aSMatthias Ringwald         uint32_t hfxt_XT_CLK_frequency)
207*5fd0122aSMatthias Ringwald {
208*5fd0122aSMatthias Ringwald     hfxtFreq = hfxt_XT_CLK_frequency;
209*5fd0122aSMatthias Ringwald     lfxtFreq = lfxt_XT_CLK_frequency;
210*5fd0122aSMatthias Ringwald }
211*5fd0122aSMatthias Ringwald 
CS_initClockSignal(uint32_t selectedClockSignal,uint32_t clockSource,uint32_t clockSourceDivider)212*5fd0122aSMatthias Ringwald void CS_initClockSignal(uint32_t selectedClockSignal, uint32_t clockSource,
213*5fd0122aSMatthias Ringwald         uint32_t clockSourceDivider)
214*5fd0122aSMatthias Ringwald {
215*5fd0122aSMatthias Ringwald     ASSERT(_CSIsClockDividerValid(clockSourceDivider));
216*5fd0122aSMatthias Ringwald 
217*5fd0122aSMatthias Ringwald     /* Unlocking the CS Module */
218*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
219*5fd0122aSMatthias Ringwald 
220*5fd0122aSMatthias Ringwald     switch (selectedClockSignal)
221*5fd0122aSMatthias Ringwald     {
222*5fd0122aSMatthias Ringwald     case CS_ACLK:
223*5fd0122aSMatthias Ringwald     {
224*5fd0122aSMatthias Ringwald         /* Making sure that the clock signal for ACLK isn't set to anything
225*5fd0122aSMatthias Ringwald          * invalid
226*5fd0122aSMatthias Ringwald          */
227*5fd0122aSMatthias Ringwald         ASSERT(
228*5fd0122aSMatthias Ringwald                 (selectedClockSignal != CS_DCOCLK_SELECT)
229*5fd0122aSMatthias Ringwald                 && (selectedClockSignal != CS_MODOSC_SELECT)
230*5fd0122aSMatthias Ringwald                 && (selectedClockSignal != CS_HFXTCLK_SELECT));
231*5fd0122aSMatthias Ringwald 
232*5fd0122aSMatthias Ringwald         /* Waiting for the clock source ready bit to be valid before
233*5fd0122aSMatthias Ringwald          * changing */
234*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_ACLK_READY_OFS))
235*5fd0122aSMatthias Ringwald             ;
236*5fd0122aSMatthias Ringwald 
237*5fd0122aSMatthias Ringwald         /* Setting the divider and source */
238*5fd0122aSMatthias Ringwald         CS->CTL1 = ((clockSourceDivider >> CS_ACLK_DIV_BITPOS)
239*5fd0122aSMatthias Ringwald                 | (clockSource << CS_ACLK_SRC_BITPOS))
240*5fd0122aSMatthias Ringwald                 | (CS->CTL1 & ~(CS_CTL1_SELA_MASK | CS_CTL1_DIVA_MASK));
241*5fd0122aSMatthias Ringwald 
242*5fd0122aSMatthias Ringwald         /* Waiting for ACLK to be ready again */
243*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_ACLK_READY_OFS))
244*5fd0122aSMatthias Ringwald             ;
245*5fd0122aSMatthias Ringwald 
246*5fd0122aSMatthias Ringwald         break;
247*5fd0122aSMatthias Ringwald     }
248*5fd0122aSMatthias Ringwald     case CS_MCLK:
249*5fd0122aSMatthias Ringwald     {
250*5fd0122aSMatthias Ringwald 
251*5fd0122aSMatthias Ringwald         /* Waiting for the clock source ready bit to be valid before
252*5fd0122aSMatthias Ringwald          * changing */
253*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_MCLK_READY_OFS))
254*5fd0122aSMatthias Ringwald             ;
255*5fd0122aSMatthias Ringwald 
256*5fd0122aSMatthias Ringwald         CS->CTL1 = ((clockSourceDivider >> CS_MCLK_DIV_BITPOS)
257*5fd0122aSMatthias Ringwald                 | (clockSource << CS_MCLK_SRC_BITPOS))
258*5fd0122aSMatthias Ringwald                 | (CS->CTL1 & ~(CS_CTL1_SELM_MASK | CS_CTL1_DIVM_MASK));
259*5fd0122aSMatthias Ringwald 
260*5fd0122aSMatthias Ringwald         /* Waiting for MCLK to be ready */
261*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_MCLK_READY_OFS))
262*5fd0122aSMatthias Ringwald             ;
263*5fd0122aSMatthias Ringwald 
264*5fd0122aSMatthias Ringwald         break;
265*5fd0122aSMatthias Ringwald     }
266*5fd0122aSMatthias Ringwald     case CS_SMCLK:
267*5fd0122aSMatthias Ringwald     {
268*5fd0122aSMatthias Ringwald         /* Waiting for the clock source ready bit to be valid before
269*5fd0122aSMatthias Ringwald          * changing */
270*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_SMCLK_READY_OFS))
271*5fd0122aSMatthias Ringwald             ;
272*5fd0122aSMatthias Ringwald 
273*5fd0122aSMatthias Ringwald         CS->CTL1 = ((clockSourceDivider >> CS_SMCLK_DIV_BITPOS)
274*5fd0122aSMatthias Ringwald                 | (clockSource << CS_HSMCLK_SRC_BITPOS))
275*5fd0122aSMatthias Ringwald                 | (CS->CTL1 & ~(CS_CTL1_DIVS_MASK | CS_CTL1_SELS_MASK));
276*5fd0122aSMatthias Ringwald 
277*5fd0122aSMatthias Ringwald         /* Waiting for SMCLK to be ready */
278*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_SMCLK_READY_OFS))
279*5fd0122aSMatthias Ringwald             ;
280*5fd0122aSMatthias Ringwald 
281*5fd0122aSMatthias Ringwald         break;
282*5fd0122aSMatthias Ringwald     }
283*5fd0122aSMatthias Ringwald     case CS_HSMCLK:
284*5fd0122aSMatthias Ringwald     {
285*5fd0122aSMatthias Ringwald         /* Waiting for the clock source ready bit to be valid before
286*5fd0122aSMatthias Ringwald          * changing */
287*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_HSMCLK_READY_OFS))
288*5fd0122aSMatthias Ringwald             ;
289*5fd0122aSMatthias Ringwald 
290*5fd0122aSMatthias Ringwald         CS->CTL1 = ((clockSourceDivider >> CS_HSMCLK_DIV_BITPOS)
291*5fd0122aSMatthias Ringwald                 | (clockSource << CS_HSMCLK_SRC_BITPOS))
292*5fd0122aSMatthias Ringwald                 | (CS->CTL1 & ~(CS_CTL1_DIVHS_MASK | CS_CTL1_SELS_MASK));
293*5fd0122aSMatthias Ringwald 
294*5fd0122aSMatthias Ringwald         /* Waiting for HSMCLK to be ready */
295*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_HSMCLK_READY_OFS))
296*5fd0122aSMatthias Ringwald             ;
297*5fd0122aSMatthias Ringwald 
298*5fd0122aSMatthias Ringwald         break;
299*5fd0122aSMatthias Ringwald     }
300*5fd0122aSMatthias Ringwald     case CS_BCLK:
301*5fd0122aSMatthias Ringwald     {
302*5fd0122aSMatthias Ringwald 
303*5fd0122aSMatthias Ringwald         /* Waiting for the clock source ready bit to be valid before
304*5fd0122aSMatthias Ringwald          * changing */
305*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_BCLK_READY_OFS))
306*5fd0122aSMatthias Ringwald             ;
307*5fd0122aSMatthias Ringwald 
308*5fd0122aSMatthias Ringwald         /* Setting the clock source and then returning
309*5fd0122aSMatthias Ringwald          * (cannot divide CLK)
310*5fd0122aSMatthias Ringwald          */
311*5fd0122aSMatthias Ringwald         if (clockSource == CS_LFXTCLK_SELECT)
312*5fd0122aSMatthias Ringwald             BITBAND_PERI(CS->CTL1, CS_CTL1_SELB_OFS) = 0;
313*5fd0122aSMatthias Ringwald         else if (clockSource == CS_REFOCLK_SELECT)
314*5fd0122aSMatthias Ringwald             BITBAND_PERI(CS->CTL1, CS_CTL1_SELB_OFS) = 1;
315*5fd0122aSMatthias Ringwald         else
316*5fd0122aSMatthias Ringwald             ASSERT(false);
317*5fd0122aSMatthias Ringwald 
318*5fd0122aSMatthias Ringwald         /* Waiting for BCLK to be ready */
319*5fd0122aSMatthias Ringwald         while (!BITBAND_PERI(CS->STAT, CS_STAT_BCLK_READY_OFS))
320*5fd0122aSMatthias Ringwald             ;
321*5fd0122aSMatthias Ringwald 
322*5fd0122aSMatthias Ringwald         break;
323*5fd0122aSMatthias Ringwald     }
324*5fd0122aSMatthias Ringwald     default:
325*5fd0122aSMatthias Ringwald     {
326*5fd0122aSMatthias Ringwald         /* Should never get here */
327*5fd0122aSMatthias Ringwald         ASSERT(false);
328*5fd0122aSMatthias Ringwald     }
329*5fd0122aSMatthias Ringwald     }
330*5fd0122aSMatthias Ringwald 
331*5fd0122aSMatthias Ringwald     /* Locking the module */
332*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
333*5fd0122aSMatthias Ringwald }
334*5fd0122aSMatthias Ringwald 
CS_startHFXT(bool bypassMode)335*5fd0122aSMatthias Ringwald bool CS_startHFXT(bool bypassMode)
336*5fd0122aSMatthias Ringwald {
337*5fd0122aSMatthias Ringwald     return CS_startHFXTWithTimeout(bypassMode, 0);
338*5fd0122aSMatthias Ringwald }
339*5fd0122aSMatthias Ringwald 
CS_startHFXTWithTimeout(bool bypassMode,uint32_t timeout)340*5fd0122aSMatthias Ringwald bool CS_startHFXTWithTimeout(bool bypassMode, uint32_t timeout)
341*5fd0122aSMatthias Ringwald {
342*5fd0122aSMatthias Ringwald     uint32_t wHFFreqRange;
343*5fd0122aSMatthias Ringwald     uint_fast8_t bNMIStatus;
344*5fd0122aSMatthias Ringwald     bool boolTimeout;
345*5fd0122aSMatthias Ringwald 
346*5fd0122aSMatthias Ringwald     /* Unlocking the CS Module */
347*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
348*5fd0122aSMatthias Ringwald 
349*5fd0122aSMatthias Ringwald     /* Saving status and temporarily disabling NMIs for UCS faults */
350*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_SYSCTL_A__
351*5fd0122aSMatthias Ringwald     bNMIStatus = SysCtl_A_getNMISourceStatus() & SYSCTL_A_CS_SRC;
352*5fd0122aSMatthias Ringwald     SysCtl_A_disableNMISource(SYSCTL_A_CS_SRC);
353*5fd0122aSMatthias Ringwald #else
354*5fd0122aSMatthias Ringwald     bNMIStatus = SysCtl_getNMISourceStatus() & SYSCTL_CS_SRC;
355*5fd0122aSMatthias Ringwald     SysCtl_disableNMISource(SYSCTL_CS_SRC);
356*5fd0122aSMatthias Ringwald #endif
357*5fd0122aSMatthias Ringwald 
358*5fd0122aSMatthias Ringwald     /* Determining which frequency range to use */
359*5fd0122aSMatthias Ringwald     wHFFreqRange = _CSGetHFXTFrequency();
360*5fd0122aSMatthias Ringwald     boolTimeout = (timeout == 0) ? false : true;
361*5fd0122aSMatthias Ringwald 
362*5fd0122aSMatthias Ringwald     /* Setting to maximum drive strength  */
363*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->CTL2, CS_CTL2_HFXTDRIVE_OFS) = 1;
364*5fd0122aSMatthias Ringwald     CS->CTL2 = (CS->CTL2 & (~CS_CTL2_HFXTFREQ_MASK)) | (wHFFreqRange);
365*5fd0122aSMatthias Ringwald 
366*5fd0122aSMatthias Ringwald     if (bypassMode)
367*5fd0122aSMatthias Ringwald     {
368*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL2, CS_CTL2_HFXTBYPASS_OFS) = 1;
369*5fd0122aSMatthias Ringwald     } else
370*5fd0122aSMatthias Ringwald     {
371*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL2, CS_CTL2_HFXTBYPASS_OFS) = 0;
372*5fd0122aSMatthias Ringwald     }
373*5fd0122aSMatthias Ringwald 
374*5fd0122aSMatthias Ringwald     /* Starting and Waiting for frequency stabilization */
375*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->CTL2, CS_CTL2_HFXT_EN_OFS) = 1;
376*5fd0122aSMatthias Ringwald     while (BITBAND_PERI(CS->IFG, CS_IFG_HFXTIFG_OFS))
377*5fd0122aSMatthias Ringwald     {
378*5fd0122aSMatthias Ringwald         if (boolTimeout && ((--timeout) == 0))
379*5fd0122aSMatthias Ringwald             break;
380*5fd0122aSMatthias Ringwald 
381*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CLRIFG,CS_CLRIFG_CLR_HFXTIFG_OFS) = 1;
382*5fd0122aSMatthias Ringwald     }
383*5fd0122aSMatthias Ringwald 
384*5fd0122aSMatthias Ringwald     /* Setting the drive strength */
385*5fd0122aSMatthias Ringwald     if (!bypassMode)
386*5fd0122aSMatthias Ringwald     {
387*5fd0122aSMatthias Ringwald         if (wHFFreqRange != CS_CTL2_HFXTFREQ_0)
388*5fd0122aSMatthias Ringwald             BITBAND_PERI(CS->CTL2, CS_CTL2_HFXTDRIVE_OFS) = 1;
389*5fd0122aSMatthias Ringwald         else
390*5fd0122aSMatthias Ringwald             BITBAND_PERI(CS->CTL2, CS_CTL2_HFXTDRIVE_OFS) = 0;
391*5fd0122aSMatthias Ringwald     }
392*5fd0122aSMatthias Ringwald 
393*5fd0122aSMatthias Ringwald     /* Locking the module */
394*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
395*5fd0122aSMatthias Ringwald 
396*5fd0122aSMatthias Ringwald     /* Enabling the NMI state */
397*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_SYSCTL_A__
398*5fd0122aSMatthias Ringwald     SysCtl_A_enableNMISource(bNMIStatus);
399*5fd0122aSMatthias Ringwald #else
400*5fd0122aSMatthias Ringwald     SysCtl_enableNMISource(bNMIStatus);
401*5fd0122aSMatthias Ringwald #endif
402*5fd0122aSMatthias Ringwald 
403*5fd0122aSMatthias Ringwald     if (boolTimeout && timeout == 0)
404*5fd0122aSMatthias Ringwald         return false;
405*5fd0122aSMatthias Ringwald 
406*5fd0122aSMatthias Ringwald     return true;
407*5fd0122aSMatthias Ringwald }
408*5fd0122aSMatthias Ringwald 
CS_startLFXT(uint32_t xtDrive)409*5fd0122aSMatthias Ringwald bool CS_startLFXT(uint32_t xtDrive)
410*5fd0122aSMatthias Ringwald {
411*5fd0122aSMatthias Ringwald     return CS_startLFXTWithTimeout(xtDrive, 0);
412*5fd0122aSMatthias Ringwald }
413*5fd0122aSMatthias Ringwald 
CS_startLFXTWithTimeout(uint32_t xtDrive,uint32_t timeout)414*5fd0122aSMatthias Ringwald bool CS_startLFXTWithTimeout(uint32_t xtDrive, uint32_t timeout)
415*5fd0122aSMatthias Ringwald {
416*5fd0122aSMatthias Ringwald     uint8_t bNMIStatus;
417*5fd0122aSMatthias Ringwald     bool boolBypassMode, boolTimeout;
418*5fd0122aSMatthias Ringwald 
419*5fd0122aSMatthias Ringwald     ASSERT(lfxtFreq != 0)
420*5fd0122aSMatthias Ringwald     ASSERT(
421*5fd0122aSMatthias Ringwald             (xtDrive == CS_LFXT_DRIVE0) || (xtDrive == CS_LFXT_DRIVE1)
422*5fd0122aSMatthias Ringwald             || (xtDrive == CS_LFXT_DRIVE2)
423*5fd0122aSMatthias Ringwald             || (xtDrive == CS_LFXT_DRIVE3)
424*5fd0122aSMatthias Ringwald             || (xtDrive == CS_LFXT_BYPASS));
425*5fd0122aSMatthias Ringwald 
426*5fd0122aSMatthias Ringwald     /* Unlocking the CS Module */
427*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
428*5fd0122aSMatthias Ringwald 
429*5fd0122aSMatthias Ringwald     /* Saving status and temporarily disabling NMIs for UCS faults */
430*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_SYSCTL_A__
431*5fd0122aSMatthias Ringwald     bNMIStatus = SysCtl_A_getNMISourceStatus() & SYSCTL_A_CS_SRC;
432*5fd0122aSMatthias Ringwald     SysCtl_A_disableNMISource(SYSCTL_A_CS_SRC);
433*5fd0122aSMatthias Ringwald #else
434*5fd0122aSMatthias Ringwald     bNMIStatus = SysCtl_getNMISourceStatus() & SYSCTL_CS_SRC;
435*5fd0122aSMatthias Ringwald     SysCtl_disableNMISource(SYSCTL_CS_SRC);
436*5fd0122aSMatthias Ringwald #endif
437*5fd0122aSMatthias Ringwald     boolBypassMode = (xtDrive == CS_LFXT_BYPASS) ? true : false;
438*5fd0122aSMatthias Ringwald     boolTimeout = (timeout == 0) ? false : true;
439*5fd0122aSMatthias Ringwald 
440*5fd0122aSMatthias Ringwald     /* Setting to maximum drive strength  */
441*5fd0122aSMatthias Ringwald     if (boolBypassMode)
442*5fd0122aSMatthias Ringwald     {
443*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL2, CS_CTL2_LFXTBYPASS_OFS) = 1;
444*5fd0122aSMatthias Ringwald     } else
445*5fd0122aSMatthias Ringwald     {
446*5fd0122aSMatthias Ringwald         CS->CTL2 |= (CS_LFXT_DRIVE3);
447*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL2, CS_CTL2_LFXTBYPASS_OFS) = 0;
448*5fd0122aSMatthias Ringwald     }
449*5fd0122aSMatthias Ringwald 
450*5fd0122aSMatthias Ringwald     /* Waiting for frequency stabilization */
451*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->CTL2, CS_CTL2_LFXT_EN_OFS) = 1;
452*5fd0122aSMatthias Ringwald 
453*5fd0122aSMatthias Ringwald     while (BITBAND_PERI(CS->IFG, CS_IFG_LFXTIFG_OFS))
454*5fd0122aSMatthias Ringwald     {
455*5fd0122aSMatthias Ringwald         if (boolTimeout && ((--timeout) == 0))
456*5fd0122aSMatthias Ringwald             break;
457*5fd0122aSMatthias Ringwald 
458*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CLRIFG,CS_CLRIFG_CLR_LFXTIFG_OFS) = 1;
459*5fd0122aSMatthias Ringwald     }
460*5fd0122aSMatthias Ringwald 
461*5fd0122aSMatthias Ringwald     /* Setting the drive strength */
462*5fd0122aSMatthias Ringwald     if (!boolBypassMode)
463*5fd0122aSMatthias Ringwald     {
464*5fd0122aSMatthias Ringwald         CS->CTL2 = ((CS->CTL2 & ~CS_LFXT_DRIVE3) | xtDrive);
465*5fd0122aSMatthias Ringwald     }
466*5fd0122aSMatthias Ringwald 
467*5fd0122aSMatthias Ringwald     /* Locking the module */
468*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
469*5fd0122aSMatthias Ringwald 
470*5fd0122aSMatthias Ringwald     /* Enabling the NMI state */
471*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_SYSCTL_A__
472*5fd0122aSMatthias Ringwald     SysCtl_A_enableNMISource(bNMIStatus);
473*5fd0122aSMatthias Ringwald #else
474*5fd0122aSMatthias Ringwald     SysCtl_enableNMISource(bNMIStatus);
475*5fd0122aSMatthias Ringwald #endif
476*5fd0122aSMatthias Ringwald 
477*5fd0122aSMatthias Ringwald     if (boolTimeout && timeout == 0)
478*5fd0122aSMatthias Ringwald         return false;
479*5fd0122aSMatthias Ringwald 
480*5fd0122aSMatthias Ringwald     return true;
481*5fd0122aSMatthias Ringwald }
482*5fd0122aSMatthias Ringwald 
CS_enableClockRequest(uint32_t selectClock)483*5fd0122aSMatthias Ringwald void CS_enableClockRequest(uint32_t selectClock)
484*5fd0122aSMatthias Ringwald {
485*5fd0122aSMatthias Ringwald     ASSERT(
486*5fd0122aSMatthias Ringwald             selectClock == CS_ACLK || selectClock == CS_HSMCLK
487*5fd0122aSMatthias Ringwald             || selectClock == CS_SMCLK || selectClock == CS_MCLK);
488*5fd0122aSMatthias Ringwald 
489*5fd0122aSMatthias Ringwald     /* Unlocking the module */
490*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
491*5fd0122aSMatthias Ringwald 
492*5fd0122aSMatthias Ringwald     CS->CLKEN |= selectClock;
493*5fd0122aSMatthias Ringwald 
494*5fd0122aSMatthias Ringwald     /* Locking the module */
495*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
496*5fd0122aSMatthias Ringwald }
497*5fd0122aSMatthias Ringwald 
CS_disableClockRequest(uint32_t selectClock)498*5fd0122aSMatthias Ringwald void CS_disableClockRequest(uint32_t selectClock)
499*5fd0122aSMatthias Ringwald {
500*5fd0122aSMatthias Ringwald     ASSERT(
501*5fd0122aSMatthias Ringwald             selectClock == CS_ACLK || selectClock == CS_HSMCLK
502*5fd0122aSMatthias Ringwald             || selectClock == CS_SMCLK || selectClock == CS_MCLK);
503*5fd0122aSMatthias Ringwald 
504*5fd0122aSMatthias Ringwald     /* Unlocking the module */
505*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
506*5fd0122aSMatthias Ringwald 
507*5fd0122aSMatthias Ringwald     CS->CLKEN &= ~selectClock;
508*5fd0122aSMatthias Ringwald 
509*5fd0122aSMatthias Ringwald     /* Locking the module */
510*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
511*5fd0122aSMatthias Ringwald }
512*5fd0122aSMatthias Ringwald 
CS_setReferenceOscillatorFrequency(uint8_t referenceFrequency)513*5fd0122aSMatthias Ringwald void CS_setReferenceOscillatorFrequency(uint8_t referenceFrequency)
514*5fd0122aSMatthias Ringwald {
515*5fd0122aSMatthias Ringwald     ASSERT(
516*5fd0122aSMatthias Ringwald             referenceFrequency == CS_REFO_32KHZ
517*5fd0122aSMatthias Ringwald             || referenceFrequency == CS_REFO_128KHZ);
518*5fd0122aSMatthias Ringwald 
519*5fd0122aSMatthias Ringwald     /* Unlocking the module */
520*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
521*5fd0122aSMatthias Ringwald 
522*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->CLKEN, CS_CLKEN_REFOFSEL_OFS) = referenceFrequency;
523*5fd0122aSMatthias Ringwald 
524*5fd0122aSMatthias Ringwald     /* Locking the module */
525*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
526*5fd0122aSMatthias Ringwald }
527*5fd0122aSMatthias Ringwald 
CS_enableDCOExternalResistor(void)528*5fd0122aSMatthias Ringwald void CS_enableDCOExternalResistor(void)
529*5fd0122aSMatthias Ringwald {
530*5fd0122aSMatthias Ringwald     /* Unlocking the module */
531*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
532*5fd0122aSMatthias Ringwald 
533*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->CTL0,CS_CTL0_DCORES_OFS) = 1;
534*5fd0122aSMatthias Ringwald 
535*5fd0122aSMatthias Ringwald     /* Locking the module */
536*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
537*5fd0122aSMatthias Ringwald }
538*5fd0122aSMatthias Ringwald 
CS_setDCOExternalResistorCalibration(uint_fast8_t calData,uint_fast8_t freqRange)539*5fd0122aSMatthias Ringwald void CS_setDCOExternalResistorCalibration(uint_fast8_t calData,
540*5fd0122aSMatthias Ringwald         uint_fast8_t freqRange)
541*5fd0122aSMatthias Ringwald {
542*5fd0122aSMatthias Ringwald     uint_fast8_t rselVal;
543*5fd0122aSMatthias Ringwald 
544*5fd0122aSMatthias Ringwald     /* Unlocking the module */
545*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
546*5fd0122aSMatthias Ringwald 
547*5fd0122aSMatthias Ringwald     rselVal = (CS->CTL0 | CS_CTL0_DCORSEL_MASK) >> CS_CTL0_DCORSEL_OFS;
548*5fd0122aSMatthias Ringwald 
549*5fd0122aSMatthias Ringwald     CS->CTL0 &= ~CS_CTL0_DCORSEL_MASK;
550*5fd0122aSMatthias Ringwald 
551*5fd0122aSMatthias Ringwald     if ((freqRange == CS_OVER32MHZ))
552*5fd0122aSMatthias Ringwald     {
553*5fd0122aSMatthias Ringwald         CS->DCOERCAL1 &= ~CS_DCOERCAL1_DCO_FCAL_RSEL5_MASK;
554*5fd0122aSMatthias Ringwald         CS->DCOERCAL1 |= (calData);
555*5fd0122aSMatthias Ringwald     } else
556*5fd0122aSMatthias Ringwald     {
557*5fd0122aSMatthias Ringwald         CS->DCOERCAL0 &= ~CS_DCOERCAL0_DCO_FCAL_RSEL04_MASK;
558*5fd0122aSMatthias Ringwald         CS->DCOERCAL0 |= (calData) << CS_DCOERCAL0_DCO_FCAL_RSEL04_OFS;
559*5fd0122aSMatthias Ringwald     }
560*5fd0122aSMatthias Ringwald 
561*5fd0122aSMatthias Ringwald     CS->CTL0 |= (rselVal) << CS_CTL0_DCORSEL_OFS;
562*5fd0122aSMatthias Ringwald 
563*5fd0122aSMatthias Ringwald     /* Locking the module */
564*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
565*5fd0122aSMatthias Ringwald 
566*5fd0122aSMatthias Ringwald }
567*5fd0122aSMatthias Ringwald 
CS_disableDCOExternalResistor(void)568*5fd0122aSMatthias Ringwald void CS_disableDCOExternalResistor(void)
569*5fd0122aSMatthias Ringwald {
570*5fd0122aSMatthias Ringwald     /* Unlocking the module */
571*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
572*5fd0122aSMatthias Ringwald 
573*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->CTL0,CS_CTL0_DCORES_OFS) = 0;
574*5fd0122aSMatthias Ringwald 
575*5fd0122aSMatthias Ringwald     /* Locking the module */
576*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
577*5fd0122aSMatthias Ringwald }
578*5fd0122aSMatthias Ringwald 
CS_setDCOCenteredFrequency(uint32_t dcoFreq)579*5fd0122aSMatthias Ringwald void CS_setDCOCenteredFrequency(uint32_t dcoFreq)
580*5fd0122aSMatthias Ringwald {
581*5fd0122aSMatthias Ringwald     ASSERT(
582*5fd0122aSMatthias Ringwald             dcoFreq == CS_DCO_FREQUENCY_1_5 || dcoFreq == CS_DCO_FREQUENCY_3
583*5fd0122aSMatthias Ringwald             || dcoFreq == CS_DCO_FREQUENCY_6
584*5fd0122aSMatthias Ringwald             || dcoFreq == CS_DCO_FREQUENCY_12
585*5fd0122aSMatthias Ringwald             || dcoFreq == CS_DCO_FREQUENCY_24
586*5fd0122aSMatthias Ringwald             || dcoFreq == CS_DCO_FREQUENCY_48);
587*5fd0122aSMatthias Ringwald 
588*5fd0122aSMatthias Ringwald     /* Unlocking the CS Module */
589*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
590*5fd0122aSMatthias Ringwald 
591*5fd0122aSMatthias Ringwald     /* Resetting Tuning Parameters and Setting the frequency */
592*5fd0122aSMatthias Ringwald     CS->CTL0 = ((CS->CTL0 & ~CS_CTL0_DCORSEL_MASK) | dcoFreq);
593*5fd0122aSMatthias Ringwald 
594*5fd0122aSMatthias Ringwald     /* Locking the CS Module */
595*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
596*5fd0122aSMatthias Ringwald }
597*5fd0122aSMatthias Ringwald 
CS_tuneDCOFrequency(int16_t tuneParameter)598*5fd0122aSMatthias Ringwald void CS_tuneDCOFrequency(int16_t tuneParameter)
599*5fd0122aSMatthias Ringwald {
600*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
601*5fd0122aSMatthias Ringwald 
602*5fd0122aSMatthias Ringwald     uint16_t dcoTuneMask = 0x1FFF;
603*5fd0122aSMatthias Ringwald     uint16_t dcoTuneSigned = 0x1000;
604*5fd0122aSMatthias Ringwald 
605*5fd0122aSMatthias Ringwald     dcoTuneMask = 0x3FF;
606*5fd0122aSMatthias Ringwald     dcoTuneSigned = 0x200;
607*5fd0122aSMatthias Ringwald 
608*5fd0122aSMatthias Ringwald     if (tuneParameter < 0)
609*5fd0122aSMatthias Ringwald     {
610*5fd0122aSMatthias Ringwald         CS->CTL0 = ((CS->CTL0 & ~dcoTuneMask) | (tuneParameter & dcoTuneMask)
611*5fd0122aSMatthias Ringwald                 | dcoTuneSigned);
612*5fd0122aSMatthias Ringwald     } else
613*5fd0122aSMatthias Ringwald     {
614*5fd0122aSMatthias Ringwald         CS->CTL0 = ((CS->CTL0 & ~dcoTuneMask) | (tuneParameter & dcoTuneMask));
615*5fd0122aSMatthias Ringwald     }
616*5fd0122aSMatthias Ringwald 
617*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
618*5fd0122aSMatthias Ringwald }
619*5fd0122aSMatthias Ringwald 
CS_getDCOFrequency(void)620*5fd0122aSMatthias Ringwald uint32_t CS_getDCOFrequency(void)
621*5fd0122aSMatthias Ringwald {
622*5fd0122aSMatthias Ringwald     float dcoConst;
623*5fd0122aSMatthias Ringwald     int32_t calVal;
624*5fd0122aSMatthias Ringwald     uint32_t centeredFreq;
625*5fd0122aSMatthias Ringwald     int16_t dcoTune;
626*5fd0122aSMatthias Ringwald     uint_fast8_t tlvLength;
627*5fd0122aSMatthias Ringwald     uint32_t retVal;
628*5fd0122aSMatthias Ringwald 
629*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_SYSCTL_A__
630*5fd0122aSMatthias Ringwald     SysCtl_A_CSCalTLV_Info *csInfo;
631*5fd0122aSMatthias Ringwald 
632*5fd0122aSMatthias Ringwald     /* Parsing the TLV and getting the trim information */
633*5fd0122aSMatthias Ringwald     SysCtl_A_getTLVInfo(TLV_TAG_CS, 0, &tlvLength, (uint32_t**) &csInfo);
634*5fd0122aSMatthias Ringwald #else
635*5fd0122aSMatthias Ringwald     SysCtl_CSCalTLV_Info *csInfo;
636*5fd0122aSMatthias Ringwald 
637*5fd0122aSMatthias Ringwald     /* Parsing the TLV and getting the trim information */
638*5fd0122aSMatthias Ringwald     SysCtl_getTLVInfo(TLV_TAG_CS, 0, &tlvLength, (uint32_t**) &csInfo);
639*5fd0122aSMatthias Ringwald #endif
640*5fd0122aSMatthias Ringwald 
641*5fd0122aSMatthias Ringwald     centeredFreq = _CSGetDOCFrequency();
642*5fd0122aSMatthias Ringwald 
643*5fd0122aSMatthias Ringwald     if (tlvLength == 0)
644*5fd0122aSMatthias Ringwald     {
645*5fd0122aSMatthias Ringwald         return centeredFreq;
646*5fd0122aSMatthias Ringwald     }
647*5fd0122aSMatthias Ringwald 
648*5fd0122aSMatthias Ringwald     dcoTune = CS->CTL0 & 0x3FF;
649*5fd0122aSMatthias Ringwald     if (dcoTune & 0x200)
650*5fd0122aSMatthias Ringwald     {
651*5fd0122aSMatthias Ringwald         dcoTune = dcoTune | 0xFE00;
652*5fd0122aSMatthias Ringwald     }
653*5fd0122aSMatthias Ringwald 
654*5fd0122aSMatthias Ringwald     if (dcoTune == 0)
655*5fd0122aSMatthias Ringwald         return (uint32_t) centeredFreq;
656*5fd0122aSMatthias Ringwald 
657*5fd0122aSMatthias Ringwald     /* DCORSEL = 5  */
658*5fd0122aSMatthias Ringwald     if ((centeredFreq == 48000000))
659*5fd0122aSMatthias Ringwald     {
660*5fd0122aSMatthias Ringwald         /* External Resistor */
661*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(CS->CTL0, CS_CTL0_DCORES_OFS))
662*5fd0122aSMatthias Ringwald         {
663*5fd0122aSMatthias Ringwald             dcoConst = *((float *) &csInfo->rDCOER_CONSTK_RSEL5);
664*5fd0122aSMatthias Ringwald             calVal = csInfo->rDCOER_FCAL_RSEL5;
665*5fd0122aSMatthias Ringwald         }
666*5fd0122aSMatthias Ringwald         /* Internal Resistor */
667*5fd0122aSMatthias Ringwald         else
668*5fd0122aSMatthias Ringwald         {
669*5fd0122aSMatthias Ringwald             dcoConst = *((float *) &csInfo->rDCOIR_CONSTK_RSEL5);
670*5fd0122aSMatthias Ringwald             calVal = csInfo->rDCOIR_FCAL_RSEL5;
671*5fd0122aSMatthias Ringwald         }
672*5fd0122aSMatthias Ringwald     }
673*5fd0122aSMatthias Ringwald     /* DCORSEL = 4 */
674*5fd0122aSMatthias Ringwald     else
675*5fd0122aSMatthias Ringwald     {
676*5fd0122aSMatthias Ringwald         /* External Resistor */
677*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(CS->CTL0, CS_CTL0_DCORES_OFS))
678*5fd0122aSMatthias Ringwald         {
679*5fd0122aSMatthias Ringwald             dcoConst = *((float *) &csInfo->rDCOER_CONSTK_RSEL04);
680*5fd0122aSMatthias Ringwald             calVal = csInfo->rDCOER_FCAL_RSEL04;
681*5fd0122aSMatthias Ringwald         }
682*5fd0122aSMatthias Ringwald         /* Internal Resistor */
683*5fd0122aSMatthias Ringwald         else
684*5fd0122aSMatthias Ringwald         {
685*5fd0122aSMatthias Ringwald             dcoConst = *((float *) &csInfo->rDCOIR_CONSTK_RSEL04);
686*5fd0122aSMatthias Ringwald             calVal = csInfo->rDCOIR_FCAL_RSEL04;
687*5fd0122aSMatthias Ringwald         }
688*5fd0122aSMatthias Ringwald     }
689*5fd0122aSMatthias Ringwald     retVal = (uint32_t) ((centeredFreq)
690*5fd0122aSMatthias Ringwald             / (1 - ((dcoConst * dcoTune) / ((1 + dcoConst * (768 - calVal))))));
691*5fd0122aSMatthias Ringwald 
692*5fd0122aSMatthias Ringwald     return retVal;
693*5fd0122aSMatthias Ringwald }
694*5fd0122aSMatthias Ringwald 
CS_setDCOFrequency(uint32_t dcoFrequency)695*5fd0122aSMatthias Ringwald void CS_setDCOFrequency(uint32_t dcoFrequency)
696*5fd0122aSMatthias Ringwald {
697*5fd0122aSMatthias Ringwald     int32_t nomFreq, calVal, dcoSigned;
698*5fd0122aSMatthias Ringwald     int16_t dcoTune;
699*5fd0122aSMatthias Ringwald     float dcoConst;
700*5fd0122aSMatthias Ringwald     bool rsel5 = false;
701*5fd0122aSMatthias Ringwald     dcoSigned = (int32_t) dcoFrequency;
702*5fd0122aSMatthias Ringwald     uint_fast8_t tlvLength;
703*5fd0122aSMatthias Ringwald 
704*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_SYSCTL_A__
705*5fd0122aSMatthias Ringwald     SysCtl_A_CSCalTLV_Info *csInfo;
706*5fd0122aSMatthias Ringwald 
707*5fd0122aSMatthias Ringwald     /* Parsing the TLV and getting the trim information */
708*5fd0122aSMatthias Ringwald     SysCtl_A_getTLVInfo(TLV_TAG_CS, 0, &tlvLength, (uint32_t**) &csInfo);
709*5fd0122aSMatthias Ringwald #else
710*5fd0122aSMatthias Ringwald     SysCtl_CSCalTLV_Info *csInfo;
711*5fd0122aSMatthias Ringwald 
712*5fd0122aSMatthias Ringwald     /* Parsing the TLV and getting the trim information */
713*5fd0122aSMatthias Ringwald     SysCtl_getTLVInfo(TLV_TAG_CS, 0, &tlvLength, (uint32_t**) &csInfo);
714*5fd0122aSMatthias Ringwald #endif
715*5fd0122aSMatthias Ringwald 
716*5fd0122aSMatthias Ringwald 
717*5fd0122aSMatthias Ringwald     if (dcoFrequency < 2000000)
718*5fd0122aSMatthias Ringwald     {
719*5fd0122aSMatthias Ringwald         nomFreq = CS_15MHZ;
720*5fd0122aSMatthias Ringwald         CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_1_5);
721*5fd0122aSMatthias Ringwald     } else if (dcoFrequency < 4000000)
722*5fd0122aSMatthias Ringwald     {
723*5fd0122aSMatthias Ringwald         nomFreq = CS_3MHZ;
724*5fd0122aSMatthias Ringwald         CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_3);
725*5fd0122aSMatthias Ringwald     } else if (dcoFrequency < 8000000)
726*5fd0122aSMatthias Ringwald     {
727*5fd0122aSMatthias Ringwald         nomFreq = CS_6MHZ;
728*5fd0122aSMatthias Ringwald         CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_6);
729*5fd0122aSMatthias Ringwald     } else if (dcoFrequency < 16000000)
730*5fd0122aSMatthias Ringwald     {
731*5fd0122aSMatthias Ringwald         nomFreq = CS_12MHZ;
732*5fd0122aSMatthias Ringwald         CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_12);
733*5fd0122aSMatthias Ringwald     } else if (dcoFrequency < 32000000)
734*5fd0122aSMatthias Ringwald     {
735*5fd0122aSMatthias Ringwald         nomFreq = CS_24MHZ;
736*5fd0122aSMatthias Ringwald         CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);
737*5fd0122aSMatthias Ringwald     } else if (dcoFrequency < 640000001)
738*5fd0122aSMatthias Ringwald     {
739*5fd0122aSMatthias Ringwald         nomFreq = CS_48MHZ;
740*5fd0122aSMatthias Ringwald         CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
741*5fd0122aSMatthias Ringwald         rsel5 = true;
742*5fd0122aSMatthias Ringwald     } else
743*5fd0122aSMatthias Ringwald     {
744*5fd0122aSMatthias Ringwald         ASSERT(false);
745*5fd0122aSMatthias Ringwald         return;
746*5fd0122aSMatthias Ringwald     }
747*5fd0122aSMatthias Ringwald 
748*5fd0122aSMatthias Ringwald     if (dcoFrequency == nomFreq || tlvLength == 0)
749*5fd0122aSMatthias Ringwald     {
750*5fd0122aSMatthias Ringwald         CS_tuneDCOFrequency(0);
751*5fd0122aSMatthias Ringwald         return;
752*5fd0122aSMatthias Ringwald     }
753*5fd0122aSMatthias Ringwald 
754*5fd0122aSMatthias Ringwald     if (rsel5)
755*5fd0122aSMatthias Ringwald     {
756*5fd0122aSMatthias Ringwald         /* External Resistor*/
757*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(CS->CTL0, CS_CTL0_DCORES_OFS))
758*5fd0122aSMatthias Ringwald         {
759*5fd0122aSMatthias Ringwald             dcoConst = *((float *) &csInfo->rDCOER_CONSTK_RSEL5);
760*5fd0122aSMatthias Ringwald             calVal = csInfo->rDCOER_FCAL_RSEL5;
761*5fd0122aSMatthias Ringwald         }
762*5fd0122aSMatthias Ringwald         /* Internal Resistor */
763*5fd0122aSMatthias Ringwald         else
764*5fd0122aSMatthias Ringwald         {
765*5fd0122aSMatthias Ringwald             dcoConst = *((float *) &csInfo->rDCOIR_CONSTK_RSEL5);
766*5fd0122aSMatthias Ringwald             calVal = csInfo->rDCOIR_FCAL_RSEL5;
767*5fd0122aSMatthias Ringwald         }
768*5fd0122aSMatthias Ringwald     }
769*5fd0122aSMatthias Ringwald     /* DCORSEL = 4 */
770*5fd0122aSMatthias Ringwald     else
771*5fd0122aSMatthias Ringwald     {
772*5fd0122aSMatthias Ringwald         /* External Resistor */
773*5fd0122aSMatthias Ringwald         if (BITBAND_PERI(CS->CTL0, CS_CTL0_DCORES_OFS))
774*5fd0122aSMatthias Ringwald         {
775*5fd0122aSMatthias Ringwald             dcoConst = *((float *) &csInfo->rDCOER_CONSTK_RSEL04);
776*5fd0122aSMatthias Ringwald             calVal = csInfo->rDCOER_FCAL_RSEL04;
777*5fd0122aSMatthias Ringwald         }
778*5fd0122aSMatthias Ringwald         /* Internal Resistor */
779*5fd0122aSMatthias Ringwald         else
780*5fd0122aSMatthias Ringwald         {
781*5fd0122aSMatthias Ringwald             dcoConst = *((float *) &csInfo->rDCOIR_CONSTK_RSEL04);
782*5fd0122aSMatthias Ringwald             calVal = csInfo->rDCOIR_FCAL_RSEL04;
783*5fd0122aSMatthias Ringwald         }
784*5fd0122aSMatthias Ringwald     }
785*5fd0122aSMatthias Ringwald 
786*5fd0122aSMatthias Ringwald     dcoTune = (int16_t) (((dcoSigned - nomFreq)
787*5fd0122aSMatthias Ringwald             * (1.0f + dcoConst * (768.0f - calVal))) / (dcoSigned * dcoConst));
788*5fd0122aSMatthias Ringwald 
789*5fd0122aSMatthias Ringwald     CS_tuneDCOFrequency(dcoTune);
790*5fd0122aSMatthias Ringwald 
791*5fd0122aSMatthias Ringwald }
792*5fd0122aSMatthias Ringwald 
CS_getBCLK(void)793*5fd0122aSMatthias Ringwald uint32_t CS_getBCLK(void)
794*5fd0122aSMatthias Ringwald {
795*5fd0122aSMatthias Ringwald     if (BITBAND_PERI(CS->CTL1, CS_CTL1_SELB_OFS))
796*5fd0122aSMatthias Ringwald         return _CSComputeCLKFrequency(CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
797*5fd0122aSMatthias Ringwald     else
798*5fd0122aSMatthias Ringwald         return _CSComputeCLKFrequency(CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
799*5fd0122aSMatthias Ringwald }
800*5fd0122aSMatthias Ringwald 
CS_getHSMCLK(void)801*5fd0122aSMatthias Ringwald uint32_t CS_getHSMCLK(void)
802*5fd0122aSMatthias Ringwald {
803*5fd0122aSMatthias Ringwald     uint32_t wSource, wDivider;
804*5fd0122aSMatthias Ringwald 
805*5fd0122aSMatthias Ringwald     wSource = (CS->CTL1 & CS_CTL1_SELS_MASK) >> CS_HSMCLK_SRC_BITPOS;
806*5fd0122aSMatthias Ringwald     wDivider = ((CS->CTL1 & CS_CTL1_DIVHS_MASK) << CS_HSMCLK_DIV_BITPOS);
807*5fd0122aSMatthias Ringwald 
808*5fd0122aSMatthias Ringwald     return _CSComputeCLKFrequency(wSource, wDivider);
809*5fd0122aSMatthias Ringwald }
810*5fd0122aSMatthias Ringwald 
CS_getACLK(void)811*5fd0122aSMatthias Ringwald uint32_t CS_getACLK(void)
812*5fd0122aSMatthias Ringwald {
813*5fd0122aSMatthias Ringwald     uint32_t wSource, wDivider;
814*5fd0122aSMatthias Ringwald 
815*5fd0122aSMatthias Ringwald     wSource = (CS->CTL1 & CS_CTL1_SELA_MASK) >> CS_ACLK_SRC_BITPOS;
816*5fd0122aSMatthias Ringwald     wDivider = ((CS->CTL1 & CS_CTL1_DIVA_MASK) << CS_ACLK_DIV_BITPOS);
817*5fd0122aSMatthias Ringwald 
818*5fd0122aSMatthias Ringwald     return _CSComputeCLKFrequency(wSource, wDivider);
819*5fd0122aSMatthias Ringwald }
820*5fd0122aSMatthias Ringwald 
CS_getSMCLK(void)821*5fd0122aSMatthias Ringwald uint32_t CS_getSMCLK(void)
822*5fd0122aSMatthias Ringwald {
823*5fd0122aSMatthias Ringwald     uint32_t wDivider, wSource;
824*5fd0122aSMatthias Ringwald 
825*5fd0122aSMatthias Ringwald     wSource = (CS->CTL1 & CS_CTL1_SELS_MASK) >> CS_HSMCLK_SRC_BITPOS;
826*5fd0122aSMatthias Ringwald     wDivider = ((CS->CTL1 & CS_CTL1_DIVS_MASK));
827*5fd0122aSMatthias Ringwald 
828*5fd0122aSMatthias Ringwald     return _CSComputeCLKFrequency(wSource, wDivider);
829*5fd0122aSMatthias Ringwald 
830*5fd0122aSMatthias Ringwald }
831*5fd0122aSMatthias Ringwald 
CS_getMCLK(void)832*5fd0122aSMatthias Ringwald uint32_t CS_getMCLK(void)
833*5fd0122aSMatthias Ringwald {
834*5fd0122aSMatthias Ringwald     uint32_t wSource, wDivider;
835*5fd0122aSMatthias Ringwald 
836*5fd0122aSMatthias Ringwald     wSource = (CS->CTL1 & CS_CTL1_SELM_MASK) << CS_MCLK_SRC_BITPOS;
837*5fd0122aSMatthias Ringwald     wDivider = ((CS->CTL1 & CS_CTL1_DIVM_MASK) << CS_MCLK_DIV_BITPOS);
838*5fd0122aSMatthias Ringwald 
839*5fd0122aSMatthias Ringwald     return _CSComputeCLKFrequency(wSource, wDivider);
840*5fd0122aSMatthias Ringwald }
841*5fd0122aSMatthias Ringwald 
CS_enableFaultCounter(uint_fast8_t counterSelect)842*5fd0122aSMatthias Ringwald void CS_enableFaultCounter(uint_fast8_t counterSelect)
843*5fd0122aSMatthias Ringwald {
844*5fd0122aSMatthias Ringwald     ASSERT(counterSelect == CS_HFXT_FAULT_COUNTER ||
845*5fd0122aSMatthias Ringwald             counterSelect == CS_HFXT_FAULT_COUNTER);
846*5fd0122aSMatthias Ringwald 
847*5fd0122aSMatthias Ringwald     /* Unlocking the module */
848*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
849*5fd0122aSMatthias Ringwald 
850*5fd0122aSMatthias Ringwald     if (counterSelect == CS_HFXT_FAULT_COUNTER)
851*5fd0122aSMatthias Ringwald     {
852*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL3, CS_CTL3_FCNTHF_EN_OFS) = 1;
853*5fd0122aSMatthias Ringwald     } else
854*5fd0122aSMatthias Ringwald     {
855*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL3, CS_CTL3_FCNTLF_EN_OFS) = 1;
856*5fd0122aSMatthias Ringwald     }
857*5fd0122aSMatthias Ringwald 
858*5fd0122aSMatthias Ringwald     /* Locking the module */
859*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
860*5fd0122aSMatthias Ringwald }
861*5fd0122aSMatthias Ringwald 
CS_disableFaultCounter(uint_fast8_t counterSelect)862*5fd0122aSMatthias Ringwald void CS_disableFaultCounter(uint_fast8_t counterSelect)
863*5fd0122aSMatthias Ringwald {
864*5fd0122aSMatthias Ringwald     ASSERT(counterSelect == CS_HFXT_FAULT_COUNTER ||
865*5fd0122aSMatthias Ringwald             counterSelect == CS_HFXT_FAULT_COUNTER);
866*5fd0122aSMatthias Ringwald 
867*5fd0122aSMatthias Ringwald     /* Unlocking the module */
868*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
869*5fd0122aSMatthias Ringwald 
870*5fd0122aSMatthias Ringwald     if (counterSelect == CS_HFXT_FAULT_COUNTER)
871*5fd0122aSMatthias Ringwald     {
872*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL3, CS_CTL3_FCNTHF_EN_OFS) = 0;
873*5fd0122aSMatthias Ringwald     } else
874*5fd0122aSMatthias Ringwald     {
875*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL3, CS_CTL3_FCNTLF_EN_OFS) = 0;
876*5fd0122aSMatthias Ringwald     }
877*5fd0122aSMatthias Ringwald 
878*5fd0122aSMatthias Ringwald     /* Locking the module */
879*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
880*5fd0122aSMatthias Ringwald }
881*5fd0122aSMatthias Ringwald 
CS_resetFaultCounter(uint_fast8_t counterSelect)882*5fd0122aSMatthias Ringwald void CS_resetFaultCounter(uint_fast8_t counterSelect)
883*5fd0122aSMatthias Ringwald {
884*5fd0122aSMatthias Ringwald     ASSERT(counterSelect == CS_HFXT_FAULT_COUNTER ||
885*5fd0122aSMatthias Ringwald             counterSelect == CS_HFXT_FAULT_COUNTER);
886*5fd0122aSMatthias Ringwald 
887*5fd0122aSMatthias Ringwald     /* Unlocking the module */
888*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
889*5fd0122aSMatthias Ringwald 
890*5fd0122aSMatthias Ringwald     if (counterSelect == CS_HFXT_FAULT_COUNTER)
891*5fd0122aSMatthias Ringwald     {
892*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL3, CS_CTL3_RFCNTHF_OFS) = 1;
893*5fd0122aSMatthias Ringwald     } else
894*5fd0122aSMatthias Ringwald     {
895*5fd0122aSMatthias Ringwald         BITBAND_PERI(CS->CTL3, CS_CTL3_RFCNTLF_OFS) = 1;
896*5fd0122aSMatthias Ringwald     }
897*5fd0122aSMatthias Ringwald 
898*5fd0122aSMatthias Ringwald     /* Locking the module */
899*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
900*5fd0122aSMatthias Ringwald }
901*5fd0122aSMatthias Ringwald 
CS_startFaultCounter(uint_fast8_t counterSelect,uint_fast8_t countValue)902*5fd0122aSMatthias Ringwald void CS_startFaultCounter(uint_fast8_t counterSelect, uint_fast8_t countValue)
903*5fd0122aSMatthias Ringwald {
904*5fd0122aSMatthias Ringwald     ASSERT(counterSelect == CS_HFXT_FAULT_COUNTER ||
905*5fd0122aSMatthias Ringwald             counterSelect == CS_HFXT_FAULT_COUNTER);
906*5fd0122aSMatthias Ringwald 
907*5fd0122aSMatthias Ringwald     ASSERT(countValue == CS_FAULT_COUNTER_4096_CYCLES ||
908*5fd0122aSMatthias Ringwald             countValue == CS_FAULT_COUNTER_8192_CYCLES ||
909*5fd0122aSMatthias Ringwald             countValue == CS_FAULT_COUNTER_16384_CYCLES ||
910*5fd0122aSMatthias Ringwald             countValue == CS_FAULT_COUNTER_32768_CYCLES);
911*5fd0122aSMatthias Ringwald 
912*5fd0122aSMatthias Ringwald     /* Unlocking the module */
913*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
914*5fd0122aSMatthias Ringwald 
915*5fd0122aSMatthias Ringwald     if (counterSelect == CS_HFXT_FAULT_COUNTER)
916*5fd0122aSMatthias Ringwald     {
917*5fd0122aSMatthias Ringwald         CS->CTL3 = ((CS->CTL3 & ~CS_CTL3_FCNTHF_MASK) | (countValue << 4));
918*5fd0122aSMatthias Ringwald     } else
919*5fd0122aSMatthias Ringwald     {
920*5fd0122aSMatthias Ringwald         CS->CTL3 = ((CS->CTL3 & ~CS_CTL3_FCNTLF_MASK) | (countValue));
921*5fd0122aSMatthias Ringwald     }
922*5fd0122aSMatthias Ringwald 
923*5fd0122aSMatthias Ringwald     /* Locking the module */
924*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
925*5fd0122aSMatthias Ringwald }
926*5fd0122aSMatthias Ringwald 
CS_enableInterrupt(uint32_t flags)927*5fd0122aSMatthias Ringwald void CS_enableInterrupt(uint32_t flags)
928*5fd0122aSMatthias Ringwald {
929*5fd0122aSMatthias Ringwald     /* Unlocking the module */
930*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
931*5fd0122aSMatthias Ringwald 
932*5fd0122aSMatthias Ringwald     CS->IE |= flags;
933*5fd0122aSMatthias Ringwald 
934*5fd0122aSMatthias Ringwald     /* Locking the module */
935*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
936*5fd0122aSMatthias Ringwald }
937*5fd0122aSMatthias Ringwald 
CS_disableInterrupt(uint32_t flags)938*5fd0122aSMatthias Ringwald void CS_disableInterrupt(uint32_t flags)
939*5fd0122aSMatthias Ringwald {
940*5fd0122aSMatthias Ringwald     /* Unlocking the module */
941*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
942*5fd0122aSMatthias Ringwald 
943*5fd0122aSMatthias Ringwald     CS->IE &= ~flags;
944*5fd0122aSMatthias Ringwald 
945*5fd0122aSMatthias Ringwald     /* Locking the module */
946*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
947*5fd0122aSMatthias Ringwald }
948*5fd0122aSMatthias Ringwald 
CS_getInterruptStatus(void)949*5fd0122aSMatthias Ringwald uint32_t CS_getInterruptStatus(void)
950*5fd0122aSMatthias Ringwald {
951*5fd0122aSMatthias Ringwald     return CS->IFG;
952*5fd0122aSMatthias Ringwald }
953*5fd0122aSMatthias Ringwald 
CS_getEnabledInterruptStatus(void)954*5fd0122aSMatthias Ringwald uint32_t CS_getEnabledInterruptStatus(void)
955*5fd0122aSMatthias Ringwald {
956*5fd0122aSMatthias Ringwald     return CS_getInterruptStatus() & CS->IE;
957*5fd0122aSMatthias Ringwald }
958*5fd0122aSMatthias Ringwald 
CS_clearInterruptFlag(uint32_t flags)959*5fd0122aSMatthias Ringwald void CS_clearInterruptFlag(uint32_t flags)
960*5fd0122aSMatthias Ringwald {
961*5fd0122aSMatthias Ringwald     /* Unlocking the module */
962*5fd0122aSMatthias Ringwald     CS->KEY = CS_KEY;
963*5fd0122aSMatthias Ringwald 
964*5fd0122aSMatthias Ringwald     CS->CLRIFG |= flags;
965*5fd0122aSMatthias Ringwald 
966*5fd0122aSMatthias Ringwald     /* Locking the module */
967*5fd0122aSMatthias Ringwald     BITBAND_PERI(CS->KEY, CS_KEY_KEY_OFS) = 1;
968*5fd0122aSMatthias Ringwald }
969*5fd0122aSMatthias Ringwald 
CS_registerInterrupt(void (* intHandler)(void))970*5fd0122aSMatthias Ringwald void CS_registerInterrupt(void (*intHandler)(void))
971*5fd0122aSMatthias Ringwald {
972*5fd0122aSMatthias Ringwald     //
973*5fd0122aSMatthias Ringwald     // Register the interrupt handler, returning an error if an error occurs.
974*5fd0122aSMatthias Ringwald     //
975*5fd0122aSMatthias Ringwald     Interrupt_registerInterrupt(INT_CS, intHandler);
976*5fd0122aSMatthias Ringwald 
977*5fd0122aSMatthias Ringwald     //
978*5fd0122aSMatthias Ringwald     // Enable the system control interrupt.
979*5fd0122aSMatthias Ringwald     //
980*5fd0122aSMatthias Ringwald     Interrupt_enableInterrupt(INT_CS);
981*5fd0122aSMatthias Ringwald }
982*5fd0122aSMatthias Ringwald 
CS_unregisterInterrupt(void)983*5fd0122aSMatthias Ringwald void CS_unregisterInterrupt(void)
984*5fd0122aSMatthias Ringwald {
985*5fd0122aSMatthias Ringwald     //
986*5fd0122aSMatthias Ringwald     // Disable the interrupt.
987*5fd0122aSMatthias Ringwald     //
988*5fd0122aSMatthias Ringwald     Interrupt_disableInterrupt(INT_CS);
989*5fd0122aSMatthias Ringwald 
990*5fd0122aSMatthias Ringwald     //
991*5fd0122aSMatthias Ringwald     // Unregister the interrupt handler.
992*5fd0122aSMatthias Ringwald     //
993*5fd0122aSMatthias Ringwald     Interrupt_unregisterInterrupt(INT_CS);
994*5fd0122aSMatthias Ringwald }
995*5fd0122aSMatthias Ringwald 
996