* Mock S60 * cleanup * Start refactor of OLED init * Setup timers roughly * Set Vector table offset correctly Update system_stm32f1xx.c * Update OLED.cpp * Update stm32f1xx_hal_msp.c * Update configuration.h * I2C init before GPIO From Errata Update stm32f1xx_hal_msp.c Update Software_I2C.h Allow no hardware I2C * I2C BB run bus unlock at init * cleanups * Software I2C for now * Mildly more graceful Interpolate * Handle is powered by DC Update Power.cpp Update drawPowerSourceIcon.cpp Update configuration.h Update Setup.cpp * Cleanup HomeScreen * Segment remap oled at init * Cleanup * Update MOVThread.cpp * Fix PWM Init * Fix adc2 trigger * Update configs * Fixup warning * Saner default config * Update ThermoModel.cpp * Util for current@voltage * Hub238 warning * Add hub238 handling in power mode * Update USBPDDebug_FUSB.cpp * HUSB238 debug * Hook PSU Limit * Use wrapping section of GRAM for scroll Update OLED.hpp * Update NTC table * Fix HUB voltage picker * Cleanup * Larger tip filter * Calibrate in a bunch closer Update ThermoModel.cpp * Update configuration.h * Update HUB238.cpp * Update configuration.h * Movement Pin * Update BSP.cpp * tim2 irq * Rough timer conversion (adc broken) but movement working * Fix tim2 start * Faster base PWM * Ensure utils grabs config * Add wattage limiter tolerance for device * Speed up PWM and enable PWM current limiting * tune for 12v * Prevent start until PD done * Update configuration.h * Add HUB238 check for have re-negotiated * Adjust timer to avoid noise when its possible
68 lines
1.7 KiB
C++
68 lines
1.7 KiB
C++
/*
|
|
* POWThread.cpp
|
|
*
|
|
* Created on: 16 Jan 2021
|
|
* Author: Ralim
|
|
*/
|
|
|
|
#include "BSP.h"
|
|
#include "FreeRTOS.h"
|
|
#include "HUB238.hpp"
|
|
#include "QC3.h"
|
|
#include "Settings.h"
|
|
#include "USBPD.h"
|
|
#include "cmsis_os.h"
|
|
#include "configuration.h"
|
|
#include "main.hpp"
|
|
#include "stdlib.h"
|
|
#include "task.h"
|
|
|
|
|
|
// Small worker thread to handle power (PD + QC) related steps
|
|
|
|
void startPOWTask(void const *argument __unused) {
|
|
|
|
// Init any other misc sensors
|
|
postRToSInit();
|
|
while (preStartChecksDone() == 0) {
|
|
osDelay(3);
|
|
}
|
|
// You have to run this once we are willing to answer PD messages
|
|
// Setting up too early can mean that we miss the ~20ms window to respond on some chargers
|
|
#ifdef POW_PD
|
|
USBPowerDelivery::start();
|
|
// Crank the handle at boot until we are stable and waiting for IRQ
|
|
USBPowerDelivery::step();
|
|
|
|
#endif
|
|
BaseType_t res;
|
|
for (;;) {
|
|
res = pdFALSE;
|
|
// While the interrupt is low, dont delay
|
|
/*This is due to a possible race condition, where:
|
|
* IRQ fires
|
|
* We read interrupt register but dont see the Good CRC
|
|
* Then Good CRC is set while reading it out (racing on I2C read)
|
|
* Then we would sleep as nothing to do, but 100ms> 20ms power supply typical timeout
|
|
*/
|
|
if (!getFUS302IRQLow()) {
|
|
res = xTaskNotifyWait(0x0, 0xFFFFFF, NULL, TICKS_100MS / 2);
|
|
}
|
|
|
|
#ifdef POW_PD
|
|
if (res != pdFALSE || getFUS302IRQLow()) {
|
|
USBPowerDelivery::IRQOccured();
|
|
}
|
|
USBPowerDelivery::PPSTimerCallback();
|
|
USBPowerDelivery::step();
|
|
|
|
#else
|
|
(void)res;
|
|
#endif
|
|
#if POW_PD_EXT == 1
|
|
hub238_check_negotiation();
|
|
#endif
|
|
power_check();
|
|
}
|
|
}
|