source: rtems/bsps/arm/atsam/include/libchip/include/pio_it.h

Last change on this file was d60b6d7c, checked in by Christian Mauderer <christian.mauderer@…>, on Oct 15, 2019 at 3:10:00 PM

bsp/atsam: Add additional PIO helper.

  • Property mode set to 100644
File size: 4.9 KB
Line 
1/* ---------------------------------------------------------------------------- */
2/*                  Atmel Microcontroller Software Support                      */
3/*                       SAM Software Package License                           */
4/* ---------------------------------------------------------------------------- */
5/* Copyright (c) 2015, Atmel Corporation                                        */
6/*                                                                              */
7/* All rights reserved.                                                         */
8/*                                                                              */
9/* Redistribution and use in source and binary forms, with or without           */
10/* modification, are permitted provided that the following condition is met:    */
11/*                                                                              */
12/* - Redistributions of source code must retain the above copyright notice,     */
13/* this list of conditions and the disclaimer below.                            */
14/*                                                                              */
15/* Atmel's name may not be used to endorse or promote products derived from     */
16/* this software without specific prior written permission.                     */
17/*                                                                              */
18/* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR   */
19/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
20/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE   */
21/* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,      */
22/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
23/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,  */
24/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    */
25/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING         */
26/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */
27/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                           */
28/* ---------------------------------------------------------------------------- */
29
30/**
31 *  \file
32 *
33 *  \par Purpose
34 *
35 *  Configuration and handling of interrupts on PIO status changes. The API
36 *  provided here have several advantages over the traditional PIO interrupt
37 *  configuration approach:
38 *     - It is highly portable
39 *     - It automatically demultiplexes interrupts when multiples pins have been
40 *       configured on a single PIO controller
41 *     - It allows a group of pins to share the same interrupt
42 *
43 *  However, it also has several minor drawbacks that may prevent from using it
44 *  in particular applications:
45 *     - It enables the clocks of all PIO controllers
46 *     - PIO controllers all share the same interrupt handler, which does the
47 *       demultiplexing and can be slower than direct configuration
48 *     - It reserves space for a fixed number of interrupts, which can be
49 *       increased by modifying the appropriate constant in pio_it.c.
50 *
51 *  \par Usage
52 *
53 *  -# Initialize the PIO interrupt mechanism using PIO_InitializeInterrupts()
54 *     with the desired priority (0 ... 7).
55 *  -# Configure a status change interrupt on one or more pin(s) with
56 *     PIO_ConfigureIt().
57 *  -# Enable & disable interrupts on pins using PIO_EnableIt() and
58 *     PIO_DisableIt().
59 */
60
61#ifndef _PIO_IT_
62#define _PIO_IT_
63
64/*
65 *         Headers
66 */
67
68#include "pio.h"
69#include <rtems.h>
70
71#ifdef __cplusplus
72extern "C" {
73#endif
74
75/*
76 *         Global functions
77 */
78
79extern void PIO_InitializeInterrupts(uint32_t dwPriority);
80
81extern void PIO_ConfigureIt(const Pin *pPin,
82    void (*handler)(const Pin *, void *arg), void *arg);
83
84extern rtems_status_code PIO_RemoveIt(const Pin *pPin,
85    void (*handler)(const Pin *, void *arg), void *arg);
86
87/**
88 * Enables the given interrupt source if it has been configured. The status
89 * register of the corresponding PIO controller is cleared prior to enabling
90 * the interrupt.
91 * \param pPin  Interrupt source to enable.
92 */
93static inline void PIO_EnableIt(const Pin *pPin)
94{
95        pPin->pio->PIO_ISR;
96        pPin->pio->PIO_IER = pPin->mask;
97}
98
99/**
100 * Disables a given interrupt source, with no added side effects.
101 *
102 * \param pPin  Interrupt source to disable.
103 */
104static inline void PIO_DisableIt(const Pin *pPin)
105{
106        pPin->pio->PIO_IDR = pPin->mask;
107}
108
109/**
110 * Check whether a given interrupt source is active.
111 *
112 * \param pPin  Interrupt source to check.
113 */
114static inline bool PIO_ItIsActive(const Pin *pPin)
115{
116        return ((pPin->pio->PIO_IMR & pPin->mask) != 0);
117}
118
119extern void PIO_IT_InterruptHandler(void);
120
121extern void PioInterruptHandler(uint32_t id, Pio *pPio);
122
123extern void PIO_CaptureHandler(void);
124
125#ifdef __cplusplus
126}
127#endif
128
129#endif /* #ifndef _PIO_IT_ */
130
Note: See TracBrowser for help on using the repository browser.