SAM4SD32 (SAM4S-EK2)
Loading...
Searching...
No Matches
pio_handler.c File Reference

Parallel Input/Output (PIO) interrupt handler for SAM. More...

#include "pio.h"
#include "pio_handler.h"

Go to the source code of this file.

Data Structures

struct  s_interrupt_source
 Describes a PIO interrupt source, including the PIO instance triggering the interrupt and the associated interrupt handler. More...

Macros

#define MAX_INTERRUPT_SOURCES   7
 Maximum number of interrupt sources that can be defined.

Functions

void pio_capture_handler_set (void(*p_handler)(Pio *))
 Set a capture interrupt handler for all PIO.
void pio_handler_process (Pio *p_pio, uint32_t ul_id)
 Process an interrupt request on the given PIO controller.
uint32_t pio_handler_set (Pio *p_pio, uint32_t ul_id, uint32_t ul_mask, uint32_t ul_attr, void(*p_handler)(uint32_t, uint32_t))
 Set an interrupt handler for the provided pins.
void pio_handler_set_priority (Pio *p_pio, IRQn_Type ul_irqn, uint32_t ul_priority)
 Initialize PIO interrupt management logic.

Variables

static struct s_interrupt_source gs_interrupt_sources [MAX_INTERRUPT_SOURCES]
static uint32_t gs_ul_nb_sources = 0
uint32_t pio_capture_enable_flag
static void(* pio_capture_handler )(Pio *) = NULL

Detailed Description

Parallel Input/Output (PIO) interrupt handler for SAM.

Copyright (c) 2011-2018 Microchip Technology Inc. and its subsidiaries.

\cond ASF_LICENSE

Definition in file pio_handler.c.

Macro Definition Documentation

◆ MAX_INTERRUPT_SOURCES

#define MAX_INTERRUPT_SOURCES   7

Maximum number of interrupt sources that can be defined.

This constant can be increased, but the current value is the smallest possible one that will be compatible with all existing projects.

Definition at line 45 of file pio_handler.c.

Referenced by pio_handler_process(), and pio_handler_set().

Function Documentation

◆ pio_capture_handler_set()

void pio_capture_handler_set ( void(* p_handler )(Pio *))

Set a capture interrupt handler for all PIO.

The handler will be called with the triggering PIO as its parameter as soon as an interrupt is detected.

Parameters
p_handlerInterrupt handler function pointer.

Definition at line 174 of file pio_handler.c.

175{
176 pio_capture_handler = p_handler;
177}
static void(* pio_capture_handler)(Pio *)
Definition pio_handler.c:69

References pio_capture_handler.

◆ pio_handler_process()

void pio_handler_process ( Pio * p_pio,
uint32_t ul_id )

Process an interrupt request on the given PIO controller.

Parameters
p_pioPIO controller base address.
ul_idPIO controller ID.

Definition at line 79 of file pio_handler.c.

80{
81 uint32_t status;
82 uint32_t i;
83
84 /* Read PIO controller status */
85 status = pio_get_interrupt_status(p_pio);
86 status &= pio_get_interrupt_mask(p_pio);
87
88 /* Check pending events */
89 if (status != 0) {
90 /* Find triggering source */
91 i = 0;
92 while (status != 0) {
93 /* Source is configured on the same controller */
94 if (gs_interrupt_sources[i].id == ul_id) {
95 /* Source has PIOs whose statuses have changed */
96 if ((status & gs_interrupt_sources[i].mask) != 0) {
98 gs_interrupt_sources[i].mask);
99 status &= ~(gs_interrupt_sources[i].mask);
100 }
101 }
102 i++;
103 if (i >= MAX_INTERRUPT_SOURCES) {
104 break;
105 }
106 }
107 }
108
109 /* Check capture events */
110#if (SAM3S || SAM4S || SAM4E)
113 pio_capture_handler(p_pio);
114 }
115 }
116#endif
117}
uint32_t pio_get_interrupt_status(const Pio *p_pio)
Read and clear PIO interrupt status.
Definition pio.c:601
uint32_t pio_get_interrupt_mask(const Pio *p_pio)
Read PIO interrupt mask.
Definition pio.c:613
uint32_t pio_capture_enable_flag
Definition pio.c:1033
static struct s_interrupt_source gs_interrupt_sources[MAX_INTERRUPT_SOURCES]
Definition pio_handler.c:62
#define MAX_INTERRUPT_SOURCES
Maximum number of interrupt sources that can be defined.
Definition pio_handler.c:45

References gs_interrupt_sources, s_interrupt_source::mask, MAX_INTERRUPT_SOURCES, pio_capture_enable_flag, pio_capture_handler, pio_get_interrupt_mask(), and pio_get_interrupt_status().

◆ pio_handler_set()

uint32_t pio_handler_set ( Pio * p_pio,
uint32_t ul_id,
uint32_t ul_mask,
uint32_t ul_attr,
void(* p_handler )(uint32_t, uint32_t) )

Set an interrupt handler for the provided pins.

The provided handler will be called with the triggering pin as its parameter as soon as an interrupt is detected.

Parameters
p_pioPIO controller base address.
ul_idPIO ID.
ul_maskPins (bit mask) to configure.
ul_attrPins attribute to configure.
p_handlerInterrupt handler function pointer.
Returns
0 if successful, 1 if the maximum number of sources has been defined.

Definition at line 132 of file pio_handler.c.

134{
135 uint8_t i;
136 struct s_interrupt_source *pSource;
137
139 return 1;
140
141 /* Check interrupt for this pin, if already defined, redefine it. */
142 for (i = 0; i <= gs_ul_nb_sources; i++) {
143 pSource = &(gs_interrupt_sources[i]);
144 if (pSource->id == ul_id && pSource->mask == ul_mask) {
145 break;
146 }
147 }
148
149 /* Define new source */
150 pSource->id = ul_id;
151 pSource->mask = ul_mask;
152 pSource->attr = ul_attr;
153 pSource->handler = p_handler;
154 if (i == gs_ul_nb_sources + 1) {
156 }
157
158 /* Configure interrupt mode */
159 pio_configure_interrupt(p_pio, ul_mask, ul_attr);
160
161 return 0;
162}
void pio_configure_interrupt(Pio *p_pio, const uint32_t ul_mask, const uint32_t ul_attr)
Configure the given interrupt source.
Definition pio.c:538
static uint32_t gs_ul_nb_sources
Definition pio_handler.c:65
Describes a PIO interrupt source, including the PIO instance triggering the interrupt and the associa...
Definition pio_handler.c:51
void(* handler)(const uint32_t, const uint32_t)
Definition pio_handler.c:57

References s_interrupt_source::attr, gs_interrupt_sources, gs_ul_nb_sources, s_interrupt_source::handler, s_interrupt_source::id, s_interrupt_source::mask, MAX_INTERRUPT_SOURCES, and pio_configure_interrupt().

◆ pio_handler_set_priority()

void pio_handler_set_priority ( Pio * p_pio,
IRQn_Type ul_irqn,
uint32_t ul_priority )

Initialize PIO interrupt management logic.

Parameters
p_pioPIO controller base address.
ul_irqnNVIC line number.
ul_priorityPIO controller interrupts priority.

Definition at line 274 of file pio_handler.c.

275{
276 uint32_t bitmask = 0;
277
278 bitmask = pio_get_interrupt_mask(p_pio);
279 pio_disable_interrupt(p_pio, 0xFFFFFFFF);
281 NVIC_DisableIRQ(ul_irqn);
282 NVIC_ClearPendingIRQ(ul_irqn);
283 NVIC_SetPriority(ul_irqn, ul_priority);
284 NVIC_EnableIRQ(ul_irqn);
285 pio_enable_interrupt(p_pio, bitmask);
286}
void pio_disable_interrupt(Pio *p_pio, const uint32_t ul_mask)
Disable a given interrupt source, with no added side effects.
Definition pio.c:589
void pio_enable_interrupt(Pio *p_pio, const uint32_t ul_mask)
Enable the given interrupt source.
Definition pio.c:578

References pio_disable_interrupt(), pio_enable_interrupt(), pio_get_interrupt_mask(), and pio_get_interrupt_status().

Variable Documentation

◆ gs_interrupt_sources

struct s_interrupt_source gs_interrupt_sources[MAX_INTERRUPT_SOURCES]
static

Definition at line 62 of file pio_handler.c.

Referenced by pio_handler_process(), and pio_handler_set().

◆ gs_ul_nb_sources

uint32_t gs_ul_nb_sources = 0
static

Definition at line 65 of file pio_handler.c.

Referenced by pio_handler_set().

◆ pio_capture_handler

void(* pio_capture_handler) (Pio *) ( Pio * ) = NULL
static

Definition at line 69 of file pio_handler.c.

Referenced by pio_capture_handler_set(), and pio_handler_process().