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