feat: SD boot mode detection — kill hw_server + popup after 30s if Boot mode is SD

This commit is contained in:
2026-06-12 18:16:35 +08:00
parent c0f7219d30
commit fce940926f
3 changed files with 88 additions and 3 deletions
+10 -3
View File
@@ -53,6 +53,7 @@ class ZynqCheckResult:
pl_detected: bool
hw_server_url: str
error: str = ""
hw_server_pid: int | None = None
# ── Patterns ──────────────────────────────────────────────────────────
@@ -104,12 +105,14 @@ def check_zynq_jtag(
# ── 2. Start hw_server ─────────────────────────────────────
hw_proc: subprocess.Popen | None = None
hw_pid: int | None = None
try:
hw_proc = subprocess.Popen(
build_tool_command(hw_server_path),
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
hw_pid = hw_proc.pid
# Wait up to 10s for hw_server to bind
started = False
for _ in range(100):
@@ -118,7 +121,7 @@ def check_zynq_jtag(
started = True
break
if not started:
return _fail("hw_server did not bind port 3121 within 10s", hw_server_url)
return _fail("hw_server did not bind port 3121 within 10s", hw_server_url, pid=hw_pid)
except OSError as e:
return _fail(f"Failed to start hw_server: {e}", hw_server_url)
@@ -161,9 +164,10 @@ def check_zynq_jtag(
return _fail(
f"JTAG scan timed out after {python_timeout}s",
hw_server_url,
pid=hw_pid,
)
except OSError as e:
return _fail(f"Failed to run Vivado: {e}", hw_server_url)
return _fail(f"Failed to run Vivado: {e}", hw_server_url, pid=hw_pid)
finally:
try:
Path(tcl).unlink(missing_ok=True)
@@ -201,6 +205,7 @@ def check_zynq_jtag(
ps_detected=False, pl_detected=False,
hw_server_url=hw_server_url,
error=msg,
hw_server_pid=hw_pid,
)
ps_detected = any(d.is_arm_dap for d in jtag_chain)
@@ -212,16 +217,18 @@ def check_zynq_jtag(
ps_detected=ps_detected, pl_detected=pl_detected,
hw_server_url=hw_server_url,
error="",
hw_server_pid=hw_pid,
)
# ── Helpers ───────────────────────────────────────────────────────────
def _fail(error: str, url: str) -> ZynqCheckResult:
def _fail(error: str, url: str, pid: int | None = None) -> ZynqCheckResult:
return ZynqCheckResult(
devices=[], jtag_chain=[], is_present=False,
ps_detected=False, pl_detected=False,
hw_server_url=url, error=error,
hw_server_pid=pid,
)