1 /******************************************************************************
2 *  Filename:       aux_timer.c
3 *  Revised:        2015-01-13 16:59:55 +0100 (Tue, 13 Jan 2015)
4 *  Revision:       42365
5 *
6 *  Description:    Driver for the AUX Timer Module
7 *
8 *  Copyright (c) 2015, Texas Instruments Incorporated
9 *  All rights reserved.
10 *
11 *  Redistribution and use in source and binary forms, with or without
12 *  modification, are permitted provided that the following conditions are met:
13 *
14 *  1) Redistributions of source code must retain the above copyright notice,
15 *     this list of conditions and the following disclaimer.
16 *
17 *  2) Redistributions in binary form must reproduce the above copyright notice,
18 *     this list of conditions and the following disclaimer in the documentation
19 *     and/or other materials provided with the distribution.
20 *
21 *  3) Neither the name of the ORGANIZATION nor the names of its contributors may
22 *     be used to endorse or promote products derived from this software without
23 *     specific prior written permission.
24 *
25 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
29 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 *  POSSIBILITY OF SUCH DAMAGE.
36 *
37 ******************************************************************************/
38 
39 #include <driverlib/aux_timer.h>
40 
41 //*****************************************************************************
42 //
43 // Handle support for DriverLib in ROM:
44 // This section will undo prototype renaming made in the header file
45 //
46 //*****************************************************************************
47 #if !defined(DOXYGEN)
48     #undef  AUXTimerConfigure
49     #define AUXTimerConfigure               NOROM_AUXTimerConfigure
50     #undef  AUXTimerStart
51     #define AUXTimerStart                   NOROM_AUXTimerStart
52     #undef  AUXTimerStop
53     #define AUXTimerStop                    NOROM_AUXTimerStop
54     #undef  AUXTimerPrescaleSet
55     #define AUXTimerPrescaleSet             NOROM_AUXTimerPrescaleSet
56     #undef  AUXTimerPrescaleGet
57     #define AUXTimerPrescaleGet             NOROM_AUXTimerPrescaleGet
58 #endif
59 
60 //*****************************************************************************
61 //
62 //! Configure AUX timer
63 //
64 //*****************************************************************************
65 void
AUXTimerConfigure(uint32_t ui32Timer,uint32_t ui32Config)66 AUXTimerConfigure(uint32_t ui32Timer, uint32_t ui32Config)
67 {
68     uint32_t ui32Val;
69 
70     //
71     // Check the arguments.
72     //
73     ASSERT((ui32Timer == AUX_TIMER_0) || (ui32Timer == AUX_TIMER_1) ||
74            (ui32Timer == AUX_TIMER_BOTH));
75     ASSERT(((ui32Config & 0x0000000F) == AUX_TIMER_CFG_ONE_SHOT) ||
76            ((ui32Config & 0x0000000F) == AUX_TIMER_CFG_PERIODIC) ||
77            ((ui32Config & 0x0000000F) == AUX_TIMER_CFG_ONE_SHOT_EDGE_COUNT) ||
78            ((ui32Config & 0x0000000F) == AUX_TIMER_CFG_PERIODIC_EDGE_COUNT) ||
79            ((ui32Config & 0x000000F0) == AUX_TIMER_CFG_RISING_EDGE) ||
80            ((ui32Config & 0x000000F0) == AUX_TIMER_CFG_FALLING_EDGE) ||
81            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_RTC_EVENT) ||
82            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_CMP_A) ||
83            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_CMP_B) ||
84            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_TDCDONE) ||
85            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_TIMER0_EVENT) ||
86            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_TIMER1_EVENT) ||
87            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_SMPH_RELEASE) ||
88            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_ADC_DONE) ||
89            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO0) ||
90            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO1) ||
91            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO2) ||
92            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO3) ||
93            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO4) ||
94            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO5) ||
95            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO6) ||
96            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO7) ||
97            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO8) ||
98            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO9) ||
99            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO10) ||
100            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO11) ||
101            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO12) ||
102            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO13) ||
103            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO14) ||
104            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_AIO15) ||
105            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_ACLK_REF) ||
106            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_MCU_EVENT) ||
107            ((ui32Config & 0x00000F00) == AUX_TIMER_CFG_TICK_SRC_ADC_IRQ));
108 
109     //
110     // Configure Timer 0.
111     //
112     if(ui32Timer & AUX_TIMER_0)
113     {
114         //
115         // Stop timer 0.
116         //
117         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CTL) = 0;
118 
119         //
120         // Set mode.
121         //
122         ui32Val = HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CFG);
123         ui32Val &= ~(AUX_TIMER_T0CFG_MODE_M | AUX_TIMER_T0CFG_RELOAD_M);
124         ui32Val |= (ui32Config & (AUX_TIMER_T0CFG_MODE_M |
125                                   AUX_TIMER_T0CFG_RELOAD_M));
126         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CFG) = ui32Val;
127 
128         //
129         // If edge counter, set rising/falling edge and tick source.
130         //
131         if(ui32Config & AUX_TIMER_T0CFG_MODE_M)
132         {
133             ui32Val = HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CFG);
134             ui32Val &= ~(AUX_TIMER_T0CFG_TICK_SRC_POL_M |
135                          AUX_TIMER_T0CFG_TICK_SRC_M);
136 
137             //
138             // Set edge polarity.
139             //
140             if(ui32Config & AUX_TIMER_CFG_FALLING_EDGE)
141             {
142                 ui32Val |= AUX_TIMER_T0CFG_TICK_SRC_POL;
143             }
144 
145             //
146             // Set tick source.
147             //
148             ui32Val |= ((ui32Config & 0x00000F00) >> 8) <<
149                        AUX_TIMER_T0CFG_TICK_SRC_S;
150 
151             HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CFG) = ui32Val;
152         }
153     }
154 
155     //
156     // Configure Timer 1.
157     //
158     if(ui32Timer & AUX_TIMER_1)
159     {
160         //
161         // Stop timer 1.
162         //
163         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T1CTL) = 0;
164 
165         //
166         // Set mode.
167         //
168         ui32Val = HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T1CFG);
169         ui32Val &= ~(AUX_TIMER_T1CFG_MODE_M | AUX_TIMER_T1CFG_RELOAD_M);
170         ui32Val |= ((ui32Config) & (AUX_TIMER_T1CFG_MODE_M |
171                                     AUX_TIMER_T1CFG_RELOAD_M));
172         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T1CFG) = ui32Val;
173 
174         //
175         // If edge counter, set rising/falling edge and tick source.
176         //
177         if(ui32Config & AUX_TIMER_T1CFG_MODE)
178         {
179             ui32Val = HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T1CFG);
180             ui32Val &= ~(AUX_TIMER_T1CFG_TICK_SRC_POL_M |
181                          AUX_TIMER_T1CFG_TICK_SRC_M);
182 
183             //
184             // Set edge polarity.
185             //
186             if(ui32Config & AUX_TIMER_CFG_FALLING_EDGE)
187             {
188                 ui32Val |= AUX_TIMER_T1CFG_TICK_SRC_POL;
189             }
190 
191             //
192             // Set tick source.
193             //
194             ui32Val |= ((ui32Config & 0x00000F00) >> 8) <<
195                        AUX_TIMER_T1CFG_TICK_SRC_S;
196             HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T1CFG) = ui32Val;
197         }
198     }
199 }
200 
201 //*****************************************************************************
202 //
203 //! Start AUX timer
204 //
205 //*****************************************************************************
206 void
AUXTimerStart(uint32_t ui32Timer)207 AUXTimerStart(uint32_t ui32Timer)
208 {
209     //
210     // Check the arguments.
211     //
212     ASSERT((ui32Timer == AUX_TIMER_0) ||
213            (ui32Timer == AUX_TIMER_1) ||
214            (ui32Timer == AUX_TIMER_BOTH));
215 
216     if(ui32Timer & AUX_TIMER_0)
217     {
218         //
219         // Start timer 0.
220         //
221         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CTL) = AUX_TIMER_T0CTL_EN;
222     }
223     if(ui32Timer & AUX_TIMER_1)
224     {
225         //
226         // Start timer 1.
227         //
228         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T1CTL) = AUX_TIMER_T1CTL_EN;
229     }
230 }
231 
232 //*****************************************************************************
233 //
234 //! Stop AUX timer
235 //
236 //*****************************************************************************
237 void
AUXTimerStop(uint32_t ui32Timer)238 AUXTimerStop(uint32_t ui32Timer)
239 {
240     //
241     // Check the arguments.
242     //
243     ASSERT((ui32Timer == AUX_TIMER_0) ||
244            (ui32Timer == AUX_TIMER_1) ||
245            (ui32Timer == AUX_TIMER_BOTH));
246 
247     if(ui32Timer & AUX_TIMER_0)
248     {
249         //
250         // Stop timer 0.
251         //
252         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CTL) = 0;
253     }
254     if(ui32Timer & AUX_TIMER_1)
255     {
256         //
257         // Stop timer 1.
258         //
259         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T1CTL) = 0;
260     }
261 }
262 
263 //*****************************************************************************
264 //
265 //! Set AUX timer prescale value
266 //
267 //*****************************************************************************
268 void
AUXTimerPrescaleSet(uint32_t ui32Timer,uint32_t ui32PrescaleDiv)269 AUXTimerPrescaleSet(uint32_t ui32Timer, uint32_t ui32PrescaleDiv)
270 {
271     uint32_t ui32Val;
272 
273     //
274     // Check the arguments.
275     //
276     ASSERT((ui32Timer == AUX_TIMER_0) || (ui32Timer == AUX_TIMER_1) ||
277            (ui32Timer == AUX_TIMER_BOTH));
278     ASSERT(ui32PrescaleDiv <= AUX_TIMER_PRESCALE_DIV_32768);
279 
280     if(ui32Timer & AUX_TIMER_0)
281     {
282         //
283         // Set timer 0 prescale value.
284         //
285         ui32Val = HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CFG);
286         ui32Val &= ~AUX_TIMER_T0CFG_PRE_M;
287         ui32Val |=  ui32PrescaleDiv << AUX_TIMER_T0CFG_PRE_S;
288         HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CFG) = ui32Val;
289     }
290     if(ui32Timer & AUX_TIMER_1)
291     {
292         //
293         // Set timer 1 prescale value.
294         //
295         ui32Val = HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T1CFG);
296         ui32Val &= ~AUX_TIMER_T1CFG_PRE_M;
297         ui32Val |=  ui32PrescaleDiv << AUX_TIMER_T1CFG_PRE_S;
298         HWREG(AUX_TIMER_BASE  + AUX_TIMER_O_T1CFG) = ui32Val;
299     }
300 }
301 
302 //*****************************************************************************
303 //
304 //! Get AUX timer prescale value
305 //
306 //*****************************************************************************
307 uint32_t
AUXTimerPrescaleGet(uint32_t ui32Timer)308 AUXTimerPrescaleGet(uint32_t ui32Timer)
309 {
310     uint32_t ui32Val;
311     uint32_t ui32PrescaleDiv;
312 
313     //
314     // Check the arguments.
315     //
316     ASSERT((ui32Timer == AUX_TIMER_0) || (ui32Timer == AUX_TIMER_1));
317 
318     ui32Val = (HWREG(AUX_TIMER_BASE + AUX_TIMER_O_T0CFG));
319     if(ui32Timer & AUX_TIMER_0)
320     {
321         //
322         // Get timer 0 prescale value.
323         //
324         ui32PrescaleDiv =
325             (ui32Val & AUX_TIMER_T0CFG_PRE_M) >> AUX_TIMER_T0CFG_PRE_S;
326     }
327     else
328     {
329         //
330         // Get timer 1 prescale value.
331         //
332         ui32PrescaleDiv =
333             (ui32Val & AUX_TIMER_T1CFG_PRE_M) >> AUX_TIMER_T1CFG_PRE_S;
334     }
335 
336     return(ui32PrescaleDiv);
337 }
338