mirror of
https://github.com/skot/ESP-Miner.git
synced 2025-04-09 20:39:14 +02:00
Merge branch 'dev-latest' into remove-bm1397Module
This commit is contained in:
commit
1991d98a78
6
.github/workflows/unittest.yml
vendored
6
.github/workflows/unittest.yml
vendored
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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">
|
||||
|
@ -51,5 +51,6 @@ export interface ISystemInfo {
|
||||
boardtemp1?: number,
|
||||
boardtemp2?: number,
|
||||
overheat_mode: number,
|
||||
power_fault?: string
|
||||
overclockEnabled?: number
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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_ */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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_ */
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user