-
Notifications
You must be signed in to change notification settings - Fork 8
Description
There is a new generation of users that only have RP2350 boards. They cannot update their Airlift firmware with a M4 or RP2040 without purchasing one for the task.
Summary
Failure always occurs at flash_begin() inside flash_file() ESP_FLASH_BEGIN (opcode 0x02) with:
Flashing NINA_ADAFRUIT-esp32-3.3.0.bin
Writing NINA_ADAFRUIT-esp32-3.3.0.bin w/filesize: 1333248
Erase size 1333248, num_blocks 2604, size 512, offset 0x0000
=== check_command ===
opcode: 0x2
buffer len: 16 checksum: 0 timeout: 13
['0xc0', '0x0', '0x2', '0x10', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0',
'0x10', '0x0', '0x0', '0x8', '0x0', '0x0', '0x0', '0x0', '0x2', '0x0',
'0x0', '0x0', '0x0', '0x0', '0x0', '0xc0']
Writing: bytearray(b'\xc0\x00\x02\x10\x00\x00\x00\x00\x00\x00\x10\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\xc0')
Timed out after 13 seconds
raw value: None
raw data: None len = 0
DEBUG: NO HEADER received for opcode 0x2
flash_begin() RAISED: RuntimeError("Didn't get enough status bytes",)
This is the exact exception:
Writing NINA_ADAFRUIT-esp32-3.3.0.bin w/filesize: 1333248
Erase size 1269760, num_blocks 2604, size 512, offset 0x0000
Traceback (most recent call last):
File "code.py", line 43, in <module>
File "adafruit_miniesptool.py", line 500, in flash_file
File "adafruit_miniesptool.py", line 322, in flash_begin
File "adafruit_miniesptool.py", line 354, in check_command
RuntimeError: Didn't get enough status bytes
This happens on both Feather RP2040 and Feather RP2350 with an AirLift FeatherWing (ESP32-MINI-1), across multiple CircuitPython and miniesptool versions.
The same hardware + wiring flashes NINA successfully when using the official RP2040 passthru UF2 + desktop esptool.py, so the issue appears specific to the CircuitPython/UART/miniesptool path.
Hardware
- Host boards tested:
- Adafruit Feather RP2040
- Adafruit Feather RP2350
- WiFi module:
- Adafruit AirLift FeatherWing (ESP32-U4WDH, NINA-style firmware)
- Connection:
- Standard Feather + AirLift FeatherWing stacking
- Using UART pins and reset/GPIO0 as per guides
Software / Versions
-
CircuitPython:
- 10.0.0
- 10.0.3
- 10.1.0-beta.1
-
adafruit_miniesptool:- 0.2.25 (rolled back via local copy on CIRCUITPY)
- 0.2.26 (current, with ESP32-C6 support)
-
Desktop tooling for passthru test:
esptool.py v4.8.1on macOS
Minimal code.py (Feather RP2350 + AirLift)
This is the test script I’m using on the Feather RP2350 (very similar script also used on Feather RP2040):
import time
import board
import busio
from digitalio import DigitalInOut
import adafruit_miniesptool
print("ESP32 Nina-FW Loader (Feather RP2350 + AirLift FeatherWing)")
tx = getattr(board, "ESP_TX", board.TX)
rx = getattr(board, "ESP_RX", board.RX)
resetpin = getattr(board, "ESP_RESET", board.IO4)
gpio0pin = getattr(board, "ESP_GPIO0", board.D10)
uart = busio.UART(tx, rx, baudrate=115200, timeout=1)
esptool = adafruit_miniesptool.miniesptool(
uart,
DigitalInOut(gpio0pin),
DigitalInOut(resetpin),
flashsize=4 * 1024 * 1024,
)
print("Resetting + syncing...")
esptool.sync()
print("Synced")
print("Found:", esptool.chip_name)
print("Baudrate (initial):", esptool.baudrate)
print("MAC ADDR:", [hex(i) for i in esptool.mac_addr])
for new_baud in (912600, 460800, 230400):
try:
print("Trying faster baudrate:", new_baud)
esptool.baudrate = new_baud
print("New baudrate set:", esptool.baudrate)
break
except Exception as e:
print("Failed to set baudrate", new_baud, "->", e)
else:
print("Staying at 115200; high-speed baud change failed.")
FILENAME = "NINA_ADAFRUIT-esp32-3.3.0.bin"
print("Flashing", FILENAME)
esptool.flash_file(FILENAME, 0x0)
print("Done flashing, resetting ESP32...")
esptool.reset()
time.sleep(0.5)
print("All done.")