@web-font-path: "roboto-debian.css";
Loading...
Searching...
No Matches
irq.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _HARDWARE_IRQ_H
8#define _HARDWARE_IRQ_H
9
10// These two config items are also used by assembler, so keeping separate
11// PICO_CONFIG: PICO_MAX_SHARED_IRQ_HANDLERS, Maximum number of shared IRQ handlers, default=4, advanced=true, group=hardware_irq
12#ifndef PICO_MAX_SHARED_IRQ_HANDLERS
13#define PICO_MAX_SHARED_IRQ_HANDLERS 4
14#endif
15
16// PICO_CONFIG: PICO_DISABLE_SHARED_IRQ_HANDLERS, Disable shared IRQ handlers, type=bool, default=0, group=hardware_irq
17#ifndef PICO_DISABLE_SHARED_IRQ_HANDLERS
18#define PICO_DISABLE_SHARED_IRQ_HANDLERS 0
19#endif
20
21// PICO_CONFIG: PICO_VTABLE_PER_CORE, user is using separate vector tables per core, type=bool, default=0, group=hardware_irq
22#ifndef PICO_VTABLE_PER_CORE
23#define PICO_VTABLE_PER_CORE 0
24#endif
25
26#ifndef __ASSEMBLER__
27
28#include "pico.h"
30#include "hardware/regs/intctrl.h"
31#include "hardware/regs/m0plus.h"
32
98// PICO_CONFIG: PICO_DEFAULT_IRQ_PRIORITY, Define the default IRQ priority, default=0x80, group=hardware_irq
99#ifndef PICO_DEFAULT_IRQ_PRIORITY
100#define PICO_DEFAULT_IRQ_PRIORITY 0x80
101#endif
102
103#define PICO_LOWEST_IRQ_PRIORITY 0xff
104#define PICO_HIGHEST_IRQ_PRIORITY 0x00
105
106// PICO_CONFIG: PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY, Set default shared IRQ order priority, default=0x80, group=hardware_irq
107#ifndef PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY
108#define PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY 0x80
109#endif
110
111#define PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY 0xff
112#define PICO_SHARED_IRQ_HANDLER_LOWEST_ORDER_PRIORITY 0x00
113
114// PICO_CONFIG: PARAM_ASSERTIONS_ENABLED_IRQ, Enable/disable assertions in the IRQ module, type=bool, default=0, group=hardware_irq
115#ifndef PARAM_ASSERTIONS_ENABLED_IRQ
116#define PARAM_ASSERTIONS_ENABLED_IRQ 0
117#endif
118
119#ifdef __cplusplus
120extern "C" {
121#endif
122
128typedef void (*irq_handler_t)(void);
129
130static inline void check_irq_param(__unused uint num) {
131 invalid_params_if(IRQ, num >= NUM_IRQS);
132}
133
146void irq_set_priority(uint num, uint8_t hardware_priority);
147
161uint irq_get_priority(uint num);
162
169void irq_set_enabled(uint num, bool enabled);
170
177bool irq_is_enabled(uint num);
178
185void irq_set_mask_enabled(uint32_t mask, bool enabled);
186
201void irq_set_exclusive_handler(uint num, irq_handler_t handler);
202
215
240void irq_add_shared_handler(uint num, irq_handler_t handler, uint8_t order_priority);
241
258void irq_remove_handler(uint num, irq_handler_t handler);
259
266bool irq_has_shared_handler(uint num);
267
276
286static inline void irq_clear(uint int_num) {
287 *((volatile uint32_t *) (PPB_BASE + M0PLUS_NVIC_ICPR_OFFSET)) = (1u << ((uint32_t) (int_num & 0x1F)));
288}
289
297void irq_set_pending(uint num);
298
299
304void irq_init_priorities(void);
305
318void user_irq_claim(uint irq_num);
319
334void user_irq_unclaim(uint irq_num);
335
349int user_irq_claim_unused(bool required);
350
351/*
352*! \brief Check if a user IRQ is in use on the calling core
353 * \ingroup hardware_irq
354 *
355 * User IRQs are numbered 26-31 and are not connected to any hardware, but can be triggered by \ref irq_set_pending.
356 *
357 * \note User IRQs are a core local feature; they cannot be used to communicate between cores. Therfore all functions
358 * dealing with Uer IRQs affect only the calling core
359 *
360 * \param irq_num the irq irq_num
361 * \return true if the irq_num is claimed, false otherwise
362 * \sa user_irq_claim
363 * \sa user_irq_unclaim
364 * \sa user_irq_claim_unused
365 */
366bool user_irq_is_claimed(uint irq_num);
367
368#ifdef __cplusplus
369}
370#endif
371
372#endif
373#endif
bool irq_is_enabled(uint num)
Determine if a specific interrupt is enabled on the executing core.
Definition irq.c:54
void user_irq_unclaim(uint irq_num)
Mark a user IRQ as no longer used on the calling core.
Definition irq.c:449
static void irq_clear(uint int_num)
Clear a specific interrupt on the executing core.
Definition irq.h:286
void irq_set_pending(uint num)
Force an interrupt to be pending on the executing core.
Definition irq.c:70
irq_handler_t irq_get_exclusive_handler(uint num)
Get the exclusive interrupt handler for an interrupt on the executing core.
Definition irq.c:141
irq_handler_t irq_get_vtable_handler(uint num)
Get the current IRQ handler for the specified IRQ from the currently installed hardware vector table ...
Definition irq.c:123
uint irq_get_priority(uint num)
Get specified interrupt's priority.
Definition irq.c:385
void irq_set_enabled(uint num, bool enabled)
Enable or disable a specific interrupt on the executing core.
Definition irq.c:49
void(* irq_handler_t)(void)
Interrupt handler function type.
Definition irq.h:128
void user_irq_claim(uint irq_num)
Claim ownership of a user IRQ on the calling core.
Definition irq.c:445
int user_irq_claim_unused(bool required)
Claim ownership of a free user IRQ on the calling core.
Definition irq.c:453
void irq_set_priority(uint num, uint8_t hardware_priority)
Set specified interrupt's priority.
Definition irq.c:377
void irq_remove_handler(uint num, irq_handler_t handler)
Remove a specific interrupt handler for the given irq number on the executing core.
Definition irq.c:280
bool irq_has_shared_handler(uint num)
Determine if the current handler for the given number is shared.
Definition irq.c:109
void irq_set_mask_enabled(uint32_t mask, bool enabled)
Enable/disable multiple interrupts on the executing core.
Definition irq.c:59
void irq_add_shared_handler(uint num, irq_handler_t handler, uint8_t order_priority)
Add a shared interrupt handler for an interrupt on the executing core.
Definition irq.c:206
void irq_set_exclusive_handler(uint num, irq_handler_t handler)
Set an exclusive interrupt handler for an interrupt on the executing core.
Definition irq.c:128
void irq_init_priorities(void)
Perform IRQ priority initialization for the current core.
Definition irq.c:427