Files
Blanton_TTL_Script_Diag/ARCHITECTURE.md
T
etwenandClaude Opus 5 318e656744 docs(arch): Add ARCHITECTURE and CLAUDE, init repo
Bring the Diag-OS variant of the Blanton A/B/C Tera Term scripts under
version control, alongside the SONiC-based Blanton_TTL_Script.

- ARCHITECTURE.md: Diag OS flow, acc_* command taxonomy, swutil addressing,
  TH6 test sequence side effects, and a 6-phase roadmap
- CLAUDE.md: stack, per-script command inventory, conventions, footguns
- .gitattributes: keep .ttl as CRLF (Windows-only), LF for everything else
- .gitignore: secret/, For_AI/, *.log, publish/ output
- secret/: README + config_secret.ttl.example for per-unit overrides
- Logs/ and utils/ placeholders (logopen needs Logs/ to pre-exist)

Known gaps documented, not fixed here: 2_Blanton_Script_B.ttl includes
utils/show_margin_status.ttl which does not exist yet, and its while loop
has no pause despite the "every 10mins" comment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SoEiorvuhmdTkpZWtEhJwq
2026-08-18 22:45:07 +08:00

550 lines
34 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ARCHITECTURE — Blanton TTL Script (Diag)
## Overview
**Blanton_TTL_Script_Diag** 是 BlantonProject Helios)交換器平台在 **Diag OS**ODM 出貨的診斷映像,
非 SONiC)下的**產線 / 工程驗證自動化腳本組**。
測試工程師在 Windows 端用 **Tera Term (TTL macro)** 透過 COM port 連上 DUT 的 diag console
(提示字元 `root@(none):~#`),由 A / B / C 三支腳本依序把整套 `acc_*` 診斷指令跑過一輪,全程自動存 log。
三支腳本的分工就是一輪測試的三個階段:
| Script | 階段 | 做什麼 |
|--------|------|--------|
| `1_Blanton_Script_A.ttl` | **Inventory / Functional sweep** | 開 log → 韌體版本、EEPROM、I2C/PCIe 列舉、DDR/SSD/USB/BMC/TPM/RTC/NFC 功能測、溫度風扇、100G port、BER/FEC/FDR、TH6 診斷 |
| `2_Blanton_Script_B.ttl` | **Stress / Soak** | 起 CPU / DDR / SSD / USB 壓力與流量,之後進 `while 1` 迴圈週期取數(目前僅 margin,其餘為空區塊) |
| `3_Blanton_Script_C.ttl` | **Post-test / Verdict** | 殺掉壓力程序、收工取數、比對 PCIe error counter 與流量 counter(目前全為空區塊) |
與姊妹專案 [`Blanton_TTL_Script`](../Blanton_TTL_Script)(SONiC 版)最大的差異在**取數能力的來源**:
| | `Blanton_TTL_Script`SONiC | **本專案(Diag** |
|---|---|---|
| DUT OS | SONiCDebian-based NOS | ODM Diag OSbusybox 風格,`root@(none)` |
| 取數層 | 自寫的 **bash 工具庫**`pcimem` → FPGA I2C/VI2C → VRM/溫感) | Diag image **內建的 `acc_*` 指令集** + `swutil` |
| 登入 | `sonic login:` → admin → `sudo -i`(要密碼) | 直接就是 root(無登入互動) |
| 交換晶片 | `bcmcmd` drivshell | `swutil`(含 `dsh -c` 轉發 drivshell |
| 腳本內容 | TTL + bash 兩層 | **純 TTL 一層** |
**使用者**:硬體 / 系統驗證工程師(ETWen、KC、Alan)與產線測試員。
**核心價值**:把 Diag OS 下數十條要人工逐條敲、且每條輸出都要留存的診斷指令,
壓縮成「開 Tera Term → 跑 A → 跑 B 泡著 → 跑 C 收工」三個動作,且每一筆數據都有 log 可回溯。
---
## Tech Stack
| Layer | Technology |
|-------|-----------|
| 測試控制端(Host | Tera Term 5.x **TTL macro**`.ttl`),Windows |
| Host ↔ DUT 通道 | RS-232 / USB-Serial COM portdiag console115200-8-N-1 |
| DUT OS | ODM **Diag OS**busybox/Linuxprompt `root@(none):~#`,直接 root |
| DUT 診斷指令集 | 內建 `acc_*` 家族(見 Data Models §2+ `swutil` + `onie-syseeprom` |
| 交換晶片存取 | `swutil`Tomahawk6 / TH6`*:` = all unit、`1:` = unit 1`dsh -c` 轉發 drivshell |
| 系統韌體資訊 | `version``acc_misc_version {bios,i210,mac}``acc_pld util``acc_bmc_board info` |
| 板級 EEPROM | `onie-syseeprom -t cpu`ONIE TLV 格式) |
| 錯誤 / 健康資料源 | `acc_dram_cpu chkecc``acc_fs_ssd selftest``acc_misc_liquid info`(漏液)、`acc_temp_thermal` |
| 高速鏈路驗證 | `acc_net_mac {100G,ber,fec,fdr}``swutil *:ps cd``100init.sh` |
| Log | Tera Term `logopen`append + plain text + timestamp |
| 版本控制 | GitNAS + GiteaGitea 端本 repo 設為 **public**,見 Security Considerations |
> ⚠️ **無編譯步驟。** TTL 是直譯執行,「build」等同「把 `src/Script_ABC_Blanton_Diag/` 整包複製到
> Tera Term 的工作目錄,並確認同層有 `Logs\` 資料夾」。
---
## Architecture Diagram
```
┌──────────────────────────────────────────────────────────────┐
│ Windows Host — Tera Term 5.x │
│ │
│ 1_Blanton_Script_A.ttl ──┐ │
│ 2_Blanton_Script_B.ttl ──┼─→ include "config.ttl" │
│ 3_Blanton_Script_C.ttl ──┘ (prompt_diag / EN_* 旗標) │
│ │ │
│ └─→ include "utils/*.ttl" (可重用取數片段) │
│ │
│ logopen → Logs\Blanton_Margin_<ts>.log (整段 console 存檔) │
└───────────────────────┬──────────────────────────────────────┘
│ COM portsendln "<cmd>" / wait prompt_diag
┌──────────────────────────────────────────────────────────────┐
│ DUT — Diag OS console (root@(none):~#) │
│ │
│ acc_misc_* version / liquidBIOS/I210/MAC 版本、漏液) │
│ acc_pld_* util cbCB CPLD/PLD 暫存器) │
│ acc_pwr_mon show d2d(電源監控) │
│ acc_iai_* i2c device / pcie device(匯流排列舉) │
│ acc_dram_cpu info / rw / chkeccDDR
│ acc_bmc_* board/iai/net/fs/dram/e2pBMC 子系統) │
│ acc_fs_* ssd info|rw|selftest / usb rw(儲存) │
│ acc_scy_* tpm / nfc(安全元件) │
│ acc_net_* cpu traffic mgmtp / mac 100G|ber|fec|fdr │
│ acc_temp_thermal ddr|cpu|sensor ; acc_cool_fan speed │
│ acc_time_rtc test ; acc_led_*LED,目前註解未啟用) │
│ onie-syseeprom -t cpu │
│ 100init.sh100G 埠初始化) │
└───────────────────────┬──────────────────────────────────────┘
│ swutil*: = all unit, 1: = unit 1
┌──────────────────────────────────────────────────────────────┐
│ Tomahawk6 (TH6) 交換晶片 × 2 unit │
│ swutil *:ps cd 埠狀態 / link / speed │
│ swutil *:port cd en=0|1 埠 down/up(重新協商) │
│ swutil -C -r 重新載入設定並重啟 │
│ swutil [1:]dsh -c 'tr NN' Broadcom drivshell 內建測試 │
│ │
│ 設定檔:/usr/local/bin/config.ymlAUTO: 0→1
│ /usr/local/bin/extphy_init_LT.soc(測試時改名停用) │
└──────────────────────────────────────────────────────────────┘
```
---
## Project Structure
```
Blanton_TTL_Script_Diag/
├── CLAUDE.md # 專案記憶 & 給 Claude 的指令
├── ARCHITECTURE.md # 本架構文件
├── .gitignore # secret/ + For_AI/ + logs 規則
├── .gitattributes # 換行符政策(.ttl 保持 CRLF、.sh/.md 一律 LF
├── docs/ # 規格與狀態文件(客戶提供 / 專案產出)
│ └── .gitkeep # ← 待放:Diag 指令手冊、逐項 Status 表
├── tools/ # Host / 離線端輔助腳本
│ └── .gitkeep # ← 待放:log 解析器(Phase 5
├── secret/ # 🚫 gitignored — COM 設定、per-unit 覆寫、未公開附件
│ ├── README.md # ✅ committed — 用途索引
│ ├── config_secret.ttl.example # ✅ committed — 現場參數範本(__CHANGE_ME__
│ └── config_secret.ttl # 🚫 實際值,由 config.ttl include(尚未接線)
├── For_AI/ # 🚫 gitignored — AI 協作素材(截圖、草稿)
├── publish/ # 可交付的打包輸出(Blanton_Script_ABC_Diag_v<ver>_<date>/ + zip
└── src/
└── Script_ABC_Blanton_Diag/ # ← Tera Term 的工作目錄(整包給測試員)
├── config.ttl # 全域設定:testcase 名、EN_Margin / EN_log、prompt_diag
├── 1_Blanton_Script_A.ttl # Inventory + 功能掃描(目前唯一實作完整的一支)
├── 2_Blanton_Script_B.ttl # Stress / soak(骨架,區塊多為空)
├── 3_Blanton_Script_C.ttl # Post-test 判定(骨架,區塊多為空)
├── utils/ # 可 include 的取數片段(TTL,無狀態、只 wait+sendln
│ └── show_margin_status.ttl # ⚠️ Script B 已 include**檔案尚未建立**Phase 1
└── Logs/ # Tera Term logopen 輸出(*.log gitignored
```
---
## Data Models
本專案沒有資料庫,「資料模型」是**設定檔格式**與**Diag 指令的命名語意 / 回傳格式**。
### 1. `config.ttl` — 全域測試參數(TTL 變數)
```ini
strTestcase = "Margin" ; 測項名,進 log 檔名
project_name = "Blanton" ; 專案名,進 log 檔名
EN_Margin = 1 ; 1=Script B 迴圈內跑 margin 取數, 0=跳過
EN_log = 1 ; 1=logopen 存檔, 0=不存
prompt_diag = "root@(none):~#" ; Diag OS 的 shell 提示字元(所有 wait 的依據)
```
Log 檔名規則:`<mdir>\Logs\<project_name>_<strTestcase>_<YYYYmmdd-HHMMSS>.log`
`mdir``getdir` 取得 = macro 所在資料夾;**`Logs\` 必須先存在**`logopen` 不會自建)。
`logopen filename 0 1 1 1` 的四個旗標依序為:binary=0(文字)、append=1、plain text=1、timestamp=1。
### 2. `acc_*` 指令命名語意(Diag OS 指令集)
Diag image 內建的指令一律是 `acc_<domain>_<device> <subcommand> [args]`
| domain | 涵蓋範圍 | 本專案用到的指令 |
|--------|----------|------------------|
| `misc` | 雜項 / 版本 / 液冷 | `acc_misc_version {bios,i210,mac}``acc_misc_liquid info` |
| `pld` | CPLD / PLD | `acc_pld util cb 0 0x0`CB PLD,起始位址 0x0 |
| `pwr` | 電源監控 | `acc_pwr_mon show d2d` |
| `bmc` | BMC 子系統 | `acc_bmc_board info``acc_bmc_iai i2c_device``acc_bmc_net usb_ping``acc_bmc_fs spi_test``acc_bmc_dram rw``acc_bmc_e2p bmc_r` |
| `iai` | 匯流排 / 介面列舉(Inventory Access Interface | `acc_iai_i2c device``acc_iai_pcie device` |
| `dram` | 主記憶體 | `acc_dram_cpu {info,rw,chkecc}` |
| `fs` | 儲存裝置 | `acc_fs_ssd {info,rw,selftest short}``acc_fs_usb rw` |
| `scy` | 安全元件 | `acc_scy_tpm``acc_scy_nfc test` |
| `net` | 網路 / MAC | `acc_net_cpu traffic mgmtp``acc_net_mac {100G,ber,fec,fdr}` |
| `temp` | 溫度 | `acc_temp_thermal {ddr,cpu,sensor}` |
| `cool` | 散熱 | `acc_cool_fan speed 30`(設定 30% duty |
| `time` | 時間 | `acc_time_rtc test` |
| `led` | 指示燈 | `acc_led_sys``acc_led_mgmtport`(**Script A 內目前全部註解掉** |
高速鏈路測試的參數形式:
| 指令 | 參數 | 說明 |
|------|------|------|
| `acc_net_mac ber -m berproj -p all` | `-m` 模式、`-p` 埠 | BERbit error rate)測試,全埠 |
| `acc_net_mac fec -p all` | `-p` 埠 | FEC 錯誤計數 |
| `acc_net_mac fdr -m fdr -u all` | `-m` 模式、`-u` unit | FDRForward Data Rate / 廠商定義)測試,全 unit |
### 3. `swutil` 定址語法(TH6 交換晶片)
| 形式 | 意義 |
|------|------|
| `swutil *:<cmd>` | 對**所有** switch unit 下指令 |
| `swutil 1:<cmd>` | 只對 **unit 1** 下(不加前綴 = unit 0 |
| `swutil *:ps cd` | port status`cd` 為埠群組(100G/400G cd 系列) |
| `swutil *:port cd en=0` / `en=1` | 埠 disable / enable(用來強制重新協商) |
| `swutil -C -r` | 重新載入設定(`config.yml`)並 reset |
| `swutil [1:]dsh -c '<drivshell cmd>'` | 把指令轉發給 Broadcom drivshell |
Tomahawk6 測試段落會先改兩個檔再重載:
```bash
sed -i 's/AUTO: 0/AUTO: 1/g' /usr/local/bin/config.yml # 開啟自動協商
mv /usr/local/bin/extphy_init_LT.soc /usr/local/bin/extphy_init_LT.temp # 停用外部 PHY LT 初始化
swutil -C -r # 重載設定
swutil dsh -c 'tr 39' # unit 0 內建測試 39
swutil 1: dsh -c 'tr 39' # unit 1 內建測試 39
swutil dsh -c 'tr 55' # unit 0 內建測試 55
```
> ⚠️ **`tr <n>` 的實際測項定義尚未在本 repo 留檔**(來自 Broadcom SDK 的內建 test suite 編號)。
> 待取得 SDK 文件後補進 `docs/`,否則 log 裡只會看到編號、看不出測了什麼。
> ⚠️ **這段有副作用且不會自動還原**`config.yml` 被 `sed -i` 就地改寫、
> `extphy_init_LT.soc` 被改名。跑完這段的 DUT 已不是出廠設定,
> 下一輪測試(或交機)前必須手動復原。
### 4. 判定資料源(目前散在 log 裡,尚未自動化)
| 類別 | 來源指令 | 判定 |
|------|----------|------|
| DDR ECC | `acc_dram_cpu chkecc` | 有 UE 直接 failCE 依門檻 |
| SSD 健康 | `acc_fs_ssd selftest short` / `info` | selftest 非 pass 即 fail |
| 漏液 | `acc_misc_liquid info` | 任一 channel 觸發即 fail(液冷平台最高優先) |
| 溫度 | `acc_temp_thermal {ddr,cpu,sensor}` | 超出板規上限即 fail |
| 鏈路 | `acc_net_mac ber` / `fec``swutil *:ps cd` | BER 超門檻、FEC 不可修正錯誤 > 0、link 未達標速 |
| PCIe / I2C 列舉 | `acc_iai_pcie device``acc_iai_i2c device` | 裝置數量 / 位址與 golden list 不符即 fail |
> 目前這些全靠人眼看 log。Phase 5 的 `tools/parse_blanton_diag_log.py` 就是要把上表變成自動判定。
---
## Key Features
| 模組 | 進入點 | 功能 |
|------|--------|------|
| **Script AInventory + 功能掃描)** | `1_Blanton_Script_A.ttl` | `logopen` → 版本/PLD/電源監控/BMC board info → 漏液 → ONIE EEPROM → I2C/PCIe 列舉 → DDR info/rw/chkecc → BMC 六項(I2C/USB net/SPI/DRAM/EEPROM)→ SSD 三項 → TPM → USB → MGMT traffic → 溫度三項 → 風扇 → RTC → NFC → 100G init + MAC → 埠 down/up + 狀態 → BER / FEC / FDR → TH6 `tr` 測試 |
| **Script BStress / Soak** | `2_Blanton_Script_B.ttl` | 目前只有骨架:`logwrite` 分隔線 + `while 1` 迴圈,迴圈內依 `EN_Margin` include margin 取數。CPU/DDR/SSD/USB 壓力、eye measurement、traffic start 皆為**空區塊** |
| **Script CPost-test** | `3_Blanton_Script_C.ttl` | 目前只有骨架:`logwrite` 分隔線 + 結尾 `messagebox`。kill process、取數、PCIe error counter、stress 結果、traffic counter 皆為**空區塊** |
| **共用設定** | `config.ttl` | 三支腳本開頭 `include`,集中管理 testcase 名、`EN_*` 旗標、`prompt_diag` |
| **Log 一體化** | Script A `logopen` | A 開檔,B / C 用 `logwrite` 續寫分隔線 → 一輪測試一個 log 檔 |
---
## Data Flow
### 一輪完整測試(端到端)
```
[測試員] 開 Tera Term,連 COM<n> (115200-8-N-1)Control → Macro → 1_Blanton_Script_A.ttl
Script A ── logopen Logs\Blanton_Margin_<ts>.log ──┐ (之後所有畫面都進這個檔)
│ │
├─ flushrecv ← 清掉開檔前殘留的 console 輸出
├─ Inventoryversion / bios / PLD / i210 / mac / pwr_mon / bmc board
├─ 漏液:acc_misc_liquid info ← 液冷平台,出事就不用往下測了
├─ EEPROMonie-syseeprom -t cpu
├─ 列舉:acc_iai_i2c device / acc_iai_pcie device
├─ DDRinfo → rw → chkecc
├─ BMCi2c_device / usb_ping / spi_test / dram rw / e2p bmc_r
├─ 儲存:ssd info/rw/selftest short、usb rw
├─ 安全:tpm、nfc
├─ MGMTacc_net_cpu traffic mgmtp
├─ 環境:thermal ddr/cpu/sensor、fan speed 30、rtc test
├─ 100G100init.sh → acc_net_mac 100G
├─ 埠:ps cd → port en=0 → en=1 → (pause 60) → ps cd ← 等重新協商
├─ 鏈路品質:ber → fec → fdr
└─ TH6config.yml AUTO 改 1 → 停用 extphy LT → swutil -C -r
→ dsh 'tr 39'(u0) → 'tr 39'(u1) → 'tr 55'(u0)
[目前 Script A 結尾沒有 messagebox,跑完不會提示接 Script B] ← Phase 2 待補
Script B ── 同一個 log 檔續寫(logwrite '##### ScriptB START #####'
├─ (待實作) CPU / DDR / SSD / USB 壓力、uplink eye measurement、traffic start
└─ while 1: if EN_Margin=1 → include "utils/show_margin_status.ttl"
↑ ⚠️ 此檔尚未建立,目前跑到這裡會失敗
↑ ⚠️ 迴圈內無 pause,不是註解說的「每 10 分鐘」
[測試員停止 B 的 macro,接著跑 C]
Script C ── logwrite '##### ScriptC START #####'
├─ (待實作) kill process / take data / PCIe error counter / stress 結果 / traffic counter
└─ messagebox 'GOOD JOB! Test Case DONE'
[人工檢查 Logs\Blanton_Margin_<ts>.log]
```
### 單一取數步驟的執行模型
```
wait prompt_diag ← 等上一條指令跑完、shell 把提示字元吐回來
sendln "<diag command>" ← 送下一條
└→ 畫面上出現的所有回應,被 logopen 的 log 直接吃進檔案
```
這個「先 `wait``sendln`」的節奏是全專案唯一的同步機制 —— 沒有回傳值解析、沒有 exit code、
沒有逾時保護。因此:
- **判定完全靠事後看 log**(或 Phase 5 的解析器)。
- **`wait` 沒有 timeout 就是無限等**:長時間指令(`acc_fs_ssd selftest``acc_net_mac ber`
`acc_dram_cpu rw`)若在 DUT 上掛住,macro 會永遠停在那一行,且畫面上看不出是「還在跑」還是「死了」。
---
## Key Constraints & Business Rules
1. **A → B → C 必須在同一個 Tera Term session 依序跑。** 只有 Script A 會 `logopen`
B / C 是 `logwrite` 續寫;中途關掉 window,log 就斷了(未來 B 的背景程序也會跟著沒了)。
2. **`Logs\` 資料夾必須先存在。** `logopen` 不會自動建目錄,缺了就整支 macro 在第一步失敗
—— 而且因為還沒開 log,失敗現場不會留下任何紀錄。
3. **`prompt_diag = "root@(none):~#"` 是全專案的同步基準。** Diag image 換版、hostname 被設定、
或 shell prompt 客製化,整組腳本會全部卡在第一個 `wait`。換 image 先確認這一行。
4. **Diag OS 沒有登入互動。** 開機直接是 root,所以本專案(不同於 SONiC 版)**沒有帳密要藏**;
`secret/` 存在是為了 per-unit 的 COM port / 埠清單 / 客戶未公開附件。
5. **`wait` 沒有逾時保護。** 現行腳本任何一條指令 hang 住,macro 就無限等待。
長時間項目(SSD selftest、BER、DDR rw)在 Phase 2 要加 `timeout` 與逾時分支。
6. **TH6 段落會改 DUT 的檔案且不還原**`sed -i``config.yml``AUTO: 0``AUTO: 1`
`extphy_init_LT.soc` 改名成 `.temp`。**跑完的 DUT 不是出廠狀態**,交機或下一輪測試前要手動復原。
7. **`acc_cool_fan speed 30` 會把風扇壓到 30%**,之後腳本沒有還原成自動控制。
在高負載 / 高室溫環境下連著跑 Script B 的 soak 有過熱風險 —— 測完要確認風扇回到 auto。
8. **`swutil *:port cd en=0` 會把埠打掉。** 若 DUT 的管理流量走這些埠(而不是 MGMT port),
遠端連線會斷。現場只用 COM console 時沒問題,改用 SSH 操作時要特別注意。
9. **漏液檢查(`acc_misc_liquid info`)優先於一切。** 這是液冷平台,漏液屬於會弄壞硬體的等級,
Script A 把它排在很前面就是這個理由;判讀為異常時應直接中止測試,不要繼續往下跑。
10. **`utils/show_margin_status.ttl` 目前不存在**,但 `2_Blanton_Script_B.ttl` 已經 `include` 它。
這是已知的 broken referencePhase 1 修)——`EN_Margin=1` 時 Script B 會失敗。
11. **Diag 版與 SONiC 版是兩套獨立腳本,不共用檔案。** 兩邊的 `config.ttl` 同名但內容不同
(prompt 不一樣),**不要互相複製**;共通的只有「A/B/C 三段式 + logopen/logwrite」這個慣例。
---
## Security Considerations
| 項目 | 做法 |
|------|------|
| **DUT 帳密** | Diag OS 直接是 root、無登入互動,**本 repo 不含任何帳密**。日後若 image 加上登入,一律放 `secret/config_secret.ttl`gitignored),由 `config.ttl` includerepo 內只留 `.example``__CHANGE_ME__` |
| **`secret/` 資料夾** | 本機 / 現場敏感資料集中地:COM port 設定、per-unit 埠清單與 BDF 覆寫、客戶提供的未公開附件。`.gitignore``secret/*` + `!secret/README.md` + `!secret/*.example` + `!secret/.gitkeep`**除 README 與 `.example` 外全部忽略** |
| **測試 log** | `Logs/*.log` 含 DUT 序號、MAC、韌體版本、ONIE EEPROM 內容等可識別資訊 → gitignore,只保留目錄結構(`.gitkeep` |
| **客戶機密文件** | `docs/` 內若放入客戶提供的 diag 指令手冊 / schematic 衍生資訊,屬 NDA 範圍;schematic 原始檔(`*.DSN`)一律 gitignore |
| **Remote 與可見性** | 推 `nas``git.et-wen.com:51222`+ `gitea``etgit.et-wen.com`)。**本 repo 在 Gitea 上依指示設為 public** —— 因此 `docs/` 放客戶文件前務必再確認一次,可公開的東西才進 repo。GitHub 不設 `origin` |
| **破壞性指令** | `acc_dram_cpu rw``acc_bmc_dram rw``acc_fs_ssd rw``acc_fs_usb rw` 都是**寫入測試**`sed -i config.yml``mv extphy_init_LT.soc` 會改動 DUT 設定。這些只能對測試機執行,**絕不可對客戶已上線的機器跑** |
| **For_AI/** | AI 協作素材(截圖、草稿筆記)整個資料夾 gitignore,避免不小心把客戶圖面帶進 repo |
---
## Build & Setup Steps
無編譯。從零到能跑一輪測試:
```bash
# ── 0. 取得專案(開發機 / 測試 NB)────────────────────────────
git clone ssh://ETHouseNAS@git.et-wen.com:51222/volume1/git/Blanton_TTL_Script_Diag.git
cd Blanton_TTL_Script_Diag
# ── 1. 現場參數(不進 git;目前尚未被 config.ttl include,先備而不用)──
cp secret/config_secret.ttl.example secret/config_secret.ttl
# 編輯 secret/config_secret.ttl,把 __CHANGE_ME__ 換成實際值
```
**HostWindows)端:**
```
1. 安裝 Tera Term 5.x
2. 把 src\Script_ABC_Blanton_Diag\ 整包複製到本機(路徑不要有空白與非 ASCII)
3. 確認該資料夾下有 Logs\ 目錄(repo 內已用 .gitkeep 保留;logopen 不會自建)
4. Tera Term 連上 DUT 的 diag console COM port115200-8-N-1
5. 手動按一次 Enter,確認提示字元真的是 root@(none):~#
不是的話,改 config.ttl 的 prompt_diag,否則整組腳本會卡在第一個 wait
6. Control → Macro → 選 1_Blanton_Script_A.ttl
7. A 跑完 → 手動跑 2_Blanton_Script_B.ttlsoakwhile 1 迴圈,泡到時間到停掉)
⚠️ 目前 EN_Margin=1 會因為 utils\show_margin_status.ttl 不存在而失敗,
未修好前先在 config.ttl 設 EN_Margin=0
8. 停掉 B → 跑 3_Blanton_Script_C.ttl
9. 檢查 Logs\Blanton_Margin_<ts>.log
10. 收工還原:確認風扇回自動控制、config.yml 的 AUTO 與 extphy_init_LT.soc 已復原
```
**DUT 端煙霧測試(跑 Script A 之前先手動敲三條確認):**
```bash
version # 有輸出 = console 通了、diag 環境正常
acc_iai_i2c device # I2C 列舉,對照 golden list
acc_misc_liquid info # 漏液狀態,異常就別往下跑
```
> 註:本專案非 .NET / Blazor / EC2 架構,`aws-ec2-deploy` 與 `vbox-run-deploy`
> 兩份部署指南不適用,已跳過。
---
## Development Phases
現況基準(2026-08-18):**Script A 已完整、B / C 只有骨架**,且 B 有一個 broken include。
以下 Phase 先把「能穩定跑完一輪」補起來,再往自動判定與交付走。
### Phase 1 — 版控化 + 修好 broken reference(工作量:S
**目標:** 專案進 git(NAS + Gitea),三支腳本能從乾淨 clone 跑起來不報錯。
**包含:**
- [x] `git init` + `.gitignore``secret/*``For_AI/``Logs/*.log``~$*``*.DSN`
- [x] `.gitattributes``.ttl``-text`(維持 CRLF),`.sh`/`.md`/`.py` 一律 LF
- [x]`secret/README.md` + `secret/config_secret.ttl.example``__CHANGE_ME__` placeholder
- [x] `src/Script_ABC_Blanton_Diag/Logs/.gitkeep``logopen` 依賴這個目錄存在)
- [x] `CLAUDE.md` + `ARCHITECTURE.md` 進 repopush `nas` + `gitea`
- [ ] **建立 `utils/show_margin_status.ttl`** —— Script B 已 include 但檔案不存在;
內容為 Diag OS 下對應的 margin 取數指令(SONiC 版是 `source margin_status_all.sh`
Diag 版要先確認有沒有等價的 `acc_pwr_*` 子指令,沒有就先放 `acc_pwr_mon show d2d`
- [ ]`config.ttl``script_version`,並於 Script A 開頭 `logwrite` 出來
(log 開頭要看得出跑的是哪一版腳本)
**驗收條件:** 在另一台機器 `git clone` → 複製 `src/Script_ABC_Blanton_Diag/` 到 Tera Term →
A / B / C 三支都能載入且不出現「找不到檔案」;`git status` 乾淨(log 不會被誤加)。
---
### Phase 2 — Script A 穩固化:逾時、分段、交棒(工作量:M)
**目標:** Script A 不會無聲卡死,log 分段清楚,跑完會提示接 Script B。
**包含:**
- [ ] Script A 開頭補 `logwrite '##### ScriptA START #####'` 分隔線
(B / C 都有,只有 A 沒有,log 開頭少一段)
- [ ] 每個測試區塊前加 `logwrite` 小標題(`=== DDR ===``=== BMC ===`…),
讓 Phase 5 的解析器有明確的切段依據
- [ ] 長時間指令加逾時保護:`timeout = <秒>` + `wait prompt_diag` 後檢查 `result`
逾時就 `logwrite` 標記並 `messagebox` 提示(`acc_fs_ssd selftest short`
`acc_net_mac ber``acc_dram_cpu rw``acc_bmc_dram rw` 這四項優先)
- [ ] Script A 結尾補 `messagebox 'Script A DONE — start Script B'`(比照 SONiC 版)
- [ ] TH6 段落加還原步驟:測完把 `extphy_init_LT.temp` 改回 `.soc`
`config.yml``AUTO: 1` 改回 `0`(或至少在結尾 `messagebox` 提醒人工復原)
- [ ] `acc_cool_fan speed 30` 之後補一條還原成自動控制的指令(先確認 Diag 的子指令名)
- [ ] 把註解掉的 LED 測試改為由 `config.ttl``EN_LED` 旗標控制(LED 要人眼看,
不是每個站點都跑,但不該用註解來開關)
- [ ] 拆出 `utils/`:把 Script A 的大區塊(BMC 六項、SSD 三項、溫度三項、
鏈路品質三項)各自抽成 `utils/show_*.ttl`,主腳本只留 `include` —— 比照 SONiC 版的分層慣例
**驗收條件:** 跑一次 Script A,log 內每個區塊都有 `===` 標題可切段;
故意拔掉 SSD 讓 selftest 卡住,macro 會在逾時後標記並繼續(而不是永遠停住);
跑完跳出 messagebox。
---
### Phase 3 — Script B 壓力層實作(工作量:L)
**目標:** Script B 從骨架變成真的能 soak:壓力起得來、起不來看得出來、取樣有固定週期。
**包含:**
- [ ] 確認 Diag OS 上可用的壓力手段(SONiC 版用 `~/hammer/tools/``mlucas-avx2` /
`stress_*.py`**Diag image 不一定有**)—— 先在 DUT 上盤點,把結論寫進 `docs/`
- [ ] `; ========== CLEAR EVENT ==========`:補上清事件 / 清 counter 的指令
- [ ] AMD CPU stress / DDR stress / SSD rw / USB rw 四個空區塊實作,
並在啟動後印一次「目前跑著哪些背景程序」以供確認
- [ ] `; ========== Take one round of eye measurement on uplink ports ==========`
確認 `acc_net_mac``swutil dsh` 是否有 eye scan 子指令,補上
- [ ] Traffic START 區塊:接 `100init.sh` + `acc_net_mac 100G``swutil` loopback
- [ ] soak 迴圈補 `pause EN_LoopInterval``config.ttl` 新增,預設 600 = 10 分鐘),
每輪開頭先 `sendln "date"` 留時戳 —— 兌現註解寫的「Get data every 10mins」
- [ ] 迴圈內取數擴充:溫度、風扇、電源監控、漏液、DDR ECC(不是只有 margin
**驗收條件:** Script B 啟動後能列出所有背景壓力程序;連續跑 3 輪,
log 內三段各自帶時戳且間隔 ≈10 分鐘;`EN_Margin=0` 時整段 margin 跳過且不報錯。
---
### Phase 4 — Script C 收工判定(工作量:M)
**目標:** Script C 從骨架變成真的能收工:程序收乾淨、資料抓齊、counter 有前後比對。
**包含:**
- [ ] `; ========== Kill Process ==========`:收掉 Script B 起的所有背景壓力
(Diag OS 下的做法要先確認 —— busybox 的 `jobs` 行為與 SONiC 的 bash 不一定相同)
- [ ] `; ========== TAKE DATA ==========`:收工快照(版本、溫度、風扇、電源、漏液、DDR ECC)
- [ ] `; ========== Check PCIE error counters ==========`
`acc_iai_pcie device`(或 Diag 提供的 AER 子指令)抓錯誤計數
—— **要與 Script A 的基線相減**,看差值不看絕對值
- [ ] `; ========== CHECK Stress results ==========`:把 Phase 3 各壓力程式的 log 印出來
- [ ] `; ========== CHECK Traffic counters ==========``swutil *:ps cd` + MAC counter
與 Script B 啟動時的基線比對
- [ ] 結尾除了 `messagebox`,再 `logwrite` 一段收工時戳與「本輪測了哪些項目」清單
**驗收條件:** 跑完 A→B→C`ps` 確認沒有殘留的壓力程序;
log 內 Script A 與 Script C 的 PCIe / ECC counter 可直接對照相減;
messagebox 出現時 log 已完整寫出。
---
### Phase 5 — Log 解析與自動判定(工作量:L)
**目標:** 不用人眼掃幾 MB 的 console log,跑完自動吐一張 PASS/FAIL 摘要。
**包含:**
- [ ] `tools/parse_blanton_diag_log.py`:吃 `Logs/*.log`,靠 `#####``===` 分隔線
切出 ScriptA / ScriptB / ScriptC 三段與各測試區塊
- [ ]`acc_*` 指令輸出的解析規則表(一個指令一個 parser,缺 parser 就標 `UNPARSED`
而不是靜默略過)
- [ ] Counter 差值計算:Script A 與 Script C 的 PCIe error / DDR ECC 相減,
UE > 0 或 fatal > 0 直接標 FAIL
- [ ] 鏈路品質判定:BER / FEC 的門檻可設定(放 `tools/thresholds.yml`),超過標 FAIL
- [ ] soak 期間的溫度 / 風扇 / 電源趨勢 → CSV(可直接畫圖)
- [ ] 產出 `Logs/<run>_summary.md`:一頁 PASS/FAIL + 每個子系統一行結論
**驗收條件:** 拿一份實跑的 log 產出 summary 與 CSV
人工在 log 內植入一筆假的 ECC UEsummary 正確翻成 FAIL
未知輸出格式不會讓解析器崩潰,只會標 `UNPARSED`
---
### Phase 6 — 打包、Runbook 與交付(工作量:S)
**目標:** 產出可直接交給現場測試員(或客戶)的一包,含操作手冊,不需要看原始碼。
**包含:**
- [ ] `tools/publish.sh`:把 `src/Script_ABC_Blanton_Diag/` + 空 `Logs/` + `secret/*.example`
打包成 `publish/Blanton_Script_ABC_Diag_v<ver>_<YYYYMMDD>/` 與同名 zip
- [ ] `README.md`(現場用):Tera Term 設定、A→B→C 操作順序、
常見錯誤(prompt 不符、`Logs\` 缺目錄、指令逾時、TH6 設定未復原)與對應處理
- [ ] `CHANGELOG.md`:延續 `1_Blanton_Script_A.ttl` 頂端的 Version History,集中成一份
- [ ] `docs/` 補齊:Diag 指令手冊(廠商提供)、`tr <n>` 測項對照、逐項 Status 表
- [ ] 三支腳本的 header 版號與 `CHANGELOG.md` 對齊
- [ ] 打 git tag `v1.0.0`push `nas` + `gitea`
**驗收條件:** 從 zip 解壓到一台乾淨的測試 NB,照 README 操作,
不看原始碼就能完成一輪 A→B→C 並產出 summary`publish/` 內容與 git tag 一致。
---
## Future Extensions
- **與 SONiC 版共用 utils 慣例**:兩個 repo 的 `utils/*.ttl` 命名與分層若對齊,
未來寫 log 解析器可以共用一套切段規則(甚至同一支 parser 吃兩種 log)。
- **`tr <n>` 測項字典**:把 Broadcom drivshell 的內建測試編號整理進 `docs/`
log 裡才看得出 `tr 39` / `tr 55` 到底測了什麼。
- **TH6 設定的自動還原**:目前 `config.yml``extphy_init_LT.soc` 的改動要人工復原,
可寫成 Script C 的收尾步驟,或做成 `utils/th6_restore.ttl`
- **產線模式**:把 Script A 的功能掃描抽成「快速版」(跳過 BER / selftest 等長時間項目),
`config.ttl``EN_Quick` 切換,供產線快篩使用。
- **SSH / 網路模式**:目前全走 COM console。若 Diag OS 的 MGMT port 可用,
可改用 `plink`/`ssh` 執行同一組指令,速度與可靠度都比 serial 好。
- **多 DUT 併行**:多台同時測時 Tera Term 每台開一個 macro window
可考慮改成 Python`pyserial`)統一排程與集中收 log。
- **與 `Blanton_TTL_Script`(SONiC 版)的測項對照表**:同一片硬體在兩種 OS 下各測了什麼、
哪些項目只有其中一邊有 —— 這張表對交機報告很有用。