From 18ec76490fbe92d153e2acd061bab700bc838afe Mon Sep 17 00:00:00 2001 From: Rahix <rahix@rahix.de> Date: Thu, 11 Jul 2019 14:21:04 +0200 Subject: [PATCH] feat(epicardium): Add a separate task for PMIC Signed-off-by: Rahix <rahix@rahix.de> --- epicardium/main.c | 30 ++++++++--------- epicardium/modules/meson.build | 3 +- epicardium/modules/modules.h | 3 ++ epicardium/modules/pmic.c | 61 ++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 epicardium/modules/pmic.c diff --git a/epicardium/main.c b/epicardium/main.c index 2b0453c2..8e01f8ee 100644 --- a/epicardium/main.c +++ b/epicardium/main.c @@ -30,21 +30,6 @@ void vApiDispatcher(void *pvParameters) } } -static void pmic_button(bool falling) -{ - if (falling) { - printf("Resetting ...\n"); - /* - * Give the UART fifo time to clear. - * TODO: Do this properly - */ - for (int i = 0; i < 0x1000000; i++) { - __asm volatile("nop"); - } - MXC_GCR->rstr0 = MXC_F_GCR_RSTR0_SYSTEM; - } -} - int main(void) { card10_init(); @@ -53,8 +38,6 @@ int main(void) /* TODO: Move this to its own function */ SCB->SCR |= SCB_SCR_SEVONPEND_Msk; - pmic_set_button_callback(pmic_button); - cdcacm_init(); printf("=> Initializing tasks ...\n"); @@ -71,6 +54,19 @@ int main(void) abort(); } + /* PMIC */ + if (xTaskCreate( + vPmicTask, + (const char *)"PMIC", + configMINIMAL_STACK_SIZE, + NULL, + tskIDLE_PRIORITY + 1, + NULL) != pdPASS) { + printf("Failed to create pmic task!\n"); + abort(); + } + + /* API */ if (xTaskCreate( vApiDispatcher, (const char *)"API Dispatcher", diff --git a/epicardium/modules/meson.build b/epicardium/modules/meson.build index 03fce22c..9f2d2c07 100644 --- a/epicardium/modules/meson.build +++ b/epicardium/modules/meson.build @@ -1,5 +1,6 @@ module_sources = files( 'leds.c', + 'pmic.c', 'serial.c', - 'vibra.c' + 'vibra.c', ) diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h index cc779a5f..5a074273 100644 --- a/epicardium/modules/modules.h +++ b/epicardium/modules/modules.h @@ -5,5 +5,8 @@ #define SERIAL_READ_BUFFER_SIZE 128 void vSerialTask(void *pvParameters); +/* ---------- PMIC --------------------------------------------------------- */ +void vPmicTask(void *pvParameters); + #endif /* MODULES_H */ diff --git a/epicardium/modules/pmic.c b/epicardium/modules/pmic.c new file mode 100644 index 00000000..41618cda --- /dev/null +++ b/epicardium/modules/pmic.c @@ -0,0 +1,61 @@ +#include <stdio.h> + +#include "max32665.h" +#include "gcr_regs.h" +#include "pmic.h" +#include "MAX77650-Arduino-Library.h" + +#include "FreeRTOS.h" +#include "task.h" + +#include "epicardium.h" +#include "modules.h" + +/* Task ID for the pmic handler */ +static TaskHandle_t pmic_task_id = NULL; + +void pmic_interrupt_callback(void *_) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + if (pmic_task_id != NULL) { + vTaskNotifyGiveFromISR(pmic_task_id, &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } +} + +void vPmicTask(void *pvParameters) +{ + pmic_task_id = xTaskGetCurrentTaskHandle(); + + while (1) { + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + + uint8_t int_flag = MAX77650_getINT_GLBL(); + + if (int_flag & MAX77650_INT_nEN_F) { + /* Button was pressed */ + printf("pmic: Button pressed!\n"); + } + if (int_flag & MAX77650_INT_nEN_R) { + /* Button was pressed */ + printf("pmic: Button released!\n"); + + printf("Resetting ...\n"); + /* + * Give the UART fifo time to clear. + * TODO: Do this properly + */ + for (int i = 0; i < 0x1000000; i++) { + __asm volatile("nop"); + } + MXC_GCR->rstr0 = MXC_F_GCR_RSTR0_SYSTEM; + } + + /* TODO: Remove when all interrupts are handled */ + if (int_flag & ~(MAX77650_INT_nEN_F | MAX77650_INT_nEN_R)) { + printf("=====> WARNING <=====\n" + "* Unhandled PMIC Interrupt: %x\n", + int_flag); + } + } +} -- GitLab