diff --git a/epicardium/main.c b/epicardium/main.c index 2b0453c2c0922a3dd0a341d3e744a2e987a6e652..8e01f8ee9d3c15e14dbd077f4b4650f57f69373d 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 03fce22cb86c55267fabd05db5136cfb778098a9..9f2d2c070b0978786fa00f1390f8d36788099427 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 cc779a5f324d68564886c371bf3593e3502fd37f..5a074273748019293f30c6ae299c830a019c497c 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 0000000000000000000000000000000000000000..41618cdae0dd23c4c0657d75377a738cb5b94a98 --- /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); + } + } +}