mirror of
https://github.com/skot/ESP-Miner.git
synced 2025-04-12 22:09:18 +02:00
more cleanup of mb1397 and system
This commit is contained in:
parent
c148aec820
commit
3d9d1692f2
@ -16,6 +16,15 @@
|
||||
#define SLEEP_TIME 20
|
||||
#define FREQ_MULT 25.0
|
||||
|
||||
#define CLOCK_ORDER_CONTROL_0 0x80
|
||||
#define CLOCK_ORDER_CONTROL_1 0x84
|
||||
#define ORDERED_CLOCK_ENABLE 0x20
|
||||
#define CORE_REGISTER_CONTROL 0x3C
|
||||
#define PLL3_PARAMETER 0x68
|
||||
#define FAST_UART_CONFIGURATION 0x28
|
||||
#define TICKET_MASK 0x14
|
||||
#define MISC_CONTROL 0x18
|
||||
|
||||
static const char *TAG = "bm1397Module";
|
||||
|
||||
/// @brief
|
||||
@ -175,27 +184,24 @@ static void _send_init(void) {
|
||||
|
||||
_set_chip_address(0x00);
|
||||
|
||||
unsigned char init[6] = {0x00, 0x80, 0x00, 0x00, 0x00, 0x00}; //init1 - clock_order_control0
|
||||
unsigned char init[6] = {0x00, CLOCK_ORDER_CONTROL_0, 0x00, 0x00, 0x00, 0x00}; //init1 - clock_order_control0
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), init, 6, false);
|
||||
|
||||
unsigned char init2[6] = {0x00, 0x84, 0x00, 0x00, 0x00, 0x00}; //init2 - clock_order_control1
|
||||
unsigned char init2[6] = {0x00, CLOCK_ORDER_CONTROL_1, 0x00, 0x00, 0x00, 0x00}; //init2 - clock_order_control1
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), init2, 6, false);
|
||||
|
||||
unsigned char init3[9] = {0x00, 0x20, 0x00, 0x00, 0x00, 0x01}; //init3 - ordered_clock_enable
|
||||
unsigned char init3[9] = {0x00, ORDERED_CLOCK_ENABLE, 0x00, 0x00, 0x00, 0x01}; //init3 - ordered_clock_enable
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), init3, 6, false);
|
||||
|
||||
unsigned char init4[9] = {0x00, 0x3C, 0x80, 0x00, 0x80, 0x74}; //init4 - init_4_?
|
||||
unsigned char init4[9] = {0x00, CORE_REGISTER_CONTROL, 0x80, 0x00, 0x80, 0x74}; //init4 - init_4_?
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), init4, 6, false);
|
||||
|
||||
BM1397_set_job_difficulty_mask(256);
|
||||
|
||||
unsigned char init5[9] = {0x00, 0x68, 0xC0, 0x70, 0x01, 0x11}; //init5 - pll3_parameter
|
||||
unsigned char init5[9] = {0x00, PLL3_PARAMETER, 0xC0, 0x70, 0x01, 0x11}; //init5 - pll3_parameter
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), init5, 6, false);
|
||||
|
||||
unsigned char init5_2[9] = {0x00, 0x68, 0xC0, 0x70, 0x01, 0x11}; //init5_2 - pll3_parameter
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), init5_2, 6, false);
|
||||
|
||||
unsigned char init6[9] = {0x00, 0x28, 0x06, 0x00, 0x00, 0x0F}; //init6 - fast_uart_configuration
|
||||
unsigned char init6[9] = {0x00, FAST_UART_CONFIGURATION, 0x06, 0x00, 0x00, 0x0F}; //init6 - fast_uart_configuration
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), init6, 6, false);
|
||||
|
||||
BM1397_set_default_baud();
|
||||
@ -253,20 +259,20 @@ void BM1397_init(void) {
|
||||
// The denominator is 5 bits found in the misc_control (bits 9-13)
|
||||
void BM1397_set_default_baud(void){
|
||||
//default divider of 26 (11010) for 115,749
|
||||
unsigned char baudrate[9] = {0x00, 0x18, 0x00, 0x00, 0b01111010, 0b00110001}; //baudrate - misc_control
|
||||
unsigned char baudrate[9] = {0x00, MISC_CONTROL, 0x00, 0x00, 0b01111010, 0b00110001}; //baudrate - misc_control
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), baudrate, 6, false);
|
||||
}
|
||||
|
||||
void BM1397_set_max_baud(void){
|
||||
// divider of 0 for 3,125,000
|
||||
unsigned char baudrate[9] = { 0x00, 0x18, 0x00, 0x00, 0b01100000, 0b00110001 };; //baudrate - misc_control
|
||||
unsigned char baudrate[9] = { 0x00, MISC_CONTROL, 0x00, 0x00, 0b01100000, 0b00110001 };; //baudrate - misc_control
|
||||
_send_BM1397((TYPE_CMD | GROUP_ALL | CMD_WRITE), baudrate, 6, false);
|
||||
}
|
||||
|
||||
void BM1397_set_job_difficulty_mask(int difficulty){
|
||||
|
||||
// Default mask of 256 diff
|
||||
unsigned char job_difficulty_mask[9] = {0x00, 0x14, 0b00000000, 0b00000000, 0b00000000, 0b11111111};
|
||||
unsigned char job_difficulty_mask[9] = {0x00, TICKET_MASK, 0b00000000, 0b00000000, 0b00000000, 0b11111111};
|
||||
|
||||
// The mask must be a power of 2 so there are no holes
|
||||
// Correct: {0b00000000, 0b00000000, 0b11111111, 0b11111111}
|
||||
|
@ -338,10 +338,10 @@ static void stratum_task(void * pvParameters)
|
||||
int16_t parsed_id;
|
||||
if (parse_stratum_result_message(line, &parsed_id)) {
|
||||
ESP_LOGI(TAG, "message id %d result accepted", parsed_id);
|
||||
SYSTEM_notify_accepted_share();
|
||||
SYSTEM_notify_accepted_share(&SYSTEM_MODULE);
|
||||
} else {
|
||||
ESP_LOGI(TAG, "message id %d result rejected", parsed_id);
|
||||
SYSTEM_notify_rejected_share();
|
||||
SYSTEM_notify_rejected_share(&SYSTEM_MODULE);
|
||||
}
|
||||
free(line);
|
||||
} else {
|
||||
|
156
main/system.c
156
main/system.c
@ -18,29 +18,19 @@
|
||||
static const char *TAG = "SystemModule";
|
||||
|
||||
#define BM1397_VOLTAGE CONFIG_BM1397_VOLTAGE
|
||||
#define HISTORY_LENGTH 100
|
||||
#define HISTORY_WINDOW_SIZE 5
|
||||
|
||||
static char oled_buf[20];
|
||||
static int screen_page = 0;
|
||||
|
||||
static uint16_t shares_accepted = 0;
|
||||
static uint16_t shares_rejected = 0;
|
||||
static time_t start_time;
|
||||
|
||||
|
||||
static int historical_hashrate_rolling_index = 0;
|
||||
static double historical_hashrate_time_stamps[HISTORY_LENGTH] = {0.0};
|
||||
static double historical_hashrate[HISTORY_LENGTH] = {0.0};
|
||||
static int historical_hashrate_init = 0;
|
||||
static double current_hashrate = 0;
|
||||
|
||||
|
||||
static void _init_system(SystemModule* module) {
|
||||
|
||||
module->duration_start = 0;
|
||||
module->historical_hashrate_rolling_index = 0;
|
||||
module->historical_hashrate_init = 0;
|
||||
module->current_hashrate = 0;
|
||||
module->screen_page = 0;
|
||||
module->shares_accepted = 0;
|
||||
module->shares_rejected = 0;
|
||||
|
||||
start_time = time(NULL);
|
||||
module->start_time = time(NULL);
|
||||
|
||||
//test the LEDs
|
||||
// ESP_LOGI(TAG, "Init LEDs!");
|
||||
@ -77,30 +67,31 @@ static void _init_system(SystemModule* module) {
|
||||
|
||||
}
|
||||
|
||||
static void _update_hashrate(void){
|
||||
static void _update_hashrate(SystemModule* module){
|
||||
|
||||
if(screen_page != 0){
|
||||
|
||||
if(module->screen_page != 0){
|
||||
return;
|
||||
}
|
||||
|
||||
float power = INA260_read_power() / 1000;
|
||||
|
||||
float efficiency = power / (current_hashrate/1000.0);
|
||||
float efficiency = power / (module->current_hashrate/1000.0);
|
||||
|
||||
OLED_clearLine(0);
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, "Gh%s: %.1f W/Th: %.1f", historical_hashrate_init < HISTORY_LENGTH ? "*": "", current_hashrate, efficiency);
|
||||
OLED_writeString(0, 0, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, "Gh%s: %.1f W/Th: %.1f", module->historical_hashrate_init < HISTORY_LENGTH ? "*": "", module->current_hashrate, efficiency);
|
||||
OLED_writeString(0, 0, module->oled_buf);
|
||||
}
|
||||
|
||||
static void _update_shares(void){
|
||||
if(screen_page != 0){
|
||||
static void _update_shares(SystemModule* module){
|
||||
if(module->screen_page != 0){
|
||||
return;
|
||||
}
|
||||
OLED_clearLine(1);
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, "A/R: %u/%u", shares_accepted, shares_rejected);
|
||||
OLED_writeString(0, 1, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, "A/R: %u/%u", module->shares_accepted, module->shares_rejected);
|
||||
OLED_writeString(0, 1, module->oled_buf);
|
||||
}
|
||||
|
||||
static void _clear_display(void){
|
||||
@ -111,8 +102,8 @@ static void _clear_display(void){
|
||||
}
|
||||
|
||||
|
||||
static void _update_system_info(void) {
|
||||
char oled_buf[21];
|
||||
static void _update_system_info(SystemModule* module) {
|
||||
|
||||
|
||||
uint16_t fan_speed = EMC2101_get_fan_speed();
|
||||
float chip_temp = EMC2101_get_chip_temp();
|
||||
@ -122,27 +113,27 @@ static void _update_system_info(void) {
|
||||
|
||||
if (OLED_status()) {
|
||||
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, " Fan: %d RPM", fan_speed);
|
||||
OLED_writeString(0, 0, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, " Fan: %d RPM", fan_speed);
|
||||
OLED_writeString(0, 0, module->oled_buf);
|
||||
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, "Temp: %.1f C", chip_temp);
|
||||
OLED_writeString(0, 1, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, "Temp: %.1f C", chip_temp);
|
||||
OLED_writeString(0, 1, module->oled_buf);
|
||||
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, " Pwr: %.3f W", power);
|
||||
OLED_writeString(0, 2, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, " Pwr: %.3f W", power);
|
||||
OLED_writeString(0, 2, module->oled_buf);
|
||||
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, " %i mV: %i mA",(int)voltage, (int)current);
|
||||
OLED_writeString(0, 3, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, " %i mV: %i mA",(int)voltage, (int)current);
|
||||
OLED_writeString(0, 3, module->oled_buf);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void _update_esp32_info(void) {
|
||||
char oled_buf[20];
|
||||
static void _update_esp32_info(SystemModule* module) {
|
||||
|
||||
|
||||
uint32_t free_heap_size = esp_get_free_heap_size();
|
||||
|
||||
@ -150,13 +141,13 @@ static void _update_esp32_info(void) {
|
||||
|
||||
if (OLED_status()) {
|
||||
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, "FH: %u bytes", free_heap_size);
|
||||
OLED_writeString(0, 0, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, "FH: %u bytes", free_heap_size);
|
||||
OLED_writeString(0, 0, module->oled_buf);
|
||||
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, "vCore: %u mV", vcore);
|
||||
OLED_writeString(0, 1, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, "vCore: %u mV", vcore);
|
||||
OLED_writeString(0, 1, module->oled_buf);
|
||||
|
||||
// memset(oled_buf, 0, 20);
|
||||
// snprintf(oled_buf, 20, "Pwr: %.2f W", power);
|
||||
@ -165,10 +156,11 @@ static void _update_esp32_info(void) {
|
||||
|
||||
}
|
||||
|
||||
static void _update_system_performance(){
|
||||
|
||||
static void _update_system_performance(SystemModule* module){
|
||||
|
||||
|
||||
// Calculate the uptime in seconds
|
||||
double uptime_in_seconds = difftime(time(NULL), start_time);
|
||||
double uptime_in_seconds = difftime(time(NULL), module->start_time);
|
||||
int uptime_in_days = uptime_in_seconds / (3600 * 24);
|
||||
int remaining_seconds = (int)uptime_in_seconds % (3600 * 24);
|
||||
int uptime_in_hours = remaining_seconds / 3600;
|
||||
@ -178,12 +170,12 @@ static void _update_system_performance(){
|
||||
|
||||
if (OLED_status()) {
|
||||
|
||||
_update_hashrate();
|
||||
_update_shares();
|
||||
_update_hashrate(module);
|
||||
_update_shares(module);
|
||||
|
||||
memset(oled_buf, 0, 20);
|
||||
snprintf(oled_buf, 20, "UT: %dd %ih %im", uptime_in_days, uptime_in_hours, uptime_in_minutes);
|
||||
OLED_writeString(0, 2, oled_buf);
|
||||
memset(module->oled_buf, 0, 20);
|
||||
snprintf(module->oled_buf, 20, "UT: %dd %ih %im", uptime_in_days, uptime_in_hours, uptime_in_minutes);
|
||||
OLED_writeString(0, 2, module->oled_buf);
|
||||
}
|
||||
}
|
||||
|
||||
@ -196,18 +188,18 @@ void SYSTEM_task(SystemModule* module) {
|
||||
|
||||
while(1){
|
||||
_clear_display();
|
||||
screen_page = 0;
|
||||
_update_system_performance();
|
||||
module->screen_page = 0;
|
||||
_update_system_performance(module);
|
||||
vTaskDelay(40000 / portTICK_RATE_MS);
|
||||
|
||||
_clear_display();
|
||||
screen_page = 1;
|
||||
_update_system_info();
|
||||
module->screen_page = 1;
|
||||
_update_system_info(module);
|
||||
vTaskDelay(10000 / portTICK_RATE_MS);
|
||||
|
||||
_clear_display();
|
||||
screen_page = 2;
|
||||
_update_esp32_info();
|
||||
module->screen_page = 2;
|
||||
_update_esp32_info(module);
|
||||
vTaskDelay(10000 / portTICK_RATE_MS);
|
||||
|
||||
}
|
||||
@ -215,13 +207,13 @@ void SYSTEM_task(SystemModule* module) {
|
||||
|
||||
|
||||
|
||||
void SYSTEM_notify_accepted_share(void){
|
||||
shares_accepted++;
|
||||
_update_shares();
|
||||
void SYSTEM_notify_accepted_share(SystemModule* module){
|
||||
module->shares_accepted++;
|
||||
_update_shares(module);
|
||||
}
|
||||
void SYSTEM_notify_rejected_share(void){
|
||||
shares_rejected++;
|
||||
_update_shares();
|
||||
void SYSTEM_notify_rejected_share(SystemModule* module){
|
||||
module->shares_rejected++;
|
||||
_update_shares(module);
|
||||
}
|
||||
|
||||
|
||||
@ -239,35 +231,35 @@ void SYSTEM_notify_found_nonce(SystemModule* module, double nonce_diff){
|
||||
|
||||
// hashrate = (nonce_difficulty * 2^32) / time_to_find
|
||||
|
||||
historical_hashrate[historical_hashrate_rolling_index] = nonce_diff;
|
||||
historical_hashrate_time_stamps[historical_hashrate_rolling_index] = esp_timer_get_time();
|
||||
module->historical_hashrate[module->historical_hashrate_rolling_index] = nonce_diff;
|
||||
module->historical_hashrate_time_stamps[module->historical_hashrate_rolling_index] = esp_timer_get_time();
|
||||
|
||||
historical_hashrate_rolling_index = (historical_hashrate_rolling_index + 1) % HISTORY_LENGTH;
|
||||
module->historical_hashrate_rolling_index = (module->historical_hashrate_rolling_index + 1) % HISTORY_LENGTH;
|
||||
|
||||
//ESP_LOGI(TAG, "nonce_diff %.1f, ttf %.1f, res %.1f", nonce_diff, duration, historical_hashrate[historical_hashrate_rolling_index]);
|
||||
|
||||
|
||||
if(historical_hashrate_init < HISTORY_LENGTH){
|
||||
historical_hashrate_init++;
|
||||
if(module->historical_hashrate_init < HISTORY_LENGTH){
|
||||
module->historical_hashrate_init++;
|
||||
}else{
|
||||
module->duration_start = historical_hashrate_time_stamps[(historical_hashrate_rolling_index + 1) % HISTORY_LENGTH];
|
||||
module->duration_start = module->historical_hashrate_time_stamps[(module->historical_hashrate_rolling_index + 1) % HISTORY_LENGTH];
|
||||
}
|
||||
double sum = 0;
|
||||
for (int i = 0; i < historical_hashrate_init; i++) {
|
||||
sum += historical_hashrate[i];
|
||||
for (int i = 0; i < module->historical_hashrate_init; i++) {
|
||||
sum += module->historical_hashrate[i];
|
||||
}
|
||||
|
||||
double duration = (double)(esp_timer_get_time() - module->duration_start) / 1000000;
|
||||
|
||||
double rolling_rate = (sum * 4294967296) / (duration * 1000000000);
|
||||
if(historical_hashrate_init < HISTORY_LENGTH){
|
||||
current_hashrate = rolling_rate;
|
||||
if(module->historical_hashrate_init < HISTORY_LENGTH){
|
||||
module->current_hashrate = rolling_rate;
|
||||
}else{
|
||||
// More smoothing
|
||||
current_hashrate = ((current_hashrate * 9) + rolling_rate)/10;
|
||||
module->current_hashrate = ((module->current_hashrate * 9) + rolling_rate)/10;
|
||||
}
|
||||
|
||||
_update_hashrate();
|
||||
_update_hashrate(module);
|
||||
|
||||
// logArrayContents(historical_hashrate, HISTORY_LENGTH);
|
||||
// logArrayContents(historical_hashrate_time_stamps, HISTORY_LENGTH);
|
||||
|
@ -1,15 +1,27 @@
|
||||
#ifndef SYSTEM_H_
|
||||
#define SYSTEM_H_
|
||||
|
||||
#define HISTORY_LENGTH 100
|
||||
#define HISTORY_WINDOW_SIZE 5
|
||||
typedef struct {
|
||||
double duration_start;
|
||||
int historical_hashrate_rolling_index;
|
||||
double historical_hashrate_time_stamps[HISTORY_LENGTH];
|
||||
double historical_hashrate[HISTORY_LENGTH];
|
||||
int historical_hashrate_init;
|
||||
double current_hashrate;
|
||||
time_t start_time;
|
||||
uint16_t shares_accepted;
|
||||
uint16_t shares_rejected;
|
||||
int screen_page;
|
||||
char oled_buf[20]
|
||||
} SystemModule;
|
||||
|
||||
void SYSTEM_task(SystemModule* module);
|
||||
|
||||
|
||||
void SYSTEM_notify_accepted_share(void);
|
||||
void SYSTEM_notify_rejected_share(void);
|
||||
void SYSTEM_notify_accepted_share(SystemModule* module);
|
||||
void SYSTEM_notify_rejected_share(SystemModule* module);
|
||||
void SYSTEM_notify_found_nonce(SystemModule* module, double nonce_diff);
|
||||
void SYSTEM_notify_mining_started(SystemModule* module);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user