mutatrum a5842a54b3
Verify CHIP_ID response (#745)
* Verify CHIP_ID response

Fixes #740

* Log warning on CHIP_ID mismatch

* Fix CHIP_ID checksum calculation

* On BM1397, CORE_NUM should be 0x18

* CORE_NUM and ADDR log only and early exit when no chips are detected

* Fix compile error

* Refactored out duplicated code

Moved count_asic_chips and receive_work functions to common.c
Moved asic_response_buffer to local scope
Unified preamble and crc check on serial rx
Fixed typo in proccess_work
Moved CRC5_MASK define to proper location

* Change receive_work read timeout log to debug

* Changed wrong log to debug

* Fix merge

* Fix length check for bm1397

* add ASIC TX dubugging on BM1397 (crap, does this fix the ticket mask?!)

---------

Co-authored-by: Skot <skot@bitnet.cx>
2025-03-12 22:45:33 +01:00

264 lines
10 KiB
C

#include <string.h>
#include <esp_log.h>
#include "bm1397.h"
#include "bm1366.h"
#include "bm1368.h"
#include "bm1370.h"
#include "asic.h"
static const double NONCE_SPACE = 4294967296.0; // 2^32
static const char *TAG = "asic";
// .init_fn = BM1366_init,
uint8_t ASIC_init(GlobalState * GLOBAL_STATE) {
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
return BM1397_init(GLOBAL_STATE->POWER_MANAGEMENT_MODULE.frequency_value, BITAXE_MAX_ASIC_COUNT);
case DEVICE_ULTRA:
return BM1366_init(GLOBAL_STATE->POWER_MANAGEMENT_MODULE.frequency_value, BITAXE_ULTRA_ASIC_COUNT);
case DEVICE_SUPRA:
return BM1368_init(GLOBAL_STATE->POWER_MANAGEMENT_MODULE.frequency_value, BITAXE_SUPRA_ASIC_COUNT);
case DEVICE_GAMMA:
return BM1370_init(GLOBAL_STATE->POWER_MANAGEMENT_MODULE.frequency_value, BITAXE_GAMMA_ASIC_COUNT);
case DEVICE_GAMMATURBO:
return BM1370_init(GLOBAL_STATE->POWER_MANAGEMENT_MODULE.frequency_value, BITAXE_GAMMATURBO_ASIC_COUNT);
default:
}
return ESP_OK;
}
uint8_t ASIC_get_asic_count(GlobalState * GLOBAL_STATE) {
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
return BITAXE_MAX_ASIC_COUNT;
case DEVICE_ULTRA:
return BITAXE_ULTRA_ASIC_COUNT;
case DEVICE_SUPRA:
return BITAXE_SUPRA_ASIC_COUNT;
case DEVICE_GAMMA:
return BITAXE_GAMMA_ASIC_COUNT;
case DEVICE_GAMMATURBO:
return BITAXE_GAMMATURBO_ASIC_COUNT;
default:
}
return 0;
}
uint16_t ASIC_get_small_core_count(GlobalState * GLOBAL_STATE) {
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
return BM1397_SMALL_CORE_COUNT;
case DEVICE_ULTRA:
return BM1366_SMALL_CORE_COUNT;
case DEVICE_SUPRA:
return BM1368_SMALL_CORE_COUNT;
case DEVICE_GAMMA:
return BM1370_SMALL_CORE_COUNT;
case DEVICE_GAMMATURBO:
return BM1370_SMALL_CORE_COUNT;
default:
}
return 0;
}
// .receive_result_fn = BM1366_process_work,
task_result * ASIC_process_work(GlobalState * GLOBAL_STATE) {
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
return BM1397_process_work(GLOBAL_STATE);
case DEVICE_ULTRA:
return BM1366_process_work(GLOBAL_STATE);
case DEVICE_SUPRA:
return BM1368_process_work(GLOBAL_STATE);
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
return BM1370_process_work(GLOBAL_STATE);
default:
}
return NULL;
}
// .set_max_baud_fn = BM1366_set_max_baud,
int ASIC_set_max_baud(GlobalState * GLOBAL_STATE) {
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
return BM1397_set_max_baud();
case DEVICE_ULTRA:
return BM1366_set_max_baud();
case DEVICE_SUPRA:
return BM1368_set_max_baud();
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
return BM1370_set_max_baud();
default:
return 0;
}
}
// .set_difficulty_mask_fn = BM1366_set_job_difficulty_mask,
void ASIC_set_job_difficulty_mask(GlobalState * GLOBAL_STATE, uint8_t mask) {
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
BM1397_set_job_difficulty_mask(mask);
break;
case DEVICE_ULTRA:
BM1366_set_job_difficulty_mask(mask);
break;
case DEVICE_SUPRA:
BM1368_set_job_difficulty_mask(mask);
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
BM1370_set_job_difficulty_mask(mask);
break;
default:
}
}
// .send_work_fn = BM1366_send_work,
void ASIC_send_work(GlobalState * GLOBAL_STATE, void * next_job) {
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
BM1397_send_work(GLOBAL_STATE, next_job);
break;
case DEVICE_ULTRA:
BM1366_send_work(GLOBAL_STATE, next_job);
break;
case DEVICE_SUPRA:
BM1368_send_work(GLOBAL_STATE, next_job);
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
BM1370_send_work(GLOBAL_STATE, next_job);
break;
default:
return;
}
}
// .set_version_mask = BM1366_set_version_mask
void ASIC_set_version_mask(GlobalState * GLOBAL_STATE, uint32_t mask) {
switch (GLOBAL_STATE->device_model) {
case DEVICE_MAX:
BM1397_set_version_mask(mask);
break;
case DEVICE_ULTRA:
BM1366_set_version_mask(mask);
break;
case DEVICE_SUPRA:
BM1368_set_version_mask(mask);
break;
case DEVICE_GAMMA:
case DEVICE_GAMMATURBO:
BM1370_set_version_mask(mask);
break;
default:
return;
}
}
bool ASIC_set_frequency(GlobalState * GLOBAL_STATE, float target_frequency) {
ESP_LOGI(TAG, "Setting ASIC frequency to %.2f MHz", target_frequency);
bool success = false;
switch (GLOBAL_STATE->asic_model) {
case ASIC_BM1366:
success = BM1366_set_frequency(target_frequency);
break;
case ASIC_BM1368:
success = BM1368_set_frequency(target_frequency);
break;
case ASIC_BM1370:
success = BM1370_set_frequency(target_frequency);
break;
case ASIC_BM1397:
// BM1397 doesn't have a set_frequency function yet
ESP_LOGE(TAG, "Frequency transition not implemented for BM1397");
success = false;
break;
default:
ESP_LOGE(TAG, "Unknown ASIC model, cannot set frequency");
success = false;
break;
}
if (success) {
ESP_LOGI(TAG, "Successfully transitioned to new ASIC frequency: %.2f MHz", target_frequency);
} else {
ESP_LOGE(TAG, "Failed to transition to new ASIC frequency: %.2f MHz", target_frequency);
}
return success;
}
esp_err_t ASIC_set_device_model(GlobalState * GLOBAL_STATE) {
if (GLOBAL_STATE->device_model_str == NULL) {
ESP_LOGE(TAG, "No device model string found");
return ESP_FAIL;
}
if (strcmp(GLOBAL_STATE->device_model_str, "max") == 0) {
GLOBAL_STATE->asic_model = ASIC_BM1397;
GLOBAL_STATE->valid_model = true;
GLOBAL_STATE->asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE->POWER_MANAGEMENT_MODULE.frequency_value * BM1397_SMALL_CORE_COUNT * 1000)) / (double) ASIC_get_asic_count(GLOBAL_STATE); // no version-rolling so same Nonce Space is splitted between Small Cores
GLOBAL_STATE->ASIC_difficulty = BM1397_ASIC_DIFFICULTY;
ESP_LOGI(TAG, "DEVICE: bitaxeMax");
ESP_LOGI(TAG, "ASIC: %dx BM1397 (%" PRIu64 " cores)", BITAXE_MAX_ASIC_COUNT, BM1397_CORE_COUNT);
GLOBAL_STATE->device_model = DEVICE_MAX;
} else if (strcmp(GLOBAL_STATE->device_model_str, "ultra") == 0) {
GLOBAL_STATE->asic_model = ASIC_BM1366;
GLOBAL_STATE->valid_model = true;
//GLOBAL_STATE.asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE.POWER_MANAGEMENT_MODULE.frequency_value * BM1366_CORE_COUNT * 1000)) / (double) BITAXE_ULTRA_ASIC_COUNT; // version-rolling so Small Cores have different Nonce Space
GLOBAL_STATE->asic_job_frequency_ms = 2000; //ms
GLOBAL_STATE->ASIC_difficulty = BM1366_ASIC_DIFFICULTY;
ESP_LOGI(TAG, "DEVICE: bitaxeUltra");
ESP_LOGI(TAG, "ASIC: %dx BM1366 (%" PRIu64 " cores)", BITAXE_ULTRA_ASIC_COUNT, BM1366_CORE_COUNT);
GLOBAL_STATE->device_model = DEVICE_ULTRA;
} else if (strcmp(GLOBAL_STATE->device_model_str, "supra") == 0) {
GLOBAL_STATE->asic_model = ASIC_BM1368;
GLOBAL_STATE->valid_model = true;
//GLOBAL_STATE.asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE.POWER_MANAGEMENT_MODULE.frequency_value * BM1368_CORE_COUNT * 1000)) / (double) BITAXE_SUPRA_ASIC_COUNT; // version-rolling so Small Cores have different Nonce Space
GLOBAL_STATE->asic_job_frequency_ms = 500; //ms
GLOBAL_STATE->ASIC_difficulty = BM1368_ASIC_DIFFICULTY;
ESP_LOGI(TAG, "DEVICE: bitaxeSupra");
ESP_LOGI(TAG, "ASIC: %dx BM1368 (%" PRIu64 " cores)", BITAXE_SUPRA_ASIC_COUNT, BM1368_CORE_COUNT);
GLOBAL_STATE->device_model = DEVICE_SUPRA;
} else if (strcmp(GLOBAL_STATE->device_model_str, "gamma") == 0) {
GLOBAL_STATE->asic_model = ASIC_BM1370;
GLOBAL_STATE->valid_model = true;
//GLOBAL_STATE.asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE.POWER_MANAGEMENT_MODULE.frequency_value * BM1370_CORE_COUNT * 1000)) / (double) BITAXE_GAMMA_ASIC_COUNT; // version-rolling so Small Cores have different Nonce Space
GLOBAL_STATE->asic_job_frequency_ms = 500; //ms
GLOBAL_STATE->ASIC_difficulty = BM1370_ASIC_DIFFICULTY;
ESP_LOGI(TAG, "DEVICE: bitaxeGamma");
ESP_LOGI(TAG, "ASIC: %dx BM1370 (%" PRIu64 " cores)", BITAXE_GAMMA_ASIC_COUNT, BM1370_CORE_COUNT);
GLOBAL_STATE->device_model = DEVICE_GAMMA;
} else if (strcmp(GLOBAL_STATE->device_model_str, "gammaturbo") == 0) {
GLOBAL_STATE->asic_model = ASIC_BM1370;
GLOBAL_STATE->valid_model = true;
//GLOBAL_STATE.asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE.POWER_MANAGEMENT_MODULE.frequency_value * BM1370_CORE_COUNT * 1000)) / (double) BITAXE_GAMMATURBO_ASIC_COUNT; // version-rolling so Small Cores have different Nonce Space
GLOBAL_STATE->asic_job_frequency_ms = 500; //ms
GLOBAL_STATE->ASIC_difficulty = BM1370_ASIC_DIFFICULTY;
ESP_LOGI(TAG, "DEVICE: bitaxeGammaTurbo");
ESP_LOGI(TAG, "ASIC: %dx BM1370 (%" PRIu64 " cores)", BITAXE_GAMMATURBO_ASIC_COUNT, BM1370_CORE_COUNT);
GLOBAL_STATE->device_model = DEVICE_GAMMATURBO;
} else {
ESP_LOGE(TAG, "Invalid DEVICE model");
// maybe should return here to now execute anything with a faulty device parameter !
// this stops crashes/reboots and allows dev testing without an asic
GLOBAL_STATE->device_model = DEVICE_UNKNOWN;
GLOBAL_STATE->valid_model = false;
return ESP_FAIL;
}
return ESP_OK;
}