157 lines
4.3 KiB
Python
157 lines
4.3 KiB
Python
|
"""
|
||
|
flash_esp8266.py
|
||
|
|
||
|
Version: 1.0.0
|
||
|
Author: [Dein Name]
|
||
|
Copyright: 2023
|
||
|
License: MIT
|
||
|
|
||
|
Beschreibung:
|
||
|
Dieses Skript entpackt ein ZIP-Archiv mit Firmware- und Dateisystem-Dateien und flasht diese auf einen ESP8266.
|
||
|
Die entpackten Dateien werden nach dem Flashen gelöscht.
|
||
|
|
||
|
Versionshistorie:
|
||
|
1.0.0 - Initiale Version
|
||
|
|
||
|
Benutzung:
|
||
|
python flash_esp8266.py <zip_file> [-v]
|
||
|
|
||
|
Optionen:
|
||
|
-v Aktiviert Debug-Ausgaben
|
||
|
"""
|
||
|
|
||
|
import esptool
|
||
|
import sys
|
||
|
import serial.tools.list_ports
|
||
|
import zipfile
|
||
|
import os
|
||
|
import gzip
|
||
|
import shutil
|
||
|
|
||
|
BAUD_RATE = 921600 # Erhöhte Baudrate
|
||
|
DEBUG = '-v' in sys.argv
|
||
|
|
||
|
def debug_print(message):
|
||
|
if DEBUG:
|
||
|
print(message)
|
||
|
|
||
|
def get_com_ports():
|
||
|
ports = [comport.device for comport in serial.tools.list_ports.comports()]
|
||
|
debug_print(f"Verfügbare COM-Ports: {ports}")
|
||
|
return ports
|
||
|
|
||
|
def find_new_com_port(old_ports, timeout=15):
|
||
|
debug_print("Suche nach neuen COM-Ports...")
|
||
|
import time
|
||
|
start_time = time.time()
|
||
|
while time.time() - start_time < timeout:
|
||
|
new_ports = get_com_ports()
|
||
|
added_ports = list(set(new_ports) - set(old_ports))
|
||
|
if added_ports:
|
||
|
new_port = added_ports[0]
|
||
|
print(f"Neuer COM-Port gefunden: {new_port}")
|
||
|
return new_port
|
||
|
time.sleep(1)
|
||
|
return None
|
||
|
|
||
|
def extract_files(zip_file):
|
||
|
with zipfile.ZipFile(zip_file, 'r') as zip_ref:
|
||
|
zip_ref.extractall()
|
||
|
debug_print(f"Entpackt: {zip_ref.namelist()}")
|
||
|
return zip_ref.namelist()
|
||
|
|
||
|
def decompress_gz(file_path):
|
||
|
output_file = file_path.replace('.gz', '')
|
||
|
with gzip.open(file_path, 'rb') as f_in:
|
||
|
with open(output_file, 'wb') as f_out:
|
||
|
shutil.copyfileobj(f_in, f_out)
|
||
|
debug_print(f"Entpackt {file_path} zu {output_file}")
|
||
|
return output_file
|
||
|
|
||
|
def clean_up(files):
|
||
|
for file in files:
|
||
|
if os.path.isfile(file):
|
||
|
os.remove(file)
|
||
|
debug_print(f"Gelöscht: {file}")
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
if len(sys.argv) < 2:
|
||
|
print("Verwendung: python flash_esp8266.py <zip_file> [-v]")
|
||
|
sys.exit(1)
|
||
|
|
||
|
ZIP_FILE = sys.argv[1]
|
||
|
|
||
|
# Überprüfe, ob das ZIP-Archiv existiert
|
||
|
if not os.path.isfile(ZIP_FILE):
|
||
|
print(f"ZIP-Archiv {ZIP_FILE} nicht gefunden.")
|
||
|
sys.exit(1)
|
||
|
|
||
|
# Entpacke das ZIP-Archiv
|
||
|
extracted_files = extract_files(ZIP_FILE)
|
||
|
|
||
|
# Finde die .fw.bin- und .fs.gz-Dateien
|
||
|
bin_file = None
|
||
|
fs_file = None
|
||
|
|
||
|
for file in extracted_files:
|
||
|
if file.endswith('.fw.bin'):
|
||
|
bin_file = file
|
||
|
elif file.endswith('.fs.gz'):
|
||
|
fs_file = file
|
||
|
|
||
|
if not bin_file or not fs_file:
|
||
|
print(f"Die erforderlichen Dateien (.fw.bin und .fs.gz) wurden nicht im ZIP-Archiv {ZIP_FILE} gefunden.")
|
||
|
sys.exit(1)
|
||
|
|
||
|
print(f"Gefundene Firmware-Datei: {bin_file}")
|
||
|
print(f"Gefundene Dateisystem-Datei: {fs_file}")
|
||
|
|
||
|
# Entpacke die .fs.gz-Datei
|
||
|
decompressed_fs_file = decompress_gz(fs_file)
|
||
|
|
||
|
print("Bitte stecke den ESP8266 ab, falls er angeschlossen ist, und drücke Enter.")
|
||
|
input()
|
||
|
|
||
|
print("Suche nach verfügbaren COM-Ports...")
|
||
|
old_ports = get_com_ports()
|
||
|
|
||
|
print("Bitte stecke den ESP8266 jetzt an und warte, bis der neue COM-Port erkannt wird...")
|
||
|
|
||
|
port = find_new_com_port(old_ports, timeout=15)
|
||
|
|
||
|
if port is None:
|
||
|
print("Kein neuer COM-Port gefunden. Bitte versuche es erneut.")
|
||
|
sys.exit(1)
|
||
|
|
||
|
print(f"Neuer COM-Port gefunden: {port}")
|
||
|
|
||
|
# Benutze esptool zum Flashen der Firmware und des Dateisystems
|
||
|
try:
|
||
|
# Flashen der Firmware
|
||
|
esptool_args_bin = [
|
||
|
'--port', port,
|
||
|
'--baud', str(BAUD_RATE),
|
||
|
'write_flash', '-fm', 'dout', '0x00000', bin_file
|
||
|
]
|
||
|
esptool.main(esptool_args_bin)
|
||
|
print("Firmware erfolgreich geflasht!")
|
||
|
|
||
|
# Flashen des Dateisystems
|
||
|
esptool_args_fs = [
|
||
|
'--port', port,
|
||
|
'--baud', str(BAUD_RATE),
|
||
|
'write_flash', '0x300000', decompressed_fs_file
|
||
|
]
|
||
|
esptool.main(esptool_args_fs)
|
||
|
print("Dateisystem erfolgreich geflasht!")
|
||
|
|
||
|
# Bereinigen der entpackten Dateien
|
||
|
clean_up(extracted_files)
|
||
|
clean_up([decompressed_fs_file])
|
||
|
|
||
|
except Exception as e:
|
||
|
print(f"Fehler beim Flashen: {e}")
|
||
|
sys.exit(1)
|
||
|
|
||
|
input("Drücke Enter, um das Fenster zu schließen...") # Hält das Fenster offen
|