1
0
forked from me/IronOS

Add manual irq line check for the int task for PD

This commit is contained in:
Ben V. Brown
2021-04-05 15:05:12 +10:00
parent 16ac45d74a
commit 854189d720
5 changed files with 26 additions and 9 deletions

View File

@@ -8,5 +8,6 @@
#ifndef USER_BSP_PD_H_
#define USER_BSP_PD_H_
#include "BSP.h"
bool getFUS302IRQLow(); // Return true if the IRQ line is still held low
#endif /* USER_BSP_PD_H_ */

View File

@@ -6,7 +6,9 @@
*/
#include "IRQ.h"
#include "Pins.h"
#include "int_n.h"
/*
* Catch the IRQ that says that the conversion is done on the temperature
* readings coming in Once these have come in we can unblock the PID so that it
@@ -32,3 +34,8 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
(void)GPIO_Pin;
InterruptHandler::irqCallback();
}
bool getFUS302IRQLow() {
// Return true if the IRQ line is still held low
return HAL_GPIO_ReadPin(INT_PD_GPIO_Port, INT_PD_Pin) == GPIO_PIN_RESET;
}

View File

@@ -118,6 +118,10 @@ void EXTI5_9_IRQHandler(void) {
#endif
}
bool getFUS302IRQLow() {
// Return true if the IRQ line is still held low
return (RESET == gpio_input_bit_get(FUSB302_IRQ_GPIO_Port, FUSB302_IRQ_Pin));
}
// These are unused for now
void I2C0_EV_IRQHandler(void) {}

View File

@@ -17,6 +17,7 @@
#include "int_n.h"
#include "BSP.h"
#include "BSP_PD.h"
#include "fusb302b.h"
#include "fusbpd.h"
#include "policy_engine.h"
@@ -39,9 +40,11 @@ void InterruptHandler::Thread(const void *arg) {
union fusb_status status;
while (true) {
/* If the INT_N line is low */
if (xTaskNotifyWait(0x00, 0x0F, NULL, PolicyEngine::setupCompleteOrTimedOut() ? 1000 : 10) == pdPASS) {
// delay slightly so we catch the crc with better timing
osDelay(1);
if (!getFUS302IRQLow()) {
if (xTaskNotifyWait(0x00, 0x0F, NULL, PolicyEngine::setupCompleteOrTimedOut() ? 100 : 10) == pdPASS) {
// delay slightly so we catch the crc with better timing
// osDelay(1);
}
}
/* Read the FUSB302B status and interrupt registers */
fusb_get_status(&status);
@@ -68,9 +71,11 @@ void InterruptHandler::Thread(const void *arg) {
}
}
void InterruptHandler::irqCallback() {
if (TaskHandle != NULL) {
BaseType_t taskWoke = pdFALSE;
xTaskNotifyFromISR(TaskHandle, 0, eNotifyAction::eNoAction, &taskWoke);
portYIELD_FROM_ISR(taskWoke);
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
if (TaskHandle != NULL) {
BaseType_t taskWoke = pdFALSE;
xTaskNotifyFromISR(TaskHandle, 0x01, eNotifyAction::eSetValueWithOverwrite, &taskWoke);
portYIELD_FROM_ISR(taskWoke);
}
}
}

View File

@@ -25,7 +25,7 @@
/* PD Buddy thread priorities */
#define PDB_PRIO_PE (osPriorityAboveNormal)
#define PDB_PRIO_PRL (osPriorityNormal)
#define PDB_PRIO_PRL_INT_N (osPriorityBelowNormal)
#define PDB_PRIO_PRL (osPriorityAboveNormal)
#define PDB_PRIO_PRL_INT_N (osPriorityAboveNormal)
#endif /* PDB_CONF_H */