-
Notifications
You must be signed in to change notification settings - Fork 91
Expand file tree
/
Copy pathboard.cpp
More file actions
186 lines (155 loc) · 5.18 KB
/
Copy pathboard.cpp
File metadata and controls
186 lines (155 loc) · 5.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include <algorithm>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "board.h"
#include "nvs_config.h"
#include "esp_log.h"
#include "../displays/displayDriver.h"
const static char* TAG = "board";
Board::Board() {
m_absMaxAsicFrequency = 0;
m_absMinAsicVoltageMillis = 0;
m_absMaxAsicVoltageMillis = 0;
m_vrFrequency = m_defaultVrFrequency = 0;
m_hasHashCounter = false;
m_ecoAsicFrequency = 0;
m_ecoAsicVoltageMillis = 0;
m_numFans = 1;
}
void Board::loadSettings()
{
m_fanPerc = Config::getFanSpeed();
// default values are initialized in the constructor of each board
// clamp frequency and voltage to absMax values
if (m_absMaxAsicFrequency) {
m_asicFrequency = std::min((int) Config::getAsicFrequency(m_asicFrequency), m_absMaxAsicFrequency);
} else {
m_asicFrequency = (int) Config::getAsicFrequency(m_asicFrequency);
}
if (m_absMaxAsicVoltageMillis) {
m_asicVoltageMillis = std::min((int) Config::getAsicVoltage(m_asicVoltageMillis), m_absMaxAsicVoltageMillis);
} else {
m_asicVoltageMillis = (int) Config::getAsicVoltage(m_asicVoltageMillis);
}
m_asicJobIntervalMs = Config::getAsicJobInterval(m_asicJobIntervalMs);
m_fanInvertPolarity = Config::isFanPolarity(m_fanInvertPolarity);
m_flipScreen = Config::isFlipScreenEnabled(m_flipScreen);
m_vrFrequency = Config::getVrFrequency(m_defaultVrFrequency);
for (int ch = 0; ch < 2; ch++) {
m_fanMode[ch] = Config::getFanMode(ch, m_fanMode[ch]);
m_pidSettings[ch].targetTemp = Config::getFanPidTargetTemp(ch, m_pidSettings[ch].targetTemp);
m_pidSettings[ch].p = Config::getFanPidP(ch, m_pidSettings[ch].p);
m_pidSettings[ch].i = Config::getFanPidI(ch, m_pidSettings[ch].i);
m_pidSettings[ch].d = Config::getFanPidD(ch, m_pidSettings[ch].d);
}
ESP_LOGI(TAG, "ASIC Frequency: %dMHz", m_asicFrequency);
ESP_LOGI(TAG, "ASIC voltage: %dmV", m_asicVoltageMillis);
ESP_LOGI(TAG, "ASIC job interval: %dms", m_asicJobIntervalMs);
ESP_LOGI(TAG, "invert fan polarity: %s", m_fanInvertPolarity ? "true" : "false");
ESP_LOGI(TAG, "fan speed: %d%%", (int) m_fanPerc);
}
bool Board::initBoard() {
m_chipTemps = new float[m_asicCount]();
return true;
}
void Board::setChipTemp(int nr, float temp) {
if (nr < 0 || nr >= m_asicCount) {
return;
}
m_chipTemps[nr] = temp;
}
float Board::getChipTemp(int nr) {
if (nr < 0 || nr >= m_asicCount) {
return 0.0f;
}
return m_chipTemps[nr];
}
void Board::requestChipTemps() {
// NOP
}
float Board::getMaxChipTemp() {
float maxTemp = 0.0f;
for (int i=0;i<m_asicCount;i++) {
maxTemp = std::max(maxTemp, m_chipTemps[i]);
}
return maxTemp;
}
const char *Board::getDeviceModel()
{
return m_deviceModel;
}
const char *Board::getMiningAgent()
{
return m_miningAgent;
}
int Board::getVersion()
{
return m_version;
}
const char *Board::getAsicModel()
{
return m_asicModel;
}
int Board::getAsicCount()
{
return m_asicCount;
}
int Board::getAsicJobIntervalMs()
{
return m_asicJobIntervalMs;
}
bool Board::selfTest(){
// Initialize the display
DisplayDriver *temp_display;
temp_display = new DisplayDriver();
temp_display->init(this);
temp_display->logMessage("Self test not supported on this board...");
ESP_LOGI("board", "Self test not supported on this board");
vTaskDelay(pdMS_TO_TICKS(1000));
return false;
}
// requires loadSettings to update the variables
bool Board::setAsicFrequency(float frequency) {
if (!validateFrequency(frequency)) {
return false;
}
// not initialized
if (!m_asics) {
return false;
}
return m_asics->setAsicFrequency(frequency);
}
// set and get version rolling frequency
// requires loadSettings to update the variables
void Board::setVrFrequency(uint32_t freq) {
if (!m_asics) {
return;
}
m_asics->setVrFrequency(freq);
}
bool Board::validateVoltage(float core_voltage) {
if (core_voltage == 0.0f) {
return true; // 0V = disable output
}
int millis = (int) (core_voltage * 1000.0f);
// we allow m_absMaxAsicVoltageMillis = 0 for no limit to not break what was
// working before on nerdaxe and nerdaxegamma
if (m_absMinAsicVoltageMillis && millis < m_absMinAsicVoltageMillis) {
ESP_LOGE(TAG, "Validation error. ASIC voltage %d is lower than absolute minimum value %d", millis, m_absMinAsicVoltageMillis);
return false;
}
if (m_absMaxAsicVoltageMillis && millis > m_absMaxAsicVoltageMillis) {
ESP_LOGE(TAG, "Validation error. ASIC voltage %d is higher than absolute maximum value %d", millis, m_absMaxAsicVoltageMillis);
return false;
}
return true;
}
bool Board::validateFrequency(float frequency) {
// we allow m_absMaxAsicFrequency = 0 for no limit to not break what was
// working before on nerdaxe and nerdaxegamma
if (m_absMaxAsicFrequency && frequency > (float) m_absMaxAsicFrequency) {
ESP_LOGE(TAG, "Validation error. ASIC Frequency %.3f is higher than absolute maximum value %.3f", frequency, (float) m_absMaxAsicFrequency);
return false;
}
return true;
}