fix detect chiptype

This commit is contained in:
Bob 2025-11-09 20:15:41 -08:00
parent 811ef6829b
commit 1a05445931
1 changed files with 69 additions and 45 deletions

View File

@ -7,41 +7,65 @@ Detects and lists ESP32 devices connected via USB
import serial.tools.list_ports import serial.tools.list_ports
import subprocess import subprocess
import sys import sys
import time
import serial
def detect_chip_type(port): def detect_chip_type(port):
""" """
Try to detect the ESP32 chip type using esptool.py Try to detect the ESP32 chip type using esptool.py
Returns chip type string or 'Unknown' Returns chip type string or 'Unknown'
""" """
# Try to enter ROM bootloader via DTR/RTS before probing
try_enter_bootloader(port)
cmd = ['esptool.py', '--port', port, '--chip', 'auto', '--before', 'default_reset',
'--after', 'no_reset', 'chip_id']
try : try :
result = subprocess.run( result = subprocess.run(cmd, capture_output=True, text=True, timeout=20)
['esptool.py', '--port', port, 'chip_id'], output = (result.stdout or '') + (result.stderr or '')
capture_output=True,
text=True,
timeout=10
)
output = result.stdout + result.stderr if result.returncode != 0:
last = output.strip().splitlines()[-1] if output.strip().splitlines() else 'esptool failed'
print(f" esptool on {port} failed: {last}")
return 'Unknown'
if 'ESP32-S3' in output: # Prefer exact "Chip is ..." line (e.g., ESP32-D0WD-V3)
return 'ESP32-S3' for line in output.splitlines():
elif 'ESP32-S2' in output: if line.startswith('Chip is '):
return 'ESP32-S2' return line.replace('Chip is ', '').split(' (', 1)[0].strip()
elif 'ESP32-C3' in output:
return 'ESP32-C3'
elif 'ESP32-C6' in output:
return 'ESP32-C6'
elif 'ESP32-H2' in output:
return 'ESP32-H2'
elif 'ESP32' in output:
return 'ESP32'
except Exception: # Fallback loose matches
pass for name in ('ESP32-S3','ESP32-S2','ESP32-C6','ESP32-C3','ESP32-H2','ESP32'):
if name in output:
return name
except FileNotFoundError:
print(" esptool.py not found (pip install esptool)")
except subprocess.TimeoutExpired:
print(f" esptool on {port} timed out (check EN/IO0 wiring)")
except Exception as e:
print(f" Error running esptool on {port}: {e}")
return 'Unknown' return 'Unknown'
def try_enter_bootloader(port):
"""
Toggle DTR/RTS to enter download mode.
Assumes RTS->EN (active-low) and DTR->IO0 (active-low on many adapters).
Safe no-op if control lines aren't available.
"""
try:
with serial.Serial(port, 115200, timeout=0.1) as ser:
ser.rts = True # EN low
ser.dtr = True # IO0 low
time.sleep(0.05)
ser.rts = False # EN high
time.sleep(0.05)
ser.dtr = False # IO0 high
time.sleep(0.05)
except Exception:
pass
def guess_chip_type_from_usb(vid, pid): def guess_chip_type_from_usb(vid, pid):
""" """