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