Merge branch 'dev-latest' into remove-bm1397Module

This commit is contained in:
mutatrum 2025-03-19 23:56:10 +02:00 committed by GitHub
commit 1991d98a78
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 400 additions and 172 deletions

View File

@ -1,5 +1,11 @@
name: Unit Test
on: [push, pull_request]
permissions:
checks: write
pull-requests: write
contents: read
jobs:
build:
runs-on: ubuntu-latest

View File

@ -88,6 +88,7 @@ typedef struct
char * fallback_pool_pass;
bool is_using_fallback;
uint16_t overheat_mode;
uint16_t power_fault;
uint32_t lastClockSync;
bool is_screen_active;
bool is_firmware_update;

View File

@ -11,6 +11,10 @@
text="Bitaxe frequency is set low - See settings">
</p-message>
<p-message *ngIf="info.power_fault" severity="error" styleClass="w-full mb-4 py-4 border-round-xl"
text="{{info.power_fault}} Check your Power Supply.">
</p-message>
<div class="grid" *ngIf="info$ | async as info; else loading">
<div class="col-12">
<div class="grid">
@ -26,9 +30,9 @@
</div>
</div>
</div>
<ng-container>
Average:
Average:
<span class="text-green-500 font-medium">
{{calculateAverage(hashrateData) | hashSuffix}}
</span>
@ -51,9 +55,9 @@
</div>
</div>
</div>
<ng-container>
Average:
Average:
<span class="text-green-500 font-medium">
{{calculateEfficiencyAverage(hashrateData, powerData) | number: '1.2-2'}} <small>J/TH</small>
</span>
@ -168,7 +172,7 @@
<div class="grid">
<div class="col-12">
<h6>ASIC Temperature
<h6>ASIC Temperature
<span style="float: right;">
<ng-template #noTemp>--</ng-template>
<ng-container *ngIf="info.temp > 0; else noTemp">

View File

@ -51,5 +51,6 @@ export interface ISystemInfo {
boardtemp1?: number,
boardtemp2?: number,
overheat_mode: number,
power_fault?: string
overclockEnabled?: number
}

View File

@ -1,6 +1,11 @@
#include "http_server.h"
#include "theme_api.h" // Add theme API include
#include "cJSON.h"
#include <pthread.h>
#include <fcntl.h>
#include <string.h>
#include <sys/param.h>
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_http_server.h"
#include "esp_log.h"
@ -9,17 +14,6 @@
#include "esp_timer.h"
#include "esp_wifi.h"
#include "esp_vfs.h"
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"
#include "global_state.h"
#include "nvs_config.h"
#include "vcore.h"
#include "power.h"
#include "connect.h"
#include <fcntl.h>
#include <string.h>
#include <sys/param.h>
#include "dns_server.h"
#include "esp_mac.h"
@ -32,10 +26,17 @@
#include "lwip/netdb.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include <pthread.h>
#include "connect.h"
#include "cJSON.h"
#include "global_state.h"
#include "nvs_config.h"
#include "vcore.h"
#include "power.h"
#include "connect.h"
#include "asic.h"
#include "TPS546.h"
#include "theme_api.h" // Add theme API include
#include "http_server.h"
static const char * TAG = "http_server";
static const char * CORS_TAG = "CORS";
@ -601,6 +602,10 @@ static esp_err_t GET_system_info(httpd_req_t * req)
cJSON_AddNumberToObject(root, "fanspeed", GLOBAL_STATE->POWER_MANAGEMENT_MODULE.fan_perc);
cJSON_AddNumberToObject(root, "fanrpm", GLOBAL_STATE->POWER_MANAGEMENT_MODULE.fan_rpm);
if (GLOBAL_STATE->SYSTEM_MODULE.power_fault > 0) {
cJSON_AddStringToObject(root, "power_fault", VCORE_get_fault_string(GLOBAL_STATE));
}
free(ssid);
free(hostname);

View File

@ -4,7 +4,7 @@
#include "nvs_config.h"
#include "cJSON.h"
static const char *TAG = "theme_api";
//static const char *TAG = "theme_api";
// Helper function to set CORS headers
static esp_err_t set_cors_headers(httpd_req_t *req)

View File

@ -7,7 +7,6 @@
#define GPIO_BUTTON_BOOT CONFIG_GPIO_BUTTON_BOOT
#define ESP_INTR_FLAG_DEFAULT 0
#define LONG_PRESS_DURATION_MS 2000
static const char * TAG = "input";
@ -55,7 +54,6 @@ esp_err_t input_init(void (*button_short_clicked_cb)(void), void (*button_long_p
gpio_config(&io_conf);
// Install ISR service and hook the interrupt handler
ESP_RETURN_ON_ERROR(gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT), TAG, "Error installing ISR service");
ESP_RETURN_ON_ERROR(gpio_isr_handler_add(GPIO_BUTTON_BOOT, button_isr_handler, NULL), TAG, "Error adding ISR handler");
lv_group_t * group = lv_group_create();

View File

@ -4,12 +4,15 @@
#include <string.h>
#include "esp_log.h"
#include "esp_err.h"
#include "esp_check.h"
#include "pmbus_commands.h"
#include "i2c_bitaxe.h"
#include "TPS546.h"
//#define _DEBUG_LOG_ 1
//#define DEBUG_TPS546_MEAS 1 //uncomment to debug TPS546 measurements
//#define DEBUG_TPS546_STATUS 1 //uncomment to debug TPS546 status bits
#define I2C_MASTER_NUM 0 /*!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip */
@ -21,23 +24,20 @@
#define NACK_VALUE 0x1
#define MAX_BLOCK_LEN 32
#define SMBUS_DEFAULT_TIMEOUT (1000 / portTICK_PERIOD_MS)
static const char *TAG = "TPS546";
static uint8_t DEVICE_ID1[] = {0x54, 0x49, 0x54, 0x6B, 0x24, 0x41}; // TPS546D24A
static uint8_t DEVICE_ID2[] = {0x54, 0x49, 0x54, 0x6D, 0x24, 0x41}; // TPS546D24A
static uint8_t DEVICE_ID3[] = {0x54, 0x49, 0x54, 0x6D, 0x24, 0x62}; // TPS546D24S
static uint8_t MFR_ID[] = {'B', 'A', 'X'};
static uint8_t MFR_MODEL[] = {'H', 'E', 'X'};
static uint8_t MFR_REVISION[] = {0x00, 0x00, 0x01};
//static uint8_t COMPENSATION_CONFIG[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
static i2c_master_dev_handle_t tps546_dev_handle;
static i2c_master_dev_handle_t tps546_i2c_handle;
static TPS546_CONFIG tps546_config;
static esp_err_t TPS546_parse_status(uint16_t);
/**
* @brief SMBus read byte
* @param command The command to read
@ -45,7 +45,7 @@ static TPS546_CONFIG tps546_config;
*/
static esp_err_t smb_read_byte(uint8_t command, uint8_t *data)
{
return i2c_bitaxe_register_read(tps546_dev_handle, command, data, 1);
return i2c_bitaxe_register_read(tps546_i2c_handle, command, data, 1);
}
/**
@ -55,7 +55,7 @@ static esp_err_t smb_read_byte(uint8_t command, uint8_t *data)
*/
static esp_err_t smb_write_byte(uint8_t command, uint8_t data)
{
return i2c_bitaxe_register_write_byte(tps546_dev_handle, command, data);
return i2c_bitaxe_register_write_byte(tps546_i2c_handle, command, data);
}
/**
@ -64,7 +64,7 @@ static esp_err_t smb_write_byte(uint8_t command, uint8_t data)
*/
static esp_err_t smb_write_addr(uint8_t command)
{
return i2c_bitaxe_register_write_addr(tps546_dev_handle, command);
return i2c_bitaxe_register_write_addr(tps546_i2c_handle, command);
}
/**
@ -75,7 +75,7 @@ static esp_err_t smb_write_addr(uint8_t command)
static esp_err_t smb_read_word(uint8_t command, uint16_t *result)
{
uint8_t data[2];
if (i2c_bitaxe_register_read(tps546_dev_handle, command, data, 2) != ESP_OK) {
if (i2c_bitaxe_register_read(tps546_i2c_handle, command, data, 2) != ESP_OK) {
return ESP_FAIL;
} else {
*result = (data[1] << 8) + data[0];
@ -90,7 +90,7 @@ static esp_err_t smb_read_word(uint8_t command, uint16_t *result)
*/
static esp_err_t smb_write_word(uint8_t command, uint16_t data)
{
return i2c_bitaxe_register_write_word(tps546_dev_handle, command, data);
return i2c_bitaxe_register_write_word(tps546_i2c_handle, command, data);
}
/**
@ -103,7 +103,7 @@ static esp_err_t smb_read_block(uint8_t command, uint8_t *data, uint8_t len)
{
//malloc a buffer len+1 to store the length byte
uint8_t *buf = (uint8_t *)malloc(len+1);
if (i2c_bitaxe_register_read(tps546_dev_handle, command, buf, len+1) != ESP_OK) {
if (i2c_bitaxe_register_read(tps546_i2c_handle, command, buf, len+1) != ESP_OK) {
free(buf);
return ESP_FAIL;
}
@ -114,30 +114,30 @@ static esp_err_t smb_read_block(uint8_t command, uint8_t *data, uint8_t len)
return ESP_OK;
}
/**
* @brief SMBus write block - don;t forget the length byte first :P
* @param command The command to write
* @param data The data to write
* @param len The number of bytes to write
*/
static esp_err_t smb_write_block(uint8_t command, uint8_t *data, uint8_t len)
{
//malloc a buffer len+2 to store the command byte and then the length byte
uint8_t *buf = (uint8_t *)malloc(len+2);
buf[0] = command;
buf[1] = len;
//copy the data into the buffer
memcpy(buf+2, data, len);
// /**
// * @brief SMBus write block - don;t forget the length byte first :P
// * @param command The command to write
// * @param data The data to write
// * @param len The number of bytes to write
// */
// static esp_err_t smb_write_block(uint8_t command, uint8_t *data, uint8_t len)
// {
// //malloc a buffer len+2 to store the command byte and then the length byte
// uint8_t *buf = (uint8_t *)malloc(len+2);
// buf[0] = command;
// buf[1] = len;
// //copy the data into the buffer
// memcpy(buf+2, data, len);
//write it all
if (i2c_bitaxe_register_write_bytes(tps546_dev_handle, buf, len+2) != ESP_OK) {
free(buf);
return ESP_FAIL;
} else {
free(buf);
return ESP_OK;
}
}
// //write it all
// if (i2c_bitaxe_register_write_bytes(tps546_i2c_handle, buf, len+2) != ESP_OK) {
// free(buf);
// return ESP_FAIL;
// } else {
// free(buf);
// return ESP_OK;
// }
// }
/**
* @brief Convert an SLINEAR11 value into an int
@ -344,10 +344,7 @@ esp_err_t TPS546_init(TPS546_CONFIG config)
ESP_LOGI(TAG, "Initializing the core voltage regulator");
if (i2c_bitaxe_add_device(TPS546_I2CADDR, &tps546_dev_handle, TAG) != ESP_OK) {
ESP_LOGE(TAG, "Failed to add I2C device");
return ESP_FAIL;
}
ESP_RETURN_ON_ERROR(i2c_bitaxe_add_device(TPS546_I2CADDR, &tps546_i2c_handle, TAG), TAG, "Failed to add TPS546 I2C");
/* Establish communication with regulator */
smb_read_block(PMBUS_IC_DEVICE_ID, data, 6); //the DEVICE_ID block first byte is the length.
@ -359,12 +356,16 @@ esp_err_t TPS546_init(TPS546_CONFIG config)
return ESP_FAIL;
}
//write operation register to turn off power
u8_value = OPERATION_OFF;
ESP_LOGI(TAG, "Power config-OPERATION: %02X", u8_value);
smb_write_byte(PMBUS_OPERATION, u8_value);
/* Make sure power is turned off until commanded */
u8_value = ON_OFF_CONFIG_CMD | ON_OFF_CONFIG_PU | ON_OFF_CONFIG_CP |
ON_OFF_CONFIG_POLARITY | ON_OFF_CONFIG_DELAY;
ESP_LOGI(TAG, "Power config-ON_OFF_CONFIG: %02x", u8_value);
u8_value = (ON_OFF_CONFIG_DELAY | ON_OFF_CONFIG_POLARITY | ON_OFF_CONFIG_CP | ON_OFF_CONFIG_CMD | ON_OFF_CONFIG_PU);
ESP_LOGI(TAG, "Power config-ON_OFF_CONFIG: %02X", u8_value);
smb_write_byte(PMBUS_ON_OFF_CONFIG, u8_value);
/* Read version number and see if it matches */
TPS546_read_mfr_info(read_mfr_revision);
// if (memcmp(read_mfr_revision, MFR_REVISION, 3) != 0) {
@ -389,13 +390,8 @@ esp_err_t TPS546_init(TPS546_CONFIG config)
/* Show voltage settings */
TPS546_show_voltage_settings();
uint16_t status;
TPS546_check_status(&status);
if (status != 0) {
ESP_LOGE(TAG, "Status error: %04x", status);
TPS546_parse_status(status);
}
smb_read_word(PMBUS_STATUS_WORD, &u16_value);
ESP_LOGI(TAG, "read STATUS_WORD: %04x", u16_value);
ESP_LOGI(TAG, "-----------VOLTAGE/CURRENT---------------------");
smb_read_word(PMBUS_READ_VIN, &u16_value);
@ -434,6 +430,12 @@ esp_err_t TPS546_init(TPS546_CONFIG config)
ESP_LOGI(TAG, "read INTERLEAVE: %04x", u16_value);
smb_read_byte(PMBUS_CAPABILITY, &u8_value);
ESP_LOGI(TAG, "read CAPABILITY: %02x", u8_value);
ESP_LOGI(TAG, "---------OPERATION------------------");
smb_read_byte(PMBUS_OPERATION, &u8_value);
ESP_LOGI(TAG, "read OPERATION: %02x", u8_value);
smb_read_byte(PMBUS_ON_OFF_CONFIG, &u8_value);
ESP_LOGI(TAG, "read ON_OFF_CONFIG: %02x", u8_value);
// Read the compensation config registers
@ -449,15 +451,18 @@ esp_err_t TPS546_init(TPS546_CONFIG config)
ESP_LOGI(TAG, "Clearing faults");
TPS546_clear_faults();
smb_read_word(PMBUS_STATUS_WORD, &u16_value);
ESP_LOGI(TAG, "read STATUS_WORD: %04x", u16_value);
return ESP_OK;
}
esp_err_t TPS546_clear_faults(void) {
// if (smb_write_byte(PMBUS_CLEAR_FAULTS, 0xFF) != ESP_OK) {
if (smb_write_addr(PMBUS_CLEAR_FAULTS) != ESP_OK) {
ESP_LOGE(TAG, "Failed to clear faults");
return ESP_FAIL;
}
ESP_RETURN_ON_ERROR(smb_write_addr(PMBUS_CLEAR_FAULTS), TAG, "Failed to write address");
// acknowledge the SMBus fault to reset the SMBALERT pin
//ESP_RETURN_ON_ERROR(smb_clear_alert(), TAG, "Failed to clear alert"); //this doesn't seem to work?
return ESP_OK;
}
@ -492,20 +497,6 @@ void TPS546_read_mfr_info(uint8_t *read_mfr_revision)
ESP_LOGI(TAG, "MFR_REVISION: %02X %02X %02X", read_mfr_revision[0], read_mfr_revision[1], read_mfr_revision[2]);
}
/**
* @brief Write the manufacturer ID and revision to NVM
*/
void TPS546_set_mfr_info(void)
{
ESP_LOGI(TAG, "----- Manufacturer Info");
ESP_LOGI(TAG, "Setting MFR_ID: %02X %02X %02X", MFR_ID[0], MFR_ID[1], MFR_ID[2]);
smb_write_block(PMBUS_MFR_ID, MFR_ID, 3);
ESP_LOGI(TAG, "Setting MFR_MODEL: %02X %02X %02X", MFR_MODEL[0], MFR_MODEL[1], MFR_MODEL[2]);
smb_write_block(PMBUS_MFR_MODEL, MFR_MODEL, 3);
ESP_LOGI(TAG, "Setting MFR_REVISION: %02X %02X %02X", MFR_REVISION[0], MFR_REVISION[1], MFR_REVISION[2]);
smb_write_block(PMBUS_MFR_REVISION, MFR_REVISION, 3);
}
/**
* @brief Set all the relevant config registers for normal operation
*/
@ -513,11 +504,11 @@ void TPS546_write_entire_config(void)
{
ESP_LOGI(TAG, "---Writing new config values to TPS546---");
/* set up the ON_OFF_CONFIG */
ESP_LOGI(TAG, "Setting ON_OFF_CONFIG: %02X", TPS546_INIT_ON_OFF_CONFIG);
if (smb_write_byte(PMBUS_ON_OFF_CONFIG, TPS546_INIT_ON_OFF_CONFIG) != ESP_OK) {
ESP_LOGE(TAG, "Failed to write ON_OFF_CONFIG");
return;
}
// ESP_LOGI(TAG, "Setting ON_OFF_CONFIG: %02X", TPS546_INIT_ON_OFF_CONFIG);
// if (smb_write_byte(PMBUS_ON_OFF_CONFIG, TPS546_INIT_ON_OFF_CONFIG) != ESP_OK) {
// ESP_LOGE(TAG, "Failed to write ON_OFF_CONFIG");
// return;
// }
/* Phase */
ESP_LOGI(TAG, "Setting PHASE: %02X", TPS546_INIT_PHASE);
@ -622,12 +613,12 @@ void TPS546_write_entire_config(void)
smb_write_word(PMBUS_PIN_DETECT_OVERRIDE, INIT_PIN_DETECT_OVERRIDE);
/* TODO write new MFR_REVISION number to reflect these parameters */
ESP_LOGI(TAG, "Setting MFR ID");
smb_write_block(PMBUS_MFR_ID, MFR_ID, 3);
ESP_LOGI(TAG, "Setting MFR MODEL");
smb_write_block(PMBUS_MFR_ID, MFR_MODEL, 3);
ESP_LOGI(TAG, "Setting MFR REVISION");
smb_write_block(PMBUS_MFR_ID, MFR_REVISION, 3);
// ESP_LOGI(TAG, "Setting MFR ID");
// smb_write_block(PMBUS_MFR_ID, MFR_ID, 3);
// ESP_LOGI(TAG, "Setting MFR MODEL");
// smb_write_block(PMBUS_MFR_ID, MFR_MODEL, 3);
// ESP_LOGI(TAG, "Setting MFR REVISION");
// smb_write_block(PMBUS_MFR_ID, MFR_REVISION, 3);
/*
!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -687,7 +678,7 @@ float TPS546_get_vin(void)
return 0;
} else {
vin = slinear11_2_float(u16_value);
#ifdef _DEBUG_LOG_
#ifdef DEBUG_TPS546_MEAS
ESP_LOGI(TAG, "Got Vin: %2.3f V", vin);
#endif
return vin;
@ -706,7 +697,7 @@ float TPS546_get_iout(void)
} else {
iout = slinear11_2_float(u16_value);
#ifdef _DEBUG_LOG_
#ifdef DEBUG_TPS546_MEAS
ESP_LOGI(TAG, "Got Iout: %2.3f A", iout);
#endif
@ -725,68 +716,116 @@ float TPS546_get_vout(void)
return 0;
} else {
vout = ulinear16_2_float(u16_value);
#ifdef _DEBUG_LOG_
#ifdef DEBUG_TPS546_MEAS
ESP_LOGI(TAG, "Got Vout: %2.3f V", vout);
#endif
return vout;
}
}
esp_err_t TPS546_check_status(uint16_t *status) {
esp_err_t TPS546_check_status(GlobalState * global_state) {
if (smb_read_word(PMBUS_STATUS_WORD, status) != ESP_OK) {
ESP_LOGE(TAG, "Could not read STATUS_WORD");
return ESP_FAIL;
uint16_t status;
SystemModule * sys_module = &global_state->SYSTEM_MODULE;
ESP_RETURN_ON_ERROR(smb_read_word(PMBUS_STATUS_WORD, &status), TAG, "Failed to read STATUS_WORD");
//determine if this is a fault we care about
if (status & (TPS546_STATUS_OFF | TPS546_STATUS_VOUT_OV | TPS546_STATUS_IOUT_OC | TPS546_STATUS_VIN_UV | TPS546_STATUS_TEMP)) {
if (sys_module->power_fault == 0) {
ESP_RETURN_ON_ERROR(TPS546_parse_status(status), TAG, "Failed to parse STATUS_WORD");
sys_module->power_fault = 1;
}
} else {
sys_module->power_fault = 0;
}
return ESP_OK;
}
esp_err_t TPS546_parse_status(uint16_t status) {
// Global variable to store the TPS error message for the UI
static char tps_error_message[256] = "Power Fault Detected.";
const char* TPS546_get_error_message() {
return tps_error_message;
}
static esp_err_t TPS546_parse_status(uint16_t status) {
uint8_t u8_value;
//print the status word
ESP_LOGE(TAG, "Status: 0x%04X", status);
if (status & TPS546_STATUS_BUSY) {
ESP_LOGI(TAG, "TPS546 is busy");
ESP_LOGE(TAG, "Voltage regulator was busy and unable to respond");
return ESP_OK;
}
if (status & TPS546_STATUS_OFF) {
ESP_LOGI(TAG, "TPS546 is off");
ESP_LOGE(TAG, "The voltage regulator is turned off");
}
if (status & TPS546_STATUS_VOUT_OV) {
ESP_LOGI(TAG, "TPS546 VOUT is out of range");
ESP_LOGE(TAG, "An output overvoltage fault has occurred");
}
if (status & TPS546_STATUS_IOUT_OC) {
ESP_LOGI(TAG, "TPS546 IOUT is out of range");
ESP_LOGE(TAG, "An output overcurrent fault has occurred");
}
if (status & TPS546_STATUS_VIN_UV) {
ESP_LOGI(TAG, "TPS546 VIN is out of range");
ESP_LOGE(TAG, "An input undervoltage fault has occurred");
}
if (status & TPS546_STATUS_TEMP) {
ESP_LOGI(TAG, "TPS546 TEMP Status Error");
ESP_LOGE(TAG, "A temperature fault/warning has occurred");
//the host should check STATUS_TEMPERATURE for more information.
if (smb_read_byte(PMBUS_STATUS_TEMPERATURE, &u8_value) != ESP_OK) {
ESP_LOGE(TAG, "Could not read STATUS_TEMPERATURE");
return ESP_FAIL;
} else {
ESP_LOGI(TAG, "TPS546 Temperature Status: %02X", u8_value);
ESP_LOGE(TAG, "TPS546 Temperature Status: %02X", u8_value);
if (u8_value & TPS546_STATUS_TEMP_OTF) {
ESP_LOGE(TAG, "Overtemperature fault");
}
if (u8_value & TPS546_STATUS_TEMP_OTW) {
ESP_LOGE(TAG, "Overtemperature warning");
}
}
}
if (status & TPS546_STATUS_CML) {
ESP_LOGI(TAG, "TPS546 CML Status Error");
ESP_LOGE(TAG, "A communication, memory, logic fault has occurred");
//the host should check STATUS_CML for more information.
if (smb_read_byte(PMBUS_STATUS_CML, &u8_value) != ESP_OK) {
ESP_LOGE(TAG, "Could not read STATUS_CML");
return ESP_FAIL;
} else {
ESP_LOGI(TAG, "TPS546 CML Status: %02X", u8_value);
ESP_LOGE(TAG, "TPS546 CML Status: %02X", u8_value);
if (u8_value & TPS546_STATUS_CML_IVC) {
ESP_LOGE(TAG, "invalid or unsupported command was received");
}
if (u8_value & TPS546_STATUS_CML_IVD) {
ESP_LOGE(TAG, "invalid or unsupported data was received");
}
if (u8_value & TPS546_STATUS_CML_PEC) {
ESP_LOGE(TAG, "packet error check has failed");
}
if (u8_value & TPS546_STATUS_CML_MEM) {
ESP_LOGE(TAG, "memory error was detected");
}
if (u8_value & TPS546_STATUS_CML_PROC) {
ESP_LOGE(TAG, "logic core error was detected");
}
if (u8_value & TPS546_STATUS_CML_COMM) {
ESP_LOGE(TAG, "communication error detected");
}
}
}
if (status & TPS546_STATUS_NONE) {
ESP_LOGI(TAG, "TPS546 Status Word Error");
//ESP_LOGI(TAG, "TPS546 Status Word Error");
//The host should check the STATUS_WORD for more information.
} else {
return ESP_OK;
@ -795,56 +834,113 @@ esp_err_t TPS546_parse_status(uint16_t status) {
//STATUS_WORD bits
if (status & TPS546_STATUS_VOUT) {
ESP_LOGI(TAG, "TPS546 VOUT Status Error");
//ESP_LOGI(TAG, "TPS546 VOUT Status Error");
//the host should check STATUS_VOUT for more information.
if (smb_read_byte(PMBUS_STATUS_VOUT, &u8_value) != ESP_OK) {
ESP_LOGE(TAG, "Could not read STATUS_VOUT");
return ESP_FAIL;
} else {
ESP_LOGI(TAG, "TPS546 VOUT Status: %02X", u8_value);
ESP_LOGE(TAG, "VOUT Status: %02X", u8_value);
if (u8_value & TPS546_STATUS_VOUT_OVF) {
ESP_LOGE(TAG, "VOUT Overvoltage Fault");
}
if (u8_value & TPS546_STATUS_VOUT_OVW) {
ESP_LOGE(TAG, "VOUT Undervoltage Warning");
}
if (u8_value & TPS546_STATUS_VOUT_UVW) {
ESP_LOGE(TAG, "VOUT Undervoltage Warning");
}
if (u8_value & TPS546_STATUS_VOUT_UVF) {
ESP_LOGE(TAG, "VOUT Undervoltage Warning");
}
if (u8_value & TPS546_STATUS_VOUT_MIN_MAX) {
ESP_LOGE(TAG, "VOUT Outside Min/Max Range");
}
if (u8_value & TPS546_STATUS_VOUT_TON_MAX) {
ESP_LOGE(TAG, "VOUT Did not reach target output in time");
}
}
}
if (status & TPS546_STATUS_IOUT) {
ESP_LOGI(TAG, "TPS546 IOUT Status Error");
//ESP_LOGI(TAG, "TPS546 IOUT Status Error");
//the host should check STATUS_IOUT for more information.
if (smb_read_byte(PMBUS_STATUS_IOUT, &u8_value) != ESP_OK) {
ESP_LOGE(TAG, "Could not read STATUS_IOUT");
return ESP_FAIL;
} else {
ESP_LOGI(TAG, "TPS546 IOUT Status: %02X", u8_value);
if (u8_value & TPS546_STATUS_IOUT_OCF) {
ESP_LOGE(TAG, "IOUT Overcurrent Fault");
}
if (u8_value & TPS546_STATUS_IOUT_OCW) {
ESP_LOGE(TAG, "IOUT Overcurrent Warning");
}
}
}
if (status & TPS546_STATUS_INPUT) {
ESP_LOGI(TAG, "TPS546 INPUT Status Error");
//ESP_LOGI(TAG, "TPS546 INPUT Status Error");
//the host should check STATUS_INPUT for more information.
if (smb_read_byte(PMBUS_STATUS_INPUT, &u8_value) != ESP_OK) {
ESP_LOGE(TAG, "Could not read STATUS_INPUT");
return ESP_FAIL;
} else {
ESP_LOGI(TAG, "TPS546 INPUT Status: %02X", u8_value);
ESP_LOGE(TAG, "TPS546 INPUT Status: %02X", u8_value);
if (u8_value & TPS546_STATUS_VIN_OVF) {
ESP_LOGE(TAG, "VIN Overvoltage Fault");
}
if (u8_value & TPS546_STATUS_VIN_UVW) {
ESP_LOGE(TAG, "VIN Undervoltage Warning");
}
if (u8_value & TPS546_STATUS_VIN_LOW_VIN) {
ESP_LOGE(TAG, "VIN Low Voltage");
}
}
}
if (status & TPS546_STATUS_MFR) {
ESP_LOGI(TAG, "TPS546 MFR_SPECIFIC Status Error");
//ESP_LOGI(TAG, "TPS546 MFR_SPECIFIC Status Error");
//the host should check STATUS_MFR_SPECIFIC for more information.
if (smb_read_byte(PMBUS_STATUS_MFR_SPECIFIC, &u8_value) != ESP_OK) {
ESP_LOGE(TAG, "Could not read STATUS_MFR_SPECIFIC");
return ESP_FAIL;
} else {
ESP_LOGI(TAG, "TPS546 MFR_SPECIFIC Status: %02X", u8_value);
ESP_LOGE(TAG, "TPS546 MFR_SPECIFIC Status: %02X", u8_value);
if (u8_value & TPS546_STATUS_MFR_POR) {
ESP_LOGE(TAG, "A Power-On Reset Fault has been detected.");
}
if (u8_value & TPS546_STATUS_MFR_SELF) {
ESP_LOGE(TAG, "Power-On Self-Check is in progress. One or more BCX slaves have not responded.");
}
if (u8_value & TPS546_STATUS_MFR_RESET) {
ESP_LOGE(TAG, "A RESET_VOUT event has occurred.");
}
if (u8_value & TPS546_STATUS_MFR_BCX) {
ESP_LOGE(TAG, "A BCX fault event has occurred.");
}
if (u8_value & TPS546_STATUS_MFR_SYNC) {
ESP_LOGE(TAG, "A SYNC fault has been detected.");
}
}
}
if (status & TPS546_STATUS_PGOOD) {
ESP_LOGI(TAG, "TPS546 PGOOD Status Error");
ESP_LOGE(TAG, "The output voltage is NOT within the regulation window. PGOOD pin is asserted.");
}
if (status & TPS546_STATUS_OTHER) {
ESP_LOGI(TAG, "TPS546 OTHER Status Error");
//ESP_LOGI(TAG, "TPS546 OTHER Status Error");
//the host should check STATUS_OTHER for more information.
if (smb_read_byte(PMBUS_STATUS_OTHER, &u8_value) != ESP_OK) {
ESP_LOGE(TAG, "Could not read STATUS_OTHER");
return ESP_FAIL;
} else {
ESP_LOGI(TAG, "TPS546 OTHER Status: %02X", u8_value);
ESP_LOGE(TAG, "TPS546 OTHER Status: %02X", u8_value);
if (u8_value & TPS546_STATUS_OTHER_FIRST) {
ESP_LOGE(TAG, "this device was the first to assert SMBALERT");
}
}
}
@ -861,6 +957,7 @@ esp_err_t TPS546_parse_status(uint16_t status) {
**/
esp_err_t TPS546_set_vout(float volts) {
uint16_t value;
uint8_t value8;
if (volts == 0) {
/* turn off output */
@ -889,6 +986,16 @@ esp_err_t TPS546_set_vout(float volts) {
return ESP_FAIL;
}
//make sure operation was written correctly
if (smb_read_byte(PMBUS_OPERATION, &value8) != ESP_OK) {
ESP_LOGE(TAG, "Could not read OPERATION");
return ESP_FAIL;
}
if (value8 != OPERATION_ON) {
ESP_LOGE(TAG, "Operation not set to ON: %02X", value8);
}
}
}
return ESP_OK;

View File

@ -3,17 +3,21 @@
#include <stdint.h>
#include <esp_err.h>
#include <stdbool.h>
#define TPS546_I2CADDR 0x24 //< TPS546 i2c address
#define TPS546_MANUFACTURER_ID 0xFE //< Manufacturer ID
#define TPS546_REVISION 0xFF //< Chip revision
#include "global_state.h"
#define TPS546_I2CADDR 0x24 // TPS546 i2c address
#define TPS546_I2CADDR_ALERT 0x0C // TPS546 SMBus Alert address
#define TPS546_MANUFACTURER_ID 0xFE // Manufacturer ID
#define TPS546_REVISION 0xFF // Chip revision
/*-------------------------*/
/* These are the inital values for the voltage regulator configuration */
/* when the config revision stored in the TPS546 doesn't match, these values are used */
#define TPS546_INIT_ON_OFF_CONFIG 0x18 /* use ON_OFF command to control power */
//#define TPS546_INIT_ON_OFF_CONFIG 0x18 /* use ON_OFF command to control power */
#define OPERATION_OFF 0x00
#define OPERATION_ON 0x80
@ -43,13 +47,19 @@ typedef struct
// #define TPS546_INIT_VIN_OFF 10.5 /* V */
// #define TPS546_INIT_VIN_UV_WARN_LIMIT 14.0 /* V */
// #define TPS546_INIT_VIN_OV_FAULT_LIMIT 15.0 /* V */
#define TPS546_INIT_VIN_OV_FAULT_RESPONSE 0xB7 /* retry 6 times */
//VIN_OV_FAULT_RESPONSE pg98
//0xB7 -> 1011 0111
//10 -> Immediate Shutdown. Shut down and restart according to VIN_OV_RETRY.
//110 -> After shutting down, wait one HICCUP period, and attempt to restart up to 6 times. After 6 failed restart attempts, do not attempt to restart (latch off).
//111 -> Shutdown delay of seven PWM_CLK, HICCUP equal to 7 times TON_RISE
#define TPS546_INIT_VIN_OV_FAULT_RESPONSE 0xB7
/* vout voltage */
//#define TPS546_INIT_SCALE_LOOP 0.25 /* Voltage Scale factor */
//#define TPS546_INIT_VOUT_MAX 3 /* V */
#define TPS546_INIT_VOUT_OV_FAULT_LIMIT 1.25 /* %/100 above VOUT_COMMAND */
#define TPS546_INIT_VOUT_OV_WARN_LIMIT 1.1 /* %/100 above VOUT_COMMAND */
#define TPS546_INIT_VOUT_OV_WARN_LIMIT 1.16 /* %/100 above VOUT_COMMAND */
#define TPS546_INIT_VOUT_MARGIN_HIGH 1.1 /* %/100 above VOUT */
//#define TPS546_INIT_VOUT_COMMAND 1.2 /* V absolute value */
#define TPS546_INIT_VOUT_MARGIN_LOW 0.90 /* %/100 below VOUT */
@ -60,12 +70,24 @@ typedef struct
/* iout current */
// #define TPS546_INIT_IOUT_OC_WARN_LIMIT 50.00 /* A */
// #define TPS546_INIT_IOUT_OC_FAULT_LIMIT 55.00 /* A */
//IOUT_OC_FAULT_RESPONSE - pg91
//0xC0 -> 1100 0000
//11 -> Shutdown Immediately
//000 -> Do not attempt to restart (latch off).
//000 -> Shutdown delay of one PWM_CLK, HICCUP equal to TON_RISE
#define TPS546_INIT_IOUT_OC_FAULT_RESPONSE 0xC0 /* shut down, no retries */
/* temperature */
// It is better to set the temperature warn limit for TPS546 more higher than Ultra
#define TPS546_INIT_OT_WARN_LIMIT 105 /* degrees C */
#define TPS546_INIT_OT_FAULT_LIMIT 145 /* degrees C */
//OT_FAULT_RESPONSE - pg94
//0xFF -> 1111 1111
//11 -> Shutdown until Temperature is below OT_WARN_LIMIT, then restart according to OT_RETRY*.
//111 -> After shutting down, wait one HICCUP period, and attempt to restart indefinitely, until commanded OFF or a successful start-up occurs.
//111 -> Shutdown delay of 7 ms, HICCUP equal to 4 times TON_RISE
#define TPS546_INIT_OT_FAULT_RESPONSE 0xFF /* wait for cooling, and retry */
/* timing */
@ -83,11 +105,11 @@ typedef struct
/*-------------------------*/
/* PMBUS_ON_OFF_CONFIG initialization values */
#define ON_OFF_CONFIG_PU 0x10 // turn on PU bit
#define ON_OFF_CONFIG_CMD 0x08 // turn on CMD bit
#define ON_OFF_CONFIG_CP 0x00 // turn off CP bit
#define ON_OFF_CONFIG_POLARITY 0x00 // turn off POLARITY bit
#define ON_OFF_CONFIG_DELAY 0x00 // turn off DELAY bit
#define ON_OFF_CONFIG_PU 0x10 // Act on CONTROL. (01h) OPERATION command to start/stop power conversion, or both.
#define ON_OFF_CONFIG_CMD 0x08 // Act on (01h) OPERATION Command (and CONTROL pin if configured by CP) to start/stop power conversion.
#define ON_OFF_CONFIG_CP 0x04 // Act on CONTROL pin (and (01h) OPERATION Command if configured by bit [3]) to start/stop power conversion.
#define ON_OFF_CONFIG_POLARITY 0x02 // CONTROL pin has active high polarity.
#define ON_OFF_CONFIG_DELAY 0x01 // When power conversion is commanded OFF by the CONTROL pin (must be configured to respect the CONTROL pin as above), stop power conversion immediately.
//// STATUS_WORD Offsets
#define TPS546_STATUS_VOUT 0x8000 //bit 15
@ -106,11 +128,50 @@ typedef struct
#define TPS546_STATUS_CML 0x0002
#define TPS546_STATUS_NONE 0x0001
/* STATUS_VOUT OFFSETS */
#define TPS546_STATUS_VOUT_OVF 0x80 //bit 7 - Latched flag indicating a VOUT OV fault has occurred.
#define TPS546_STATUS_VOUT_OVW 0x40 //bit 6 - Latched flag indicating a VOUT OV warn has occurred.
#define TPS546_STATUS_VOUT_UVW 0x20 //bit 5 - Latched flag indicating a VOUT UV warn has occurred.
#define TPS546_STATUS_VOUT_UVF 0x10 //bit 4 - Latched flag indicating a VOUT UV fault has occurred.
#define TPS546_STATUS_VOUT_MIN_MAX 0x08 //bit 3 - Latched flag indicating a VOUT_MIN_MAX has occurred.
#define TPS546_STATUS_VOUT_TON_MAX 0x04 //bit 2 - Latched flag indicating a TON_MAX has occurred.
/* STATUS_IOUT OFFSETS */
#define TPS546_STATUS_IOUT_OCF 0x80 //bit 7 - Latched flag indicating IOUT OC fault has occurred.
#define TPS546_STATUS_IOUT_OCW 0x20 //bit 5 - Latched flag indicating IOUT OC warn has occurred.
/* STATUS_INPUT OFFSETS */
#define TPS546_STATUS_VIN_OVF 0x80 //bit 7 - Latched flag indicating PVIN OV fault has occurred.
#define TPS546_STATUS_VIN_UVW 0x20 //bit 5 - Latched flag indicating PVIN UV warn has occurred.
#define TPS546_STATUS_VIN_LOW_VIN 0x08 //bit 3 - LIVE (unlatched) status bit. PVIN is OFF.
/* STATUS_TEMPERATURE OFFSETS */
#define TPS546_STATUS_TEMP_OTF 0x80 //bit 7 - Latched flag indicating OT fault has occurred.
#define TPS546_STATUS_TEMP_OTW 0x40 //bit 6 - Latched flag indicating OT warn has occurred
/* STATUS_CML OFFSETS */
#define TPS546_STATUS_CML_IVC 0x80 //bit 7 - Latched flag indicating an invalid or unsupported command was received.
#define TPS546_STATUS_CML_IVD 0x40 //bit 6 - Latched flag indicating an invalid or unsupported data was received.
#define TPS546_STATUS_CML_PEC 0x20 //bit 5 - Latched flag indicating a packet error check has failed.
#define TPS546_STATUS_CML_MEM 0x10 //bit 4 - Latched flag indicating a memory error was detected.
#define TPS546_STATUS_CML_PROC 0x08 //bit 3 - Latched flag indicating a logic core error was detected.
#define TPS546_STATUS_CML_COMM 0x02 //bit 1 - Latched flag indicating communication error detected.
/* STATUS_OTHER */
#define TPS546_STATUS_OTHER_FIRST 0x01 //bit 0 - Latched flag indicating that this device was the first to assert SMBALERT.
/* STATUS_MFG */
#define TPS546_STATUS_MFR_POR 0x80 //bit 7 - A Power-On Reset Fault has been detected.
#define TPS546_STATUS_MFR_SELF 0x40 //bit 6 - Power-On Self-Check is in progress. One or more BCX slaves have not responded.
#define TPS546_STATUS_MFR_RESET 0x08 //bit 3 - A RESET_VOUT event has occurred.
#define TPS546_STATUS_MFR_BCX 0x04 //bit 2 - A BCX fault event has occurred.
#define TPS546_STATUS_MFR_SYNC 0x02 //bit 1 - A SYNC fault has been detected.
/* public functions */
esp_err_t TPS546_init(TPS546_CONFIG config);
void TPS546_read_mfr_info(uint8_t *);
void TPS546_set_mfr_info(void);
void TPS546_write_entire_config(void);
int TPS546_get_frequency(void);
void TPS546_set_frequency(int);
@ -122,8 +183,9 @@ esp_err_t TPS546_set_vout(float volts);
void TPS546_show_voltage_settings(void);
void TPS546_print_status(void);
esp_err_t TPS546_check_status(uint16_t *);
esp_err_t TPS546_parse_status(uint16_t status);
esp_err_t TPS546_check_status(GlobalState * global_state);
esp_err_t TPS546_clear_faults(void);
const char* TPS546_get_error_message(void); //Get the current TPS error message
#endif /* TPS546_H_ */

View File

@ -33,7 +33,7 @@ static TPS546_CONFIG TPS546_CONFIG_GAMMA = {
.TPS546_INIT_VIN_ON = 4.8,
.TPS546_INIT_VIN_OFF = 4.5,
.TPS546_INIT_VIN_UV_WARN_LIMIT = 0, //Set to 0 to ignore. TI Bug in this register
.TPS546_INIT_VIN_OV_FAULT_LIMIT = 5.5,
.TPS546_INIT_VIN_OV_FAULT_LIMIT = 6.5,
/* vout voltage */
.TPS546_INIT_SCALE_LOOP = 0.25,
.TPS546_INIT_VOUT_MIN = 1,
@ -52,10 +52,7 @@ esp_err_t VCORE_init(GlobalState * GLOBAL_STATE) {
case DEVICE_ULTRA:
case DEVICE_SUPRA:
if (GLOBAL_STATE->board_version >= 402 && GLOBAL_STATE->board_version <= 499) {
if (TPS546_init(TPS546_CONFIG_GAMMA) != ESP_OK) {
ESP_LOGE(TAG, "TPS546 init failed!");
return ESP_FAIL;
}
ESP_RETURN_ON_ERROR(TPS546_init(TPS546_CONFIG_GAMMA), TAG, "TPS546 init failed!"); //yes, it's a gamma as far as the TPS546 is concerned
} else {
ESP_RETURN_ON_ERROR(DS4432U_init(), TAG, "DS4432 init failed!");
ESP_RETURN_ON_ERROR(INA260_init(), TAG, "INA260 init failed!");
@ -144,3 +141,43 @@ int16_t VCORE_get_voltage_mv(GlobalState * global_state) {
}
return -1;
}
esp_err_t VCORE_check_fault(GlobalState * global_state) {
switch (global_state->device_model) {
case DEVICE_MAX:
case DEVICE_ULTRA:
case DEVICE_SUPRA:
if (global_state->board_version >= 402 && global_state->board_version <= 499) {
ESP_RETURN_ON_ERROR(TPS546_check_status(global_state), TAG, "TPS546 check status failed!");
}
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
ESP_RETURN_ON_ERROR(TPS546_check_status(global_state), TAG, "TPS546 check status failed!");
break;
// case DEVICE_HEX:
default:
}
return ESP_OK;
}
const char* VCORE_get_fault_string(GlobalState * global_state) {
switch (global_state->device_model) {
case DEVICE_MAX:
case DEVICE_ULTRA:
case DEVICE_SUPRA:
if (global_state->board_version >= 402 && global_state->board_version <= 499) {
return TPS546_get_error_message();
}
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
return TPS546_get_error_message();
break;
// case DEVICE_HEX:
default:
}
return NULL;
}

View File

@ -6,5 +6,7 @@
esp_err_t VCORE_init(GlobalState * global_state);
esp_err_t VCORE_set_voltage(float core_voltage, GlobalState * global_state);
int16_t VCORE_get_voltage_mv(GlobalState * global_state);
esp_err_t VCORE_check_fault(GlobalState * global_state);
const char* VCORE_get_fault_string(GlobalState * global_state);
#endif /* VCORE_H_ */

View File

@ -10,6 +10,7 @@
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_check.h"
#include "driver/gpio.h"
#include "esp_app_desc.h"
@ -82,6 +83,9 @@ void SYSTEM_init_system(GlobalState * GLOBAL_STATE)
module->overheat_mode = nvs_config_get_u16(NVS_CONFIG_OVERHEAT_MODE, 0);
ESP_LOGI(TAG, "Initial overheat_mode value: %d", module->overheat_mode);
//Initialize power_fault fault mode
module->power_fault = 0;
// set the best diff string
_suffix_string(module->best_nonce_diff, module->best_diff_string, DIFF_STRING_SIZE, 0);
_suffix_string(module->best_session_nonce_diff, module->best_session_diff_string, DIFF_STRING_SIZE, 0);
@ -93,20 +97,20 @@ void SYSTEM_init_system(GlobalState * GLOBAL_STATE)
memset(module->wifi_status, 0, 20);
}
void SYSTEM_init_peripherals(GlobalState * GLOBAL_STATE) {
// Initialize the core voltage regulator
VCORE_init(GLOBAL_STATE);
VCORE_set_voltage(nvs_config_get_u16(NVS_CONFIG_ASIC_VOLTAGE, CONFIG_ASIC_VOLTAGE) / 1000.0, GLOBAL_STATE);
esp_err_t SYSTEM_init_peripherals(GlobalState * GLOBAL_STATE) {
ESP_RETURN_ON_ERROR(gpio_install_isr_service(0), TAG, "Error installing ISR service");
Thermal_init(GLOBAL_STATE->device_model, nvs_config_get_u16(NVS_CONFIG_INVERT_FAN_POLARITY, 1));
// Initialize the core voltage regulator
ESP_RETURN_ON_ERROR(VCORE_init(GLOBAL_STATE), TAG, "VCORE init failed!");
ESP_RETURN_ON_ERROR(VCORE_set_voltage(nvs_config_get_u16(NVS_CONFIG_ASIC_VOLTAGE, CONFIG_ASIC_VOLTAGE) / 1000.0, GLOBAL_STATE), TAG, "VCORE set voltage failed!");
ESP_RETURN_ON_ERROR(Thermal_init(GLOBAL_STATE->device_model, nvs_config_get_u16(NVS_CONFIG_INVERT_FAN_POLARITY, 1)), TAG, "Thermal init failed!");
vTaskDelay(500 / portTICK_PERIOD_MS);
// Ensure overheat_mode config exists
esp_err_t ret = ensure_overheat_mode_config();
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to ensure overheat_mode config");
}
ESP_RETURN_ON_ERROR(ensure_overheat_mode_config(), TAG, "Failed to ensure overheat_mode config");
//Init the DISPLAY
switch (GLOBAL_STATE->device_model) {
@ -125,15 +129,13 @@ void SYSTEM_init_peripherals(GlobalState * GLOBAL_STATE) {
default:
}
if (input_init(screen_next, toggle_wifi_softap) != ESP_OK) {
ESP_LOGW(TAG, "Input init failed!");
}
ESP_RETURN_ON_ERROR(input_init(screen_next, toggle_wifi_softap), TAG, "Input init failed!");
if (screen_start(GLOBAL_STATE) != ESP_OK) {
ESP_LOGW(TAG, "Screen init failed");
}
ESP_RETURN_ON_ERROR(screen_start(GLOBAL_STATE), TAG, "Screen start failed!");
netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
return ESP_OK;
}
void SYSTEM_notify_accepted_share(GlobalState * GLOBAL_STATE)

View File

@ -1,10 +1,11 @@
#ifndef SYSTEM_H_
#define SYSTEM_H_
#include "esp_err.h"
#include "global_state.h"
void SYSTEM_init_system(GlobalState * GLOBAL_STATE);
void SYSTEM_init_peripherals(GlobalState * GLOBAL_STATE);
esp_err_t SYSTEM_init_peripherals(GlobalState * GLOBAL_STATE);
void SYSTEM_notify_accepted_share(GlobalState * GLOBAL_STATE);
void SYSTEM_notify_rejected_share(GlobalState * GLOBAL_STATE, char * error_msg);

View File

@ -69,6 +69,7 @@ void POWER_MANAGEMENT_task(void * pvParameters)
GlobalState * GLOBAL_STATE = (GlobalState *) pvParameters;
PowerManagementModule * power_management = &GLOBAL_STATE->POWER_MANAGEMENT_MODULE;
SystemModule * sys_module = &GLOBAL_STATE->SYSTEM_MODULE;
power_management->frequency_multiplier = 1;
@ -154,14 +155,15 @@ void POWER_MANAGEMENT_task(void * pvParameters)
}
// Check for changing of overheat mode
SystemModule * module = &GLOBAL_STATE->SYSTEM_MODULE;
uint16_t new_overheat_mode = nvs_config_get_u16(NVS_CONFIG_OVERHEAT_MODE, 0);
if (new_overheat_mode != module->overheat_mode) {
module->overheat_mode = new_overheat_mode;
ESP_LOGI(TAG, "Overheat mode updated to: %d", module->overheat_mode);
if (new_overheat_mode != sys_module->overheat_mode) {
sys_module->overheat_mode = new_overheat_mode;
ESP_LOGI(TAG, "Overheat mode updated to: %d", sys_module->overheat_mode);
}
VCORE_check_fault(GLOBAL_STATE);
// looper:
vTaskDelay(POLL_RATE / portTICK_PERIOD_MS);
}