source: rtems/c/src/lib/libcpu/powerpc/mpc83xx/gtm/gtm.c @ ff8f05b

4.104.115
Last change on this file since ff8f05b was ff8f05b, checked in by Thomas Doerfler <Thomas.Doerfler@…>, on 03/27/10 at 14:42:26

code changes to remove warnings

  • Property mode set to 100644
File size: 6.4 KB
Line 
1/**
2 * @file
3 *
4 * @brief Source file for timer functions.
5 */
6
7/*
8 * Copyright (c) 2008
9 * Embedded Brains GmbH
10 * Obere Lagerstr. 30
11 * D-82178 Puchheim
12 * Germany
13 * rtems@embedded-brains.de
14 *
15 * The license and distribution terms for this file may be found in the file
16 * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
17 */
18
19#include <rtems/bspIo.h>
20
21#include <mpc83xx/mpc83xx.h>
22#include <mpc83xx/gtm.h>
23
24#define RTEMS_STATUS_CHECKS_USE_PRINTK
25
26#include <rtems/status-checks.h>
27
28#define MPC83XX_GTM_CHECK_INDEX( timer) \
29        if (( timer) < 0 || ( timer) >= MPC83XX_GTM_NUMBER) { \
30                return RTEMS_INVALID_NUMBER; \
31        }
32
33#define GTM_MODULE(timer)       ((timer)/4)
34#define GTM_MODULE_TIMER(timer) ((timer)%4)
35#define GTM_HIGH(timer)         (GTM_MODULE_TIMER(timer)/2)
36#define GTM_LOW(timer)          (GTM_MODULE_TIMER(timer)%2)
37
38#define MPC83XX_GTM_CLOCK_MASK MPC83XX_GTM_CLOCK_EXTERN
39
40static const uint8_t mpc83xx_gmt_interrupt_vector_table [MPC83XX_GTM_NUMBER] = { 90, 78, 84, 72, 91, 79, 85, 73 };
41
42static const uint8_t mpc83xx_gmt_interrupt_priority_table [MPC83XX_GTM_NUMBER] = { 113, 77, 95, 59, 116, 80, 98, 62 };
43
44rtems_status_code mpc83xx_gtm_initialize( int timer, int clock)
45{
46        rtems_status_code sc = RTEMS_SUCCESSFUL;
47        rtems_interrupt_level level;
48
49        unsigned mask = 0xfU << (GTM_LOW(timer) * 4);
50        unsigned flags = 0x3U << (GTM_LOW(timer) * 4);
51        uint8_t reg = 0;
52
53        MPC83XX_GTM_CHECK_INDEX( timer);
54
55        rtems_interrupt_disable( level);
56
57        reg = mpc83xx.gtm [GTM_MODULE(timer)].gtcfr [GTM_HIGH(timer)].reg;
58        mpc83xx.gtm [GTM_MODULE(timer)].gtcfr [GTM_HIGH(timer)].reg =
59          (uint8_t) ((reg & ~mask) | flags);
60
61        mpc83xx.gtm [GTM_MODULE(timer)]
62          .gt_tim_regs [GTM_HIGH(timer)]
63          .gtmdr [GTM_LOW(timer)] = 0;
64
65        rtems_interrupt_enable( level);
66
67        sc = mpc83xx_gtm_set_clock( timer, clock);
68        RTEMS_CHECK_SC( sc, "Set clock");
69
70        sc = mpc83xx_gtm_set_value( timer, 0);
71        RTEMS_CHECK_SC( sc, "Set value");
72
73        sc = mpc83xx_gtm_set_reference( timer, 0);
74        RTEMS_CHECK_SC( sc, "Set reference");
75
76        sc = mpc83xx_gtm_set_prescale( timer, 0);
77        RTEMS_CHECK_SC( sc, "Set prescale");
78
79        return RTEMS_SUCCESSFUL;
80}
81
82rtems_status_code mpc83xx_gtm_enable_restart( int timer, bool enable)
83{
84        rtems_interrupt_level level;
85        MPC83XX_GTM_CHECK_INDEX( timer);
86
87        rtems_interrupt_disable( level);
88
89        if (enable) {
90                mpc83xx.gtm [GTM_MODULE(timer)]
91                  .gt_tim_regs [GTM_HIGH(timer)]
92                  .gtmdr [GTM_LOW(timer)] |= 0x0008;
93        } else {
94                mpc83xx.gtm [GTM_MODULE(timer)]
95                  .gt_tim_regs [GTM_HIGH(timer)]
96                  .gtmdr [GTM_LOW(timer)] &= ~0x0008;
97        }
98
99        rtems_interrupt_enable( level);
100
101        return RTEMS_SUCCESSFUL;
102}
103
104rtems_status_code mpc83xx_gtm_set_clock( int timer, int clock)
105{
106        rtems_interrupt_level level;
107        uint16_t reg = 0;
108
109        MPC83XX_GTM_CHECK_INDEX( timer);
110
111        if (clock & ~MPC83XX_GTM_CLOCK_MASK) {
112                return RTEMS_INVALID_CLOCK;
113        }
114
115        rtems_interrupt_disable( level);
116
117        reg = mpc83xx.gtm [GTM_MODULE(timer)]
118          .gt_tim_regs [GTM_HIGH(timer)]
119          .gtmdr [GTM_LOW(timer)];
120        mpc83xx.gtm [GTM_MODULE(timer)]
121          .gt_tim_regs [GTM_HIGH(timer)]
122          .gtmdr [GTM_LOW(timer)] = (reg & ~MPC83XX_GTM_CLOCK_MASK) | clock;
123
124        rtems_interrupt_enable( level);
125
126        return RTEMS_SUCCESSFUL;
127}
128
129rtems_status_code mpc83xx_gtm_get_clock( int timer, int *clock)
130{
131        MPC83XX_GTM_CHECK_INDEX( timer);
132
133        *clock = mpc83xx.gtm [GTM_MODULE(timer)]
134          .gt_tim_regs [GTM_HIGH(timer)]
135          .gtmdr [GTM_LOW(timer)] & MPC83XX_GTM_CLOCK_MASK;
136
137        return RTEMS_SUCCESSFUL;
138}
139
140rtems_status_code mpc83xx_gtm_start( int timer)
141{
142        rtems_interrupt_level level;
143        uint8_t flags = 0x2 << (GTM_LOW(timer) * 4);
144
145        MPC83XX_GTM_CHECK_INDEX( timer);
146
147        rtems_interrupt_disable( level);
148        mpc83xx.gtm [GTM_MODULE(timer)]
149.gtcfr [GTM_HIGH(timer)].reg &= ~flags;
150        rtems_interrupt_enable( level);
151
152        return RTEMS_SUCCESSFUL;
153}
154
155rtems_status_code mpc83xx_gtm_stop( int timer)
156{
157        rtems_interrupt_level level;
158        uint8_t flags = 0x2 << (GTM_LOW(timer) * 4);
159
160        MPC83XX_GTM_CHECK_INDEX( timer);
161
162        rtems_interrupt_disable( level);
163        mpc83xx.gtm [GTM_MODULE(timer)].gtcfr [GTM_HIGH(timer)].reg |= flags;
164        rtems_interrupt_enable( level);
165
166        return RTEMS_SUCCESSFUL;
167}
168
169rtems_status_code mpc83xx_gtm_set_value( int timer, uint16_t value)
170{
171        MPC83XX_GTM_CHECK_INDEX( timer);
172
173        mpc83xx.gtm [GTM_MODULE(timer)].gt_tim_regs [GTM_HIGH(timer)].gtcnr [GTM_LOW(timer)] = value;
174
175        return RTEMS_SUCCESSFUL;
176}
177
178rtems_status_code mpc83xx_gtm_get_value( int timer, uint16_t *value)
179{
180        MPC83XX_GTM_CHECK_INDEX( timer);
181
182        *value = mpc83xx.gtm [GTM_MODULE(timer)].gt_tim_regs [GTM_HIGH(timer)].gtcnr [GTM_LOW(timer)];
183
184        return RTEMS_SUCCESSFUL;
185}
186
187rtems_status_code mpc83xx_gtm_set_reference( int timer, uint16_t reference)
188{
189        MPC83XX_GTM_CHECK_INDEX( timer);
190
191        mpc83xx.gtm [GTM_MODULE(timer)].gt_tim_regs [GTM_HIGH(timer)].gtrfr [GTM_LOW(timer)] = reference;
192
193        return RTEMS_SUCCESSFUL;
194}
195
196rtems_status_code mpc83xx_gtm_get_reference( int timer, uint16_t *reference)
197{
198        MPC83XX_GTM_CHECK_INDEX( timer);
199
200        *reference = mpc83xx.gtm [GTM_MODULE(timer)].gt_tim_regs [GTM_HIGH(timer)].gtrfr [GTM_LOW(timer)];
201
202        return RTEMS_SUCCESSFUL;
203}
204
205rtems_status_code mpc83xx_gtm_set_prescale( int timer, uint8_t prescale)
206{
207        MPC83XX_GTM_CHECK_INDEX( timer);
208
209        mpc83xx.gtm [GTM_MODULE(timer)].gtpsr [GTM_MODULE_TIMER(timer)] = prescale;
210
211        return RTEMS_SUCCESSFUL;
212}
213
214rtems_status_code mpc83xx_gtm_get_prescale( int timer, uint8_t *prescale)
215{
216        MPC83XX_GTM_CHECK_INDEX( timer);
217
218        *prescale = mpc83xx.gtm [GTM_MODULE(timer)].gtpsr [GTM_MODULE_TIMER(timer)];
219
220        return RTEMS_SUCCESSFUL;
221}
222
223rtems_status_code mpc83xx_gtm_interrupt_get_vector( int timer, rtems_vector_number *vector)
224{
225        MPC83XX_GTM_CHECK_INDEX( timer);
226
227        *vector = mpc83xx_gmt_interrupt_vector_table [timer];
228
229        return RTEMS_SUCCESSFUL;
230}
231
232rtems_status_code mpc83xx_gtm_interrupt_enable( int timer)
233{
234        rtems_interrupt_level level;
235        MPC83XX_GTM_CHECK_INDEX( timer);
236
237        rtems_interrupt_disable( level);
238        mpc83xx.gtm [GTM_MODULE(timer)].gt_tim_regs [GTM_HIGH(timer)].gtmdr [GTM_LOW(timer)] |= 0x0010;
239        rtems_interrupt_enable( level);
240
241        return RTEMS_SUCCESSFUL;
242}
243
244rtems_status_code mpc83xx_gtm_interrupt_disable( int timer)
245{
246        rtems_interrupt_level level;
247        MPC83XX_GTM_CHECK_INDEX( timer);
248
249        rtems_interrupt_disable( level);
250        mpc83xx.gtm [GTM_MODULE(timer)].gt_tim_regs [GTM_HIGH(timer)].gtmdr [GTM_LOW(timer)] &= ~0x0010;
251        rtems_interrupt_enable( level);
252
253        return RTEMS_SUCCESSFUL;
254}
255
256rtems_status_code mpc83xx_gtm_interrupt_clear( int timer)
257{
258        MPC83XX_GTM_CHECK_INDEX( timer);
259
260        mpc83xx.gtm [GTM_MODULE(timer)].gtevr [GTM_MODULE_TIMER(timer)] = 0x0002;
261
262        return RTEMS_SUCCESSFUL;
263}
Note: See TracBrowser for help on using the repository browser.