ESP-Miner/main/power/power.c
2025-03-08 23:12:14 +01:00

148 lines
4.5 KiB
C

#include "TPS546.h"
#include "INA260.h"
#include "DS4432U.h"
#include "power.h"
#include "vcore.h"
#define GPIO_ASIC_ENABLE CONFIG_GPIO_ASIC_ENABLE
#define SUPRA_POWER_OFFSET 5 //Watts
#define GAMMA_POWER_OFFSET 5 //Watts
#define GAMMATURBO_POWER_OFFSET 5 //Watts
esp_err_t Power_disable(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) {
// Turn off core voltage
VCORE_set_voltage(0.0, GLOBAL_STATE);
} else if (GLOBAL_STATE->board_version == 202 || GLOBAL_STATE->board_version == 203 || GLOBAL_STATE->board_version == 204) {
gpio_set_level(GPIO_ASIC_ENABLE, 1);
}
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
// Turn off core voltage
VCORE_set_voltage(0.0, GLOBAL_STATE);
break;
default:
}
return ESP_OK;
}
float Power_get_current(GlobalState * GLOBAL_STATE) {
float current = 0.0;
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) {
current = TPS546_get_iout() * 1000.0;
} else {
if (INA260_installed() == true) {
current = INA260_read_current();
}
}
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
current = TPS546_get_iout() * 1000.0;
break;
default:
}
return current;
}
float Power_get_power(GlobalState * GLOBAL_STATE) {
float power = 0.0;
float current = 0.0;
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) {
current = TPS546_get_iout() * 1000.0;
// calculate regulator power (in milliwatts)
power = (TPS546_get_vout() * current) / 1000.0;
// The power reading from the TPS546 is only it's output power. So the rest of the Bitaxe power is not accounted for.
power += SUPRA_POWER_OFFSET; // Add offset for the rest of the Bitaxe power. TODO: this better.
} else {
if (INA260_installed() == true) {
power = INA260_read_power() / 1000.0;
}
}
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
current = TPS546_get_iout() * 1000.0;
// calculate regulator power (in milliwatts)
power = (TPS546_get_vout() * current) / 1000.0;
// The power reading from the TPS546 is only it's output power. So the rest of the Bitaxe power is not accounted for.
power += GAMMATURBO_POWER_OFFSET; // Add offset for the rest of the Bitaxe power. TODO: this better.
break;
default:
}
return power;
}
float Power_get_input_voltage(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_vin() * 1000.0;
} else {
if (INA260_installed() == true) {
return INA260_read_voltage();
}
}
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
return TPS546_get_vin() * 1000.0;
break;
default:
}
return 0.0;
}
float Power_get_vreg_temp(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_temperature();
} else {
if (INA260_installed() == true) {
return 0.0;
}
}
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
return TPS546_get_temperature();
break;
default:
}
return 0.0;
}