From ddf0eb81474aa0871665698ccdccaffa15cb789b Mon Sep 17 00:00:00 2001 From: jim800121chen Date: Thu, 16 Apr 2026 22:49:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(local-tool):=20KL520=20=E9=A6=96=E6=AC=A1?= =?UTF-8?q?=20connect=20=E8=B7=B3=E9=81=8E=E4=B8=8D=E5=BF=85=E8=A6=81?= =?UTF-8?q?=E7=9A=84=20device=20reset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用者 Windows 上 connect KL520 耗時 60+ 秒且前端收到 504 timeout。 根因分析(從 log 逐行推斷): 1. server 啟動後首次 connect → needsReset=true → restartBridge() 2. reset 送出 → KL520 reboot → 退回 KDP2 Loader 模式(USB Boot 裝置, reset = firmware 從 RAM 清掉) 3. USB 重新枚舉 8 秒 → 新 bridge process → 嘗試 reconnect 4. Loader 模式的 connect_devices_without_check 不穩定 → attempt 1 fail (16 秒 timeout) → attempt 2 成功 (4 秒) 5. 載 firmware fw_scpu.bin → 31 秒 6. firmware loaded → 再次 reboot → 5 秒後 reconnect 7. 總時:8 + 16 + 4 + 31 + 5 = 64 秒 > 前端 60 秒 HTTP timeout → 504 但 KL520 是 USB Boot 裝置,每次斷電 firmware + model 就會清掉,connect 時本來就是 clean state。server 啟動後主動 reset 是多餘的——它把完整 firmware 砍掉再重載一次,浪費 60 秒且 Loader 模式 connect 不穩定。 這個 reset 邏輯最初是為 KL720 設計的:KL720 是 flash-based 裝置, firmware 和 model 保留在 flash,reset 清 stale model 才有意義。 修法:needsReset 條件加上 chipType == "KL720"。KL520 跳過 reset, 直接使用已有的 firmware。如果 KL520 真的有殘留 model 要清(理論上 不會因為它是 RAM-based),下次 load_model 前的 restartBridge 會處理。 修復後 KL520 connect 預期時間:2-5 秒(一次 connect + set_timeout)。 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../internal/driver/kneron/kl720_driver.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/local-tool/server/internal/driver/kneron/kl720_driver.go b/local-tool/server/internal/driver/kneron/kl720_driver.go index a4b3cc5..5f2ab30 100644 --- a/local-tool/server/internal/driver/kneron/kl720_driver.go +++ b/local-tool/server/internal/driver/kneron/kl720_driver.go @@ -289,14 +289,27 @@ func (d *KneronDriver) Connect() error { d.mu.Unlock() // First connect after server start: reset device to clear stale models. - if needsReset { - d.driverLog("INFO", "[kneron] first connect after server start — resetting device to clear stale model...") + // + // KL520 跳過 reset:KL520 是 USB Boot 裝置,reset 會退回 Loader 模式 + // (firmware 從 RAM 清掉),然後需要重新載 firmware(~30 秒)+ USB + // 重新枚舉(~8 秒)。這讓原本 2 秒的 connect 變成 60+ 秒,而且 + // Loader 模式的 connect_devices_without_check 不穩定(常需重試)。 + // + // KL520 每次 connect 本來就是 clean state(RAM-based firmware,斷電 + // 即清),不需要主動 reset 清 stale model。如果真的有殘留 model, + // 下次 load_model 前的 restartBridge 會處理。 + // + // KL720 是 flash-based 裝置,firmware 和 model 會保留在 flash,reset + // 清 stale model 才有意義。 + if needsReset && d.chipType == "KL720" { + d.driverLog("INFO", "[kneron] first connect after server start — resetting KL720 to clear stale model...") if err := d.restartBridge(); err != nil { d.driverLog("WARN", "[kneron] reset on connect failed (non-fatal): %v", err) - // Non-fatal: device is still connected, just might have stale model } else { d.driverLog("INFO", "[kneron] device reset complete — clean state ready") } + } else if needsReset { + d.driverLog("INFO", "[kneron] %s: skipping reset on first connect (USB Boot device, clean state by default)", d.chipType) } return nil