diff --git a/bootloader/bootloader-usb.c b/bootloader/bootloader-usb.c index 6dad89b3f88aa57099cd393af39dee6f34bf235b..2e1bd9f3280982759b76068aef989b2ab898c350 100644 --- a/bootloader/bootloader-usb.c +++ b/bootloader/bootloader-usb.c @@ -51,7 +51,7 @@ #include "msc.h" #include "descriptors.h" #include "mscmem.h" - +#include "card10.h" /***** Definitions *****/ #define EVENT_ENUM_COMP MAXUSB_NUM_EVENTS @@ -212,6 +212,8 @@ void run_usbmsc(void) printf("Remote Wakeup\n"); } } + + card10_poll(); } } diff --git a/epicardium/support.c b/epicardium/support.c index 1504d1efba6b82d4fc46d3bfa49fad89b15ebc39..957e787b8e2ee2201f55627471999461784068be 100644 --- a/epicardium/support.c +++ b/epicardium/support.c @@ -7,6 +7,8 @@ #include "api/dispatcher.h" +#include "card10.h" + extern TaskHandle_t dispatcher_task_id; /* @@ -39,6 +41,10 @@ void post_idle_sleep(TickType_t xExpectedIdleTime) if (api_dispatcher_poll_once()) { xTaskNotifyGive(dispatcher_task_id); } + + // Do card10 house keeping. E.g. polling the i2c devices if they triggered an interrupt + // TODO: Do this in a more task fokused way (high/low ISR) + card10_poll(); } void vApplicationGetIdleTaskMemory( diff --git a/lib/card10/card10.c b/lib/card10/card10.c index a2037ff9aef56068add905fdcfd9867698d2e343..0b6b38fd5c656f63a9f78e8838a5edb1a6e2133e 100644 --- a/lib/card10/card10.c +++ b/lib/card10/card10.c @@ -185,3 +185,7 @@ void core1_stop(void) { MXC_GCR->perckcn1 |= MXC_F_GCR_PERCKCN1_CPU1; } +void card10_poll(void) +{ + pmic_poll(); +} diff --git a/lib/card10/card10.h b/lib/card10/card10.h index b7c5b0630f1f9df0ae635c69d1e6e392ec9028e7..e06b8a3f71abddcd2c2ad5d0206c885ead9961c0 100644 --- a/lib/card10/card10.h +++ b/lib/card10/card10.h @@ -12,4 +12,5 @@ void card10_diag(void); void core1_start(void); void core1_stop(void); +void card10_poll(void); #endif diff --git a/lib/card10/pmic.c b/lib/card10/pmic.c index 28feae70866671a5a929df2f51dcd7314b58149b..30519a07c2e48c6b198459f800c2eccf354a30a8 100644 --- a/lib/card10/pmic.c +++ b/lib/card10/pmic.c @@ -9,11 +9,14 @@ static const gpio_cfg_t pmic_interrupt_pin = { PORT_0, PIN_12, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }; static pmic_button_callback_fn pmic_button_callback = NULL; +static volatile bool interrupt_pending; void pmic_init(void) { uint8_t didm = MAX77650_getDIDM(); uint8_t cid = MAX77650_getChipID(); + interrupt_pending = false; + printf("MAX7765x DIDM: 0x%02x CID: 0x%02x\n", didm, cid); MAX77650_setIP_SBB0(0b11); //Limit switch current of SBB0 to 500mA for noise reduction @@ -99,14 +102,23 @@ void pmic_init(void) static void pmic_interrupt_callback(void*_) { - uint8_t int_flag = MAX77650_getINT_GLBL(); + interrupt_pending = true; +} - if (int_flag & (MAX77650_INT_nEN_R | MAX77650_INT_nEN_F)) { - if (pmic_button_callback != NULL) { - (*pmic_button_callback)(int_flag & MAX77650_INT_nEN_F); +void pmic_poll(void) +{ + if(interrupt_pending) { + /* There might be a race condition here. Don't care ATM. */ + interrupt_pending = false; + uint8_t int_flag = MAX77650_getINT_GLBL(); + + if (int_flag & (MAX77650_INT_nEN_R | MAX77650_INT_nEN_F)) { + if (pmic_button_callback != NULL) { + (*pmic_button_callback)(int_flag & MAX77650_INT_nEN_F); + } } + /* TODO: Other pmic interrupts */ } - /* TODO: Other pmic interrupts */ } void pmic_set_button_callback(pmic_button_callback_fn cb) diff --git a/lib/card10/pmic.h b/lib/card10/pmic.h index 06874c289f942f0331da2ef718a07c3cfe76252e..fb522c15a271fdbabad7e0732cbd9606eb36b04f 100644 --- a/lib/card10/pmic.h +++ b/lib/card10/pmic.h @@ -6,6 +6,7 @@ void pmic_init(void); void pmic_set_led(uint8_t led, uint8_t val); +void pmic_poll(void); typedef void (*pmic_button_callback_fn)(bool falling); void pmic_set_button_callback(pmic_button_callback_fn cb);