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
diff --git a/main/global_state.h b/main/global_state.h
index 676d2545..27518ba0 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">
+
+
+
-
+
- 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
--
0; else noTemp">
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);
}