Advanced Distributed Systems module at HSLU
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

249 lines
7.8 KiB

/*
* Copyright (c) 2022, Erich Styger
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "platform.h"
#include "buttons.h"
#include "buttons_config.h"
#include <assert.h>
#include "McuButton.h"
#include "McuRTOS.h"
#include "McuLED.h"
#include "leds.h"
#include "debounce.h"
#if McuLib_CONFIG_CPU_IS_KINETIS
#include "fsl_port.h"
#elif McuLib_CONFIG_CPU_IS_LPC
#include "fsl_pint.h"
#include "fsl_syscon.h"
#endif
#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS
#include "McuSystemView.h"
#endif
typedef struct BTN_Desc_t {
McuBtn_Handle_t handle; /* handle of button pin */
} BTN_Desc_t;
static BTN_Desc_t BTN_Infos[BTN_NOF_BUTTONS];
bool BTN_IsPressed(BTN_Buttons_e btn) {
assert(btn<BTN_NOF_BUTTONS);
return McuBtn_IsOn(BTN_Infos[btn].handle);
}
uint32_t BTN_GetButtons(void) {
uint32_t val = 0;
#if McuLib_CONFIG_CPU_IS_KINETIS
if (BTN_IsPressed(BTN_NAV_UP)) {
val |= BTN_BIT_NAV_UP;
}
if (BTN_IsPressed(BTN_NAV_DOWN)) {
val |= BTN_BIT_NAV_DOWN;
}
if (BTN_IsPressed(BTN_NAV_LEFT)) {
val |= BTN_BIT_NAV_LEFT;
}
if (BTN_IsPressed(BTN_NAV_RIGHT)) {
val |= BTN_BIT_NAV_RIGHT;
}
if (BTN_IsPressed(BTN_NAV_CENTER)) {
val |= BTN_BIT_NAV_CENTER;
}
#elif McuLib_CONFIG_CPU_IS_LPC
if (BTN_IsPressed(BTN_USER)) {
val |= BTN_BIT_USER;
}
#endif
return val;
}
static void SysViewLogStart(void) {
#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS
#define MCU_SYSTEM_VIEW_USER_ID_BUTTON_INTERRUPT (0)
McuSystemView_RecordEnterISR();
McuSystemView_Print((const char*)"Pressed button\r\n");
McuSystemView_OnUserStart(MCU_SYSTEM_VIEW_USER_ID_BUTTON_INTERRUPT);
#endif
}
static void SysViewLogEnd(void) {
#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS
McuSystemView_OnUserStop(MCU_SYSTEM_VIEW_USER_ID_BUTTON_INTERRUPT);
McuSystemView_RecordExitISR();
#endif
}
#if McuLib_CONFIG_CPU_IS_KINETIS
void PORTA_IRQHandler(void) {
uint32_t flags;
uint32_t buttons = 0;
BaseType_t xHigherPriorityTaskWoken = false;
SysViewLogStart();
flags = GPIO_PortGetInterruptFlags(GPIOA);
if (flags&(1U<<BUTTONS_PINS_HATNAVLEFT_PIN)) {
buttons |= BTN_BIT_NAV_LEFT;
}
if (flags&(1U<<BUTTONS_PINS_HATNAVRIGHT_PIN)) {
buttons |= BTN_BIT_NAV_RIGHT;
}
GPIO_PortClearInterruptFlags(GPIOA, flags);
Debounce_StartDebounceFromISR(buttons, &xHigherPriorityTaskWoken);
SysViewLogEnd();
if (xHigherPriorityTaskWoken) {
taskYIELD();
}
__DSB();
}
#endif
#if McuLib_CONFIG_CPU_IS_KINETIS
void PORTB_IRQHandler(void) {
uint32_t flags;
uint32_t buttons = 0;
BaseType_t xHigherPriorityTaskWoken = false;
SysViewLogStart();
flags = GPIO_PortGetInterruptFlags(GPIOB);
if (flags&(1U<<BUTTONS_PINS_HATNAVCENTER_PIN)) {
buttons |= BTN_BIT_NAV_CENTER;
}
if (flags&(1U<<BUTTONS_PINS_HATNAVDOWN_PIN)) {
buttons |= BTN_BIT_NAV_DOWN;
}
if (flags&(1U<<BUTTONS_PINS_HATNAVUP_PIN)) {
buttons |= BTN_BIT_NAV_UP;
}
GPIO_PortClearInterruptFlags(GPIOB, flags);
Debounce_StartDebounceFromISR(buttons, &xHigherPriorityTaskWoken);
SysViewLogEnd();
if (xHigherPriorityTaskWoken) {
taskYIELD();
}
__DSB(); /* need barrier due ARM Cortex bug */
}
#endif
#if McuLib_CONFIG_CPU_IS_LPC
static void pint_intr_callback(pint_pin_int_t pintr, uint32_t pmatch_status) {
SysViewLogStart();
/*! \todo handle interrupt */
SysViewLogEnd();
}
#endif
void BTN_Deinit(void) {
#if McuLib_CONFIG_CPU_IS_KINETIS
DisableIRQ(PORTA_IRQn);
DisableIRQ(PORTB_IRQn);
#endif
for(int i=0; i<BTN_NOF_BUTTONS; i++) {
BTN_Infos[i].handle = McuBtn_DeinitButton(BTN_Infos[i].handle);
}
}
void BTN_Init(void) {
McuGPIO_Init();
McuBtn_Init();
#if McuLib_CONFIG_CPU_IS_KINETIS
McuBtn_Config_t btnConfig;
BUTTONS_ENABLE_CLOCK();
McuBtn_GetDefaultConfig(&btnConfig);
btnConfig.isLowActive = true;
btnConfig.hw.gpio = BUTTONS_PINS_HATNAVCENTER_GPIO;
btnConfig.hw.port = BUTTONS_PINS_HATNAVCENTER_PORT;
btnConfig.hw.pin = BUTTONS_PINS_HATNAVCENTER_PIN;
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
btnConfig.hw.pull = McuGPIO_PULL_UP;
#endif
BTN_Infos[BTN_NAV_CENTER].handle = McuBtn_InitButton(&btnConfig);
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
McuBtn_EnablePullResistor(BTN_Infos[BTN_NAV_CENTER].handle); /* note: only required if using a McuLib prior 18-Mar-21 */
#endif
btnConfig.hw.gpio = BUTTONS_PINS_HATNAVLEFT_GPIO;
btnConfig.hw.port = BUTTONS_PINS_HATNAVLEFT_PORT;
btnConfig.hw.pin = BUTTONS_PINS_HATNAVLEFT_PIN;
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
btnConfig.hw.pull = McuGPIO_PULL_UP;
#endif
BTN_Infos[BTN_NAV_LEFT].handle = McuBtn_InitButton(&btnConfig);
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
McuBtn_EnablePullResistor(BTN_Infos[BTN_NAV_LEFT].handle); /* note: only required if using a McuLib prior 18-Mar-21 */
#endif
btnConfig.hw.gpio = BUTTONS_PINS_HATNAVRIGHT_GPIO;
btnConfig.hw.port = BUTTONS_PINS_HATNAVRIGHT_PORT;
btnConfig.hw.pin = BUTTONS_PINS_HATNAVRIGHT_PIN;
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
btnConfig.hw.pull = McuGPIO_PULL_UP;
#endif
BTN_Infos[BTN_NAV_RIGHT].handle = McuBtn_InitButton(&btnConfig);
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
McuBtn_EnablePullResistor(BTN_Infos[BTN_NAV_RIGHT].handle); /* note: only required if using a McuLib prior 18-Mar-21 */
#endif
btnConfig.hw.gpio = BUTTONS_PINS_HATNAVUP_GPIO;
btnConfig.hw.port = BUTTONS_PINS_HATNAVUP_PORT;
btnConfig.hw.pin = BUTTONS_PINS_HATNAVUP_PIN;
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
btnConfig.hw.pull = McuGPIO_PULL_UP;
#endif
BTN_Infos[BTN_NAV_UP].handle = McuBtn_InitButton(&btnConfig);
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
McuBtn_EnablePullResistor(BTN_Infos[BTN_NAV_UP].handle); /* note: only required if using a McuLib prior 18-Mar-21 */
#endif
btnConfig.hw.gpio = BUTTONS_PINS_HATNAVDOWN_GPIO;
btnConfig.hw.port = BUTTONS_PINS_HATNAVDOWN_PORT;
btnConfig.hw.pin = BUTTONS_PINS_HATNAVDOWN_PIN;
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
btnConfig.hw.pull = McuGPIO_PULL_UP;
#endif
BTN_Infos[BTN_NAV_DOWN].handle = McuBtn_InitButton(&btnConfig);
#if PL_CONFIG_BOARD_ID==PL_CONFIG_BOARD_ID_TINYK22_APROG_HAT_V7
McuBtn_EnablePullResistor(BTN_Infos[BTN_NAV_DOWN].handle); /* note: only required if using a McuLib prior 18-Mar-21 */
#endif
PORT_SetPinInterruptConfig(BUTTONS_PINS_HATNAVLEFT_PORT, BUTTONS_PINS_HATNAVLEFT_PIN, kPORT_InterruptFallingEdge);
PORT_SetPinInterruptConfig(BUTTONS_PINS_HATNAVRIGHT_PORT, BUTTONS_PINS_HATNAVRIGHT_PIN, kPORT_InterruptFallingEdge);
NVIC_SetPriority(PORTA_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
EnableIRQ(PORTA_IRQn);
PORT_SetPinInterruptConfig(BUTTONS_PINS_HATNAVDOWN_PORT, BUTTONS_PINS_HATNAVDOWN_PIN, kPORT_InterruptFallingEdge);
PORT_SetPinInterruptConfig(BUTTONS_PINS_HATNAVUP_PORT, BUTTONS_PINS_HATNAVUP_PIN, kPORT_InterruptFallingEdge);
PORT_SetPinInterruptConfig(BUTTONS_PINS_HATNAVCENTER_PORT, BUTTONS_PINS_HATNAVCENTER_PIN, kPORT_InterruptFallingEdge);
NVIC_SetPriority(PORTB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
EnableIRQ(PORTB_IRQn);
#elif McuLib_CONFIG_CPU_IS_LPC
/* user button on LPC845-BRK board: PIO0_4 */
McuBtn_Config_t btnConfig;
BUTTONS_ENABLE_CLOCK();
McuBtn_GetDefaultConfig(&btnConfig);
btnConfig.isLowActive = true;
btnConfig.hw.gpio = BUTTONS_USER_GPIO;
btnConfig.hw.port = BUTTONS_USER_PORT;
btnConfig.hw.pin = BUTTONS_USER_PIN;
btnConfig.hw.iocon = BUTTONS_USER_IOCON;
BTN_Infos[BTN_USER].handle = McuBtn_InitButton(&btnConfig);
SYSCON_AttachSignal(SYSCON, kPINT_PinInt0, kSYSCON_GpioPort0Pin4ToPintsel);
PINT_Init(PINT); /* Initialize PINT */
/* Setup Pin Interrupt 0 for rising edge */
PINT_PinInterruptConfig(PINT, kPINT_PinInt0, kPINT_PinIntEnableFallEdge, pint_intr_callback);
/* Enable callbacks for PINT0 by Index */
PINT_EnableCallbackByIndex(PINT, kPINT_PinInt0);
#endif
}