* Add SDK * fork * massaging makefile * Drop git module * Bring in sdk as its broken Far, Far to much crap to fix with regex now * Remove bl706 * rf_para_flash_t is missing defs * Remove crapton of junk * Remove yet more * Poking I2C * Update peripheral_config.h * Update pinmux_config.h * Update preRTOS.cpp * Update main.hpp * Setup template * Verbose boot * I2C ish * Update I2C_Wrapper.cpp * Update main.cpp * Turn off I2C reading for now * Display running * Roughing out scheduling timer0 * Starting ADC setup * Working scheduling of ADC 🎉 * Format adc headers * Update IRQ.cpp * Buttons working * Slow down I2C * Poking IRQ * Larger stack required * Accel on * Trying to chase down why __libc_init_array isnt working yet * Working c++ * Cleanup * Bump stacks * I2C wake part workaround * Cleanup * Working PWM init * qc draft * Hookup PWM * Stable enough ADC * ADC timing faster + timer without HAL * Silence * Remove boot banner * Tuning in ADC * Wake PID after ADC * Remove unused hal * Draft flash settings * Working settings save & restore * Update to prod model * Cleanup * NTC thermistor * Correct adc gain * Rough tip resistance progress * Scratch out resistance awareness of the tip * better adc settings * Tweaking ADC * ADC tweaking * Make adc range scalable * Update Dockerfile * Update configuration.h * Can read same ADC twice in a row * ADC Setup * Update PIDThread.cpp * Lesser adc backoff * Update USBPD.h * Add device ID * Update BSP_Power.h * Update BSP.cpp * DrawHex dynamicLength * Shorter ID padding * Show validation code * tip measurement * Create access for w0w1 * Expose w0 w1 * Enable debug * crc32 * Device validation * wip starting epr * Logic refactor * Safer PWM Init * PD cleanups * Update bl702_pwm.c * Update power.cpp * Update usb-pd * io * EPR decode * Better gui for showing pd specs * Rough handler for capabilities * EPR * Fix > 25V input * Perform pow step after PPS * Update BSP.cpp * Fix timer output * QC3 * Add tip resistance view * Hold PD negotiation until detection is done for tip res * Get Thermal mass * Tip res =0 protection * Update PIDThread.cpp * Update GUIThread.cpp * Rewrite tip resistance measurement * Update GUIThread.cpp * Fix fallback * Far better tip resistance measurement * Fix QC 0.6V D- * Convert the interpolator to int32 * Correct the NTC lookup * Update BSP.cpp * Update Setup.cpp * . Update configuration #defines More backported functions * Update usb-pd * More missed updates * Refactor BSP Magic BSP -> PinecilV2 Pine64 BSP -> Pinecil Update Makefile * Add Pinecilv2 to CI * Pinecil v2 multi-lang Update push.yml * Update HallSensor.md * Update README.md * Fix wrong prestartcheck default * Fix logo mapping * Update Makefile * Remove unused font block * Style * Style * Remove unused timer funcs * More culling TS80P * Revert "More culling TS80P" This reverts commit2078b89be7. * Revert "Remove unused timer funcs" This reverts commit0c693a89cc. * Make VBus check maskable * Remove DMA half transfer * Drop using brightness and invert icons and go back to text Saves flash space * Refactor settings UI drawing descriptions * Shorten setting function names * Store bin file assets * Fix MHP prestart
179 lines
5.3 KiB
C++
179 lines
5.3 KiB
C++
/*
|
|
* IRQ.c
|
|
*
|
|
* Created on: 30 May 2020
|
|
* Author: Ralim
|
|
*/
|
|
|
|
#include "IRQ.h"
|
|
#include "Pins.h"
|
|
#include "configuration.h"
|
|
#include "history.hpp"
|
|
|
|
extern "C" {
|
|
#include "bflb_platform.h"
|
|
#include "bl702_adc.h"
|
|
#include "bl702_glb.h"
|
|
#include "bl702_pwm.h"
|
|
#include "bl702_timer.h"
|
|
}
|
|
|
|
#define ADC_Filter_Smooth 4
|
|
history<uint16_t, ADC_Filter_Smooth> ADC_Vin;
|
|
history<uint16_t, ADC_Filter_Smooth> ADC_Temp;
|
|
history<uint16_t, ADC_Filter_Smooth> ADC_Tip;
|
|
void adc_fifo_irq(void) {
|
|
if (ADC_GetIntStatus(ADC_INT_FIFO_READY) == SET) {
|
|
// Read out all entries in the fifo
|
|
while (ADC_Get_FIFO_Count()) {
|
|
volatile uint32_t reading = ADC_Read_FIFO();
|
|
// As per manual, 26 bit reading; lowest 16 are the ADC
|
|
uint16_t sample = reading & 0xFFFF;
|
|
uint8_t source = (reading >> 21) & 0b11111;
|
|
switch (source) {
|
|
case TMP36_ADC_CHANNEL:
|
|
ADC_Temp.update(sample);
|
|
break;
|
|
case TIP_TEMP_ADC_CHANNEL:
|
|
ADC_Tip.update(sample);
|
|
break;
|
|
case VIN_ADC_CHANNEL:
|
|
ADC_Vin.update(sample);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// unblock the PID controller thread
|
|
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
|
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
|
if (pidTaskNotification) {
|
|
vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken);
|
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
|
}
|
|
}
|
|
}
|
|
// Clear IRQ
|
|
ADC_IntClr(ADC_INT_ALL);
|
|
}
|
|
|
|
static bool fastPWM = false;
|
|
static void switchToFastPWM(void);
|
|
|
|
volatile uint16_t PWMSafetyTimer = 0;
|
|
volatile uint8_t pendingPWM = 0;
|
|
volatile bool lastPeriodWasFast = false;
|
|
|
|
// Timer 0 is used to co-ordinate the ADC and the output PWM
|
|
void timer0_comp0_callback(void) { ADC_Start(); }
|
|
void timer0_comp1_callback(void) { PWM_Channel_Disable(PWM_Channel); }
|
|
void timer0_comp2_callback(void) {
|
|
|
|
// This occurs at timer rollover, so if we want to turn on the output PWM; we do so
|
|
if (PWMSafetyTimer) {
|
|
PWMSafetyTimer--;
|
|
if (lastPeriodWasFast != fastPWM) {
|
|
if (fastPWM) {
|
|
switchToFastPWM();
|
|
} else {
|
|
switchToSlowPWM();
|
|
}
|
|
}
|
|
// Update trigger for the end point of the PWM cycle
|
|
if (pendingPWM > 0) {
|
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, pendingPWM - 1);
|
|
// Turn on output
|
|
PWM_Channel_Enable(PWM_Channel);
|
|
} else {
|
|
// Leave output off
|
|
PWM_Channel_Disable(PWM_Channel);
|
|
}
|
|
} else {
|
|
PWM_Channel_Disable(PWM_Channel);
|
|
}
|
|
}
|
|
|
|
void switchToFastPWM(void) {
|
|
fastPWM = true;
|
|
totalPWM = powerPWM + tempMeasureTicks + holdoffTicks;
|
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
|
|
|
// ~10Hz
|
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks);
|
|
// Set divider to 11
|
|
|
|
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
|
|
|
|
tmpVal = BL_SET_REG_BITS_VAL(tmpVal, TIMER_TCDR2, 11);
|
|
|
|
BL_WR_REG(TIMER_BASE, TIMER_TCDR, tmpVal);
|
|
}
|
|
|
|
void switchToSlowPWM(void) {
|
|
// 5Hz
|
|
fastPWM = false;
|
|
totalPWM = powerPWM + tempMeasureTicks / 2 + holdoffTicks / 2;
|
|
|
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
|
// Adjust ADC
|
|
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + (holdoffTicks / 2));
|
|
|
|
// Set divider to 22
|
|
|
|
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
|
|
|
|
tmpVal = BL_SET_REG_BITS_VAL(tmpVal, TIMER_TCDR2, 22);
|
|
|
|
BL_WR_REG(TIMER_BASE, TIMER_TCDR, tmpVal);
|
|
}
|
|
void setTipPWM(const uint8_t pulse, const bool shouldUseFastModePWM) {
|
|
PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is
|
|
// disabled if the PID task is not scheduled often enough.
|
|
pendingPWM = pulse;
|
|
fastPWM = shouldUseFastModePWM;
|
|
}
|
|
extern osThreadId POWTaskHandle;
|
|
|
|
void GPIO_IRQHandler(void) {
|
|
if (SET == GLB_Get_GPIO_IntStatus(FUSB302_IRQ_GLB_Pin)) {
|
|
GLB_GPIO_IntClear(FUSB302_IRQ_GLB_Pin, SET);
|
|
#if POW_PD
|
|
if (POWTaskHandle != nullptr) {
|
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
|
xTaskNotifyFromISR(POWTaskHandle, 1, eSetBits, &xHigherPriorityTaskWoken);
|
|
/* Force a context switch if xHigherPriorityTaskWoken is now set to pdTRUE.
|
|
The macro used to do this is dependent on the port and may be called
|
|
portEND_SWITCHING_ISR. */
|
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
|
}
|
|
#endif
|
|
|
|
/* timeout check */
|
|
uint32_t timeOut = 32;
|
|
|
|
do {
|
|
timeOut--;
|
|
} while ((SET == GLB_Get_GPIO_IntStatus(FUSB302_IRQ_GLB_Pin)) && timeOut);
|
|
|
|
if (!timeOut) {
|
|
// MSG("WARNING: Clear GPIO interrupt status fail.\r\n");
|
|
}
|
|
|
|
GLB_GPIO_IntClear(FUSB302_IRQ_GLB_Pin, RESET);
|
|
}
|
|
}
|
|
|
|
bool getFUS302IRQLow() {
|
|
// Return true if the IRQ line is still held low
|
|
return !gpio_read(FUSB302_IRQ_Pin);
|
|
}
|
|
|
|
uint16_t getADCHandleTemp(uint8_t sample) { return ADC_Temp.average(); }
|
|
|
|
uint16_t getADCVin(uint8_t sample) { return ADC_Vin.average(); }
|
|
|
|
// Returns either average or instant value. When sample is set the samples from the injected ADC are copied to the filter and then the raw reading is returned
|
|
uint16_t getTipRawTemp(uint8_t sample) { return ADC_Tip.average() >> 1; }
|