From 347431852a6540c948260807872837d80d4e66b4 Mon Sep 17 00:00:00 2001 From: WantClue <86001033+WantClue@users.noreply.github.com> Date: Tue, 18 Mar 2025 17:47:35 +0100 Subject: [PATCH 1/2] Update unittest.yml update permissions on workflow --- .github/workflows/unittest.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index c0eb71a5..74675d2b 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -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 From 9c6910966e97d8ff7a3e10e03eb2e8ba6d60d607 Mon Sep 17 00:00:00 2001 From: skot <140785+skot@users.noreply.github.com> Date: Wed, 19 Mar 2025 17:15:17 -0400 Subject: [PATCH 2/2] Create TPS546 VCORE alerts (#780) * add ISR for SMB_ALRT and checking in systemtask * change order of gpio ISR init * switch back tp TPS546 status polling * added some comments arbout the structure of the 3 fault responses * feat: add TPS alerts to UI * change Gamma VIN_OV_FAULT_LIMIT from 5.5V to 6.5V * changed the power fault banner to use the SYSTEM_MODULE.power_fault flag. Found the right TPS546 register so that a soft reset clears a power fault. * clean up fault alert wording * remove the PMBUS_ALERT interrupt -- that never worked. * cleanup https_server.c includes * remove unused TPS546 functions * handle setting the power_fault flag in TPS546.c. only print the error messages once. * make TPS542 faults debug more consistent * added more detail to TPS546_parse_status() --------- Co-authored-by: WantClue --- main/global_state.h | 1 + .../app/components/home/home.component.html | 14 +- .../axe-os/src/models/ISystemInfo.ts | 1 + main/http_server/http_server.c | 37 +- main/http_server/theme_api.c | 2 +- main/input.c | 2 - main/power/TPS546.c | 325 ++++++++++++------ main/power/TPS546.h | 90 ++++- main/power/vcore.c | 47 ++- main/power/vcore.h | 2 + main/system.c | 32 +- main/system.h | 3 +- main/tasks/power_management_task.c | 10 +- 13 files changed, 394 insertions(+), 172 deletions(-) diff --git a/main/global_state.h b/main/global_state.h index 0847ce75..705e264c 100644 --- a/main/global_state.h +++ b/main/global_state.h @@ -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; diff --git a/main/http_server/axe-os/src/app/components/home/home.component.html b/main/http_server/axe-os/src/app/components/home/home.component.html index 867f1506..15cf79a5 100644 --- a/main/http_server/axe-os/src/app/components/home/home.component.html +++ b/main/http_server/axe-os/src/app/components/home/home.component.html @@ -11,6 +11,10 @@ text="Bitaxe frequency is set low - See settings"> + + +
@@ -26,9 +30,9 @@
- + - Average: + Average: {{calculateAverage(hashrateData) | hashSuffix}} @@ -51,9 +55,9 @@ - + - Average: + Average: {{calculateEfficiencyAverage(hashrateData, powerData) | number: '1.2-2'}} J/TH @@ -168,7 +172,7 @@
-
ASIC Temperature +
ASIC Temperature -- diff --git a/main/http_server/axe-os/src/models/ISystemInfo.ts b/main/http_server/axe-os/src/models/ISystemInfo.ts index fcfe45df..bd759528 100644 --- a/main/http_server/axe-os/src/models/ISystemInfo.ts +++ b/main/http_server/axe-os/src/models/ISystemInfo.ts @@ -51,5 +51,6 @@ export interface ISystemInfo { boardtemp1?: number, boardtemp2?: number, overheat_mode: number, + power_fault?: string overclockEnabled?: number } diff --git a/main/http_server/http_server.c b/main/http_server/http_server.c index c07a71c3..194fd9a4 100644 --- a/main/http_server/http_server.c +++ b/main/http_server/http_server.c @@ -1,6 +1,11 @@ -#include "http_server.h" -#include "theme_api.h" // Add theme API include -#include "cJSON.h" +#include +#include +#include +#include + +#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 -#include -#include #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 -#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); diff --git a/main/http_server/theme_api.c b/main/http_server/theme_api.c index 53a5629f..b1fb13e7 100644 --- a/main/http_server/theme_api.c +++ b/main/http_server/theme_api.c @@ -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) diff --git a/main/input.c b/main/input.c index 5728efa1..e26e2229 100644 --- a/main/input.c +++ b/main/input.c @@ -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(); diff --git a/main/power/TPS546.c b/main/power/TPS546.c index 8d94cd0d..de050c59 100644 --- a/main/power/TPS546.c +++ b/main/power/TPS546.c @@ -4,12 +4,15 @@ #include #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; diff --git a/main/power/TPS546.h b/main/power/TPS546.h index 325dddde..de63dd56 100644 --- a/main/power/TPS546.h +++ b/main/power/TPS546.h @@ -3,17 +3,21 @@ #include #include +#include -#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_ */ diff --git a/main/power/vcore.c b/main/power/vcore.c index 0bfc3fe1..2378e04a 100644 --- a/main/power/vcore.c +++ b/main/power/vcore.c @@ -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; +} + diff --git a/main/power/vcore.h b/main/power/vcore.h index a9143a18..5527ae3d 100644 --- a/main/power/vcore.h +++ b/main/power/vcore.h @@ -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_ */ diff --git a/main/system.c b/main/system.c index e5bb1dc5..b894ce80 100644 --- a/main/system.c +++ b/main/system.c @@ -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) diff --git a/main/system.h b/main/system.h index e1ac64bf..ccd5af56 100644 --- a/main/system.h +++ b/main/system.h @@ -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); diff --git a/main/tasks/power_management_task.c b/main/tasks/power_management_task.c index 94caaf6e..723e1c40 100644 --- a/main/tasks/power_management_task.c +++ b/main/tasks/power_management_task.c @@ -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); }