diff --git a/src/fw/hotspot b/src/fw/hotspot index 40f9083e..e23d16c2 160000 --- a/src/fw/hotspot +++ b/src/fw/hotspot @@ -1 +1 @@ -Subproject commit 40f9083e6117c48761f61d3a873a167e1f74b0b4 +Subproject commit e23d16c25b37c8914ae15531f348d7397184c312 diff --git a/src/fw/modem b/src/fw/modem index a5b09522..ea08502d 160000 --- a/src/fw/modem +++ b/src/fw/modem @@ -1 +1 @@ -Subproject commit a5b0952258a5db12c6928c2285aa0d898d98a54c +Subproject commit ea08502d1ef4f2ac4c5487da7bae0db5002455fc diff --git a/src/host/calibrate/HostCal.cpp b/src/host/calibrate/HostCal.cpp index acbcec34..7a19fcf9 100644 --- a/src/host/calibrate/HostCal.cpp +++ b/src/host/calibrate/HostCal.cpp @@ -674,6 +674,10 @@ int HostCal::run(int argc, char **argv) case '`': printStatus(); break; + case '!': + writeBootload(); + end = true; + break; case 'V': ::LogInfo(__PROG_NAME__ " %s (built %s)", __VER__, __BUILD__); ::LogInfo("Copyright (c) 2017-2024 Bryan Biedenkapp, N2PLL and DVMProject (https://github.com/dvmproject) Authors."); @@ -747,6 +751,7 @@ void HostCal::displayHelp() LogMessage(LOG_CAL, "General Commands:"); LogMessage(LOG_CAL, " Toggle transmit"); LogMessage(LOG_CAL, " ` Display current settings and operation mode"); + LogMessage(LOG_CAL, " ! Restart into Bootloader Mode (wipes configuration area!)"); LogMessage(LOG_CAL, " V Display version of host"); LogMessage(LOG_CAL, " v Display version of firmware"); LogMessage(LOG_CAL, " H/h Display help"); diff --git a/src/host/modem/Modem.cpp b/src/host/modem/Modem.cpp index 2575e558..09ee1bdc 100644 --- a/src/host/modem/Modem.cpp +++ b/src/host/modem/Modem.cpp @@ -2566,6 +2566,9 @@ std::string Modem::cmdToString(uint8_t opcode) case CMD_FLSH_WRITE: return std::string("FLSH_WRITE"); + case CMD_RESET_MCU: + return std::string("CMD_RESET_MCU"); + default: return std::string(); } diff --git a/src/host/modem/Modem.h b/src/host/modem/Modem.h index b2701a1f..866cd9d1 100644 --- a/src/host/modem/Modem.h +++ b/src/host/modem/Modem.h @@ -182,6 +182,8 @@ namespace modem CMD_FLSH_READ = 0xE0U, //! Read Flash Partition CMD_FLSH_WRITE = 0xE1U, //! Write Flash Partition + CMD_RESET_MCU = 0xEAU, //! Soft Reboot MCU + CMD_DEBUG1 = 0xF1U, //! CMD_DEBUG2 = 0xF2U, //! CMD_DEBUG3 = 0xF3U, //! diff --git a/src/host/setup/HostSetup.cpp b/src/host/setup/HostSetup.cpp index 3a2e5ea6..83d3b355 100644 --- a/src/host/setup/HostSetup.cpp +++ b/src/host/setup/HostSetup.cpp @@ -139,7 +139,9 @@ HostSetup::HostSetup(const std::string& confFile) : m_timeout(300U), m_timer(0U), m_updateConfigFromModem(false), - m_hasFetchedStatus(false) + m_hasFetchedStatus(false), + m_requestedStatus(false), + m_reqBootload(false) { /* stub */ } @@ -1985,6 +1987,10 @@ bool HostSetup::writeFlash() buffer[48U] = m_modem->m_rssiFinePot; } + buffer[100U] = 0x00U; + if (m_reqBootload) + buffer[100U] |= 0x20U; + // software signature std::string software; software.append(__NETVER__ " (built " __BUILD__ ")"); @@ -2012,6 +2018,24 @@ bool HostSetup::writeFlash() return true; } +/* */ + +void HostSetup::writeBootload() +{ + m_reqBootload = true; + if (writeFlash()) { + uint8_t buffer[4U]; + ::memset(buffer, 0x00U, 4U); + + buffer[0U] = DVM_SHORT_FRAME_START; + buffer[1U] = 4U; + buffer[2U] = CMD_RESET_MCU; + + m_modem->write(buffer, 4U); + return; + } +} + /* Helper to clock the calibration BER timer. */ void HostSetup::timerClock() diff --git a/src/host/setup/HostSetup.h b/src/host/setup/HostSetup.h index dd4b9893..2c0d36c1 100644 --- a/src/host/setup/HostSetup.h +++ b/src/host/setup/HostSetup.h @@ -185,6 +185,8 @@ protected: bool m_hasFetchedStatus; bool m_requestedStatus; + bool m_reqBootload; + /** * @brief Modem port open callback. * @param modem Instance of the Modem class. @@ -320,6 +322,11 @@ protected: */ bool writeFlash(); + /** + * @brief + */ + void writeBootload(); + /** * @brief Helper to clock the calibration BER timer. */