1 /*
2 * Copyright (c) 2016-2019 Arm Limited. All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <stdint.h>
18 #include "NuMicro.h"
19 #include "timer_cmsdk_drv.h"
20
21
timer_cmsdk_init(const struct timer_cmsdk_dev_t * dev)22 void timer_cmsdk_init(const struct timer_cmsdk_dev_t* dev)
23 {
24 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
25
26 if (dev->data->is_initialized == 0)
27 {
28
29 NVIC_EnableIRQ(TMR0_IRQn);
30 NVIC_EnableIRQ(TMR2_IRQn);
31
32 TIMER_Open(tmr, TIMER_PERIODIC_MODE, 1000);
33 dev->data->is_initialized = 1;
34 }
35 }
36
timer_cmsdk_is_initialized(const struct timer_cmsdk_dev_t * dev)37 bool timer_cmsdk_is_initialized(const struct timer_cmsdk_dev_t* dev)
38 {
39 return dev->data->is_initialized;
40 }
41
timer_cmsdk_enable_external_input(const struct timer_cmsdk_dev_t * dev)42 void timer_cmsdk_enable_external_input(const struct timer_cmsdk_dev_t* dev)
43 {
44 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
45 TIMER_EnableCapture(tmr, TIMER_CAPTURE_COUNTER_RESET_MODE, TIMER_CAPTURE_EVENT_RISING);
46 }
47
timer_cmsdk_disable_external_input(const struct timer_cmsdk_dev_t * dev)48 void timer_cmsdk_disable_external_input(const struct timer_cmsdk_dev_t* dev)
49 {
50 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
51 TIMER_DisableCapture(tmr);
52 }
53
timer_cmsdk_is_external_input_enabled(const struct timer_cmsdk_dev_t * dev)54 bool timer_cmsdk_is_external_input_enabled(const struct timer_cmsdk_dev_t* dev)
55 {
56 return ((((TIMER_T*)dev->cfg->base)->EXTCTL & TIMER_EXTCTL_CAPEN_Msk) != 0);
57 }
58
timer_cmsdk_set_clock_to_internal(const struct timer_cmsdk_dev_t * dev)59 void timer_cmsdk_set_clock_to_internal(const struct timer_cmsdk_dev_t* dev)
60 {
61 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
62 TIMER_DisableEventCounter(tmr);
63 }
64
timer_cmsdk_set_clock_to_external(const struct timer_cmsdk_dev_t * dev)65 void timer_cmsdk_set_clock_to_external(const struct timer_cmsdk_dev_t* dev)
66 {
67 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
68 TIMER_EnableEventCounter(tmr, TIMER_COUNTER_EVENT_RISING);
69 }
70
timer_cmsdk_is_clock_external(const struct timer_cmsdk_dev_t * dev)71 bool timer_cmsdk_is_clock_external(const struct timer_cmsdk_dev_t* dev)
72 {
73 return ((((TIMER_T *)dev->cfg->base)->CTL & TIMER_CTL_EXTCNTEN_Msk) != 0);
74 }
75
timer_cmsdk_enable(const struct timer_cmsdk_dev_t * dev)76 void timer_cmsdk_enable(const struct timer_cmsdk_dev_t* dev)
77 {
78 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
79 TIMER_Start(tmr);
80 }
81
timer_cmsdk_disable(const struct timer_cmsdk_dev_t * dev)82 void timer_cmsdk_disable(const struct timer_cmsdk_dev_t* dev)
83 {
84 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
85 TIMER_Stop(tmr);
86 }
87
timer_cmsdk_is_enabled(const struct timer_cmsdk_dev_t * dev)88 bool timer_cmsdk_is_enabled(const struct timer_cmsdk_dev_t* dev)
89 {
90 return ((((TIMER_T *)dev->cfg->base)->CTL & TIMER_CTL_CNTEN_Msk) != 0);
91 }
92
timer_cmsdk_enable_interrupt(const struct timer_cmsdk_dev_t * dev)93 void timer_cmsdk_enable_interrupt(const struct timer_cmsdk_dev_t* dev)
94 {
95 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
96 TIMER_EnableInt(tmr);
97 }
98
timer_cmsdk_disable_interrupt(const struct timer_cmsdk_dev_t * dev)99 void timer_cmsdk_disable_interrupt(const struct timer_cmsdk_dev_t* dev)
100 {
101 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
102 TIMER_DisableInt(tmr);
103 }
104
timer_cmsdk_is_interrupt_enabled(const struct timer_cmsdk_dev_t * dev)105 bool timer_cmsdk_is_interrupt_enabled(const struct timer_cmsdk_dev_t* dev)
106 {
107 return ((((TIMER_T *)dev->cfg->base)->CTL & TIMER_CTL_INTEN_Msk) != 0);
108 }
109
timer_cmsdk_is_interrupt_active(const struct timer_cmsdk_dev_t * dev)110 bool timer_cmsdk_is_interrupt_active(const struct timer_cmsdk_dev_t* dev)
111 {
112 return ((((TIMER_T *)dev->cfg->base)->INTSTS & TIMER_INTSTS_TIF_Msk) != 0);
113 }
114
timer_cmsdk_clear_interrupt(const struct timer_cmsdk_dev_t * dev)115 void timer_cmsdk_clear_interrupt(const struct timer_cmsdk_dev_t* dev)
116 {
117 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
118 TIMER_ClearIntFlag(tmr);
119 }
120
timer_cmsdk_get_current_value(const struct timer_cmsdk_dev_t * dev)121 uint32_t timer_cmsdk_get_current_value(const struct timer_cmsdk_dev_t* dev)
122 {
123 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
124 return TIMER_GetCounter(tmr);
125 }
126
timer_cmsdk_set_reload_value(const struct timer_cmsdk_dev_t * dev,uint32_t reload)127 void timer_cmsdk_set_reload_value(const struct timer_cmsdk_dev_t* dev,
128 uint32_t reload)
129 {
130 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
131
132 /* reload value must > 1 */
133 if(reload < 2)
134 {
135 reload = 2;
136 }
137
138 TIMER_SET_CMP_VALUE(tmr, reload);
139 }
140
timer_cmsdk_reset(const struct timer_cmsdk_dev_t * dev)141 void timer_cmsdk_reset(const struct timer_cmsdk_dev_t* dev)
142 {
143 TIMER_T* tmr = (TIMER_T*)dev->cfg->base;
144 TIMER_ResetCounter(tmr);
145 }
146
timer_cmsdk_get_reload_value(const struct timer_cmsdk_dev_t * dev)147 uint32_t timer_cmsdk_get_reload_value(const struct timer_cmsdk_dev_t* dev)
148 {
149 return ((TIMER_T*)dev->cfg->base)->CMP;
150 }
151
timer_cmsdk_get_elapsed_value(const struct timer_cmsdk_dev_t * dev)152 uint32_t timer_cmsdk_get_elapsed_value(const struct timer_cmsdk_dev_t* dev)
153 {
154 TIMER_T *tmr;
155
156 tmr = (TIMER_T*)dev->cfg->base;
157 return tmr->CMP - tmr->CNT;
158 }
159