OTA

OTA Constants

#define MG_OTA_NONE 0                // No OTA support
#define MG_OTA_STM32H5 1            // STM32 H5
#define MG_OTA_STM32H7 2            // STM32 H7
#define MG_OTA_STM32H7_DUAL_CORE 3  // STM32 H7 dual core
#define MG_OTA_STM32F 4             // STM32 F7/F4/F2
#define MG_OTA_CH32V307 100         // WCH CH32V307
#define MG_OTA_U2A 200              // Renesas U2A16, U2A8, U2A6
#define MG_OTA_RT1020 300           // IMXRT1020
#define MG_OTA_RT1050 301           // IMXRT1050
#define MG_OTA_RT1060 302           // IMXRT1060
#define MG_OTA_RT1064 303           // IMXRT1064
#define MG_OTA_RT1170 304           // IMXRT1170
#define MG_OTA_MCXN 310             // MCXN947
#define MG_OTA_RW612 320            // FRDM-RW612
#define MG_OTA_FLASH 900            // OTA via an internal flash
#define MG_OTA_ESP32 910            // ESP32 OTA implementation
#define MG_OTA_PICOSDK 920          // RP2040/2350 using Pico-SDK hardware_flash
#define MG_OTA_CUSTOM 1000          // Custom implementation

OTA platform selection constants. Set MG_OTA to one of these values to select the target platform for firmware updates.

MG_IRAM

#define MG_IRAM __attribute__((noinline, section(".iram")))

Macro to place functions in RAM for execution during flash operations. Used when MG_OTA is defined (not MG_OTA_NONE). Functions marked with MG_IRAM reside in a special section that can be executed while the flash is being written.

mg_ota_begin()

bool mg_ota_begin(size_t new_firmware_size);

Start a firmware update session.

Parameters:

  • new_firmware_size - Expected size of the new firmware image

Return value: true on success, false on failure

Usage example:

if (mg_ota_begin(firmware_size)) {
  // Ready to write firmware
} else {
  // OTA begin failed
}

mg_ota_write()

bool mg_ota_write(const void *buf, size_t len);

Write a chunk of firmware data. Data must be aligned to 1k boundaries as required by the underlying flash hardware.

Parameters:

  • buf - Pointer to data buffer containing firmware chunk
  • len - Length of data to write (must be aligned to 1k)

Return value: true on success, false on failure

Usage example:

if (!mg_ota_write(data, data_len)) {
  // Write failed
}

mg_ota_end()

bool mg_ota_end(void);

Finalize the firmware update session. This function verifies the written firmware and prepares it for boot.

Return value: true on success, false on failure

Usage example:

if (mg_ota_end()) {
  // Firmware update complete, reboot to apply
} else {
  // OTA end failed
}

mg_ota_url_check()

void mg_ota_url_check(struct mg_mgr *mgr,
                      const char *current_version,
                      const char *metadata_url,
                      void (*fn)(const char *status));

Check for firmware updates by fetching metadata from a URL and comparing versions.

Metadata file format:

{
  "version": "1.2.3",
  "url": "http://my-product.com/firmwares/firmware-1.2.3.bin",
  "size": 324645
}

Parameters:

  • mgr - Event manager to use for HTTP request
  • current_version - Current firmware version string
  • metadata_url - URL to fetch update metadata (JSON containing version info)
  • fn - Callback function that receives status updates during the check

Return value: None

The callback function receives status strings indicating the progress or result of the update check.