# Trouble Completing OTA Host MCU (Swan + CircuitPython) Firmware Updates Using Notecard DFU

**URL:** <https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376>\
**Category:** Swan\
**Tags:** python\
**Created:** [November 11, 2025, 3:08am UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376 "2025-11-11T03:08:10Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![chasez0r](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/chasez0r/32/1725_2.png) [@chasez0r](https://discuss.blues.com/u/chasez0r)\
**Post date:** [November 11, 2025, 3:08am UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/1 "2025-11-11T03:08:10Z")

</div>

Hello,

I’m trying to update my host MCU firmware (Swan running CircuitPython) over-the-air using the Notecard’s outboard DFU, but I keep running into issues where the host MCU never comes back up properly leading me to manually re-flash everything to so I can try again.

**Here’s what works so far:**

- I can manually flash the Swan using dfu-util (TinyUF2 + CircuitPython).

- CircuitPython runs fine, and I can mount CIRCUITPY, copy my code, and run it without issues.

- I can also build and apply a scripts.cpy using **circuitpython-fs-builder** after getting virtual env setup I run `cpy-fs src/ src/scripts.cpy` and can verify my codes in there.

- I have build and tried all 3 variations of a binpack file…

- I can get my Notecard to enter DFU mode and successfully download from Notehub and start the process.

**Where things go wrong:**

- The 3 part and 2 part image result in this error message `outboard DFU of stm32 firmware: can't initiate chip erase: send command 44 timeout` in the \_health.qo text after the download
- The 1 part, script only image, downloads super fast, unmounts the MCU and it never comes back up. However, if I re-flash tinyuf2 and circuitpython (by dragging a uf2 file over), it all comes back up and my new firmware is there! Meaning writing to this address `0x8100000` worked!

**My setup:**

- Blues Swan on a Notecarrier-F
- Notecard 8.x LTS firmware
- OTA .binpack built as either 1-part (scripts), 2-part (CircuitPython + scripts) or 3-part (TinyUF2 + CP + scripts)

Has anyone managed to get a reliable OTA update process working for CircuitPython on Swan using Notecard DFU?

Any examples, tips, or best practices, I feel like I must be missing something in the docs? Thank you.

---

<div class="post-metadata">

**Author:** ![abucknall](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/abucknall/32/1335_2.png) [@abucknall](https://discuss.blues.com/u/abucknall)\
**Post date:** [November 13, 2025, 1:52pm UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/3 "2025-11-13T13:52:56Z")

</div>

Hi @chasez0r

Thanks for your patience, I’m looking into this for you. In the meantime, something you can try to iterate on the OTA is to use the `-sideload` feature of Notecard CLI to place your circuitpython image onto the Notecard for use with ODFU. This is effectively the same mechanism that takes place when the Notecard receives your OTA image but without costing you data and events to send the image over Notehub.

Thanks,

Alex

---

<div class="post-metadata">

**Author:** ![chasez0r](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/chasez0r/32/1725_2.png) [@chasez0r](https://discuss.blues.com/u/chasez0r)\
**Post date:** [November 13, 2025, 3:24pm UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/4 "2025-11-13T15:24:34Z")

</div>

Thanks for the response. I will look into doing this locally with the sideload flag, maybe that will shed more light onto the issue. Let me know if anything else comes to mind. Thanks!

---

<div class="post-metadata">

**Author:** ![chasez0r](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/chasez0r/32/1725_2.png) [@chasez0r](https://discuss.blues.com/u/chasez0r)\
**Post date:** [November 14, 2025, 5:06pm UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/5 "2025-11-14T17:06:41Z")

</div>

I keep getting this error when trying to -sideload `dfu.put: dfu: cannot sideload on top of notehub-loaded firmware`

I have even run `notecard -format` and then got the same results after. There arent any docs I can find on the use of -sideload so any advice would be appreciated.

Full output after running -sideload

`placing notecard into DFU mode so that we can send file to its external flash storage`  
`waiting for notecard to power-up the external storage`  
`sending DFU binary to notecard`  
`restoring notecard so that it is no longer in DFU mode`  
`dfu.put: dfu: cannot sideload on top of notehub-loaded firmware`

---

<div class="post-metadata">

**Author:** ![abucknall](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/abucknall/32/1335_2.png) [@abucknall](https://discuss.blues.com/u/abucknall)\
**Post date:** [November 20, 2025, 9:24am UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/6 "2025-11-20T09:24:02Z")

</div>

Hi @chasez0r

I’m still looking into this for you, the `circuitpython-fs-builder` seems to be missing some documentation, so I’m trying to make sure that you’re building the firmware correctly.

On the issue of `-sideload` , for development purposes, I think the best option is to first remove the OTA firmware from Notehub and then use `card.restore` command to reset Notecard’s filesystem and force a re-sync with Notehub. This should hopefully drop the old firmware image from the Notecard’s flash. This is specifically what the `dfu.put: dfu: cannot sideload on top of notehub-loaded firmware` error is referring to.

```auto
{
  "req": "card.restore"
}

```

Thanks,

Alex

---

<div class="post-metadata">

**Author:** ![chasez0r](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/chasez0r/32/1725_2.png) [@chasez0r](https://discuss.blues.com/u/chasez0r)\
**Post date:** [November 20, 2025, 12:24pm UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/7 "2025-11-20T12:24:28Z")

</div>

Thanks, im still stuck any insights are appreciated!

---

<div class="post-metadata">

**Author:** ![abucknall](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/abucknall/32/1335_2.png) [@abucknall](https://discuss.blues.com/u/abucknall)\
**Post date:** [November 26, 2025, 7:36pm UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/8 "2025-11-26T19:36:50Z")

</div>

Hi @chasez0r

Apologies for the delay, it seems like something has changed upstream with how the CircuitPython image is being generated as it’s advanced a few years on from when this process was originally designed. The issue appears to be rooted in the CircuitPython image and how it is being built. Thanks for your patience!

---

<div class="post-metadata">

**Author:** ![chasez0r](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/chasez0r/32/1725_2.png) [@chasez0r](https://discuss.blues.com/u/chasez0r)\
**Post date:** [December 4, 2025, 1:15am UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/9 "2025-12-04T01:15:32Z")

</div>

Do you know which CircuitPython last worked with the current build process? I am happy to revert to an older version to try.

---

<div class="post-metadata">

**Author:** ![chasez0r](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.blues.com/chasez0r/32/1725_2.png) [@chasez0r](https://discuss.blues.com/u/chasez0r)\
**Post date:** [March 15, 2026, 4:30pm UTC](https://discuss.blues.com/t/trouble-completing-ota-host-mcu-swan-circuitpython-firmware-updates-using-notecard-dfu/3376/10 "2026-03-15T16:30:29Z")

</div>

@abucknall just following up on this. Do you know which was the last version of CircuitPython that worked?
