Fix overtemp and self tests for gamma (#343)

This commit is contained in:
Benjamin Wilson 2024-09-20 19:30:20 -04:00 committed by GitHub
parent 669d81b645
commit b700c6bbf0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 99 additions and 33 deletions

View File

@ -613,12 +613,12 @@ void BM1366_send_work(void * pvParameters, bm_job * next_bm_job)
pthread_mutex_lock(&GLOBAL_STATE->valid_jobs_lock);
GLOBAL_STATE->valid_jobs[job.job_id] = 1;
pthread_mutex_unlock(&GLOBAL_STATE->valid_jobs_lock);
//debug sent jobs - this can get crazy if the interval is short
#if BM1368_DEBUG_JOBS
#if BM1366_DEBUG_JOBS
ESP_LOGI(TAG, "Send Job: %02X", job.job_id);
#endif
pthread_mutex_unlock(&GLOBAL_STATE->valid_jobs_lock);
_send_BM1366((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(BM1366_job), BM1366_DEBUG_WORK);
}

View File

@ -348,11 +348,11 @@ void BM1368_send_work(void * pvParameters, bm_job * next_bm_job)
pthread_mutex_lock(&GLOBAL_STATE->valid_jobs_lock);
GLOBAL_STATE->valid_jobs[job.job_id] = 1;
pthread_mutex_unlock(&GLOBAL_STATE->valid_jobs_lock);
#if BM1368_DEBUG_JOBS
ESP_LOGI(TAG, "Send Job: %02X", job.job_id);
#endif
pthread_mutex_unlock(&GLOBAL_STATE->valid_jobs_lock);
_send_BM1368((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(BM1368_job), BM1368_DEBUG_WORK);
}

View File

@ -96,7 +96,9 @@ static void _send_BM1370(uint8_t header, uint8_t * data, uint8_t data_len, bool
}
// send serial data
SERIAL_send(buf, total_length, packet_type == CMD_PACKET ? BM1370_SERIALTX_DEBUG : false);
if (SERIAL_send(buf, total_length, debug) == 0) {
ESP_LOGE(TAG, "Failed to send data to BM1370");
}
free(buf);
}
@ -115,7 +117,7 @@ static void _send_chain_inactive(void)
unsigned char read_address[2] = {0x00, 0x00};
// send serial data
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_INACTIVE), read_address, 2, false);
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_INACTIVE), read_address, 2, BM1370_SERIALTX_DEBUG);
}
static void _set_chip_address(uint8_t chipAddr)
@ -123,7 +125,7 @@ static void _set_chip_address(uint8_t chipAddr)
unsigned char read_address[2] = {chipAddr, 0x00};
// send serial data
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_SETADDRESS), read_address, 2, false);
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_SETADDRESS), read_address, 2, BM1370_SERIALTX_DEBUG);
}
void BM1370_send_hash_frequency(int id, float target_freq, float max_diff) {
@ -174,7 +176,7 @@ void BM1370_send_hash_frequency(int id, float target_freq, float max_diff) {
_send_BM1370(TYPE_CMD | GROUP_ALL | CMD_WRITE, freqbuf, 6, BM1370_SERIALTX_DEBUG);
}
//ESP_LOGI(TAG, "Setting Frequency to %.2fMHz (%.2f)", target_freq, best_freq);
ESP_LOGI(TAG, "Setting Frequency to %.2fMHz (%.2f)", target_freq, best_freq);
}
static void do_frequency_ramp_up(float target_frequency) {
@ -189,7 +191,7 @@ static void do_frequency_ramp_up(float target_frequency) {
float next_step = fminf(step, target_frequency - current);
current += next_step;
BM1370_send_hash_frequency(-1, current, 0.001);
vTaskDelay(pdMS_TO_TICKS(100));
vTaskDelay(pdMS_TO_TICKS(10));
}
}
@ -277,20 +279,20 @@ static uint8_t _send_init(uint64_t frequency, uint16_t asic_count)
for (uint8_t i = 0; i < chip_counter; i++) {
//Reg_A8
unsigned char set_a8_register[6] = {i * address_interval, 0xA8, 0x00, 0x07, 0x01, 0xF0};
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_a8_register, 6, false);
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_a8_register, 6, BM1370_SERIALTX_DEBUG);
//Misc Control
unsigned char set_18_register[6] = {i * address_interval, 0x18, 0xF0, 0x00, 0xC1, 0x00};
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_18_register, 6, false);
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_18_register, 6, BM1370_SERIALTX_DEBUG);
//Core Register Control
unsigned char set_3c_register_first[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x8B, 0x00};
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_first, 6, false);
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_first, 6, BM1370_SERIALTX_DEBUG);
//Core Register Control
//unsigned char set_3c_register_second[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x80, 0x0C}; //from S21Pro dump
unsigned char set_3c_register_second[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x80, 0x18};
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_second, 6, false);
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_second, 6, BM1370_SERIALTX_DEBUG);
//Core Register Control
unsigned char set_3c_register_third[6] = {i * address_interval, 0x3C, 0x80, 0x00, 0x82, 0xAA};
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_third, 6, false);
_send_BM1370((TYPE_CMD | GROUP_SINGLE | CMD_WRITE), set_3c_register_third, 6, BM1370_SERIALTX_DEBUG);
}
do_frequency_ramp_up(frequency);
@ -305,7 +307,7 @@ static uint8_t _send_init(uint64_t frequency, uint16_t asic_count)
//unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x00, 0x15, 0xA4}; //S21-Stock Default
unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x00, 0x1E, 0xB5}; //S21 Pro-Stock Default
// unsigned char set_10_hash_counting[6] = {0x00, 0x10, 0x00, 0x0F, 0x00, 0x00}; //supposedly the "full" 32bit nonce range
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_WRITE), set_10_hash_counting, 6, false);
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_WRITE), set_10_hash_counting, 6, BM1370_SERIALTX_DEBUG);
return chip_counter;
}
@ -330,7 +332,7 @@ static void _send_read_address(void)
unsigned char read_address[2] = {0x00, 0x00};
// send serial data
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_READ), read_address, 2, false);
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_READ), read_address, 2, BM1370_SERIALTX_DEBUG);
}
uint8_t BM1370_init(uint64_t frequency, uint16_t asic_count)
@ -354,7 +356,7 @@ int BM1370_set_default_baud(void)
{
// default divider of 26 (11010) for 115,749
unsigned char baudrate[9] = {0x00, MISC_CONTROL, 0x00, 0x00, 0b01111010, 0b00110001}; // baudrate - misc_control
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_WRITE), baudrate, 6, false);
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_WRITE), baudrate, 6, BM1370_SERIALTX_DEBUG);
return 115749;
}
@ -394,7 +396,7 @@ void BM1370_set_job_difficulty_mask(int difficulty)
ESP_LOGI(TAG, "Setting ASIC difficulty mask to %d", difficulty);
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_WRITE), job_difficulty_mask, 6, false);
_send_BM1370((TYPE_CMD | GROUP_ALL | CMD_WRITE), job_difficulty_mask, 6, BM1370_SERIALTX_DEBUG);
}
static uint8_t id = 0;
@ -423,10 +425,14 @@ void BM1370_send_work(void * pvParameters, bm_job * next_bm_job)
pthread_mutex_lock(&GLOBAL_STATE->valid_jobs_lock);
GLOBAL_STATE->valid_jobs[job.job_id] = 1;
//ESP_LOGI(TAG, "Send Job: %02X", job.job_id);
pthread_mutex_unlock(&GLOBAL_STATE->valid_jobs_lock);
_send_BM1370((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(BM1370_job), false);
//debug sent jobs - this can get crazy if the interval is short
#if BM1370_DEBUG_JOBS
ESP_LOGI(TAG, "Send Job: %02X", job.job_id);
#endif
_send_BM1370((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(BM1370_job), BM1370_DEBUG_WORK);
}
asic_result * BM1370_receive_work(void)

View File

@ -384,9 +384,12 @@ void BM1397_send_work(void *pvParameters, bm_job *next_bm_job)
pthread_mutex_lock(&GLOBAL_STATE->valid_jobs_lock);
GLOBAL_STATE->valid_jobs[job.job_id] = 1;
// ESP_LOGI(TAG, "Added Job: %i", job.job_id);
pthread_mutex_unlock(&GLOBAL_STATE->valid_jobs_lock);
#if BM1397_DEBUG_JOBS
ESP_LOGI(TAG, "Send Job: %02X", job.job_id);
#endif
_send_BM1397((TYPE_JOB | GROUP_SINGLE | CMD_WRITE), &job, sizeof(job_packet), BM1397_DEBUG_WORK);
}

View File

@ -13,7 +13,7 @@
#define BM1366_SERIALTX_DEBUG false
#define BM1366_SERIALRX_DEBUG false
#define BM1366_DEBUG_WORK false //causes insane amount of debug output
#define BM1368_DEBUG_JOBS false //causes insane amount of debug output
#define BM1366_DEBUG_JOBS false //causes insane amount of debug output
static const uint64_t BM1366_CORE_COUNT = 112;
static const uint64_t BM1366_SMALL_CORE_COUNT = 894;

View File

@ -14,6 +14,7 @@
#define BM1370_SERIALTX_DEBUG true
#define BM1370_SERIALRX_DEBUG false
#define BM1370_DEBUG_WORK false //causes insane amount of debug output
#define BM1370_DEBUG_JOBS false //causes insane amount of debug output
static const uint64_t BM1370_CORE_COUNT = 128;
static const uint64_t BM1370_SMALL_CORE_COUNT = 2040;

View File

@ -13,6 +13,7 @@
#define BM1937_SERIALTX_DEBUG false
#define BM1937_SERIALRX_DEBUG false
#define BM1397_DEBUG_WORK false //causes insane amount of debug output
#define BM1397_DEBUG_JOBS false //causes insane amount of debug output
static const uint64_t BM1397_CORE_COUNT = 168;
static const uint64_t BM1397_SMALL_CORE_COUNT = 672;

View File

@ -69,6 +69,11 @@ float EMC2101_get_external_temp(void)
}
float result = (float) reading / 8.0;
// Greater than 200C is probably an erroneous reading...
if (result > 200){
return EMC2101_get_internal_temp();
}
return result;
}

View File

@ -106,7 +106,7 @@ typedef struct
uint32_t version_mask;
int sock;
bool ASIC_initalized;
} GlobalState;
#endif /* GLOBAL_STATE_H_ */

View File

@ -17,7 +17,13 @@
#include "stratum_task.h"
#include "user_input_task.h"
static GlobalState GLOBAL_STATE = {.extranonce_str = NULL, .extranonce_2_len = 0, .abandon_work = 0, .version_mask = 0};
static GlobalState GLOBAL_STATE = {
.extranonce_str = NULL,
.extranonce_2_len = 0,
.abandon_work = 0,
.version_mask = 0,
.ASIC_initalized = false
};
static const char * TAG = "bitaxe";
static const double NONCE_SPACE = 4294967296.0; // 2^32
@ -195,6 +201,8 @@ void app_main(void)
SERIAL_set_baud((*GLOBAL_STATE.ASIC_functions.set_max_baud_fn)());
SERIAL_clear_buffer();
GLOBAL_STATE.ASIC_initalized = true;
xTaskCreate(stratum_task, "stratum admin", 8192, (void *) &GLOBAL_STATE, 5, NULL);
xTaskCreate(create_jobs_task, "stratum miner", 8192, (void *) &GLOBAL_STATE, 10, NULL);
xTaskCreate(ASIC_task, "asic", 8192, (void *) &GLOBAL_STATE, 10, NULL);

View File

@ -11,6 +11,7 @@
#include "vcore.h"
#include "utils.h"
#include "string.h"
#include "TPS546.h"
static const char * TAG = "self_test";
@ -51,11 +52,23 @@ static bool fan_sense_pass(GlobalState * GLOBAL_STATE)
return false;
}
static bool power_consumption_pass()
static bool INA260_power_consumption_pass(int target_power, int margin)
{
float power = INA260_read_power() / 1000;
ESP_LOGI(TAG, "Power: %f", power);
if (power > 9 && power < 15) {
if (power > target_power -margin && power < target_power +margin) {
return true;
}
return false;
}
static bool TPS546_power_consumption_pass(int target_power, int margin)
{
float voltage = TPS546_get_vout();
float current = TPS546_get_iout();
float power = voltage * current;
ESP_LOGI(TAG, "Power: %f, Voltage: %f, Current %f", power, voltage, current);
if (power > target_power -margin && power < target_power +margin) {
return true;
}
return false;
@ -143,10 +156,24 @@ void self_test(void * pvParameters)
if(!DS4432U_test()){
ESP_LOGE(TAG, "DS4432 test failed!");
display_msg("DS4432U:FAIL", GLOBAL_STATE);
return;
}
}else{
int result = TPS546_init();
if(result != 0){
ESP_LOGE(TAG, "TPS546 test failed!");
display_msg("TPS546:FAIL", GLOBAL_STATE);
return;
}
}
break;
case DEVICE_GAMMA:
int result = TPS546_init();
if(result != 0){
ESP_LOGE(TAG, "TPS546 test failed!");
display_msg("TPS546:FAIL", GLOBAL_STATE);
return;
}
break;
default:
}
@ -240,12 +267,27 @@ void self_test(void * pvParameters)
case DEVICE_MAX:
case DEVICE_ULTRA:
case DEVICE_SUPRA:
if (INA260_installed() && !power_consumption_pass()) {
ESP_LOGE(TAG, "INA260 test failed!");
display_msg("MONITOR: FAIL", GLOBAL_STATE);
return;
if(GLOBAL_STATE->board_version != 402){
if (!INA260_power_consumption_pass(12, 3)) {
ESP_LOGE(TAG, "INA260 Power Draw Failed");
display_msg("POWER: FAIL", GLOBAL_STATE);
return;
}
} else {
if (!TPS546_power_consumption_pass(8, 2)) {
ESP_LOGE(TAG, "TPS546 Power Draw Failed, target %f", 8.0);
display_msg("POWER: FAIL", GLOBAL_STATE);
return;
}
}
break;
case DEVICE_GAMMA:
if (!TPS546_power_consumption_pass(15, 2)) {
ESP_LOGE(TAG, "TPS546 Power Draw Failed, target %f", 15.0);
display_msg("POWER: FAIL", GLOBAL_STATE);
return;
}
break;
default:
}

View File

@ -157,7 +157,7 @@ void POWER_MANAGEMENT_task(void * pvParameters)
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
power_management->chip_temp_avg = EMC2101_get_external_temp();
power_management->chip_temp_avg = GLOBAL_STATE->ASIC_initalized ? EMC2101_get_external_temp() : -1;
if ((power_management->chip_temp_avg > THROTTLE_TEMP) &&
(power_management->frequency_value > 50 || power_management->voltage > 1000)) {
@ -178,7 +178,7 @@ void POWER_MANAGEMENT_task(void * pvParameters)
case DEVICE_SUPRA:
if (GLOBAL_STATE->board_version == 402) {
power_management->chip_temp_avg = EMC2101_get_external_temp();
power_management->chip_temp_avg = GLOBAL_STATE->ASIC_initalized ? EMC2101_get_external_temp() : -1;
power_management->vr_temp = (float)TPS546_get_temperature();
} else {
power_management->chip_temp_avg = EMC2101_get_internal_temp() + 5;
@ -212,7 +212,7 @@ void POWER_MANAGEMENT_task(void * pvParameters)
break;
case DEVICE_GAMMA:
power_management->chip_temp_avg = EMC2101_get_external_temp();
power_management->chip_temp_avg = GLOBAL_STATE->ASIC_initalized ? EMC2101_get_external_temp() : -1;
power_management->vr_temp = (float)TPS546_get_temperature();
// EMC2101 will give bad readings if the ASIC is turned off