OpenWrt Router'ın USB Seri Portu Üzerinden ESP32'yi Uzaktan Flash Etme

Sahadaki bir ESP32, bir OpenWrt router’ındaki USB-seri adaptöre (UART ile) bağlıysa, yeni firmware’i tamamen SSH üzerinden flash edebilirsin — fiziksel erişim gerekmez, ayrı programlayıcı gerekmez. Numara: esptool‘u router’ın kendisinde çalıştırmak.

Ön koşullar

  1. OpenWrt router’ına SSH erişimi.
  2. ESP32 UART’ı (TX/RX/GND/EN/BOOT veya auto-reset devresi) router’ın USB portuna takılı USB-seri adaptöre bağlı.
  3. Router’da kmod-usb-serial artı adaptörünün sürücüsü (örn. kmod-usb-serial-ftdi, kmod-usb-serial-cp210x veya kmod-usb-serial-ch341) kurulu → /dev/ttyUSB0 belirir.

Adım 1: Router’a Python + esptool kur

OpenWrt’nin Python’u yeterli flash/RAM’e sahip router’lara rahat sığar:

router-setup.sh
ssh root@ROUTER_IP '
opkg update
opkg install python3 python3-pip rsync
pip3 install esptool pyserial --break-system-packages 2>/dev/null || pip3 install esptool pyserial
'

(Alternatif olarak scp/rsync ile kendi kendine yeten bir esptool kopyası ve managed_components‘i router’a kopyala.)

Adım 2: Firmware dosyalarını kopyala

upload.sh
scp build/bootloader/bootloader.bin \
    build/partition_table/partition-table.bin \
    build/ota_data_initial.bin \
    build/MyFirmware.bin \
    root@ROUTER_IP:/tmp/flash/

Adım 3: SSH üzerinden flash et

flash.sh
ssh root@ROUTER_IP 'python3 -m esptool --chip esp32 --port /dev/ttyUSB0 -b 460800 \
  --before default-reset --after hard-reset \
  write-flash --flash-mode dio --flash-size detect --flash-freq 40m \
  0x1000  /tmp/flash/bootloader.bin \
  0x8000  /tmp/flash/partition-table.bin \
  0x9000  /tmp/flash/ota_data_initial.bin \
  0x10000 /tmp/flash/MyFirmware.bin'

esptool, USB adaptörü üzerinden DTR/RTS’i geçiş yaparak bootloader’a girer, flash eder ve hard-reset atar — tam olarak yerel flash gibi, sadece SSH üzerinden taşınır.

Adım 4: Boot log’unu uzaktan yakala

Çipi resetleyip seri konsolu okuyarak yeni firmware’in gerçekten boot ettiğini doğrula:

remote_monitor.py
# Router'da şöyle çalışır: ssh root@ROUTER_IP 'python3 -' < remote_monitor.py
import serial, time

s = serial.Serial("/dev/ttyUSB0", 115200, timeout=0.3)
# DTR/RTS üzerinden reset pulse'ı (esptool usulü)
s.dtr = False; s.rts = True;  time.sleep(0.1)   # EN low
s.rts = False;                time.sleep(0.05)  # release
end = time.time() + 15
while time.time() < end:
    data = s.read(4096)
    if data:
        print(data.decode("utf-8", "replace"), end="")

Sorun giderme

İlgili


Check out similar posts by category: ESP32 OpenWRT Gömülü