diff --git a/.gitignore b/.gitignore index f4ccb086..5539f52a 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ components/components/* config.bin config.cvs managed_components/* +release/ +esp-miner-*.bin diff --git a/components/bm1397/asic.cpp b/components/bm1397/asic.cpp index fd5d9b77..3a51fe22 100644 --- a/components/bm1397/asic.cpp +++ b/components/bm1397/asic.cpp @@ -167,13 +167,7 @@ int Asic::setMaxBaud(void) return 1000000; } -// set version rolling frequency -constexpr uint32_t ASIC_IO_CLK_HZ_U32 = 15'000'000u; // 15 MHz -constexpr uint32_t VR_TICK_DIV_U32 = 5000u; // VR counter increments every 5000 IO clock cycles -constexpr uint32_t VR_TICK_HZ_U32 = ASIC_IO_CLK_HZ_U32 / VR_TICK_DIV_U32; // 3000 Hz -constexpr uint64_t VR_REG_PER_HZ_U64 = 65536ull * VR_TICK_HZ_U32; // 196,608,000 - -// Version rolling frequency register @0x10 (MSB -> LSB) +// Register 0x10 write (MSB -> LSB) void Asic::setVrFreqReg(uint32_t value) { ESP_LOGI(TAG, "setting 0x10 to %08lx", value); send6(CMD_WRITE_ALL, 0x00, 0x10, @@ -183,29 +177,29 @@ void Asic::setVrFreqReg(uint32_t value) { static_cast((value >> 0) & 0xFF)); } -// Convert desired VR frequency (Hz, integer) to register value for 0x10 -uint32_t Asic::vrFreqToReg(uint32_t freq_hz) { - // reg = round(VR_REG_PER_HZ / freq_hz) using integer division with rounding - return static_cast((VR_REG_PER_HZ_U64 + (freq_hz / 2)) / freq_hz); -} +void Asic::setNonceSpace(float frequency, uint16_t asic_count, uint16_t cores) { + int cores_up = next_power_of_two(cores); + int chips_from_interval = (m_addressInterval > 0) ? (256 / m_addressInterval) : next_power_of_two(asic_count); -// Convert 0x10 register value back to VR frequency (Hz, integer) -uint32_t Asic::vrRegToFreq(uint32_t reg) { - // freq = round(VR_REG_PER_HZ / reg) using integer division with rounding - return static_cast((VR_REG_PER_HZ_U64 + (reg / 2)) / reg); -} + float hcn_space = (float)NONCE_SPACE / cores_up / chips_from_interval; + double hcn_max = hcn_space * (double)FREQ_MULT / frequency * 0.5; + // HW errata: 134 per half clock cycle = 268 overlap between cores + uint32_t hcn = (uint32_t)hcn_max; + if (hcn > 268) hcn -= 268; + + ESP_LOGI(TAG, "Setting nonce space: cores=%d(%d) chips=%d(interval=%d) freq=%.0f HCN=%lu (max=%lu)", + cores, cores_up, chips_from_interval, m_addressInterval, frequency, (unsigned long)hcn, (unsigned long)(uint32_t)hcn_max); -void Asic::setVrFrequency(uint32_t freq_hz) { - setVrFreqReg(vrFreqToReg(freq_hz)); + setVrFreqReg(hcn); } -// default calculation +// default calculation using address_interval uint8_t Asic::chipIndexFromAddr(uint8_t addr) { - return addr >> 1; + return (m_addressInterval > 0) ? (addr / m_addressInterval) : 0; } uint8_t Asic::addrFromChipIndex(uint8_t idx) { - return idx << 1; + return idx * m_addressInterval; } void Asic::requestChipTemp() { @@ -390,7 +384,9 @@ bool Asic::processWork(task_result *result) uint32_t rolled_version = (reverseUint16(asic_result.version) << 13); // shift the 16 bit value left 13 - int asic_nr = nonceToAsicNr(asic_result.nonce); + // Extract ASIC number from nonce using address_interval (Bitaxe-style) + uint32_t nonce_h = __bswap32(asic_result.nonce); + int asic_nr = (m_addressInterval > 0) ? ((uint8_t)((nonce_h >> 17) & 0xff) / m_addressInterval) : 0; result->job_id = job_id; result->asic_nr = asic_nr; diff --git a/components/bm1397/bm1366.cpp b/components/bm1397/bm1366.cpp index 87291e9e..296b2e2b 100644 --- a/components/bm1397/bm1366.cpp +++ b/components/bm1397/bm1366.cpp @@ -33,11 +33,7 @@ const uint8_t* BM1366::getChipId() { return (uint8_t*) chip_id; } -uint32_t BM1366::getDefaultVrFrequency() { - return vrRegToFreq(0x151c); -}; - -uint8_t BM1366::init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty, uint32_t vrFrequency) +uint8_t BM1366::init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty) { // reset is done externally to not have board dependencies @@ -68,9 +64,10 @@ uint8_t BM1366::init(uint64_t frequency, uint16_t asic_count, uint32_t difficult // chain inactive sendChainInactive(); - // set chip address + // set chip address - distribute evenly across 0-255 range + m_addressInterval = (chip_counter > 0) ? (256 / next_power_of_two(chip_counter)) : 2; for (uint8_t i = 0; i < chip_counter; i++) { - setChipAddress(i * 2); + setChipAddress(i * m_addressInterval); } // Core Register Control @@ -88,22 +85,23 @@ uint8_t BM1366::init(uint64_t frequency, uint16_t asic_count, uint32_t difficult send6(CMD_WRITE_ALL, 0x00, 0x58, 0x02, 0x11, 0x11, 0x11); for (uint8_t i = 0; i < chip_counter; i++) { + uint8_t addr = i * m_addressInterval; // Reg_A8 - send6(CMD_WRITE_SINGLE, i * 2, 0xA8, 0x00, 0x07, 0x01, 0xF0); + send6(CMD_WRITE_SINGLE, addr, 0xA8, 0x00, 0x07, 0x01, 0xF0); // Misc Control - send6(CMD_WRITE_SINGLE, i * 2, 0x18, 0xF0, 0x00, 0xC1, 0x00); + send6(CMD_WRITE_SINGLE, addr, 0x18, 0xF0, 0x00, 0xC1, 0x00); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 2, 0x3C, 0x80, 0x00, 0x85, 0x40); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x85, 0x40); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 2, 0x3C, 0x80, 0x00, 0x80, 0x20); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x80, 0x20); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 2, 0x3C, 0x80, 0x00, 0x82, 0xAA); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x82, 0xAA); } doFrequencyTransition(frequency); - // set 0x10 - setVrFrequency(vrFrequency); + // set nonce search space (register 0x10) based on frequency and core count + setNonceSpace((float)frequency, asic_count, getCoreCount()); send6(CMD_WRITE_ALL, 0x00, 0xA4, 0x90, 0x00, 0xFF, 0xFF); diff --git a/components/bm1397/bm1368.cpp b/components/bm1397/bm1368.cpp index ce7f773b..0f83d25b 100644 --- a/components/bm1397/bm1368.cpp +++ b/components/bm1397/bm1368.cpp @@ -33,12 +33,7 @@ const uint8_t* BM1368::getChipId() { return (uint8_t*) chip_id; } -uint32_t BM1368::getDefaultVrFrequency() { - return vrRegToFreq(0x15a4); -}; - - -uint8_t BM1368::init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty, uint32_t vrFrequency) +uint8_t BM1368::init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty) { // reset is done externally to not have board dependencies @@ -69,9 +64,10 @@ uint8_t BM1368::init(uint64_t frequency, uint16_t asic_count, uint32_t difficult // chain inactive sendChainInactive(); - // set chip address + // set chip address - distribute evenly across 0-255 range + m_addressInterval = (chip_counter > 0) ? (256 / next_power_of_two(chip_counter)) : 2; for (uint8_t i = 0; i < chip_counter; i++) { - setChipAddress(i * 2); + setChipAddress(i * m_addressInterval); } // Core Register Control @@ -89,22 +85,23 @@ uint8_t BM1368::init(uint64_t frequency, uint16_t asic_count, uint32_t difficult send6(CMD_WRITE_ALL, 0x00, 0x58, 0x02, 0x11, 0x11, 0x11); for (uint8_t i = 0; i < chip_counter; i++) { + uint8_t addr = i * m_addressInterval; // Reg_A8 - send6(CMD_WRITE_SINGLE, i * 2, 0xA8, 0x00, 0x07, 0x01, 0xF0); + send6(CMD_WRITE_SINGLE, addr, 0xA8, 0x00, 0x07, 0x01, 0xF0); // Misc Control - send6(CMD_WRITE_SINGLE, i * 2, 0x18, 0xF0, 0x00, 0xC1, 0x00); + send6(CMD_WRITE_SINGLE, addr, 0x18, 0xF0, 0x00, 0xC1, 0x00); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 2, 0x3C, 0x80, 0x00, 0x8B, 0x00); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x8B, 0x00); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 2, 0x3C, 0x80, 0x00, 0x80, 0x18); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x80, 0x18); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 2, 0x3C, 0x80, 0x00, 0x82, 0xAA); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x82, 0xAA); } doFrequencyTransition(frequency); - // set 0x10 - setVrFrequency(vrFrequency); + // set nonce search space (register 0x10) based on frequency and core count + setNonceSpace((float)frequency, asic_count, getCoreCount()); send6(CMD_WRITE_ALL, 0x00, 0xA4, 0x90, 0x00, 0xFF, 0xFF); diff --git a/components/bm1397/bm1370.cpp b/components/bm1397/bm1370.cpp index 7c82de9d..cf4df1e7 100644 --- a/components/bm1397/bm1370.cpp +++ b/components/bm1397/bm1370.cpp @@ -36,11 +36,7 @@ const uint8_t* BM1370::getChipId() { return (uint8_t*) chip_id; } -uint32_t BM1370::getDefaultVrFrequency() { - return vrRegToFreq(0x1eb5); -}; - -uint8_t BM1370::init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty, uint32_t vrFrequency) +uint8_t BM1370::init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty) { // reset is done externally to not have board dependencies @@ -72,9 +68,10 @@ uint8_t BM1370::init(uint64_t frequency, uint16_t asic_count, uint32_t difficult // chain inactive sendChainInactive(); - // set chip address + // set chip address - distribute evenly across 0-255 range + m_addressInterval = (chip_counter > 0) ? (256 / next_power_of_two(chip_counter)) : 4; for (uint8_t i = 0; i < chip_counter; i++) { - setChipAddress(i * 4); + setChipAddress(i * m_addressInterval); } // Core Register Control @@ -96,16 +93,17 @@ uint8_t BM1370::init(uint64_t frequency, uint16_t asic_count, uint32_t difficult //send6(CMD_WRITE_ALL, 0x00, 0x28, 0x01, 0x30, 0x00, 0x00); for (uint8_t i = 0; i < chip_counter; i++) { + uint8_t addr = i * m_addressInterval; // Reg_A8 - send6(CMD_WRITE_SINGLE, i * 4, 0xA8, 0x00, 0x07, 0x01, 0xF0); + send6(CMD_WRITE_SINGLE, addr, 0xA8, 0x00, 0x07, 0x01, 0xF0); // Misc Control - send6(CMD_WRITE_SINGLE, i * 4, 0x18, 0xF0, 0x00, 0xC1, 0x00); + send6(CMD_WRITE_SINGLE, addr, 0x18, 0xF0, 0x00, 0xC1, 0x00); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 4, 0x3C, 0x80, 0x00, 0x8B, 0x00); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x8B, 0x00); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 4, 0x3C, 0x80, 0x00, 0x80, 0x0C); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x80, 0x0C); // Core Register Control - send6(CMD_WRITE_SINGLE, i * 4, 0x3C, 0x80, 0x00, 0x82, 0xAA); + send6(CMD_WRITE_SINGLE, addr, 0x3C, 0x80, 0x00, 0x82, 0xAA); } // ? @@ -122,8 +120,8 @@ uint8_t BM1370::init(uint64_t frequency, uint16_t asic_count, uint32_t difficult doFrequencyTransition(frequency); - // set 0x10 - setVrFrequency(vrFrequency); + // set nonce search space (register 0x10) based on frequency and core count + setNonceSpace((float)frequency, asic_count, getCoreCount()); send6(CMD_WRITE_ALL, 0x00, 0xA4, 0x90, 0x00, 0xFF, 0xFF); @@ -143,13 +141,8 @@ uint8_t BM1370::nonceToAsicNr(uint32_t nonce) { return (uint8_t) ((nonce & 0x0000fc00) >> 11); } -uint8_t BM1370::chipIndexFromAddr(uint8_t addr) { - return addr >> 2; -} - -uint8_t BM1370::addrFromChipIndex(uint8_t idx) { - return idx << 2; -} +// chipIndexFromAddr and addrFromChipIndex now use base class +// implementation with m_addressInterval (set during init) uint16_t BM1370::getSmallCoreCount() { return BM1370_SMALL_CORE_COUNT; diff --git a/components/bm1397/include/asic.h b/components/bm1397/include/asic.h index e3ef48d2..1b051d98 100644 --- a/components/bm1397/include/asic.h +++ b/components/bm1397/include/asic.h @@ -34,6 +34,14 @@ #define SLEEP_TIME 20 #define FREQ_MULT 25.0 +#define NONCE_SPACE 4294967296.0 // 2^32 + +static inline int next_power_of_two(int num) { + if (num <= 1) return 1; + int power = 1; + while (power < num) power <<= 1; + return power; +} #define CLOCK_ORDER_CONTROL_0 0x80 #define CLOCK_ORDER_CONTROL_1 0x84 @@ -79,6 +87,7 @@ class Asic { float m_current_frequency; float m_actual_current_frequency; uint32_t m_asicDifficulty; + uint8_t m_addressInterval = 2; ///< Chip address spacing (set during init) void send(uint8_t header, uint8_t *data, uint8_t data_len); void send2(uint8_t header, uint8_t b0, uint8_t b1); @@ -100,10 +109,6 @@ class Asic { virtual uint8_t chipIndexFromAddr(uint8_t addr); virtual uint8_t addrFromChipIndex(uint8_t idx); - // helper functions - uint32_t vrFreqToReg(uint32_t freq_hz); - uint32_t vrRegToFreq(uint32_t reg); - virtual uint8_t nonceToAsicNr(uint32_t nonce) = 0; public: @@ -118,10 +123,10 @@ class Asic { virtual void readCounter(uint8_t reg); virtual uint16_t getSmallCoreCount() = 0; - void setVrFrequency(uint32_t freq); - virtual uint32_t getDefaultVrFrequency() = 0; + void setNonceSpace(float frequency, uint16_t asic_count, uint16_t cores); + virtual uint16_t getCoreCount() = 0; - virtual uint8_t init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty, uint32_t vrFrequency) = 0; + virtual uint8_t init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty) = 0; virtual int setMaxBaud(void); }; diff --git a/components/bm1397/include/bm1366.h b/components/bm1397/include/bm1366.h index 2bdc5657..58776b68 100644 --- a/components/bm1397/include/bm1366.h +++ b/components/bm1397/include/bm1366.h @@ -8,7 +8,6 @@ class BM1366 : public Asic { protected: virtual const uint8_t* getChipId(); - virtual uint32_t getDefaultVrFrequency(); virtual uint8_t jobToAsicId(uint8_t job_id); virtual uint8_t asicToJobId(uint8_t asic_id); @@ -17,7 +16,8 @@ class BM1366 : public Asic { public: BM1366(); virtual const char* getName() { return "BM1366"; }; - virtual uint8_t init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty, uint32_t vrFrequency); + virtual uint8_t init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty); virtual uint16_t getSmallCoreCount(); + virtual uint16_t getCoreCount() { return 112; } }; diff --git a/components/bm1397/include/bm1368.h b/components/bm1397/include/bm1368.h index 657aa303..c5a6e1ef 100644 --- a/components/bm1397/include/bm1368.h +++ b/components/bm1397/include/bm1368.h @@ -8,7 +8,6 @@ class BM1368 : public Asic { protected: virtual const uint8_t* getChipId(); - virtual uint32_t getDefaultVrFrequency(); virtual uint8_t jobToAsicId(uint8_t job_id); virtual uint8_t asicToJobId(uint8_t asic_id); @@ -17,8 +16,9 @@ class BM1368 : public Asic { public: BM1368(); virtual const char* getName() { return "BM1368"; }; - virtual uint8_t init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty, uint32_t vrFrequency); + virtual uint8_t init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty); virtual void requestChipTemp(); virtual uint16_t getSmallCoreCount(); + virtual uint16_t getCoreCount() { return 80; } }; diff --git a/components/bm1397/include/bm1370.h b/components/bm1397/include/bm1370.h index 9ab5458f..c424caa0 100644 --- a/components/bm1397/include/bm1370.h +++ b/components/bm1397/include/bm1370.h @@ -8,18 +8,16 @@ class BM1370 : public Asic { protected: virtual const uint8_t* getChipId(); - virtual uint32_t getDefaultVrFrequency(); virtual uint8_t jobToAsicId(uint8_t job_id); virtual uint8_t asicToJobId(uint8_t asic_id); virtual uint8_t nonceToAsicNr(uint32_t nonce); - virtual uint8_t chipIndexFromAddr(uint8_t addr); - virtual uint8_t addrFromChipIndex(uint8_t idx); public: BM1370(); virtual const char* getName() { return "BM1370"; }; - virtual uint8_t init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty, uint32_t vrFrequency); + virtual uint8_t init(uint64_t frequency, uint16_t asic_count, uint32_t difficulty); virtual uint16_t getSmallCoreCount(); + virtual uint16_t getCoreCount() { return 128; } }; diff --git a/main/boards/board.cpp b/main/boards/board.cpp index df909cf3..35207ac5 100644 --- a/main/boards/board.cpp +++ b/main/boards/board.cpp @@ -12,7 +12,6 @@ const static char* TAG = "board"; Board::Board() { m_absMaxAsicFrequency = 0; m_absMaxAsicVoltageMillis = 0; - m_vrFrequency = m_defaultVrFrequency = 0; m_hasHashCounter = false; m_ecoAsicFrequency = 0; m_ecoAsicVoltageMillis = 0; @@ -41,7 +40,6 @@ void Board::loadSettings() 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_pidSettings[ch].targetTemp = Config::getFanPidTargetTemp(ch, m_pidSettings[ch].targetTemp); @@ -146,15 +144,6 @@ bool Board::setAsicFrequency(float frequency) { 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) { int millis = (int) (core_voltage * 1000.0f); // we allow m_absMaxAsicVoltageMillis = 0 for no limit to not break what was diff --git a/main/boards/board.h b/main/boards/board.h index 7f3f9db4..472ac442 100644 --- a/main/boards/board.h +++ b/main/boards/board.h @@ -40,8 +40,6 @@ class Board { int m_numTempSensors = 0; float *m_chipTemps; const char *m_swarmColorName = "blue"; - uint32_t m_vrFrequency; - uint32_t m_defaultVrFrequency; bool m_hasHashCounter; const char *m_defaultTheme = "cosmic"; @@ -125,8 +123,6 @@ class Board { bool validateFrequency(float frequency); bool validateVoltage(float core_voltage); - void setVrFrequency(uint32_t freq); - // abstract common methos virtual bool setVoltage(float core_voltage) = 0; virtual void setFanPolarity(bool invert) = 0; @@ -243,14 +239,6 @@ class Board { return m_ecoAsicFrequency; } - uint32_t getDefaultVrFrequency() { - return m_defaultVrFrequency; - } - - uint32_t getVrFrequency() { - return m_vrFrequency; - } - float getMinPin() { return m_minPin; diff --git a/main/boards/nerdaxe.cpp b/main/boards/nerdaxe.cpp index fa9259b5..098e0c74 100644 --- a/main/boards/nerdaxe.cpp +++ b/main/boards/nerdaxe.cpp @@ -73,7 +73,6 @@ NerdAxe::NerdAxe() : Board() { m_asics = new BM1366(); m_hasHashCounter = true; - m_vrFrequency = m_defaultVrFrequency = m_asics->getDefaultVrFrequency(); } /** @@ -165,7 +164,7 @@ bool NerdAxe::initAsics() vTaskDelay(pdMS_TO_TICKS(250)); SERIAL_clear_buffer(); - m_chipsDetected = m_asics->init(m_asicFrequency, m_asicCount, m_asicMaxDifficulty, m_vrFrequency); + m_chipsDetected = m_asics->init(m_asicFrequency, m_asicCount, m_asicMaxDifficulty); if (!m_chipsDetected) { ESP_LOGE(TAG, "error initializing asics!"); return false; diff --git a/main/boards/nerdaxegamma.cpp b/main/boards/nerdaxegamma.cpp index bbbef4fe..90f41fc0 100644 --- a/main/boards/nerdaxegamma.cpp +++ b/main/boards/nerdaxegamma.cpp @@ -63,7 +63,6 @@ NerdaxeGamma::NerdaxeGamma() : NerdAxe() { m_asics = new BM1370(); m_hasHashCounter = true; - m_vrFrequency = m_defaultVrFrequency = m_asics->getDefaultVrFrequency(); } @@ -135,7 +134,7 @@ bool NerdaxeGamma::initAsics() { vTaskDelay(pdMS_TO_TICKS(250)); SERIAL_clear_buffer(); - m_chipsDetected = m_asics->init(m_asicFrequency, m_asicCount, m_asicMaxDifficulty, m_vrFrequency); + m_chipsDetected = m_asics->init(m_asicFrequency, m_asicCount, m_asicMaxDifficulty); if (!m_chipsDetected) { ESP_LOGE(TAG, "error initializing asics!"); return false; diff --git a/main/boards/nerdqaxeplus.cpp b/main/boards/nerdqaxeplus.cpp index fba4ccd2..0dba2166 100644 --- a/main/boards/nerdqaxeplus.cpp +++ b/main/boards/nerdqaxeplus.cpp @@ -77,7 +77,7 @@ NerdQaxePlus::NerdQaxePlus() : Board() { m_asics = new BM1368(); m_hasHashCounter = true; - m_vrFrequency = m_defaultVrFrequency = m_asics->getDefaultVrFrequency(); + m_tps = new TPS53647(); } @@ -170,7 +170,7 @@ bool NerdQaxePlus::initAsics() vTaskDelay(pdMS_TO_TICKS(250)); SERIAL_clear_buffer(); - m_chipsDetected = m_asics->init(m_asicFrequency, m_asicCount, m_asicMaxDifficulty, m_vrFrequency); + m_chipsDetected = m_asics->init(m_asicFrequency, m_asicCount, m_asicMaxDifficulty); if (!m_chipsDetected) { ESP_LOGE(TAG, "error initializing asics!"); return false; diff --git a/main/boards/nerdqaxeplus2.cpp b/main/boards/nerdqaxeplus2.cpp index 667f774d..d3e24f37 100644 --- a/main/boards/nerdqaxeplus2.cpp +++ b/main/boards/nerdqaxeplus2.cpp @@ -42,7 +42,6 @@ NerdQaxePlus2::NerdQaxePlus2() : NerdQaxePlus() { #endif m_asics = new BM1370(); m_hasHashCounter = true; - m_vrFrequency = m_defaultVrFrequency = m_asics->getDefaultVrFrequency(); } float NerdQaxePlus2::getTemperature(int index) { diff --git a/main/boards/nerdqx.cpp b/main/boards/nerdqx.cpp index a566c875..caa7d1dd 100644 --- a/main/boards/nerdqx.cpp +++ b/main/boards/nerdqx.cpp @@ -71,7 +71,6 @@ NerdQX::NerdQX() : NerdQaxePlus2() { m_swarmColorName = "#7300e7"; m_defaultTheme = "default"; // light theme - m_vrFrequency = m_defaultVrFrequency = 35000; } bool NerdQX::initBoard() { diff --git a/main/http_server/axe-os/src/app/models/ISystemInfo.ts b/main/http_server/axe-os/src/app/models/ISystemInfo.ts index 38032ef9..7738f4c4 100644 --- a/main/http_server/axe-os/src/app/models/ISystemInfo.ts +++ b/main/http_server/axe-os/src/app/models/ISystemInfo.ts @@ -83,8 +83,6 @@ export interface ISystemInfo { lastpingrtt: number, recentpingloss: number, stratum_keep: number, - defaultVrFrequency?: number, - vrFrequency: number, shutdown: boolean, stratum: IStratum, diff --git a/main/http_server/axe-os/src/app/pages/edit/edit.component.html b/main/http_server/axe-os/src/app/pages/edit/edit.component.html index 30fe008b..ad171064 100644 --- a/main/http_server/axe-os/src/app/pages/edit/edit.component.html +++ b/main/http_server/axe-os/src/app/pages/edit/edit.component.html @@ -248,24 +248,6 @@

{{ 'COMMON.LOADING' | translate }}

Mining job switching time in milliseconds. -
- -
-
-
-
-
-
- - Version Rolling - Frequency. - -
- - Calculated wrap-around time: {{ wrapAroundTime | number:'1.2-2' }} s - -
-
diff --git a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts index 407c0c14..c3d35bef 100644 --- a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts +++ b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts @@ -38,7 +38,6 @@ export class EditComponent implements OnInit { public defaultFrequency: number = 0; public defaultCoreVoltage: number = 0; - public defaultVrFrequency: number = 0; public fanCount: number = 1; public fanLabels: string[] = ['Fan 1', 'Fan 2']; @@ -110,8 +109,6 @@ export class EditComponent implements OnInit { this.asicFrequencyValues = asic?.frequencyOptions ?? []; this.asicVoltageValues = asic?.voltageOptions ?? []; - this.defaultVrFrequency = info.defaultVrFrequency ?? undefined; - this.fanCount = info.fans?.length ?? info.fanCount ?? 1; this.fanLabels = info.fans?.map((f, i) => f.label || `Fan ${i + 1}`) ?? ['Fan 1', 'Fan 2']; const fan1cfg = info.fans?.[1]; @@ -222,12 +219,6 @@ export class EditComponent implements OnInit { Validators.max(90), Validators.required ]], - vrFrequency: [info.vrFrequency, [ - Validators.min(1000), - Validators.max(100000), - Validators.pattern(/^\d+$/), // only ints - Validators.required, - ]], otpEnabled: [info.otp], fan1Mode: [fan1cfg?.mode ?? 3, [Validators.required]], @@ -534,14 +525,6 @@ export class EditComponent implements OnInit { this.runSaveWithOptionalOtp(); } - get wrapAroundTime(): number { - const freq = this.form.get('vrFrequency')?.value; - if (!freq || freq <= 0) { - return 0; - } - const wrap = 65536 / freq; // seconds - return wrap; - } private runSaveWithOptionalOtp(): void { this.otpAuth.ensureOtp$( diff --git a/main/http_server/axe-os/src/app/services/system.service.ts b/main/http_server/axe-os/src/app/services/system.service.ts index 14e614d4..6cae9d2a 100644 --- a/main/http_server/axe-os/src/app/services/system.service.ts +++ b/main/http_server/axe-os/src/app/services/system.service.ts @@ -81,7 +81,6 @@ const defaultInfo: ISystemInfo = { recentpingloss: 0.00, poolDifficulty: 0, stratum_keep: 0, - vrFrequency: 25000, defaultTheme: "cosmic", shutdown: false, diff --git a/main/http_server/handler_system.cpp b/main/http_server/handler_system.cpp index f251ca74..e6d8a20f 100644 --- a/main/http_server/handler_system.cpp +++ b/main/http_server/handler_system.cpp @@ -15,8 +15,6 @@ static const char *TAG = "http_system"; -#define VR_FREQUENCY_ENABLED - uint64_t getDuplicateHWNonces(); /* Simple handler for getting system handler */ @@ -220,10 +218,6 @@ esp_err_t GET_system_info(httpd_req_t *req) doc["invertfanpolarity"] = board->isInvertFanPolarityEnabled() ? 1 : 0; doc["autofanspeed"] = Config::getTempControlMode(); doc["stratum_keep"] = Config::isStratumKeepaliveEnabled() ? 1 : 0; -#ifdef VR_FREQUENCY_ENABLED - doc["vrFrequency"] = board->getVrFrequency(); - doc["defaultVrFrequency"] = board->getDefaultVrFrequency(); -#endif doc["otp"] = Config::isOTPEnabled(); // flag if otp is enabled // system screen @@ -352,12 +346,6 @@ esp_err_t PATCH_update_settings(httpd_req_t *req) if (doc["pidD"].is()) { Config::setPidD((uint16_t) (doc["pidD"].as() * 100.0f)); } -#ifdef VR_FREQUENCY_ENABLED - if (doc["vrFrequency"].is()) { - Config::setVrFrequency(doc["vrFrequency"].as()); - } -#endif - // Per-channel fan settings: fans[0] maps to ch0 NVS keys, fans[1] to ch1 NVS keys if (doc["fans"].is()) { JsonArray fans = doc["fans"].as(); diff --git a/main/nvs_config.h b/main/nvs_config.h index fb02aad7..dc532e77 100644 --- a/main/nvs_config.h +++ b/main/nvs_config.h @@ -68,8 +68,6 @@ #define NVS_CONFIG_SWARM "swarmconfig" -#define NVS_CONFIG_VR_FREQUENCY "vr_frequency" - // device global stats #define NVS_TOTAL_FOUND_BLOCKS "totalblocks" #define NVS_CONFIG_BEST_DIFF "bestdiff" @@ -245,8 +243,6 @@ namespace Config { inline void setBestDiff(uint64_t value) { nvs_config_set_u64(NVS_CONFIG_BEST_DIFF, value); } inline void setStratumDifficulty(uint32_t value) { nvs_config_set_u64(NVS_CONFIG_STRATUM_DIFFICULTY, value); } inline void setTotalFoundBlocks(uint32_t value) { nvs_config_set_u64(NVS_TOTAL_FOUND_BLOCKS, value); } - inline void setVrFrequency(uint32_t value) { nvs_config_set_u64(NVS_CONFIG_VR_FREQUENCY, value); } - // ---- Boolean Getters (Stored as uint16_t but used as bool) ---- inline bool isInvertScreenEnabled() { return nvs_config_get_u16(NVS_CONFIG_INVERT_SCREEN, 0) != 0; } // todo unused? inline bool isSelfTestEnabled() { return nvs_config_get_u16(NVS_CONFIG_SELF_TEST, 0) != 0; } @@ -289,8 +285,6 @@ namespace Config { inline uint16_t getPidP(uint16_t d) { return nvs_config_get_u16(NVS_CONFIG_PID_P, d); } inline uint16_t getPidI(uint16_t d) { return nvs_config_get_u16(NVS_CONFIG_PID_I, d); } inline uint16_t getPidD(uint16_t d) { return nvs_config_get_u16(NVS_CONFIG_PID_D, d); } - inline uint32_t getVrFrequency(uint32_t d) { return (uint32_t) nvs_config_get_u64(NVS_CONFIG_VR_FREQUENCY, d); } - // OTP Replay-Protection state (last_step + 3-bit mask) inline void getOTPReplayState(int64_t& base_step, uint8_t& mask) { base_step = (int64_t) nvs_config_get_u64(NVS_CONFIG_OTP_LAST_STEP, 0ULL); diff --git a/main/tasks/power_management_task.cpp b/main/tasks/power_management_task.cpp index 568d7301..3ebb8b24 100644 --- a/main/tasks/power_management_task.cpp +++ b/main/tasks/power_management_task.cpp @@ -89,22 +89,15 @@ void PowerManagementTask::checkAsicFrequencyChanged() if (!m_board->setAsicFrequency((float) asic_frequency)) { ESP_LOGE(TAG, "pll setting not found for %uMHz", asic_frequency); } + // recalculate nonce space for new frequency (register 0x10) + Asic *asics = m_board->getAsics(); + if (asics) { + asics->setNonceSpace((float)asic_frequency, m_board->getAsicCount(), asics->getCoreCount()); + } last_asic_frequency = asic_frequency; } } -void PowerManagementTask::checkVrFrequencyChanged() -{ - static uint32_t lastVrFrequency = 0; - - uint32_t vrFrequency = m_board->getVrFrequency(); - if (vrFrequency != lastVrFrequency) { - m_board->setVrFrequency(vrFrequency); - ESP_LOGI(TAG, "setting version rolling frequency to %luHz", vrFrequency); - lastVrFrequency = vrFrequency; - } -} - void PowerManagementTask::logChipTemps() { size_t offset = 0; @@ -220,8 +213,6 @@ void PowerManagementTask::applyAsicSettings() // check if asic frequency changed checkAsicFrequencyChanged(); - // check if version rolling frequency changed - checkVrFrequencyChanged(); } void PowerManagementTask::requestChipTemps() diff --git a/main/tasks/power_management_task.h b/main/tasks/power_management_task.h index 006078a0..16ad9608 100644 --- a/main/tasks/power_management_task.h +++ b/main/tasks/power_management_task.h @@ -38,7 +38,6 @@ class PowerManagementTask { void checkCoreVoltageChanged(); void checkAsicFrequencyChanged(); - void checkVrFrequencyChanged(); void readAndPublishPowerTelemetry(); void applyAsicSettings(); void task();