]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/ps7_cortexa9_0/libsrc/ttcps_v2_0/src/xttcps.h
fb9363756a75e33ad33a473893e4038ce4073220
[freertos] / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo_bsp / ps7_cortexa9_0 / libsrc / ttcps_v2_0 / src / xttcps.h
1 /******************************************************************************
2 *
3 * Copyright (C) 2010 - 2014 Xilinx, Inc.  All rights reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * Use of the Software is limited solely to applications:
16 * (a) running on a Xilinx device, or
17 * (b) that interact with a Xilinx device through a bus or interconnect.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
24 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * SOFTWARE.
26 *
27 * Except as contained in this notice, the name of the Xilinx shall not be used
28 * in advertising or otherwise to promote the sale, use or other dealings in
29 * this Software without prior written authorization from Xilinx.
30 *
31 ******************************************************************************/
32 /*****************************************************************************/
33 /**
34 *
35 * @file xttcps.h
36 *
37 * This is the driver for one 16-bit timer counter in the Triple Timer Counter
38 * (TTC) module in the Ps block.
39 *
40 * The TTC module provides three independent timer/counter modules that can each
41 * be clocked using either the system clock (pclk) or an externally driven
42 * clock (ext_clk). In addition, each counter can independently prescale its
43 * selected clock input (divided by 2 to 65536). Counters can be set to
44 * decrement or increment.
45 *
46 * Each of the counters can be programmed to generate interrupt pulses:
47 *       . At a regular, predefined period, that is on a timed interval
48 *       . When the counter registers overflow
49 *       . When the count matches any one of the three 'match' registers
50 *
51 * Therefore, up to six different events can trigger a timer interrupt: three
52 * match interrupts, an overflow interrupt, an interval interrupt and an event
53 * timer interrupt. Note that the overflow interrupt and the interval interrupt
54 * are mutually exclusive.
55 *
56 * <b>Initialization & Configuration</b>
57 *
58 * An XTtcPs_Config structure is used to configure a driver instance.
59 * Information in the XTtcPs_Config structure is the hardware properties
60 * about the device.
61 *
62 * A driver instance is initialized through
63 * XTtcPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr). Where CfgPtr
64 * is a pointer to the XTtcPs_Config structure, it can be looked up statically
65 * through XTtcPs_LookupConfig(DeviceID), or passed in by the caller. The
66 * EffectiveAddr can be the static base address of the device or virtual
67 * mapped address if address translation is supported.
68 *
69 * <b>Interrupts</b>
70 *
71 * Interrupt handler is not provided by the driver, as handling of interrupt
72 * is application specific.
73 *
74 * @note
75 * The default setting for a timer/counter is:
76 *  - Overflow Mode
77 *  - Internal clock (pclk) selected
78 *  - Counter disabled
79 *  - All Interrupts disabled
80 *  - Output waveforms disabled
81 *
82 * <pre>
83 * MODIFICATION HISTORY:
84 *
85 * Ver   Who    Date     Changes
86 * ----- ------ -------- -----------------------------------------------------
87 * 1.00a drg/jz 01/20/10 First release..
88 * 2.0   adk    12/10/13 Updated as per the New Tcl API's
89 *
90 * </pre>
91 *
92 ******************************************************************************/
93
94 #ifndef XTTCPS_H                /* prevent circular inclusions */
95 #define XTTCPS_H                /* by using protection macros */
96
97 #ifdef __cplusplus
98 extern "C" {
99 #endif
100
101 /***************************** Include Files *********************************/
102
103 #include "xttcps_hw.h"
104 #include "xstatus.h"
105
106 /************************** Constant Definitions *****************************/
107
108 /** @name Configuration options
109  *
110  * Options for the device. Each of the options is bit field, so more than one
111  * options can be specified.
112  *
113  * @{
114  */
115 #define XTTCPS_OPTION_EXTERNAL_CLK      0x0001  /**< External clock source */
116 #define XTTCPS_OPTION_CLK_EDGE_NEG      0x0002  /**< Clock on trailing edge for
117                                                      external clock*/
118 #define XTTCPS_OPTION_INTERVAL_MODE     0x0004  /**< Interval mode */
119 #define XTTCPS_OPTION_DECREMENT         0x0008  /**< Decrement the counter */
120 #define XTTCPS_OPTION_MATCH_MODE        0x0010  /**< Match mode */
121 #define XTTCPS_OPTION_WAVE_DISABLE      0x0020  /**< No waveform output */
122 #define XTTCPS_OPTION_WAVE_POLARITY     0x0040  /**< Waveform polarity */
123 /*@}*/
124
125 /**************************** Type Definitions *******************************/
126
127 /**
128  * This typedef contains configuration information for the device.
129  */
130 typedef struct {
131         u16 DeviceId;     /**< Unique ID for device */
132         u32 BaseAddress;  /**< Base address for device */
133         u32 InputClockHz; /**< Input clock frequency */
134 } XTtcPs_Config;
135
136 /**
137  * The XTtcPs driver instance data. The user is required to allocate a
138  * variable of this type for each PS timer/counter device in the system. A
139  * pointer to a variable of this type is then passed to various driver API
140  * functions.
141  */
142 typedef struct {
143         XTtcPs_Config Config;   /**< Configuration structure */
144         u32 IsReady;            /**< Device is initialized and ready */
145 } XTtcPs;
146
147
148 /***************** Macros (Inline Functions) Definitions *********************/
149
150 /*
151  * Internal helper macros
152  */
153 #define InstReadReg(InstancePtr, RegOffset) \
154     (Xil_In32(((InstancePtr)->Config.BaseAddress) + (RegOffset)))
155
156 #define InstWriteReg(InstancePtr, RegOffset, Data) \
157     (Xil_Out32(((InstancePtr)->Config.BaseAddress) + (RegOffset), (Data)))
158
159 /*****************************************************************************/
160 /**
161 *
162 * This function starts the counter/timer without resetting the counter value.
163 *
164 * @param        InstancePtr is a pointer to the XTtcPs instance.
165 *
166 * @return       None
167 *
168 * @note         C-style signature:
169 *               void XTtcPs_Start(XTtcPs *InstancePtr)
170 *
171 ****************************************************************************/
172 #define XTtcPs_Start(InstancePtr)       \
173                 InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET,    \
174                 (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) &  \
175                  ~XTTCPS_CNT_CNTRL_DIS_MASK))
176
177 /*****************************************************************************/
178 /**
179 *
180 * This function stops the counter/timer. This macro may be called at any time
181 * to stop the counter. The counter holds the last value until it is reset,
182 * restarted or enabled.
183 *
184 * @param        InstancePtr is a pointer to the XTtcPs instance.
185 *
186 * @return       None
187 *
188 * @note         C-style signature:
189 *               void XTtcPs_Stop(XTtcPs *InstancePtr)
190 *
191 ****************************************************************************/
192 #define XTtcPs_Stop(InstancePtr)                \
193                 InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET,    \
194                 (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) |  \
195                  XTTCPS_CNT_CNTRL_DIS_MASK))
196
197 /*****************************************************************************/
198 /**
199 *
200 * This function checks whether the timer counter has already started.
201 *
202 * @param        InstancePtr is a pointer to the XTtcPs instance
203 *
204 * @return       Non-zero if the device has started, '0' otherwise.
205 *
206 * @note         C-style signature:
207 *               int XTtcPs_IsStarted(XTtcPs *InstancePtr)
208 *
209 ****************************************************************************/
210 #define XTtcPs_IsStarted(InstancePtr) \
211      (int)((InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) & \
212        XTTCPS_CNT_CNTRL_DIS_MASK) == 0)
213
214 /*****************************************************************************/
215 /**
216 *
217 * This function returns the current 16-bit counter value. It may be called at
218 * any time.
219 *
220 * @param        InstancePtr is a pointer to the XTtcPs instance.
221 *
222 * @return       16-bit counter value.
223 *
224 * @note         C-style signature:
225 *               u16 XTtcPs_GetCounterValue(XTtcPs *InstancePtr)
226 *
227 ****************************************************************************/
228 #define XTtcPs_GetCounterValue(InstancePtr) \
229                 (u16)InstReadReg((InstancePtr), XTTCPS_COUNT_VALUE_OFFSET)
230
231 /*****************************************************************************/
232 /**
233 *
234 * This function sets the interval value to be used in interval mode.
235 *
236 * @param        InstancePtr is a pointer to the XTtcPs instance.
237 * @param        Value is the 16-bit value to be set in the interval register.
238 *
239 * @return       None
240 *
241 * @note         C-style signature:
242 *               void XTtcPs_SetInterval(XTtcPs *InstancePtr, u16 Value)
243 *
244 ****************************************************************************/
245 #define XTtcPs_SetInterval(InstancePtr, Value)  \
246                 InstWriteReg((InstancePtr), XTTCPS_INTERVAL_VAL_OFFSET, (Value))
247
248 /*****************************************************************************/
249 /**
250 *
251 * This function gets the interval value from the interval register.
252 *
253 * @param        InstancePtr is a pointer to the XTtcPs instance.
254 *
255 * @return       16-bit interval value
256 *
257 * @note         C-style signature:
258 *               u16 XTtcPs_GetInterval(XTtcPs *InstancePtr)
259 *
260 ****************************************************************************/
261 #define XTtcPs_GetInterval(InstancePtr) \
262                 (u16)InstReadReg((InstancePtr), XTTCPS_INTERVAL_VAL_OFFSET)
263
264 /*****************************************************************************/
265 /**
266 *
267 * This macro resets the count register. It may be called at any time. The
268 * counter is reset to either 0 or 0xFFFF, or the interval value, depending on
269 * the increment/decrement mode. The state of the counter, as started or
270 * stopped, is not affected by calling reset.
271 *
272 * @param        InstancePtr is a pointer to the XTtcPs instance.
273 *
274 * @return       None
275 *
276 * @note         C-style signature:
277 *               void XTtcPs_ResetCounterValue(XTtcPs *InstancePtr)
278 *
279 ****************************************************************************/
280 #define XTtcPs_ResetCounterValue(InstancePtr) \
281                 InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET,    \
282                 (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) | \
283                  XTTCPS_CNT_CNTRL_RST_MASK))
284
285 /*****************************************************************************/
286 /**
287 *
288 * This function enables the interrupts.
289 *
290 * @param        InstancePtr is a pointer to the XTtcPs instance.
291 * @param        InterruptMask defines which interrupt should be enabled.
292 *               Constants are defined in xttcps_hw.h as XTTCPS_IXR_*.
293 *               This is a bit mask, all set bits will be enabled, cleared bits
294 *               will not be disabled.
295 *
296 * @return       None.
297 *
298 * @note
299 * C-style signature:
300 *       void XTtcPs_EnableInterrupts(XTtcPs *InstancePtr, u32 InterruptMask)
301 *
302 ******************************************************************************/
303 #define XTtcPs_EnableInterrupts(InstancePtr, InterruptMask)             \
304                 InstWriteReg((InstancePtr), XTTCPS_IER_OFFSET,          \
305                 (InstReadReg((InstancePtr), XTTCPS_IER_OFFSET) |        \
306                  (InterruptMask)))
307
308 /*****************************************************************************/
309 /**
310 *
311 * This function disables the interrupts.
312 *
313 * @param        InstancePtr is a pointer to the XTtcPs instance.
314 * @param        InterruptMask defines which interrupt should be disabled.
315 *               Constants are defined in xttcps_hw.h as XTTCPS_IXR_*.
316 *               This is a bit mask, all set bits will be disabled, cleared bits
317 *               will not be disabled.
318 *
319 * @return       None.
320 *
321 * @note
322 * C-style signature:
323 *       void XTtcPs_DisableInterrupts(XTtcPs *InstancePtr, u32 InterruptMask)
324 *
325 ******************************************************************************/
326 #define XTtcPs_DisableInterrupts(InstancePtr, InterruptMask) \
327                 InstWriteReg((InstancePtr), XTTCPS_IER_OFFSET,  \
328                 (InstReadReg((InstancePtr), XTTCPS_IER_OFFSET) &        \
329                  ~(InterruptMask)))
330
331 /*****************************************************************************/
332 /**
333 *
334 * This function reads the interrupt status.
335 *
336 * @param        InstancePtr is a pointer to the XTtcPs instance.
337 *
338 * @return       None.
339 *
340 * @note         C-style signature:
341 *               u32 XTtcPs_GetInterruptStatus(XTtcPs *InstancePtr)
342 *
343 ******************************************************************************/
344 #define XTtcPs_GetInterruptStatus(InstancePtr)   \
345                 InstReadReg((InstancePtr), XTTCPS_ISR_OFFSET)
346
347 /*****************************************************************************/
348 /**
349 *
350 * This function clears the interrupt status.
351 *
352 * @param        InstancePtr is a pointer to the XTtcPs instance.
353 * @param        InterruptMask defines which interrupt should be cleared.
354 *               Constants are defined in xttcps_hw.h as XTTCPS_IXR_*.
355 *               This is a bit mask, all set bits will be cleared, cleared bits
356 *               will not be cleared.
357 *
358 * @return       None.
359 *
360 * @note
361 * C-style signature:
362 *       void XTtcPs_ClearInterruptStatus(XTtcPs *InstancePtr, u32 InterruptMask)
363 *
364 ******************************************************************************/
365 #define XTtcPs_ClearInterruptStatus(InstancePtr, InterruptMask) \
366                 InstWriteReg((InstancePtr), XTTCPS_ISR_OFFSET, \
367                  (InterruptMask))
368
369
370 /************************** Function Prototypes ******************************/
371
372 /*
373  * Initialization functions in xttcps_sinit.c
374  */
375 XTtcPs_Config *XTtcPs_LookupConfig(u16 DeviceId);
376
377 /*
378  * Required functions, in xttcps.c
379  */
380 int XTtcPs_CfgInitialize(XTtcPs *InstancePtr,
381          XTtcPs_Config * ConfigPtr, u32 EffectiveAddr);
382
383 void XTtcPs_SetMatchValue(XTtcPs *InstancePtr, u8 MatchIndex, u16 Value);
384 u16 XTtcPs_GetMatchValue(XTtcPs *InstancePtr, u8 MatchIndex);
385
386 void XTtcPs_SetPrescaler(XTtcPs *InstancePtr, u8 PrescalerValue);
387 u8 XTtcPs_GetPrescaler(XTtcPs *InstancePtr);
388
389 void XTtcPs_CalcIntervalFromFreq(XTtcPs *InstancePtr, u32 Freq,
390         u16 *Interval, u8 *Prescaler);
391
392 /*
393  * Functions for options, in file xttcps_options.c
394  */
395 int XTtcPs_SetOptions(XTtcPs *InstancePtr, u32 Options);
396 u32 XTtcPs_GetOptions(XTtcPs *InstancePtr);
397
398 /*
399  * Function for self-test, in file xttcps_selftest.c
400  */
401 int XTtcPs_SelfTest(XTtcPs *InstancePtr);
402
403 #ifdef __cplusplus
404 }
405 #endif
406
407 #endif /* end of protection macro */