Implemented events to PAL driver for Tiva devices.

Most code from the EXT driver could be reused.
This commit is contained in:
marcoveeneman 2018-03-02 00:09:45 +01:00
parent f8b91dc682
commit 2977a2bc87
2 changed files with 1223 additions and 3 deletions

View File

@ -144,10 +144,9 @@
GPION_BIT | GPIOP_BIT | GPIOQ_BIT | GPIOR_BIT | \
GPIOS_BIT | GPIOT_BIT)
#define GPIOHBCTL_MASK (GPIO_MASK & \
(GPIOA_BIT | GPIOB_BIT | GPIOC_BIT | GPIOD_BIT | \
#define GPIOHBCTL_MASK (GPIOA_BIT | GPIOB_BIT | GPIOC_BIT | GPIOD_BIT | \
GPIOE_BIT | GPIOF_BIT | GPIOG_BIT | GPIOH_BIT | \
GPIOJ_BIT))
GPIOJ_BIT)
#define GPIOC_JTAG_MASK (0x0F)
#define GPIOD_NMI_MASK (0x80)
@ -157,6 +156,11 @@
/* Driver exported variables. */
/*===========================================================================*/
/**
* @brief Event records for all GPIO channels.
*/
palevent_t _pal_events[TIVA_GPIO_PINS];
/*===========================================================================*/
/* Driver local variables and types. */
/*===========================================================================*/
@ -202,10 +206,608 @@ static void gpio_unlock(ioportid_t port, ioportmask_t mask)
HWREG(port + GPIO_O_CR) = mask;
}
#if PAL_USE_CALLBACKS || PAL_USE_WAIT
/**
* @brief Enables GPIO IRQ sources.
*/
static void gpio_irq_enable(void)
{
#if TIVA_HAS_GPIOA
nvicEnableVector(TIVA_GPIOA_NUMBER, TIVA_EXT_GPIOA_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOB
nvicEnableVector(TIVA_GPIOB_NUMBER, TIVA_EXT_GPIOB_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOC
nvicEnableVector(TIVA_GPIOC_NUMBER, TIVA_EXT_GPIOC_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOD
nvicEnableVector(TIVA_GPIOD_NUMBER, TIVA_EXT_GPIOD_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOE
nvicEnableVector(TIVA_GPIOE_NUMBER, TIVA_EXT_GPIOE_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOF
nvicEnableVector(TIVA_GPIOF_NUMBER, TIVA_EXT_GPIOF_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOG
nvicEnableVector(TIVA_GPIOG_NUMBER, TIVA_EXT_GPIOG_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOH
nvicEnableVector(TIVA_GPIOH_NUMBER, TIVA_EXT_GPIOH_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOJ
nvicEnableVector(TIVA_GPIOJ_NUMBER, TIVA_EXT_GPIOJ_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOK
nvicEnableVector(TIVA_GPIOK_NUMBER, TIVA_EXT_GPIOK_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOL
nvicEnableVector(TIVA_GPIOL_NUMBER, TIVA_EXT_GPIOL_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOM
nvicEnableVector(TIVA_GPIOM_NUMBER, TIVA_EXT_GPIOM_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPION
nvicEnableVector(TIVA_GPION_NUMBER, TIVA_EXT_GPION_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOP
nvicEnableVector(TIVA_GPIOP0_NUMBER, TIVA_EXT_GPIOP0_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOP1_NUMBER, TIVA_EXT_GPIOP1_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOP2_NUMBER, TIVA_EXT_GPIOP2_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOP3_NUMBER, TIVA_EXT_GPIOP3_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOP4_NUMBER, TIVA_EXT_GPIOP4_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOP5_NUMBER, TIVA_EXT_GPIOP5_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOP6_NUMBER, TIVA_EXT_GPIOP6_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOP7_NUMBER, TIVA_EXT_GPIOP7_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOQ
nvicEnableVector(TIVA_GPIOQ0_NUMBER, TIVA_EXT_GPIOQ0_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOQ1_NUMBER, TIVA_EXT_GPIOQ1_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOQ2_NUMBER, TIVA_EXT_GPIOQ2_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOQ3_NUMBER, TIVA_EXT_GPIOQ3_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOQ4_NUMBER, TIVA_EXT_GPIOQ4_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOQ5_NUMBER, TIVA_EXT_GPIOQ5_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOQ6_NUMBER, TIVA_EXT_GPIOQ6_IRQ_PRIORITY);
nvicEnableVector(TIVA_GPIOQ7_NUMBER, TIVA_EXT_GPIOQ7_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOR
nvicEnableVector(TIVA_GPIOR_NUMBER, TIVA_EXT_GPIOR_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOS
nvicEnableVector(TIVA_GPIOS_NUMBER, TIVA_EXT_GPIOS_IRQ_PRIORITY);
#endif
#if TIVA_HAS_GPIOT
nvicEnableVector(TIVA_GPIOT_NUMBER, TIVA_EXT_GPIOT_IRQ_PRIORITY);
#endif
}
#endif
#define gpio_serve_irq(mask, pin, channel) { \
\
if ((mask) & (1U << (pin))) { \
_pal_isr_code(channel); \
} \
}
/**
* @brief Generic interrupt serving code for multiple pins per interrupt
* handler.
*/
#define ext_lld_serve_port_interrupt(gpio, start) \
do { \
uint32_t mis = HWREG(gpio + GPIO_O_MIS); \
\
HWREG(gpio + GPIO_O_ICR) = mis; \
\
gpio_serve_irq(mis, 0, start + 0); \
gpio_serve_irq(mis, 1, start + 1); \
gpio_serve_irq(mis, 2, start + 2); \
gpio_serve_irq(mis, 3, start + 3); \
gpio_serve_irq(mis, 4, start + 4); \
gpio_serve_irq(mis, 5, start + 5); \
gpio_serve_irq(mis, 6, start + 6); \
gpio_serve_irq(mis, 7, start + 7); \
} while (0);
/**
* @brief Generic interrupt serving code for single pin per interrupt
* handler.
*/
#define ext_lld_serve_pin_interrupt(gpio, start, pin) \
do { \
HWREG(gpio + GPIO_O_ICR) = (1 << pin); \
gpio_serve_irq((1 << pin), pin, start) \
} while (0);
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
#if TIVA_HAS_GPIOA || defined(__DOXYGEN__)
/**
* @brief GPIOA interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOA_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOA, 0);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOB || defined(__DOXYGEN__)
/**
* @brief GPIOB interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOB_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOB, 8);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOC || defined(__DOXYGEN__)
/**
* @brief GPIOC interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOC_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOC, 16);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOD || defined(__DOXYGEN__)
/**
* @brief GPIOD interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOD_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOD, 24);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOE || defined(__DOXYGEN__)
/**
* @brief GPIOE interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOE_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOE, 32);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOF || defined(__DOXYGEN__)
/**
* @brief GPIOF interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOF_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOF, 40);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOG || defined(__DOXYGEN__)
/**
* @brief GPIOG interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOG_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOG, 48);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOH || defined(__DOXYGEN__)
/**
* @brief GPIOH interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOH_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOH, 56);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOJ || defined(__DOXYGEN__)
/**
* @brief GPIOJ interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOJ_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOJ, 64);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOK || defined(__DOXYGEN__)
/**
* @brief GPIOK interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOK_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOK, 72);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOL || defined(__DOXYGEN__)
/**
* @brief GPIOL interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOL_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOL, 80);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOM || defined(__DOXYGEN__)
/**
* @brief GPIOM interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOM_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOM, 88);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPION || defined(__DOXYGEN__)
/**
* @brief GPION interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPION_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPION, 96);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOP || defined(__DOXYGEN__)
/**
* @brief GPIOP0 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOP0_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOP, 104, 0);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOP1 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOP1_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOP, 105, 1);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOP2 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOP2_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOP, 106, 2);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOP3 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOP3_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOP, 107, 3);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOP4 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOP4_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOP, 108, 4);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOP5 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOP5_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOP, 109, 5);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOP6 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOP6_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOP, 110, 6);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOP7 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOP7_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOP, 111, 7);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOQ || defined(__DOXYGEN__)
/**
* @brief GPIOQ0 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOQ0_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOQ, 112, 0);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOQ1 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOQ1_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOQ, 113, 1);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOQ2 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOQ2_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOQ, 114, 2);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOQ3 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOQ3_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOQ, 115, 3);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOQ4 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOQ4_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOQ, 116, 4);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOQ5 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOQ5_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOQ, 117, 5);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOQ6 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOQ6_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOQ, 118, 6);
OSAL_IRQ_EPILOGUE();
}
/**
* @brief GPIOQ7 interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOQ7_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_pin_interrupt(GPIOQ, 119, 7);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOR || defined(__DOXYGEN__)
/**
* @brief GPIOR interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOR_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOR, 120);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOS || defined(__DOXYGEN__)
/**
* @brief GPIOS interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOS_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOS, 128);
OSAL_IRQ_EPILOGUE();
}
#endif
#if TIVA_HAS_GPIOT || defined(__DOXYGEN__)
/**
* @brief GPIOT interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(TIVA_GPIOT_HANDLER)
{
OSAL_IRQ_PROLOGUE();
ext_lld_serve_port_interrupt(GPIOT, 132);
OSAL_IRQ_EPILOGUE();
}
#endif
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
@ -220,6 +822,14 @@ static void gpio_unlock(ioportid_t port, ioportmask_t mask)
*/
void _pal_lld_init(const PALConfig *config)
{
#if PAL_USE_CALLBACKS || PAL_USE_WAIT || defined(__DOXYGEN__)
unsigned i;
for (i = 0; i < TIVA_GPIO_PINS; i++) {
_pal_init_event(i);
}
#endif
/*
* Enables all GPIO clocks.
*/
@ -292,6 +902,9 @@ void _pal_lld_init(const PALConfig *config)
#if TIVA_HAS_GPIOT || defined(__DOXYGEN__)
gpio_init(GPIOT, &config->PTData);
#endif
#if PAL_USE_CALLBACKS || PAL_USE_WAIT
gpio_irq_enable();
#endif
}
/**
@ -362,6 +975,159 @@ void _pal_lld_setgroupmode(ioportid_t port, ioportmask_t mask, iomode_t mode)
}
}
#if PAL_USE_CALLBACKS || PAL_USE_WAIT || defined(__DOXYGEN__)
/**
* @brief Pad event enable.
* @note Programming an unknown or unsupported mode is silently ignored.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
* @param[in] mode pad event mode
*
* @notapi
*/
void _pal_lld_enablepadevent(ioportid_t port,
iopadid_t pad,
ioeventmode_t mode)
{
//uint8_t portidx;
uint32_t padmask;
//portidx = (((uint32_t)port - (uint32_t)GPIOA) >> 12) & 0x1FU;
padmask = (1 << pad);
/* Disable interrupt before changing edge configuration.*/
HWREG(port + GPIO_O_IM) &= ~padmask;
/* Configure pin to be edge-sensitive.*/
HWREG(port + GPIO_O_IS) &= ~(1 << pad);
/* Configure edges */
switch(mode & PAL_EVENT_MODE_EDGES_MASK) {
case PAL_EVENT_MODE_BOTH_EDGES:
HWREG(port + GPIO_O_IBE) |= padmask;
break;
case PAL_EVENT_MODE_RISING_EDGE:
HWREG(port + GPIO_O_IBE) &= ~padmask;
HWREG(port + GPIO_O_IEV) &= ~padmask;
break;
case PAL_EVENT_MODE_FALLING_EDGE:
HWREG(port + GPIO_O_IBE) &= ~padmask;
HWREG(port + GPIO_O_IEV) |= padmask;
break;
default:
/* Interrupt is already disabled */
break;
}
if (mode & PAL_EVENT_MODE_EDGES_MASK) {
/* Enable interrupt for this pad */
HWREG(port + GPIO_O_IM) |= padmask;
}
}
/**
* @brief Pad event disable.
* @details This function disables previously programmed event callbacks.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
*
* @notapi
*/
void _pal_lld_disablepadevent(ioportid_t port, iopadid_t pad)
{
uint8_t portidx;
uint8_t eventidx;
portidx = (((uint32_t)port - (uint32_t)GPIOA) >> 12) & 0x1FU;
eventidx = portidx * 8 + pad;
HWREG(port + GPIO_O_IM) &= ~(1 << pad);
#if PAL_USE_CALLBACKS || PAL_USE_WAIT
/* Callback cleared and/or thread reset.*/
_pal_clear_event(eventidx);
#endif
}
/**
* @brief Disables GPIO IRQ sources.
*/
void pal_lld_disable_irqs(void)
{
#if TIVA_HAS_GPIOA
nvicDisableVector(TIVA_GPIOA_NUMBER);
#endif
#if TIVA_HAS_GPIOB
nvicDisableVector(TIVA_GPIOB_NUMBER);
#endif
#if TIVA_HAS_GPIOC
nvicDisableVector(TIVA_GPIOC_NUMBER);
#endif
#if TIVA_HAS_GPIOD
nvicDisableVector(TIVA_GPIOD_NUMBER);
#endif
#if TIVA_HAS_GPIOE
nvicDisableVector(TIVA_GPIOE_NUMBER);
#endif
#if TIVA_HAS_GPIOF
nvicDisableVector(TIVA_GPIOF_NUMBER);
#endif
#if TIVA_HAS_GPIOG
nvicDisableVector(TIVA_GPIOG_NUMBER);
#endif
#if TIVA_HAS_GPIOH
nvicDisableVector(TIVA_GPIOH_NUMBER);
#endif
#if TIVA_HAS_GPIOJ
nvicDisableVector(TIVA_GPIOJ_NUMBER);
#endif
#if TIVA_HAS_GPIOK
nvicDisableVector(TIVA_GPIOK_NUMBER);
#endif
#if TIVA_HAS_GPIOL
nvicDisableVector(TIVA_GPIOL_NUMBER);
#endif
#if TIVA_HAS_GPIOM
nvicDisableVector(TIVA_GPIOM_NUMBER);
#endif
#if TIVA_HAS_GPION
nvicDisableVector(TIVA_GPION_NUMBER);
#endif
#if TIVA_HAS_GPIOP
nvicDisableVector(TIVA_GPIOP0_NUMBER);
nvicDisableVector(TIVA_GPIOP1_NUMBER);
nvicDisableVector(TIVA_GPIOP2_NUMBER);
nvicDisableVector(TIVA_GPIOP3_NUMBER);
nvicDisableVector(TIVA_GPIOP4_NUMBER);
nvicDisableVector(TIVA_GPIOP5_NUMBER);
nvicDisableVector(TIVA_GPIOP6_NUMBER);
nvicDisableVector(TIVA_GPIOP7_NUMBER);
#endif
#if TIVA_HAS_GPIOQ
nvicDisableVector(TIVA_GPIOQ0_NUMBER);
nvicDisableVector(TIVA_GPIOQ1_NUMBER);
nvicDisableVector(TIVA_GPIOQ2_NUMBER);
nvicDisableVector(TIVA_GPIOQ3_NUMBER);
nvicDisableVector(TIVA_GPIOQ4_NUMBER);
nvicDisableVector(TIVA_GPIOQ5_NUMBER);
nvicDisableVector(TIVA_GPIOQ6_NUMBER);
nvicDisableVector(TIVA_GPIOQ7_NUMBER);
#endif
#if TIVA_HAS_GPIOR
nvicDisableVector(TIVA_GPIOR_NUMBER);
#endif
#if TIVA_HAS_GPIOS
nvicDisableVector(TIVA_GPIOS_NUMBER);
#endif
#if TIVA_HAS_GPIOT
nvicDisableVector(TIVA_GPIOT_NUMBER);
#endif
}
#endif /* PAL_USE_CALLBACKS || PAL_USE_WAIT */
#endif /* HAL_USE_PAL */
/**

View File

@ -328,15 +328,255 @@ typedef uint32_t iomode_t;
*/
typedef uint32_t ioline_t;
/**
* @brief Type of an event mode.
*/
typedef uint32_t ioeventmode_t;
/**
* @brief Port Identifier.
*/
typedef uint32_t ioportid_t;
/**
* @brief Type of an pad identifier.
*/
typedef uint32_t iopadid_t;
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/**
* @name Configuration options
* @{
*/
/**
* @brief GPIOA interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOA_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOA_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOB interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOB_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOB_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOC interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOC_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOC_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOD interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOD_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOD_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOE interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOE_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOE_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOF interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOF_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOF_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOG interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOG_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOG_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOH interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOH_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOH_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOJ interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOJ_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOJ_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOK interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOK_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOK_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOL interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOL_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOL_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOM interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOM_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOM_IRQ_PRIORITY 3
#endif
/**
* @brief GPION interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPION_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPION_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOP0 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOP0_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOP0_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOP1 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOP1_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOP1_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOP2 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOP2_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOP2_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOP3 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOP3_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOP3_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOP4 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOP4_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOP4_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOP5 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOP5_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOP5_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOP6 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOP6_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOP6_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOP7 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOP7_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOP7_IRQ_PRIORITY 3
#endif
/** @} */
/**
* @brief GPIOQ0 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOQ0_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOQ0_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOQ1 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOQ1_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOQ1_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOQ2 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOQ2_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOQ2_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOQ3 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOQ3_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOQ3_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOQ4 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOQ4_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOQ4_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOQ5 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOQ5_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOQ5_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOQ6 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOQ6_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOQ6_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOQ7 interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOQ7_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOQ7_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOR interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOR_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOR_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOS interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOS_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOS_IRQ_PRIORITY 3
#endif
/**
* @brief GPIOT interrupt priority level setting.
*/
#if !defined(TIVA_EXT_GPIOT_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define TIVA_EXT_GPIOT_IRQ_PRIORITY 3
#endif
/** @} */
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
@ -360,6 +600,166 @@ typedef uint32_t ioportid_t;
#define GPIOS GPIO_PORTS_BASE
#define GPIOT GPIO_PORTT_BASE
#if TIVA_HAS_GPIOA && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOA_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOA"
#endif
#if TIVA_HAS_GPIOB && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOB_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOB"
#endif
#if TIVA_HAS_GPIOC && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOC_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOC"
#endif
#if TIVA_HAS_GPIOD && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOD_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOD"
#endif
#if TIVA_HAS_GPIOE && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOE_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOE"
#endif
#if TIVA_HAS_GPIOF && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOF_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOF"
#endif
#if TIVA_HAS_GPIOG && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOG_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOG"
#endif
#if TIVA_HAS_GPIOH && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOH_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOH"
#endif
#if TIVA_HAS_GPIOJ && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOJ_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOJ"
#endif
#if TIVA_HAS_GPIOK && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOK_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOK"
#endif
#if TIVA_HAS_GPIOL && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOL_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOL"
#endif
#if TIVA_HAS_GPIOM && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOM_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOM"
#endif
#if TIVA_HAS_GPION && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPION_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPION"
#endif
#if TIVA_HAS_GPIOP0 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOP0_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOP0"
#endif
#if TIVA_HAS_GPIOP1 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOP1_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOP1"
#endif
#if TIVA_HAS_GPIOP2 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOP2_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOP2"
#endif
#if TIVA_HAS_GPIOP3 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOP3_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOP3"
#endif
#if TIVA_HAS_GPIOP4 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOP4_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOP4"
#endif
#if TIVA_HAS_GPIOP5 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOP5_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOP5"
#endif
#if TIVA_HAS_GPIOP6 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOP6_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOP6"
#endif
#if TIVA_HAS_GPIOP7 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOP7_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOP7"
#endif
#if TIVA_HAS_GPIOQ0 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOQ0_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOQ0"
#endif
#if TIVA_HAS_GPIOQ1 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOQ1_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOQ1"
#endif
#if TIVA_HAS_GPIOQ2 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOQ2_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOQ2"
#endif
#if TIVA_HAS_GPIOQ3 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOQ3_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOQ3"
#endif
#if TIVA_HAS_GPIOQ4 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOQ4_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOQ4"
#endif
#if TIVA_HAS_GPIOQ5 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOQ5_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOQ5"
#endif
#if TIVA_HAS_GPIOQ6 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOQ6_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOQ6"
#endif
#if TIVA_HAS_GPIOQ7 && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOQ7_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOQ7"
#endif
#if TIVA_HAS_GPIOR && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOR_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOR"
#endif
#if TIVA_HAS_GPIOS && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOS_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOS"
#endif
#if TIVA_HAS_GPIOT && \
!OSAL_IRQ_IS_VALID_PRIORITY(TIVA_EXT_GPIOT_IRQ_PRIORITY)
#error "Invalid IRQ priority assigned to GPIOT"
#endif
/*===========================================================================*/
/* I/O Ports Identifiers. */
/*===========================================================================*/
@ -661,12 +1061,59 @@ typedef uint32_t ioportid_t;
#define pal_lld_clearpad(port, pad) \
(HWREG((port) + (GPIO_O_DATA + ((1 << (pad)) << 2))) = 0)
/**
* @brief Pad event enable.
* @note Programming an unknown or unsupported mode is silently ignored.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
* @param[in] mode pad event mode
*
* @notapi
*/
#define pal_lld_enablepadevent(port, pad, mode) \
_pal_lld_enablepadevent(port, pad, mode)
/**
* @brief Pad event disable.
* @details This function disables previously programmed event callbacks.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
*
* @notapi
*/
#define pal_lld_disablepadevent(port, pad) \
_pal_lld_disablepadevent(port, pad)
/**
* @brief Returns a PAL event structure associated to a pad.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
*
* @notapi
*/
#define pal_lld_get_pad_event(port, pad) \
&_pal_events[((((((uint32_t)port - (uint32_t)GPIOA) >> 12) & 0x1FU) * 8) + pad)];
/**
* @brief Returns a PAL event structure associated to a line.
*
* @param[in] line line identifier
*
* @notapi
*/
#define pal_lld_get_line_event(line) \
&_pal_events[((((((uint32_t)PAL_PORT(line) - (uint32_t)GPIOA) >> 12) & 0x1FU) * 8) + PAL_PAD(line))]
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#if !defined(__DOXYGEN__)
extern const PALConfig pal_default_config;
extern palevent_t _pal_events[TIVA_GPIO_PINS];
#endif
#ifdef __cplusplus
@ -676,6 +1123,13 @@ extern "C" {
void _pal_lld_setgroupmode(ioportid_t port,
ioportmask_t mask,
iomode_t mode);
#if PAL_USE_CALLBACKS || PAL_USE_WAIT
void _pal_lld_enablepadevent(ioportid_t port,
iopadid_t pad,
ioeventmode_t mode);
void _pal_lld_disablepadevent(ioportid_t port, iopadid_t pad);
void pal_lld_disable_irqs(void);
#endif
#ifdef __cplusplus
}
#endif