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
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
# =============================================================================
|
||||
# 換行符政策
|
||||
# -----------------------------------------------------------------------------
|
||||
# 這個 repo 的 .ttl 只在 Windows(Tera Term)上跑,其餘文字檔可能在 Linux 上處理,
|
||||
# 所以必須明確指定,不能靠各機器的 core.autocrlf。
|
||||
#
|
||||
# 姊妹專案 Blanton_TTL_Script 踩過的坑:bash 腳本帶著 CRLF 進 repo,
|
||||
# scp 到 DUT 後直接掛(-bash: $'\r': command not found)。
|
||||
# 本專案目前沒有 .sh,但規則先立好,之後加工具腳本就不會再踩。
|
||||
# =============================================================================
|
||||
|
||||
# Tera Term macro 只在 Windows 上跑,維持 CRLF;標成 -text 讓 git 原樣保存,
|
||||
# 避免對既有檔案產生大量純換行符的假 diff
|
||||
*.ttl -text
|
||||
|
||||
# 在 Linux 上執行或被 source 的,一律 LF
|
||||
*.sh text eol=lf
|
||||
*.conf text eol=lf
|
||||
*.py text eol=lf
|
||||
*.yml text eol=lf
|
||||
*.txt text eol=lf
|
||||
*.md text eol=lf
|
||||
|
||||
# 二進位,不要做任何轉換
|
||||
*.xlsx binary
|
||||
*.docx binary
|
||||
*.pdf binary
|
||||
*.h5 binary
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
# secret/ 全部忽略,但保留 README 與範本
|
||||
secret/*
|
||||
!secret/README.md
|
||||
!secret/*.example
|
||||
!secret/.gitkeep
|
||||
|
||||
# AI 協作素材不入 git
|
||||
For_AI/
|
||||
|
||||
# 測試 log(含 DUT 序號 / MAC / ONIE EEPROM / 韌體版本,保留目錄結構即可)
|
||||
*.log
|
||||
!**/logs/.gitkeep
|
||||
!**/Logs/.gitkeep
|
||||
|
||||
# 打包輸出
|
||||
publish/*
|
||||
!publish/.gitkeep
|
||||
|
||||
# Office 暫存檔
|
||||
~$*
|
||||
|
||||
# 客戶板 schematic 原始檔(機密,勿入 repo)
|
||||
*.DSN
|
||||
*.dsn
|
||||
+549
@@ -0,0 +1,549 @@
|
||||
# ARCHITECTURE — Blanton TTL Script (Diag)
|
||||
|
||||
## Overview
|
||||
|
||||
**Blanton_TTL_Script_Diag** 是 Blanton(Project 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 | SONiC(Debian-based NOS) | ODM Diag OS(busybox 風格,`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 port(diag console,115200-8-N-1) |
|
||||
| DUT OS | ODM **Diag OS**(busybox/Linux,prompt `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) |
|
||||
| 版本控制 | Git(NAS + Gitea;Gitea 端本 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 port:sendln "<cmd>" / wait prompt_diag
|
||||
▼
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ DUT — Diag OS console (root@(none):~#) │
|
||||
│ │
|
||||
│ acc_misc_* version / liquid(BIOS/I210/MAC 版本、漏液) │
|
||||
│ acc_pld_* util cb(CB CPLD/PLD 暫存器) │
|
||||
│ acc_pwr_mon show d2d(電源監控) │
|
||||
│ acc_iai_* i2c device / pcie device(匯流排列舉) │
|
||||
│ acc_dram_cpu info / rw / chkecc(DDR) │
|
||||
│ acc_bmc_* board/iai/net/fs/dram/e2p(BMC 子系統) │
|
||||
│ 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.sh(100G 埠初始化) │
|
||||
└───────────────────────┬──────────────────────────────────────┘
|
||||
│ 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.yml(AUTO: 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` 埠 | BER(bit error rate)測試,全埠 |
|
||||
| `acc_net_mac fec -p all` | `-p` 埠 | FEC 錯誤計數 |
|
||||
| `acc_net_mac fdr -m fdr -u all` | `-m` 模式、`-u` unit | FDR(Forward 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 直接 fail;CE 依門檻 |
|
||||
| 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 A(Inventory + 功能掃描)** | `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 B(Stress / Soak)** | `2_Blanton_Script_B.ttl` | 目前只有骨架:`logwrite` 分隔線 + `while 1` 迴圈,迴圈內依 `EN_Margin` include margin 取數。CPU/DDR/SSD/USB 壓力、eye measurement、traffic start 皆為**空區塊** |
|
||||
| **Script C(Post-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 輸出
|
||||
├─ Inventory:version / bios / PLD / i210 / mac / pwr_mon / bmc board
|
||||
├─ 漏液:acc_misc_liquid info ← 液冷平台,出事就不用往下測了
|
||||
├─ EEPROM:onie-syseeprom -t cpu
|
||||
├─ 列舉:acc_iai_i2c device / acc_iai_pcie device
|
||||
├─ DDR:info → rw → chkecc
|
||||
├─ BMC:i2c_device / usb_ping / spi_test / dram rw / e2p bmc_r
|
||||
├─ 儲存:ssd info/rw/selftest short、usb rw
|
||||
├─ 安全:tpm、nfc
|
||||
├─ MGMT:acc_net_cpu traffic mgmtp
|
||||
├─ 環境:thermal ddr/cpu/sensor、fan speed 30、rtc test
|
||||
├─ 100G:100init.sh → acc_net_mac 100G
|
||||
├─ 埠:ps cd → port en=0 → en=1 → (pause 60) → ps cd ← 等重新協商
|
||||
├─ 鏈路品質:ber → fec → fdr
|
||||
└─ TH6:config.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 reference(Phase 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` include,repo 內只留 `.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__ 換成實際值
|
||||
```
|
||||
|
||||
**Host(Windows)端:**
|
||||
|
||||
```
|
||||
1. 安裝 Tera Term 5.x
|
||||
2. 把 src\Script_ABC_Blanton_Diag\ 整包複製到本機(路徑不要有空白與非 ASCII)
|
||||
3. 確認該資料夾下有 Logs\ 目錄(repo 內已用 .gitkeep 保留;logopen 不會自建)
|
||||
4. Tera Term 連上 DUT 的 diag console COM port(115200-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.ttl(soak,while 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` 進 repo,push `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 UE,summary 正確翻成 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 下各測了什麼、
|
||||
哪些項目只有其中一邊有 —— 這張表對交機報告很有用。
|
||||
@@ -0,0 +1,122 @@
|
||||
# CLAUDE.md — Blanton TTL Script (Diag)
|
||||
|
||||
## 專案簡介
|
||||
|
||||
Blanton(Project Helios)交換器平台在 **Diag OS**(ODM 診斷映像,非 SONiC)下的驗證自動化腳本組。
|
||||
Windows 端用 **Tera Term TTL macro** 透過 COM console 驅動 DUT,
|
||||
A / B / C 三支腳本分別跑「功能掃描 → 壓力 soak → 收工判定」,全程存 log。
|
||||
取數能力全部來自 Diag image **內建的 `acc_*` 指令集** 與 `swutil`,**本專案是純 TTL,沒有 bash 工具庫**。
|
||||
|
||||
姊妹專案 [`Blanton_TTL_Script`](../Blanton_TTL_Script) 是同一片硬體的 **SONiC 版**(有 bash 工具庫)。
|
||||
**兩邊不共用檔案**,`config.ttl` 同名但 prompt 不同,不要互相複製。
|
||||
|
||||
完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。
|
||||
|
||||
## 技術棧
|
||||
|
||||
- **Host**:Tera Term 5.x TTL macro(`.ttl`),Windows
|
||||
- **DUT**:ODM Diag OS(busybox 風格),提示字元 `root@(none):~#`,**直接 root、無登入互動**
|
||||
- **診斷指令**:`acc_<domain>_<device> <subcmd>` 家族 —— domain 有
|
||||
`misc / pld / pwr / bmc / iai / dram / fs / scy / net / temp / cool / time / led`
|
||||
- **交換晶片**:`swutil`(`*:` = 全 unit、`1:` = unit 1、`dsh -c` 轉發 Broadcom drivshell)
|
||||
- **板級 EEPROM**:`onie-syseeprom -t cpu`(ONIE TLV)
|
||||
- **無編譯步驟**:TTL 直譯執行,「build」= 把 `src/Script_ABC_Blanton_Diag/` 複製到 Tera Term 工作目錄
|
||||
|
||||
## 常用指令
|
||||
|
||||
**Host 端跑一輪測試:**
|
||||
|
||||
```
|
||||
Tera Term 連 diag console COM port (115200-8-N-1)
|
||||
→ 先按一次 Enter,確認提示字元是 root@(none):~# ← 不符就改 config.ttl 的 prompt_diag
|
||||
→ 確認工作目錄下有 Logs\ ← logopen 不會自建目錄
|
||||
→ Control → Macro → 1_Blanton_Script_A.ttl (功能掃描,目前唯一完整的一支)
|
||||
→ 手動跑 2_Blanton_Script_B.ttl (壓力 soak,while 1,泡到時間到停掉)
|
||||
→ 手動跑 3_Blanton_Script_C.ttl (收工判定)
|
||||
→ 檢查 Logs\Blanton_Margin_<ts>.log
|
||||
→ 收工還原:風扇回 auto、config.yml 的 AUTO 與 extphy_init_LT.soc 復原
|
||||
```
|
||||
|
||||
**DUT 端煙霧測試(跑 Script A 前先手動敲):**
|
||||
|
||||
```bash
|
||||
version # 有輸出 = console 通了
|
||||
acc_iai_i2c device # I2C 列舉,對照 golden list
|
||||
acc_iai_pcie device # PCIe 列舉
|
||||
acc_misc_liquid info # 漏液狀態,異常就別往下跑
|
||||
```
|
||||
|
||||
**Script A 涵蓋的主要指令(依執行順序):**
|
||||
|
||||
```bash
|
||||
version ; acc_misc_version bios|i210|mac ; acc_pld util cb 0 0x0
|
||||
acc_pwr_mon show d2d ; acc_bmc_board info
|
||||
acc_misc_liquid info # 漏液
|
||||
onie-syseeprom -t cpu # ONIE EEPROM
|
||||
acc_iai_i2c device ; acc_iai_pcie device # 匯流排列舉
|
||||
acc_dram_cpu info|rw|chkecc # DDR
|
||||
acc_bmc_iai i2c_device ; acc_bmc_net usb_ping ; acc_bmc_fs spi_test
|
||||
acc_bmc_dram rw ; acc_bmc_e2p bmc_r # BMC 子系統
|
||||
acc_fs_ssd info|rw|selftest short ; acc_fs_usb rw
|
||||
acc_scy_tpm ; acc_scy_nfc test # 安全元件
|
||||
acc_net_cpu traffic mgmtp # MGMT 埠流量
|
||||
acc_temp_thermal ddr|cpu|sensor ; acc_cool_fan speed 30 ; acc_time_rtc test
|
||||
100init.sh ; acc_net_mac 100G # 100G
|
||||
swutil *:ps cd ; swutil *:port cd en=0|1 # 埠狀態 / down-up
|
||||
acc_net_mac ber -m berproj -p all
|
||||
acc_net_mac fec -p all
|
||||
acc_net_mac fdr -m fdr -u all
|
||||
# TH6:改 config.yml AUTO 0→1、停用 extphy_init_LT.soc、swutil -C -r、dsh 'tr 39'/'tr 55'
|
||||
```
|
||||
|
||||
## 開發慣例
|
||||
|
||||
- **執行單位**:`src/Script_ABC_Blanton_Diag/` 整包給測試員(Tera Term 工作目錄)
|
||||
- **TTL 分層**:`config.ttl` 放設定 → 三支主腳本編排流程 → `utils/*.ttl` 是可 include 的無狀態片段
|
||||
(只做 `wait prompt_diag` + `sendln`,不設變數、不 logopen)
|
||||
- **新增取數項目** = 新增一支 `utils/show_xxx.ttl`,再在主腳本 `include`,不要往主腳本塞指令
|
||||
(目前 Script A 還是一整條直線,Phase 2 才會拆 —— 新東西直接照新慣例寫)
|
||||
- **開關用旗標不用註解**:要不要跑某個區塊,用 `config.ttl` 的 `EN_*` 控制
|
||||
(現在 LED 測試是用註解關掉的,這是要修的反例)
|
||||
- **版本紀錄**:`1_Blanton_Script_A.ttl` 檔頭的 `Version History` 是三支腳本的集中紀錄,
|
||||
改動時**在檔頭補一行**(`V1.0.1 YYYY-MM-DD <做了什麼>`),不要只改版號
|
||||
- **換行符**:`.ttl` 維持 **CRLF**(只在 Windows 上跑),`.gitattributes` 已標 `-text`;
|
||||
`.sh` / `.md` / `.py` 一律 LF
|
||||
- **Commit**:Conventional Commits,**英文**。scope 用 `ttl` / `diag` / `bmc` / `net` / `th6` / `docs`
|
||||
|
||||
## 注意事項
|
||||
|
||||
- ⚠️ **`Logs\` 資料夾必須先存在**,`logopen` 不會自建。缺了就整支 macro 在第一步失敗,
|
||||
而且**因為還沒開 log,失敗現場什麼都不會留下**。repo 內用 `.gitkeep` 保留這個目錄。
|
||||
- ⚠️ **`prompt_diag = "root@(none):~#"` 是全專案唯一的同步基準**。Diag image 換版、
|
||||
hostname 被設定、prompt 客製化 → 整組腳本卡在第一個 `wait`,畫面上看起來像「當掉」。
|
||||
換 image 先手動按 Enter 確認這一行。
|
||||
- ⚠️ **`wait` 沒有 timeout 就是無限等**。`acc_fs_ssd selftest short`、`acc_net_mac ber`、
|
||||
`acc_dram_cpu rw`、`acc_bmc_dram rw` 都可能跑很久或掛住,
|
||||
現行腳本沒有逾時保護 —— macro 會永遠停在那一行,且看不出是還在跑還是死了。
|
||||
- 🔴 **`utils/show_margin_status.ttl` 目前不存在,但 `2_Blanton_Script_B.ttl` 已經 include 它。**
|
||||
`EN_Margin=1` 時 Script B 會失敗。修好之前,現場請先在 `config.ttl` 設 `EN_Margin=0`。
|
||||
- ⚠️ **Script B 的 `while 1` 迴圈裡沒有 `pause`**,註解寫「Get data every 10mins」但實際上是
|
||||
全速空轉,取樣間隔取決於指令執行時間。(Phase 3 要補 `EN_LoopInterval`。)
|
||||
- ⚠️ **TH6 段落會改 DUT 的檔案且不還原**:`sed -i` 把 `config.yml` 的 `AUTO: 0` 改成 `1`、
|
||||
把 `extphy_init_LT.soc` 改名成 `.temp`。**跑完的 DUT 不是出廠狀態**,交機前要手動復原。
|
||||
- ⚠️ **`acc_cool_fan speed 30` 之後沒有還原**成自動控制。高負載 soak 時有過熱風險,測完要確認。
|
||||
- ⚠️ **`swutil *:port cd en=0` 會把埠打掉**。用 SSH 而非 COM console 操作時會斷線。
|
||||
- ⚠️ **一堆 `rw` 是寫入測試**(`acc_dram_cpu rw`、`acc_bmc_dram rw`、`acc_fs_ssd rw`、
|
||||
`acc_fs_usb rw`),**只能對測試機跑,絕不可對客戶已上線的機器執行**。
|
||||
- ⚠️ **漏液檢查優先於一切**(液冷平台)。`acc_misc_liquid info` 異常時直接中止,別繼續往下測。
|
||||
- ⚠️ **A → B → C 必須同一個 Tera Term session**:只有 A 會 `logopen`,B / C 是 `logwrite` 續寫。
|
||||
中途關掉 window,log 就斷了。
|
||||
- ⚠️ **`tr 39` / `tr 55` 的測項定義還沒留檔**(Broadcom SDK 內建編號)。
|
||||
log 裡只看得到編號,看不出測了什麼 —— 拿到 SDK 文件請補進 `docs/`。
|
||||
- 🔒 **Gitea 上本 repo 依指示設為 public**。`docs/` 放客戶提供的文件前**務必再確認一次**,
|
||||
只有可公開的內容才進 repo。
|
||||
|
||||
## 資料夾說明
|
||||
|
||||
- `src/Script_ABC_Blanton_Diag/` — 可執行內容(Tera Term 工作目錄,整包給測試員)
|
||||
- `docs/` — 規格與狀態文件(待放:Diag 指令手冊、`tr <n>` 對照、逐項 Status 表)
|
||||
- `tools/` — Host / 離線端輔助腳本(待放:log 解析器)
|
||||
- `publish/` — 交付用打包輸出(`Blanton_Script_ABC_Diag_v<ver>_<date>/` + zip)
|
||||
- `secret/` — 🚫 gitignored(除 `README.md` 與 `*.example`):COM 設定、per-unit 覆寫、未公開附件
|
||||
- `For_AI/` — 🚫 gitignored:AI 協作素材(截圖、草稿筆記)
|
||||
@@ -0,0 +1,40 @@
|
||||
# secret/ — 本機 / 現場敏感資料
|
||||
|
||||
這個資料夾集中放**不能進 git** 的東西:per-unit 的 COM port 與序號、prompt 覆寫、
|
||||
(未來若 Diag image 加上登入的)帳密、客戶提供但未公開的附件。
|
||||
|
||||
> ℹ️ 本專案的 Diag OS **開機直接是 root、沒有登入互動**,所以目前 repo 內沒有任何帳密。
|
||||
> `secret/` 先建起來,是為了 per-unit 覆寫與客戶未公開附件;等真的需要時
|
||||
> 在 `config.ttl` 加一行 `include "config_secret.ttl"` 即可接上。
|
||||
|
||||
## Committed vs Ignored
|
||||
|
||||
`.gitignore` 規則是 `secret/*` 搭配 `!secret/README.md` / `!secret/*.example` / `!secret/.gitkeep`。
|
||||
|
||||
| 檔案 | 狀態 | 說明 |
|
||||
|------|------|------|
|
||||
| `README.md` | ✅ committed | 本說明 |
|
||||
| `config_secret.ttl.example` | ✅ committed | 現場參數範本,敏感欄位一律 `__CHANGE_ME__` |
|
||||
| `config_secret.ttl` | 🚫 ignored | **實際** per-unit 值 / 帳密 |
|
||||
| `*.local.*` | 🚫 ignored | 其他 per-unit 覆寫 |
|
||||
| `*.pem` / `*.key` / `*.env` | 🚫 ignored | 憑證、金鑰 |
|
||||
| 客戶未公開附件 | 🚫 ignored | diag 指令手冊草稿、schematic、內部 spec 等 |
|
||||
|
||||
## 第一次使用
|
||||
|
||||
```bash
|
||||
cp secret/config_secret.ttl.example secret/config_secret.ttl
|
||||
# 編輯 secret/config_secret.ttl,把 __CHANGE_ME__ 換成實際值
|
||||
```
|
||||
|
||||
Tera Term 端把整包 `src/Script_ABC_Blanton_Diag/` 複製到工作目錄時,**一併把
|
||||
`secret/config_secret.ttl` 放到 `src/Script_ABC_Blanton_Diag/` 同層**。
|
||||
現場機器上的那份不要再複製回 repo。
|
||||
|
||||
## 鐵則
|
||||
|
||||
- 🔒 **commit 前先 grep 一次**:`git grep -nE 'password|passwd|PaSsWoRd' -- . ':!secret'`
|
||||
應該只找得到變數名與 placeholder,不該出現真值。
|
||||
- 🔒 `.example` 檔內敏感欄位一律寫 `__CHANGE_ME__`,不留 `your_password` 這種半吊子 placeholder。
|
||||
- 🔒 **本 repo 在 Gitea 上是 public**(依專案指示設定)。放進 `docs/` 或任何 committed 路徑的東西
|
||||
一律當成「會被外人看到」處理;客戶未公開文件只能放 `secret/` 或 `For_AI/`。
|
||||
@@ -0,0 +1,32 @@
|
||||
; =============================================================================
|
||||
; config_secret.ttl.example — 現場 / per-unit 參數範本
|
||||
; -----------------------------------------------------------------------------
|
||||
; 用法:
|
||||
; cp secret/config_secret.ttl.example secret/config_secret.ttl
|
||||
; 編輯 config_secret.ttl,把所有 __CHANGE_ME__ 換成實際值
|
||||
;
|
||||
; 這個檔 **不進 git**(.gitignore: secret/*)。
|
||||
; Tera Term 端把 src/Script_ABC_Blanton_Diag/ 複製到工作目錄時,
|
||||
; 一併把 config_secret.ttl 放到同一層(config.ttl 以相對路徑 include)。
|
||||
;
|
||||
; ⚠️ 目前 config.ttl 尚未 include 這個檔(Diag OS 無登入互動、沒有帳密要藏)。
|
||||
; 等到真的需要 per-unit 覆寫時,在 config.ttl 加:
|
||||
; include "config_secret.ttl"
|
||||
; =============================================================================
|
||||
|
||||
; ── DUT 連線 ────────────────────────────────────────────────
|
||||
; 這台 DUT 的 diag console 掛在哪個 COM port(僅供記錄,Tera Term 連線仍是手動選)
|
||||
dut_com_port = "__CHANGE_ME__" ; 例:"COM39"
|
||||
|
||||
; ── Prompt 覆寫 ─────────────────────────────────────────────
|
||||
; Diag image 換版或 hostname 被設定時,用這裡覆寫 config.ttl 的預設值。
|
||||
; 一定要跟畫面上看到的完全一致(含空白),否則所有 wait 都會卡住。
|
||||
prompt_diag = "__CHANGE_ME__" ; 預設:"root@(none):~#"
|
||||
|
||||
; ── 登入(若未來的 Diag image 加上帳密才需要)────────────────
|
||||
dut_username = "__CHANGE_ME__"
|
||||
dut_password = "__CHANGE_ME__"
|
||||
|
||||
; ── per-unit 覆寫 ───────────────────────────────────────────
|
||||
; 每台機器不同、又不該進 repo 的東西放這裡(埠清單、BDF、序號…)
|
||||
dut_serial = "__CHANGE_ME__"
|
||||
@@ -0,0 +1,190 @@
|
||||
; =============================================================================
|
||||
; Script A for Blanton Diag
|
||||
; Version : V1.0.0
|
||||
; Date : 2026-08-18
|
||||
; Author : ETWen
|
||||
; =============================================================================
|
||||
; Version History:
|
||||
; V1.0.0 2026-08-18 Initial Version
|
||||
;
|
||||
; =============================================================================
|
||||
include "config.ttl"
|
||||
|
||||
flushrecv
|
||||
;================================================================
|
||||
; Log File Creation
|
||||
;================================================================
|
||||
gettime str_starttime "%Y%m%d-%H%M%S"
|
||||
getdir mdir
|
||||
|
||||
if EN_log = 1 then
|
||||
sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name strTestcase str_starttime
|
||||
logopen filename 0 1 1 1
|
||||
endif
|
||||
|
||||
; Version
|
||||
wait prompt_diag
|
||||
sendln "version"
|
||||
|
||||
wait prompt_diag
|
||||
sendln "acc_misc_version bios"
|
||||
|
||||
wait prompt_diag
|
||||
sendln "acc_pld util cb 0 0x0"
|
||||
|
||||
wait prompt_diag
|
||||
sendln "acc_misc_version i210"
|
||||
|
||||
wait prompt_diag
|
||||
sendln "acc_misc_version mac"
|
||||
|
||||
wait prompt_diag
|
||||
sendln "acc_pwr_mon show d2d"
|
||||
|
||||
wait prompt_diag
|
||||
sendln "acc_bmc_board info"
|
||||
|
||||
|
||||
; Leak Status
|
||||
wait prompt_diag
|
||||
sendln "acc_misc_liquid info"
|
||||
|
||||
; Read EEPROM
|
||||
wait prompt_diag
|
||||
sendln "onie-syseeprom -t cpu"
|
||||
|
||||
; Check I2C
|
||||
wait prompt_diag
|
||||
sendln "acc_iai_i2c device"
|
||||
|
||||
; Check PCie
|
||||
wait prompt_diag
|
||||
sendln "acc_iai_pcie device"
|
||||
|
||||
; DDR Info
|
||||
wait prompt_diag
|
||||
sendln "acc_dram_cpu info"
|
||||
|
||||
; DDR R/W Test
|
||||
wait prompt_diag
|
||||
sendln "acc_dram_cpu rw"
|
||||
|
||||
; DDR Check ECC
|
||||
wait prompt_diag
|
||||
sendln "acc_dram_cpu chkecc"
|
||||
|
||||
; BMC I2C Test
|
||||
wait prompt_diag
|
||||
sendln "acc_bmc_iai i2c_device"
|
||||
|
||||
; BMC module check usb network interface
|
||||
wait prompt_diag
|
||||
sendln "acc_bmc_net usb_ping"
|
||||
|
||||
; BMC SPI Flash Read/Write Test
|
||||
wait prompt_diag
|
||||
sendln "acc_bmc_fs spi_test"
|
||||
|
||||
; BMC SO-DIMM Read/Write Test
|
||||
wait prompt_diag
|
||||
sendln "acc_bmc_dram rw"
|
||||
|
||||
; BMC EEPROM test
|
||||
wait prompt_diag
|
||||
sendln "acc_bmc_e2p bmc_r"
|
||||
|
||||
; SSD Test
|
||||
wait prompt_diag
|
||||
sendln "acc_fs_ssd info"
|
||||
wait prompt_diag
|
||||
sendln "acc_fs_ssd rw"
|
||||
wait prompt_diag
|
||||
sendln "acc_fs_ssd selftest short"
|
||||
|
||||
; TPM Test
|
||||
wait prompt_diag
|
||||
sendln "acc_scy_tpm"
|
||||
|
||||
; USB test
|
||||
wait prompt_diag
|
||||
sendln "acc_fs_usb rw"
|
||||
|
||||
; MGMT Traffic test
|
||||
wait prompt_diag
|
||||
sendln "acc_net_cpu traffic mgmtp"
|
||||
|
||||
; Thermal
|
||||
wait prompt_diag
|
||||
sendln "acc_temp_thermal ddr"
|
||||
wait prompt_diag
|
||||
sendln "acc_temp_thermal cpu"
|
||||
wait prompt_diag
|
||||
sendln "acc_temp_thermal sensor"
|
||||
|
||||
; FAN
|
||||
wait prompt_diag
|
||||
sendln "acc_cool_fan speed 30"
|
||||
|
||||
; RTC
|
||||
wait prompt_diag
|
||||
sendln "acc_time_rtc test"
|
||||
|
||||
; NFC
|
||||
wait prompt_diag
|
||||
sendln "acc_scy_nfc test"
|
||||
|
||||
; 100G Port
|
||||
wait prompt_diag
|
||||
sendln "100init.sh"
|
||||
wait prompt_diag
|
||||
sendln "acc_net_mac 100G"
|
||||
|
||||
; Port status
|
||||
wait prompt_diag
|
||||
sendln "swutil *:ps cd"
|
||||
wait prompt_diag
|
||||
sendln "swutil *:port cd en=0"
|
||||
wait prompt_diag
|
||||
sendln "swutil *:port cd en=1"
|
||||
wait prompt_diag
|
||||
pause 60
|
||||
sendln "swutil *:ps cd"
|
||||
|
||||
; BER Test
|
||||
wait prompt_diag
|
||||
sendln "acc_net_mac ber -m berproj -p all"
|
||||
|
||||
; FEC Test
|
||||
wait prompt_diag
|
||||
sendln "acc_net_mac fec -p all"
|
||||
|
||||
; FDR Test
|
||||
wait prompt_diag
|
||||
sendln "acc_net_mac fdr -m fdr -u all"
|
||||
|
||||
; Tomahawk6 Test
|
||||
wait prompt_diag
|
||||
sendln "sed -i 's/AUTO: 0/AUTO: 1/g' /usr/local/bin/config.yml"
|
||||
wait prompt_diag
|
||||
sendln "mv /usr/local/bin/extphy_init_LT.soc /usr/local/bin/extphy_init_LT.temp"
|
||||
wait prompt_diag
|
||||
sendln "swutil -C -r"
|
||||
wait prompt_diag
|
||||
sendln "sleep 1"
|
||||
wait prompt_diag
|
||||
sendln "swutil dsh -c 'tr 39'"
|
||||
wait prompt_diag
|
||||
sendln "swutil 1:dsh -c 'tr 39'"
|
||||
wait prompt_diag
|
||||
sendln "swutil dsh -c 'tr 55'"
|
||||
|
||||
|
||||
; LED Test
|
||||
; acc_led_sys all off
|
||||
; acc_led_sys all amber
|
||||
|
||||
; acc_led_mgmtport all off
|
||||
; acc_led_mgmtport all aa
|
||||
; acc_led_mgmtport all aba
|
||||
; acc_led_mgmtport all all-green
|
||||
; acc_led_mgmtport all all-blink-green
|
||||
@@ -0,0 +1,41 @@
|
||||
; =============================================================================
|
||||
; Script B for Blanton Diag
|
||||
; =============================================================================
|
||||
include "config.ttl"
|
||||
|
||||
flushrecv
|
||||
logwrite ''#13#10
|
||||
logwrite '#####################################'#13#10
|
||||
logwrite 'ScriptB START'#13#10
|
||||
logwrite '#####################################'#13#10
|
||||
pause 1
|
||||
|
||||
; ========== CLEAR EVENT ==========
|
||||
;wait prompt_sonic_root
|
||||
;sendln "command"
|
||||
|
||||
; ========== AMD CPU STRESS TEST ==========
|
||||
|
||||
|
||||
; ========== DDR MEMORY STRESS TEST ==========
|
||||
|
||||
|
||||
; ========== SSD read/write ==========
|
||||
|
||||
; ========== USB read/write ==========
|
||||
|
||||
; ========== SHOW Background job ==========
|
||||
|
||||
; ========== Take one round of eye measurement on uplink ports ==========
|
||||
|
||||
; ========== Traffic START ==========
|
||||
|
||||
|
||||
|
||||
; ========== Get data every 10mins ==========
|
||||
while 1
|
||||
; ========== Check Margin ==========
|
||||
if EN_Margin = 1 then
|
||||
include "utils/show_margin_status.ttl"
|
||||
endif
|
||||
endwhile
|
||||
@@ -0,0 +1,28 @@
|
||||
; =============================================================================
|
||||
; Script C for Blanton Diag
|
||||
; =============================================================================
|
||||
include "config.ttl"
|
||||
|
||||
flushrecv
|
||||
logwrite ''#13#10
|
||||
logwrite '#####################################'#13#10
|
||||
logwrite 'ScriptC START'#13#10
|
||||
logwrite '#####################################'#13#10
|
||||
pause 1
|
||||
|
||||
; ========== Kill Process ==========
|
||||
|
||||
; ========== TAKE DATA ==========
|
||||
|
||||
|
||||
; ========== Check PCIE error counters ==========
|
||||
|
||||
|
||||
; ========== CHECK Stress results ==========
|
||||
|
||||
|
||||
; ========== CHECK Traffic counters ==========
|
||||
|
||||
|
||||
|
||||
messagebox 'GOOD JOB! Test Case DONE' 'teraterm'
|
||||
@@ -0,0 +1,13 @@
|
||||
;================================================================
|
||||
; User Configuration
|
||||
;================================================================
|
||||
strTestcase="Margin"
|
||||
project_name = "Blanton"
|
||||
|
||||
EN_Margin = 1 ; 1: Enable Margin Test, 0: Disable Margin Test
|
||||
|
||||
EN_log = 1 ; 1: Enable log, 0: Disable log
|
||||
;================================================================
|
||||
; Prompt Definitions
|
||||
;================================================================
|
||||
prompt_diag = "root@(none):~#"
|
||||
Reference in New Issue
Block a user