Compare commits
10
Commits
V1.1.6
...
b84188322d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b84188322d | ||
|
|
b4148c9571 | ||
|
|
eacb218da8 | ||
|
|
4648f936c7 | ||
|
|
9cdd651d79 | ||
|
|
4f2f9ed090 | ||
|
|
1a06367ade | ||
|
|
1fbdcc23d6 | ||
|
|
0d2faef565 | ||
|
|
a9c56ee1d4 |
@@ -28,3 +28,9 @@ publish/*
|
|||||||
# 客戶板 schematic 原始檔(機密,勿入 repo)
|
# 客戶板 schematic 原始檔(機密,勿入 repo)
|
||||||
*.DSN
|
*.DSN
|
||||||
*.dsn
|
*.dsn
|
||||||
|
|
||||||
|
# 尚未上機驗證的腳本暫存區(不入 repo,測過再搬進 src/)
|
||||||
|
tmp/
|
||||||
|
|
||||||
|
# mlucas 的 ELF binary(~99 MB),DUT image 已內含,不入 repo
|
||||||
|
src/Script_ABC_Blanton/hammer/
|
||||||
|
|||||||
+66
-14
@@ -112,7 +112,7 @@ Blanton_TTL_Script/
|
|||||||
│
|
│
|
||||||
├── CLAUDE.md # 專案記憶 & 給 Claude 的指令
|
├── CLAUDE.md # 專案記憶 & 給 Claude 的指令
|
||||||
├── ARCHITECTURE.md # 本架構文件
|
├── ARCHITECTURE.md # 本架構文件
|
||||||
├── .gitignore # secret/ + For_AI/ + logs + publish 產出
|
├── .gitignore # secret/ + For_AI/ + tmp/ + hammer/ + logs + publish 產出
|
||||||
├── .gitattributes # 換行符政策:.sh/.conf 釘 LF、.ttl 保持 CRLF
|
├── .gitattributes # 換行符政策:.sh/.conf 釘 LF、.ttl 保持 CRLF
|
||||||
│
|
│
|
||||||
├── docs/ # 規格與狀態文件(客戶提供 / 專案產出)
|
├── docs/ # 規格與狀態文件(客戶提供 / 專案產出)
|
||||||
@@ -153,11 +153,18 @@ Blanton_TTL_Script/
|
|||||||
│ ├── publish.sh # ✅ committed — 打包工具(版號讀 Script A 檔頭)
|
│ ├── publish.sh # ✅ committed — 打包工具(版號讀 Script A 檔頭)
|
||||||
│ └── Script_ABC_Blanton_<Ver>/ # 🚫 產出,gitignored(-z 另出同名 .zip)
|
│ └── Script_ABC_Blanton_<Ver>/ # 🚫 產出,gitignored(-z 另出同名 .zip)
|
||||||
│
|
│
|
||||||
|
├── tmp/ # 🚫 gitignored — 尚未上機驗證的腳本暫存區
|
||||||
|
│ └── blanton_reboottest.sh # 5_..._Reboot_Cycle.ttl 的 bash 版,測過再搬進 Blanton_Script/
|
||||||
|
│
|
||||||
└── src/
|
└── src/
|
||||||
└── Script_ABC_Blanton/ # ← Tera Term 的工作目錄(整包給測試員)
|
└── Script_ABC_Blanton/ # ← Tera Term 的工作目錄(整包給測試員)
|
||||||
│
|
│
|
||||||
├── 4_Blanton_Script_thermal_safety.ttl # 熱 / 安規:獨立跑,不接 A→B→C
|
├── 4_Blanton_Script_thermal_safety.ttl # 熱 / 安規:獨立跑,不接 A→B→C
|
||||||
├── config.ttl # 全域設定:testcase 名、EN_Margin / EN_log、三個 prompt 字串
|
├── 5_Blanton_Script_Reboot_Cycle.ttl # 重開機循環:獨立跑,while 1 無止境(未上機驗證)
|
||||||
|
├── config.ttl # 全域設定:testcase 名、EN_Margin / EN_log / EN_timestamp、
|
||||||
|
│ # 風扇與 SWB 宣告、SSD/USB/BMC_USB 壓力秒數、三個 prompt 字串
|
||||||
|
├── hammer/ # 🚫 gitignored — mlucas ELF binary(~99 MB),DUT image 自帶,
|
||||||
|
│ # publish.sh 也排除;Script B / Script 4 只負責 chmod +x 後執行
|
||||||
├── 1_Blanton_Script_A.ttl # Pre-test:登入 → 對時 → source 工具 → 清 AER → 抓基線
|
├── 1_Blanton_Script_A.ttl # Pre-test:登入 → 對時 → source 工具 → 清 AER → 抓基線
|
||||||
├── 2_Blanton_Script_B.ttl # Stress:開壓力程序 → while 1 每輪抓 fan/temp/margin
|
├── 2_Blanton_Script_B.ttl # Stress:開壓力程序 → while 1 每輪抓 fan/temp/margin
|
||||||
├── 3_Blanton_Script_C.ttl # Post-test:kill → 再抓一次 → 比對 stress log
|
├── 3_Blanton_Script_C.ttl # Post-test:kill → 再抓一次 → 比對 stress log
|
||||||
@@ -363,10 +370,11 @@ PROFILE_CHANNELS=( "0:high:8" "1:low:8" ... ) # "channel:operation:change_perc
|
|||||||
|
|
||||||
| 模組 | 進入點 | 功能 |
|
| 模組 | 進入點 | 功能 |
|
||||||
|------|--------|------|
|
|------|--------|------|
|
||||||
| **Script A(Pre-test)** | `1_Blanton_Script_A.ttl` V1.1.6 | root 登入 → `date -s` 對時 → 清 job log → **收掉前一輪殘留**(`hw-test-session finish` → `bgctl reset --yes` → `bgctl stop --all` → `bgctl list` 確認清空)→ `hw-test-session start` → **設定風扇轉速** → **等資料面就緒**(`wait_init.ttl`)→ DUT 清單(boot/version/fwutil/syseeprom/ssdhealth/TPM/NVMe)→ BMC enroll + version/status → source bash 工具 → 清/讀 7 組 PCIe AER + `ras-mc-ctl --summary` → `lspci` → margin → PMON → dmesg → **10G/1G 管理網路 ping** → **NFC 基線**(start → 30s → stop → report)→ 100G uplink 設定與狀態 → **一輪流量基線** → `show uptime` |
|
| **Script A(Pre-test)** | `1_Blanton_Script_A.ttl` V1.1.8 | root 登入 → `date -s` 對時 → 清 job log → **收掉前一輪殘留**(`hw-test-session finish` → `bgctl reset --yes` → `bgctl stop --all` → `bgctl list` 確認清空)→ `hw-test-session start` → **設定風扇轉速** → **等資料面就緒**(`wait_init.ttl`)→ DUT 清單(boot/version/fwutil/syseeprom/ssdhealth/TPM/NVMe)→ BMC enroll + version/status → source bash 工具 → 清/讀 7 組 PCIe AER + `ras-mc-ctl --summary` → `lspci` → margin → PMON → dmesg → **10G/1G 管理網路 ping** → **NFC 基線**(start → 30s → stop → report)→ 100G uplink 設定與狀態 → **一輪流量基線** → `show uptime` |
|
||||||
| **Script B(Stress)** | `2_Blanton_Script_B.ttl` | `mlucas-avx2 -cpu 0:15` + `bgctl run` 的 `memtester` / SSD / USB 壓力(v1.1.5 起 SSD/USB `--runtime 86400`、BMC memtester 不帶次數 = 跑到被停) + BMC DDR(`bmc-manager run memtester`)→ BMC USB net test(探測 cdc_ncm 介面,`systemd-run` 掛 4 小時 ping)→ 啟動 mgmt ping 監控 → **啟動 NFC 輪詢** → `jobs` / `bgctl list` → traffic(依 `SWB_UNIT`)→ `while 1` 每輪 PMON + `bgctl list`/`jobs` + `pause 60`(**V1.1.4 起 margin 不在迴圈內**)|
|
| **Script B(Stress)** | `2_Blanton_Script_B.ttl` | **V1.1.8 起 `mlucas-avx2 -cpu 0:15` 由 `systemd-run --unit=mlucas-amm`(`Type=exec`、`Restart=always`)啟動,不再是 shell 的 `&` 背景 job** + `bgctl run` 的 `memtester` / SSD / USB 壓力(v1.1.7 起 SSD/USB 的 `--runtime`/`--passes` 讀 `config.ttl` 的 `SSD_RUNTIME`/`SSD_COUNT`、`USB_RUNTIME`/`USB_COUNT`;BMC memtester 不帶次數 = 跑到被停) + BMC DDR(`bmc-manager run memtester`)→ BMC USB net test(探測 cdc_ncm 介面,`systemd-run` 掛 `BMC_USB_RUNTIME` 秒的 ping,V1.1.8 前寫死 4 小時)→ 啟動 mgmt ping 監控 → **啟動 NFC 輪詢** → `jobs` / `systemctl is-active mlucas-amm` / `bgctl list` → traffic(依 `SWB_UNIT`)→ `while 1` 每輪 PMON + `bgctl list`/`jobs`/`systemctl is-active mlucas-amm` + `pause 60`(**V1.1.4 起 margin 不在迴圈內**)|
|
||||||
| **Script C(Post-test)** | `3_Blanton_Script_C.ttl` | `kill $(jobs -p)` + `bgctl stop --all` / `reset` + 停 BMC USB unit、mgmt ping 與 **NFC 輪詢** → PMON + dmesg → 7 組 AER + `ras-mc-ctl` → BMC USB `journalctl` **寫進 `log/bmc_usb_net.log`**(不再印在 console) → `ip -s link show eth0/eth1` → `cat` mlucas log → **NFC `report`** → traffic `stop` + `report` → **BER 掃描**(依 `SWB_UNIT`)→ NVMe 健康 → `show reboot-cause` → **margin 掃描**(`EN_Margin`,V1.1.4 由 Script B 移來)→ `uptime` → **job log 複製到 USB(帶時戳)** → `exit` + wait『Script done』→ `hw-test-session finish` |
|
| **Script C(Post-test)** | `3_Blanton_Script_C.ttl` | `kill $(jobs -p)` + **`systemctl stop mlucas-amm`**(systemd unit 不是 shell job,`jobs -p` 抓不到)+ `bgctl stop --all` / `reset` + 停 BMC USB unit、mgmt ping 與 **NFC 輪詢** → PMON + dmesg → 7 組 AER + `ras-mc-ctl` → BMC USB `journalctl` **寫進 `log/bmc_usb_net.log`**(不再印在 console) → `ip -s link show eth0/eth1` → `cat` mlucas log(並 `cp` 進 job 目錄一起帶走)→ **NFC `report`** → traffic `stop` + `report` → **BER 掃描**(依 `SWB_UNIT`)→ NVMe 健康 → `show reboot-cause` → **margin 掃描**(`EN_Margin`,V1.1.4 由 Script B 移來)→ `uptime` → **job log 複製到 USB(帶時戳)** → `exit` + wait『Script done』→ `hw-test-session finish` |
|
||||||
| **Script 4(Thermal / Safety)** | `4_Blanton_Script_thermal_safety.ttl` | **獨立腳本,不接 A→B→C。** Script A 式的環境建立(登入 / session / 風扇 / `wait_init` / DUT 清單 / BMC / PCIe 清除 / `pcie_bus` / PMON / dmesg)→ **滿載**(`mlucas-avx2 -cpu 0:15` 背景 + `blanton_tr518.sh start`)→ `while 1`:PMON + `TH6_SWB0/1_power_readback.sh` + `bgctl list` / `jobs`,`pause 60`。**沒有收尾段** —— 中斷後 DUT 仍在 `port cd lb=mac` / `l2 learn off` / `test mode nr=yes`,要手動 `blanton_tr518.sh stop` |
|
| **Script 4(Thermal / Safety)** | `4_Blanton_Script_thermal_safety.ttl` | **獨立腳本,不接 A→B→C。** Script A 式的環境建立(登入 / session / 風扇 / `wait_init` / DUT 清單 / BMC / PCIe 清除 / `pcie_bus` / PMON / dmesg)→ **滿載**(`mlucas-avx2 -cpu 0:15`,V1.1.8 起與 Script B 同樣掛成 `mlucas-amm` systemd unit + `blanton_tr518.sh start`)→ `while 1`:PMON + `TH6_SWB0/1_power_readback.sh` + `bgctl list` / `jobs` / `systemctl is-active mlucas-amm`,`pause 60`。**沒有收尾段** —— 中斷後 DUT 仍在 `port cd lb=mac` / `l2 learn off` / `test mode nr=yes`,且 CPU 仍滿載,要手動 `blanton_tr518.sh stop` + `systemctl stop mlucas-amm` |
|
||||||
|
| **Script 5(Reboot Cycle)** | `5_Blanton_Script_Reboot_Cycle.ttl` | **獨立腳本,不接 A→B→C。** `while 1`:登入 → `sudo -i` → 對時 → 風扇 → **Check Pt1~Pt13**(DUT/BMC info、mgmt ping、NFC、SSD、USB、BMC USB、port status + 15s traffic、BER、NVMe、platform data、dmesg i2c、PCIe error counters)→ `show uptime` → `reboot` → `wait "Booting in blind mode"`。`cnt_cycle` 每輪 +1 印在標頭。**沒有結束條件** —— 要停就關掉 Tera Term 的 macro。**尚未上機驗證** |
|
||||||
| **SWB loopback 流量** | `blanton_traffic_linespeed <sub> [-u 0\|1\|all]` | `init`(VLAN 30..137,成對 `cdN`/`cdN+32`)→ `clear` → `start`(`tx 200 length=324 PatternRandom=yes`,v0.7.0 起)→ `stop` → `report`(per-pair TX/RX 交叉比對 PASS/FAIL);另有 `ps`(link/speed)與 `run`(一條龍)。**V0.6.0 起含 100G uplink `ce0`**(VLAN 138):它沒有 loopback 對象,靠 **ingress mirror 打回自己**維持循環,`report` 最後一列就是它,底下再接一份跨 unit summary |
|
| **SWB loopback 流量** | `blanton_traffic_linespeed <sub> [-u 0\|1\|all]` | `init`(VLAN 30..137,成對 `cdN`/`cdN+32`)→ `clear` → `start`(`tx 200 length=324 PatternRandom=yes`,v0.7.0 起)→ `stop` → `report`(per-pair TX/RX 交叉比對 PASS/FAIL);另有 `ps`(link/speed)與 `run`(一條龍)。**V0.6.0 起含 100G uplink `ce0`**(VLAN 138):它沒有 loopback 對象,靠 **ingress mirror 打回自己**維持循環,`report` 最後一列就是它,底下再接一份跨 unit summary |
|
||||||
| **FPGA 暫存器存取** | `cb_fpga <fn> <addr> [data]`、`fpga_rescan` | pcimem 打 `resource0` + BAR 相對 offset,32-bit word;BDF 於 source 時自動偵測;`pmc/icb/swb0/swb1_fpga` 走 VSPI 窗口 |
|
| **FPGA 暫存器存取** | `cb_fpga <fn> <addr> [data]`、`fpga_rescan` | pcimem 打 `resource0` + BAR 相對 offset,32-bit word;BDF 於 source 時自動偵測;`pmc/icb/swb0/swb1_fpga` 走 VSPI 窗口 |
|
||||||
| **CB I2C / PMBus** | `cb_i2c_init/scan/read/write`、`cb_pmbus_read/write/linear16` | FPGA F3 OpenCores master,**讀用 Repeated START**(SMBus/PMBus 裝置必需) |
|
| **CB I2C / PMBus** | `cb_i2c_init/scan/read/write`、`cb_pmbus_read/write/linear16` | FPGA F3 OpenCores master,**讀用 Repeated START**(SMBus/PMBus 裝置必需) |
|
||||||
@@ -474,6 +482,8 @@ pwr_data
|
|||||||
|
|
||||||
1. **A → B → C 必須依序跑,且 B 之後才能跑 C。** Script B 的背景 job 只存在於那個 shell session,
|
1. **A → B → C 必須依序跑,且 B 之後才能跑 C。** Script B 的背景 job 只存在於那個 shell session,
|
||||||
Script C 的 `kill $(jobs -p)` 依賴同一個 session;中途斷線就得手動收程序。
|
Script C 的 `kill $(jobs -p)` 依賴同一個 session;中途斷線就得手動收程序。
|
||||||
|
V1.1.8 起 `mlucas-amm` 例外 —— 它是 systemd transient unit,**跨 session 存活**,
|
||||||
|
所以 Script C 必須另外 `systemctl stop mlucas-amm`(見第 17 條)。
|
||||||
2. **A / B / C 共用同一個 log 檔**:只有 Script A `logopen`,B / C 用 `logwrite` 續寫分隔線。
|
2. **A / B / C 共用同一個 log 檔**:只有 Script A `logopen`,B / C 用 `logwrite` 續寫分隔線。
|
||||||
跑 B/C 前若關掉了 Tera Term,log 就斷了。
|
跑 B/C 前若關掉了 Tera Term,log 就斷了。
|
||||||
3. **PCIe AER 的判定是「差值」不是「絕對值」**:Script A 抓基線、Script C 抓結果,
|
3. **PCIe AER 的判定是「差值」不是「絕對值」**:Script A 抓基線、Script C 抓結果,
|
||||||
@@ -516,8 +526,13 @@ pwr_data
|
|||||||
`Permission denied`、Script C 的 `cat` 撲空(BMC 段全空但不會報錯)。
|
`Permission denied`、Script C 的 `cat` 撲空(BMC 段全空但不會報錯)。
|
||||||
14. **TTL 的 `timeout` 是全域的,設了就要還原**:`timeout = N` 之後**每一個** `wait` 都被限制在 N 秒,
|
14. **TTL 的 `timeout` 是全域的,設了就要還原**:`timeout = N` 之後**每一個** `wait` 都被限制在 N 秒,
|
||||||
逾時的 `wait` 會直接返回而沒吃到 prompt,於是下一個指令在前一個還沒跑完就送出,之後整輪錯開一拍。
|
逾時的 `wait` 會直接返回而沒吃到 prompt,於是下一個指令在前一個還沒跑完就送出,之後整輪錯開一拍。
|
||||||
`wait_init.ttl` 設 60 後還原 0;Script B 的 cdc_ncm 探測設 15,在 `:skip_ping`(兩條路徑的匯流點)還原。
|
`wait_init.ttl` 設 60 後還原 0;Script B 的 cdc_ncm 探測設 15,成功路徑在 `endif` 之後還原、
|
||||||
加新的 `timeout` 時務必配一個 `timeout = 0`。
|
跳過路徑在 `:skip_ping` 還原(兩處各一次)。
|
||||||
|
Script 5 抄了同一段,但它的 ping 區塊要 `wait` 一個 `sleep 10` —— DUT 一忙就逼近 15 s 上限,
|
||||||
|
所以**還原點提前到 `if` 之前**:分支之前還原,一行就涵蓋兩條路徑,`:skip_ping` 的那行留作備援。
|
||||||
|
加新的 `timeout` 時務必配一個 `timeout = 0`;**抄有 `goto` 的段落時連 `:label` 一起抄** ——
|
||||||
|
標籤沒定義 Tera Term 不會在載入時報錯,要真的跳進那條分支才會彈錯誤視窗停住整輪
|
||||||
|
(Script 5 原本就漏了 `:skip_ping`,只有抓不到 NCM 介面時才會發作,已補)。
|
||||||
15. **兩張管理網卡同網段時會 ARP flux**:`mgmt_ping_monitor.sh` 讓 eth0/eth1 同時 up,若兩者在同一個
|
15. **兩張管理網卡同網段時會 ARP flux**:`mgmt_ping_monitor.sh` 讓 eth0/eth1 同時 up,若兩者在同一個
|
||||||
/24(本專案預設 `192.168.1.99` / `.101`),對端 ARP 可能由任一張卡回應,回包落在沒送封包的那張,
|
/24(本專案預設 `192.168.1.99` / `.101`),對端 ARP 可能由任一張卡回應,回包落在沒送封包的那張,
|
||||||
量到的數字不能歸屬。`ARP_STRICT=1` 會設 `arp_ignore=1` / `arp_announce=2` 擋掉;
|
量到的數字不能歸屬。`ARP_STRICT=1` 會設 `arp_ignore=1` / `arp_announce=2` 擋掉;
|
||||||
@@ -525,6 +540,20 @@ pwr_data
|
|||||||
**ping 成功但 `nic_tx` 接近 0 就代表封包從另一張卡出去了**。兩張卡在不同網段時可設 0。
|
**ping 成功但 `nic_tx` 接近 0 就代表封包從另一張卡出去了**。兩張卡在不同網段時可設 0。
|
||||||
16. **客戶 NDA**:`docs/` 內含客戶 FPGA 規格與 schematic 衍生資訊,**本 repo 只推 NAS + Gitea,
|
16. **客戶 NDA**:`docs/` 內含客戶 FPGA 規格與 schematic 衍生資訊,**本 repo 只推 NAS + Gitea,
|
||||||
絕不推 GitHub**。
|
絕不推 GitHub**。
|
||||||
|
17. **改用 `systemd-run` 起壓力工作,就要自己補停的那一行。** `utils/kill_all_process.ttl` 的內容
|
||||||
|
只有 `kill $(jobs -p)`,而 systemd unit 不是 shell job,它抓不到。V1.1.8 把 `mlucas-avx2`
|
||||||
|
搬到 `mlucas-amm` unit(好處:掉線不會停、`jobs` 看不見的問題消失、`Restart=always` 會自動拉回),
|
||||||
|
代價是 Script C 少了那行 `systemctl stop` 就會讓 CPU 滿載燒進收工量測與下一輪測試 ——
|
||||||
|
而 `show interfaces status` 之類的檢查完全看不出來。目前 `mlucas-amm` 與
|
||||||
|
`qfx5252-bmc-usb-net-test` 兩個 unit 都已在 Script C 收掉。
|
||||||
|
⚠️ **`4_Blanton_Script_thermal_safety.ttl` 用同一個 `mlucas-amm` unit,但它沒有收尾段**,
|
||||||
|
所以那行 `systemctl stop mlucas-amm` 必須由測試員手動下 —— 這是 Script 4 目前
|
||||||
|
唯一一個「不下就會延續到下一輪」的負載。
|
||||||
|
18. **`config.ttl` 少一個變數會讓 macro 當場中止**,不是當成 0。V1.1.8 新增 `EN_timestamp`
|
||||||
|
(Script A `logopen` 的第 5 個參數)與 `BMC_USB_RUNTIME`(Script B 的 ping unit)。
|
||||||
|
只更新 `.ttl` 卻沿用舊的 `config.ttl`,Script A 會停在 `logopen` 那一行。
|
||||||
|
另外 **時間戳的「格式」不在 macro 裡** —— 它在 Tera Term 的
|
||||||
|
Setup → Additional settings → Log,存在那台電腦的 `TERATERM.INI`,會跟著 PC 而不是跟著腳本走。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -758,7 +787,7 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,
|
|||||||
- [ ] `CHANGELOG.md`:延續三支腳本頂端的 Version History,集中成一份
|
- [ ] `CHANGELOG.md`:延續三支腳本頂端的 Version History,集中成一份
|
||||||
- [ ] 三支腳本的 header 版號與 `CHANGELOG.md` 對齊,`config.ttl` 加 `script_version` 並寫進 log 開頭
|
- [ ] 三支腳本的 header 版號與 `CHANGELOG.md` 對齊,`config.ttl` 加 `script_version` 並寫進 log 開頭
|
||||||
- [ ] `docs/TTL_Script_Blanton_Status_*.xlsx` 更新為全 OK,或把剩餘項目移進 Future Extensions
|
- [ ] `docs/TTL_Script_Blanton_Status_*.xlsx` 更新為全 OK,或把剩餘項目移進 Future Extensions
|
||||||
- [ ] 打 git tag `v1.1.0`,push `nas` + `gitea`
|
- [x] 打 git tag,push `nas` + `gitea`(已至 `V1.1.8`;`publish/` 依 Script A 檔頭版號打包)
|
||||||
|
|
||||||
**驗收條件:** 從 zip 解壓到一台乾淨的測試 NB,照 README 操作,不看原始碼就能完成一輪 A→B→C
|
**驗收條件:** 從 zip 解壓到一台乾淨的測試 NB,照 README 操作,不看原始碼就能完成一輪 A→B→C
|
||||||
並產出 summary;`publish/` 內容與 git tag 一致。
|
並產出 summary;`publish/` 內容與 git tag 一致。
|
||||||
@@ -800,6 +829,23 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,
|
|||||||
複製到 USB。要確認 `bgctl` 的產出結構,必要時改成 `rm -rf .../jobs/*`。
|
複製到 USB。要確認 `bgctl` 的產出結構,必要時改成 `rm -rf .../jobs/*`。
|
||||||
- **100G PRBS 尚未接進 A/B/C**:`port_prbs_monitor.sh` 已隨包交付、可手動執行,但三支腳本裡的呼叫
|
- **100G PRBS 尚未接進 A/B/C**:`port_prbs_monitor.sh` 已隨包交付、可手動執行,但三支腳本裡的呼叫
|
||||||
都還註解著(bring-up 中)。要啟用時記得 PRBS 期間 link 會顯示 down,`stop` 之後才會回來。
|
都還註解著(bring-up 中)。要啟用時記得 PRBS 期間 link 會顯示 down,`stop` 之後才會回來。
|
||||||
|
- **Script 5(Reboot Cycle)尚未上機驗證**:`5_Blanton_Script_Reboot_Cycle.ttl` 隨 V1.1.7 交付,
|
||||||
|
但還沒在真 DUT 上跑過一輪完整循環。兩個要現場確認的點:`wait "Booting in blind mode"` 是否
|
||||||
|
真的在每一版開機訊息裡出現(沒出現就會永遠等下去,而且沒有 `timeout` 保護);以及每輪重跑
|
||||||
|
`bmc-first-enroll` 是否安全。**沒有結束條件**,測夠了要自己關掉 macro。
|
||||||
|
- **`tmp/blanton_reboottest.sh`(bash 版重開循環)也未上機驗證**:不用 Tera Term、由 systemd 在
|
||||||
|
每次開機跑一輪並自動 `reboot`,登入下 `stop` 才停。整個 `tmp/` 是 gitignored,**不會進交付包** ——
|
||||||
|
驗證過再搬進 `Blanton_Script/`。未驗證的腳本混進 `Blanton_Script/` 之後,測試員分不出哪支能信。
|
||||||
|
- **交付包不含 `hammer/`,但 Script B 與 Script 4 都要用它**:V1.1.8 起 `hammer/` 是 gitignored
|
||||||
|
且被 `publish.sh` 排除(~99 MB 的 mlucas binary,進 git 就永久留在 history)。這是刻意的 ——
|
||||||
|
binary 由 DUT image 帶 —— 但代表**測試員解開交付包後 `~/hammer` 必須已經在 DUT 上**,
|
||||||
|
否則 Script B 會在 `chmod +x ~/hammer/tools/amd/mlucas-avx2` 那一行失敗,而且 macro 不會停,
|
||||||
|
接著的 `systemd-run` 只是起一個立刻失敗又被 `Restart=always` 反覆重拉的 unit。
|
||||||
|
上機前先 `ls ~/hammer/tools/amd/mlucas-avx2` 確認一次。
|
||||||
|
- **`mlucas-amm` 的 `~` 依賴 systemd 的環境**:unit 是
|
||||||
|
`/bin/bash -c '~/hammer/... >> ~/hammer/mlucas_amm_log'`,system service 沒有 `User=` 時 systemd
|
||||||
|
**不會設 `HOME`**,bash 才退回 passwd 的家目錄(root → `/root`)解出同一條路徑。目前會通,
|
||||||
|
但那是剛好對上而不是保證;改成絕對路徑 `/root/hammer/...` 就不用賭。**尚未上機驗證。**
|
||||||
- **Script C 的 USB 掛載走 `mount` 而非 `usb_target.sh -o mnt`**:目前是 `-o dev` 取節點再自己
|
- **Script C 的 USB 掛載走 `mount` 而非 `usb_target.sh -o mnt`**:目前是 `-o dev` 取節點再自己
|
||||||
`mount <dev> /mnt/usb`,繞過了工具內建的 `mkdir -p`、exfat/ntfs `modprobe` 與可寫性驗證。
|
`mount <dev> /mnt/usb`,繞過了工具內建的 `mkdir -p`、exfat/ntfs `modprobe` 與可寫性驗證。
|
||||||
掛載點不存在、檔案系統模組沒載、或媒體唯讀時只會失敗一行,job log 就沒帶出來。
|
掛載點不存在、檔案系統模組沒載、或媒體唯讀時只會失敗一行,job log 就沒帶出來。
|
||||||
@@ -812,9 +858,14 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,
|
|||||||
**`sleep 120` 的方向還沒驗證** —— 若 `tr 518` 的流量是有時限的(參數含 `runtime=1`、
|
**`sleep 120` 的方向還沒驗證** —— 若 `tr 518` 的流量是有時限的(參數含 `runtime=1`、
|
||||||
`CheckDataTime=200`),等 120 秒可能量到已經降下來的值,要上機比對 0s / 30s / 120s 三次;
|
`CheckDataTime=200`),等 120 秒可能量到已經降下來的值,要上機比對 0s / 30s / 120s 三次;
|
||||||
TTL 尚未呼叫它。
|
TTL 尚未呼叫它。
|
||||||
- **`--runtime 86400` 是 24 小時的上限,不是「永遠」**:超過一天的 soak,SSD 與 USB 壓力會在
|
- **`--runtime` 是整個 job 的總時限,不是每個 pass 的**:V1.1.7 起由 `config.ttl` 宣告
|
||||||
第 24 小時安靜結束,剩下的時間那兩項是閒置的。Script B 每輪都印 `bgctl list`,數量變少會看得到,
|
(`SSD_RUNTIME`/`SSD_COUNT`、`USB_RUNTIME`/`USB_COUNT`,COUNT 直接對應 `--passes`)。
|
||||||
但**沒有任何東西會主動報警**。真的要跑更久,得把數字改大或加一段重啟 job 的邏輯。
|
`qfx5252-stress-*` 跑滿 RUNTIME 秒就結束,**`--passes` 不會把它延長**,所以
|
||||||
|
`RUNTIME=600, COUNT=720` 是 10 分鐘的壓力而不是 120 小時。要跑滿一天就把 RUNTIME 填 `86400`。
|
||||||
|
**V1.1.8 起出貨預設是 `RUNTIME=3600`(1 小時)**,`BMC_USB_RUNTIME` 則是 `172800`(2 天)——
|
||||||
|
三個壓力源的長度目前刻意不一致,開跑前要照當次 soak 的時間各自對一次。
|
||||||
|
壓力提早結束時 Script B 每輪的 `bgctl list` 數量會變少,但**沒有任何東西會主動報警**;
|
||||||
|
要比 24 小時更久則得加一段重啟 job 的邏輯。
|
||||||
- **BMC USB 的 service log 只剩隨身碟一份**:Script C 把 `journalctl` 導進
|
- **BMC USB 的 service log 只剩隨身碟一份**:Script C 把 `journalctl` 導進
|
||||||
`log/bmc_usb_net.log` 再 `cp` 到 job 目錄,**不再印在 master console log**。
|
`log/bmc_usb_net.log` 再 `cp` 到 job 目錄,**不再印在 master console log**。
|
||||||
那個 `cp` 沒有檢查回傳值(`nfc_polling.log` 檔名打錯那次就是這樣安靜失敗的),
|
那個 `cp` 沒有檢查回傳值(`nfc_polling.log` 檔名打錯那次就是這樣安靜失敗的),
|
||||||
@@ -833,8 +884,9 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,
|
|||||||
LTC2980 PMBus)摸同一批軌,各自都假設自己是唯一的寫入者。目前只靠文件與 help 提醒,
|
LTC2980 PMBus)摸同一批軌,各自都假設自己是唯一的寫入者。目前只靠文件與 help 提醒,
|
||||||
沒有任何執行期檢查。
|
沒有任何執行期檢查。
|
||||||
- **Script 4 沒有收尾段**:`while 1` 之後就是檔案結尾,中斷時 DUT 停在 `port cd lb=mac` /
|
- **Script 4 沒有收尾段**:`while 1` 之後就是檔案結尾,中斷時 DUT 停在 `port cd lb=mac` /
|
||||||
`l2 learn off` / `test mode nr=yes`,而且 `mlucas-avx2` 還在背景跑。要手動
|
`l2 learn off` / `test mode nr=yes`,而且 CPU 壓力還在跑。要手動
|
||||||
`blanton_tr518.sh stop` + `kill`,否則下一輪任何測試都在被污染的狀態上開始
|
`blanton_tr518.sh stop` + `systemctl stop mlucas-amm`(V1.1.8 起它是 systemd unit,
|
||||||
|
關掉 Tera Term 或 `kill $(jobs -p)` 都收不掉),否則下一輪任何測試都在被污染的狀態上開始
|
||||||
(Script A 的 `bgctl reset/stop --all` 收得掉 job,但收不掉 bcm 的 loopback 設定)。
|
(Script A 的 `bgctl reset/stop --all` 收得掉 job,但收不掉 bcm 的 loopback 設定)。
|
||||||
可考慮加一支對應的收尾腳本,或在檔尾用 `messagebox` 提示要下哪些指令。
|
可考慮加一支對應的收尾腳本,或在檔尾用 `messagebox` 提示要下哪些指令。
|
||||||
- **margin 在 soak 期間不再取樣**(V1.1.4):只剩 Script A 的起始值與 Script C 的結束值。
|
- **margin 在 soak 期間不再取樣**(V1.1.4):只剩 Script A 的起始值與 Script C 的結束值。
|
||||||
|
|||||||
@@ -9,14 +9,17 @@ DUT 端的取數能力由一組 **bash 工具庫** 提供(CB FPGA `pcimem` →
|
|||||||
|
|
||||||
完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。
|
完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。
|
||||||
|
|
||||||
**目前狀態(2026-09-02)**:Script A 為 **V1.1.6**(A 集中記錄所有 TTL 的變更)。涵蓋
|
**目前狀態(2026-09-06)**:Script A 為 **V1.1.8**(A 集中記錄所有 TTL 的變更)。涵蓋
|
||||||
PCIe AER / DDR EDAC / PMON+TPM / 電壓 margin(9 顆 LTC2980)/ SWB loopback 線速流量 /
|
PCIe AER / DDR EDAC / PMON+TPM / 電壓 margin(9 顆 LTC2980)/ SWB loopback 線速流量 /
|
||||||
10G+1G 管理網路 ping / BMC DDR 與 USB / NVMe 健康,壓力層走平台的 `bgctl`。
|
10G+1G 管理網路 ping / BMC DDR 與 USB / NVMe 健康,壓力層走平台的 `bgctl`。
|
||||||
switch unit 數量由 `config.ttl` 的 `SWB_UNIT0` / `SWB_UNIT1` 宣告,風扇轉速由 `FAN_SPEED` 指定
|
switch unit 數量由 `config.ttl` 的 `SWB_UNIT0` / `SWB_UNIT1` 宣告,風扇轉速由 `FAN_SPEED` 指定
|
||||||
(預設 100 = 全速;soak 是熱測試,散熱不該是變因)。
|
(預設 100 = 全速;soak 是熱測試,散熱不該是變因)。
|
||||||
測試 job log 收在 DUT 的 `/host/hw-eval/jobs/`,Script C 結束時掛好 USB 再帶時戳複製到 `/mnt/usb/`。
|
測試 job log 收在 DUT 的 `/host/hw-eval/jobs/`,Script C 結束時掛好 USB 再帶時戳複製到 `/mnt/usb/`。
|
||||||
100G PRBS(`port_prbs_monitor.sh`)已隨包交付,但 **A/B/C 的呼叫仍註解掉**,還在 bring-up。
|
100G PRBS(`port_prbs_monitor.sh`)已隨包交付,但 **A/B/C 的呼叫仍註解掉**,還在 bring-up。
|
||||||
Script B 的 soak 迴圈每輪印 `bgctl list` + `jobs`,並 `pause 60`(V1.0.10 之前完全沒有 pause)。
|
Script B 的 soak 迴圈每輪印 `bgctl list` + `jobs` + `systemctl is-active mlucas-amm`,並 `pause 60`
|
||||||
|
(V1.0.10 之前完全沒有 pause)。V1.1.8 起 AMD CPU 壓力(`mlucas-avx2`)由 `systemd-run` 掛成
|
||||||
|
`mlucas-amm` transient unit(`Restart=always`),不再是 shell 的 `&` 背景 job —— 掉線也不會停,
|
||||||
|
Script C 用 `systemctl stop mlucas-amm` 收掉並把 log 複製到隨身碟。
|
||||||
V1.1.0 新增全機 SerDes BER 掃描(`blanton_ber.sh`,**Script C 已接**,依 `SWB_UNIT` 分支)、
|
V1.1.0 新增全機 SerDes BER 掃描(`blanton_ber.sh`,**Script C 已接**,依 `SWB_UNIT` 分支)、
|
||||||
TR518 負載(`blanton_tr518.sh`,**TTL 尚未接**)、SWB 軌功耗(`TH6_SWB{0,1}_power_readback.sh`),
|
TR518 負載(`blanton_tr518.sh`,**TTL 尚未接**)、SWB 軌功耗(`TH6_SWB{0,1}_power_readback.sh`),
|
||||||
線速流量也納入 100G `ce0`(VLAN 138,靠 ingress mirror 維持循環)。
|
線速流量也納入 100G `ce0`(VLAN 138,靠 ingress mirror 維持循環)。
|
||||||
@@ -25,6 +28,9 @@ Script A 開頭會先收掉前一輪殘留(`hw-test-session finish` + `bgctl r
|
|||||||
NFC tag 讀取由 `nfc_polling.sh` 背景輪詢(A 做基線、B 起、C 停並 report)。
|
NFC tag 讀取由 `nfc_polling.sh` 背景輪詢(A 做基線、B 起、C 停並 report)。
|
||||||
另有 **`4_Blanton_Script_thermal_safety.ttl`**(熱 / 安規,**獨立跑不接 A→B→C**,滿載後每分鐘
|
另有 **`4_Blanton_Script_thermal_safety.ttl`**(熱 / 安規,**獨立跑不接 A→B→C**,滿載後每分鐘
|
||||||
取 PMON + 兩片 SWB 的軌功耗;**沒有收尾段**,中斷後要手動 `blanton_tr518.sh stop`)。
|
取 PMON + 兩片 SWB 的軌功耗;**沒有收尾段**,中斷後要手動 `blanton_tr518.sh stop`)。
|
||||||
|
以及 **`5_Blanton_Script_Reboot_Cycle.ttl`**(重開機循環,**獨立跑不接 A→B→C**:登入 → 風扇 →
|
||||||
|
Check Pt1~Pt13 → `reboot` → `wait "Booting in blind mode"`,`cnt_cycle` 每輪遞增,`while 1` 無止境,
|
||||||
|
要停就關 Tera Term 的 macro)。**尚未上機驗證**。
|
||||||
流程圖:`docs/Blanton_Test_Flow.drawio`。
|
流程圖:`docs/Blanton_Test_Flow.drawio`。
|
||||||
最後一次發布是 **V1.1.5**;SWB 的 I2C 通道與位址已於 2026-08-19 上機驗證。
|
最後一次發布是 **V1.1.5**;SWB 的 I2C 通道與位址已於 2026-08-19 上機驗證。
|
||||||
margin 的 `VNOM` 已於 2026-08-30 改為 Blanton 實測中位數(144 條軌中 86 條上調 0.8~2.5%)。
|
margin 的 `VNOM` 已於 2026-08-30 改為 Blanton 實測中位數(144 條軌中 86 條上調 0.8~2.5%)。
|
||||||
@@ -248,8 +254,21 @@ Tera Term 連 COM port (115200-8-N-1)
|
|||||||
- ⚠️ **PMBus 的 PAGE 不是只有 VRM 通道在用**:ADPM12200 把每個量測放在不同 PAGE
|
- ⚠️ **PMBus 的 PAGE 不是只有 VRM 通道在用**:ADPM12200 把每個量測放在不同 PAGE
|
||||||
(Vin 9 / Iin 10 / Vout 2 / Iout 14 / Temp 18),沒寫 PAGE 就讀,回的是 `0xFFFF` 或
|
(Vin 9 / Iin 10 / Vout 2 / Iout 14 / Temp 18),沒寫 PAGE 就讀,回的是 `0xFFFF` 或
|
||||||
`0x0000`。`blanton_pwr_data.sh` 的 PDB 表 page 是 `-`,這就是它整張表 NA 的原因
|
`0x0000`。`blanton_pwr_data.sh` 的 PDB 表 page 是 `-`,這就是它整張表 NA 的原因
|
||||||
- ⚠️ **`--runtime 86400` 是 24 小時上限**:超過一天的 soak,SSD / USB 壓力會安靜結束,
|
- ⚠️ **`--runtime` 是整個 job 的總時限,不是每個 pass 的**:V1.1.7 起由 `config.ttl` 的
|
||||||
剩下的時間那兩項閒置。`bgctl list` 的數量變少是唯一的線索,**不會報警**
|
`SSD_RUNTIME`/`SSD_COUNT`、`USB_RUNTIME`/`USB_COUNT` 指定(COUNT 就是 `--passes`)。
|
||||||
|
`qfx5252-stress-*` 跑滿 RUNTIME 秒就停,**`--passes` 不會把它延長** —— `RUNTIME=600` 就是
|
||||||
|
10 分鐘,不是 600×COUNT。要 24 小時就填 `86400`。壓力提早結束時 `bgctl list` 數量變少是
|
||||||
|
唯一線索,**不會報警**。V1.1.8 起出貨預設改為 `RUNTIME=3600`(1 小時),2 天 soak 要填 `172800`
|
||||||
|
- ⚠️ **`utils/kill_all_process.ttl` 只有 `kill $(jobs -p)`,抓不到 systemd unit**:把壓力工作改成
|
||||||
|
`systemd-run` 之後,Script C 一定要補對應的 `systemctl stop <unit>`,否則它會活過 Script C 燒進
|
||||||
|
下一輪,**收工的溫度/功耗全部是在滿載下量的**。V1.1.8 已為 `mlucas-amm` 補上。
|
||||||
|
Script 4 也改用同一個 unit,但它**沒有收尾段**,所以那行 `systemctl stop` 得由人手動下
|
||||||
|
- ⚠️ **`config.ttl` 少一個變數會讓 macro 當場中止,不是當成 0**:`EN_timestamp`(V1.1.8 新增,
|
||||||
|
餵 Script A `logopen` 的第 5 個參數)、`BMC_USB_RUNTIME` 都是必要項。只更新 `.ttl` 卻沿用舊的
|
||||||
|
`config.ttl`,Script A 會停在 `logopen` 那一行
|
||||||
|
- ⚠️ **log 時間戳的「格式」不在腳本裡**:`EN_timestamp` 只決定開不開,格式在 Tera Term 的
|
||||||
|
Setup → Additional settings → Log,存在**那台電腦的 `TERATERM.INI`**。同一份 macro 在兩台機器上
|
||||||
|
可以產生不同格式的 log,跨機比對前先確認
|
||||||
- ⚠️ **多相 VRM 與 LTC2980 是同一批軌的兩條路**:`blanton_multiphase_margin.sh`(原生 i2c)
|
- ⚠️ **多相 VRM 與 LTC2980 是同一批軌的兩條路**:`blanton_multiphase_margin.sh`(原生 i2c)
|
||||||
和 `margin.sh`(LTC2980 PMBus)都假設自己是唯一寫入者,**沒有互斥檢查**,只靠人記得
|
和 `margin.sh`(LTC2980 PMBus)都假設自己是唯一寫入者,**沒有互斥檢查**,只靠人記得
|
||||||
- ⚠️ **traffic 的計數器基準在 v0.7.0 變了**:`tx 100 length=512` → `tx 200 length=324`,
|
- ⚠️ **traffic 的計數器基準在 v0.7.0 變了**:`tx 100 length=512` → `tx 200 length=324`,
|
||||||
@@ -257,7 +276,8 @@ Tera Term 連 COM port (115200-8-N-1)
|
|||||||
- ⚠️ **Script 4(thermal/safety)沒有收尾**:`while 1` 之後就是檔尾。中斷後 DUT 停在
|
- ⚠️ **Script 4(thermal/safety)沒有收尾**:`while 1` 之後就是檔尾。中斷後 DUT 停在
|
||||||
`port cd lb=mac` / `l2 learn off` / `test mode nr=yes`,`mlucas-avx2` 也還在背景。
|
`port cd lb=mac` / `l2 learn off` / `test mode nr=yes`,`mlucas-avx2` 也還在背景。
|
||||||
下一個測試會在被污染的狀態上開始,而且 **`show interfaces status` 看不出來**。
|
下一個測試會在被污染的狀態上開始,而且 **`show interfaces status` 看不出來**。
|
||||||
收尾:`blanton_tr518.sh stop` + `kill $(jobs -p)`
|
收尾:`blanton_tr518.sh stop` + `kill $(jobs -p)` + **`systemctl stop mlucas-amm`**
|
||||||
|
(V1.1.8 起 CPU 壓力是 systemd unit,`kill $(jobs -p)` 收不掉,少這一行 CPU 會一直滿載)
|
||||||
- ⚠️ **Script 4 與 Script B 不能共用同一台 DUT**:兩者都會接管 `port cd` 的 loopback
|
- ⚠️ **Script 4 與 Script B 不能共用同一台 DUT**:兩者都會接管 `port cd` 的 loopback
|
||||||
- ⚠️ **`settings/*.conf` 的 `VNOM` 是實測中位數,不是規格值**(2026-08-30 起)。它同時是
|
- ⚠️ **`settings/*.conf` 的 `VNOM` 是實測中位數,不是規格值**(2026-08-30 起)。它同時是
|
||||||
`margin_status` 偏差 % 的分母、也是 `margin_set` 推算 high/low/OV/UV 的基準,所以改它會
|
`margin_status` 偏差 % 的分母、也是 `margin_set` 推算 high/low/OV/UV 的基準,所以改它會
|
||||||
@@ -296,7 +316,12 @@ Tera Term 連 COM port (115200-8-N-1)
|
|||||||
(`--renormalize` 只在進 index 的路上轉換)。驗證要看 byte:`grep -rlU $'\r' <dir>`
|
(`--renormalize` 只在進 index 的路上轉換)。驗證要看 byte:`grep -rlU $'\r' <dir>`
|
||||||
- ⚠️ **TTL 的 `timeout` 是全域的**:`timeout = N` 之後**每一個** `wait` 都被限制在 N 秒。逾時的 `wait`
|
- ⚠️ **TTL 的 `timeout` 是全域的**:`timeout = N` 之後**每一個** `wait` 都被限制在 N 秒。逾時的 `wait`
|
||||||
直接返回而沒吃到 prompt,下一個指令就在前一個還沒跑完時送出,之後整輪錯開一拍。**設了一定要
|
直接返回而沒吃到 prompt,下一個指令就在前一個還沒跑完時送出,之後整輪錯開一拍。**設了一定要
|
||||||
配一個 `timeout = 0` 還原**(`wait_init.ttl` 60→0;Script B 的 cdc_ncm 探測 15→0 在 `:skip_ping`)
|
配一個 `timeout = 0` 還原**(`wait_init.ttl` 60→0;Script B 的 cdc_ncm 探測 15→0 兩處各還原一次
|
||||||
|
—— `endif` 之後走成功路徑、`:skip_ping` 走跳過路徑;Script 5 同一段**直接還原在 `if` 之前**,
|
||||||
|
一行涵蓋兩條路徑,因為它的 ping 區塊要 `wait` 一個 `sleep 10`,DUT 一忙就逼近 15 s 上限)
|
||||||
|
- ⚠️ **`goto` 的標籤沒定義,Tera Term 是執行到才報錯**:Script 5 從 Script B 抄 cdc_ncm 探測時
|
||||||
|
只帶走 `goto skip_ping` 沒帶 `:skip_ping`,平常測不出來 —— 只有真的抓不到 NCM 介面走進那條分支
|
||||||
|
才會跳錯誤視窗停住整個循環(已補)。抄段落過去時**連標籤一起抄**
|
||||||
- ⚠️ **兩張管理網卡同網段會 ARP flux**:`mgmt_ping_monitor.sh` 讓 eth0/eth1 同時 up,同一個 /24 下
|
- ⚠️ **兩張管理網卡同網段會 ARP flux**:`mgmt_ping_monitor.sh` 讓 eth0/eth1 同時 up,同一個 /24 下
|
||||||
對端 ARP 可能由任一張卡回應,回包落在沒送封包的那張。`ARP_STRICT=1` 擋掉;判讀時看 `RESULT` 行的
|
對端 ARP 可能由任一張卡回應,回包落在沒送封包的那張。`ARP_STRICT=1` 擋掉;判讀時看 `RESULT` 行的
|
||||||
`nic_tx`/`nic_rx`(該卡自己的 packet delta)—— **ping 成功但 `nic_tx` 接近 0 = 封包從另一張卡出去的**
|
`nic_tx`/`nic_rx`(該卡自己的 packet delta)—— **ping 成功但 `nic_tx` 接近 0 = 封包從另一張卡出去的**
|
||||||
@@ -339,7 +364,14 @@ Tera Term 連 COM port (115200-8-N-1)
|
|||||||
- `tools/` — Host / 離線端:`bcm_mibpair_report_V1.1.0.py`(drivshell log → per-pair 報表)、
|
- `tools/` — Host / 離線端:`bcm_mibpair_report_V1.1.0.py`(drivshell log → per-pair 報表)、
|
||||||
`traffic_loopback_*.txt`(bcmcmd 原始指令表,`blanton_traffic_linespeed.sh` 是其 bash 版,
|
`traffic_loopback_*.txt`(bcmcmd 原始指令表,`blanton_traffic_linespeed.sh` 是其 bash 版,
|
||||||
**改 loopback 線路時兩邊要同步**)、`100G_PRBS.txt` / `TR518.txt` / `fan_ctrl.txt`
|
**改 loopback 線路時兩邊要同步**)、`100G_PRBS.txt` / `TR518.txt` / `fan_ctrl.txt`
|
||||||
(上機手貼用的原始指令;PRBS 已有 `.sh`,TR518 尚未腳本化)
|
(上機手貼用的原始指令;PRBS / TR518 / 100G traffic / multiphase normal 都已有對應 `.sh`)
|
||||||
- `publish/` — `publish.sh`(打包工具,**進 git**)+ `Script_ABC_Blanton_<Ver>/` 產出(**gitignored**)
|
- `publish/` — `publish.sh`(打包工具,**進 git**)+ `Script_ABC_Blanton_<Ver>/` 產出(**gitignored**)
|
||||||
|
- `tmp/` — 🚫 gitignored:**還沒上機驗證**的腳本暫存區(目前 `blanton_reboottest.sh`)。
|
||||||
|
上機測過才搬進 `src/Script_ABC_Blanton/Blanton_Script/` 並進 git —— 未驗證的東西不該混在
|
||||||
|
交付包裡,publish 時測試員分不出哪支能信
|
||||||
|
- `src/Script_ABC_Blanton/hammer/` — 🚫 gitignored:mlucas 的 ELF binary(~99 MB,avx512 / avx2 /
|
||||||
|
avx / sse2 / generic-c)。Script B 與 Script 4 會 `chmod +x` 後執行,但**它由 DUT image 帶**,
|
||||||
|
不從這個 repo 發 —— binary 一旦進 git 就永久留在 history,每個 clone 都要付這個代價。
|
||||||
|
`publish.sh` 也把它排除,所以打包結果不會因為誰的工作目錄有沒有 binary 而變成 100 MB
|
||||||
- `secret/` — 🚫 gitignored(除 `README.md` 與 `*.example`):DUT 帳密、per-unit BDF 覆寫、COM 設定
|
- `secret/` — 🚫 gitignored(除 `README.md` 與 `*.example`):DUT 帳密、per-unit BDF 覆寫、COM 設定
|
||||||
- `For_AI/` — 🚫 gitignored:AI 協作素材(波形截圖、草稿筆記)
|
- `For_AI/` — 🚫 gitignored:AI 協作素材(波形截圖、草稿筆記)
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
# v1.1.7 — A way back from a margin, and a reboot cycle that runs itself
|
||||||
|
|
||||||
|
## ✨ New features
|
||||||
|
|
||||||
|
**`blanton_multiphase_margin.sh normal` — put the rails back without a power cycle**
|
||||||
|
* `normal` returns all 38 multiphase rails to their nominal set point, with the same per-rail reporting as the margin profiles (`SWB0_0V9_ANLG0 - 0.930V Configure Done`). `-u 0|1|all` as usual.
|
||||||
|
* Until now the only way out of a margin was to power-cycle the DUT. That mattered more than it sounds: `save` run while the board was still margined would have written the offsets into NVM, where a power cycle does not help either.
|
||||||
|
* The commands it sends are in `tools/Multiphase_Normal.txt` for anyone driving the bench by hand.
|
||||||
|
|
||||||
|
> ⚠️ `TH6_CORE` is 0.8 V nominal but settles near **0.8591 V** once the load line is active. Reading back 0.859 after `normal` is the load line doing its job, not a failed write.
|
||||||
|
|
||||||
|
**`5_Blanton_Script_Reboot_Cycle.ttl` — an unattended reboot-cycle run**
|
||||||
|
* A standalone macro, like Script 4: it does **not** chain to A → B → C and does not use `hw-test-session`. Every cycle is a fresh boot, so there is nothing to carry over and nothing to tear down.
|
||||||
|
* Each round: login → `sudo -i` → `date -s` → fan speed → `wait_init` → **Check Pt1 … Pt13** → `show uptime` → `reboot` → wait for the next boot. The cycle number is printed in the banner of every round.
|
||||||
|
|
||||||
|
| | | | |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **Pt1** DUT info | **Pt2** BMC info + tools | **Pt3** mgmt ping | **Pt4** NFC poll |
|
||||||
|
| **Pt5** SSD stress | **Pt6** USB stress | **Pt7** BMC USB net | **Pt8** port status + 15 s traffic |
|
||||||
|
| **Pt9** BER sweep | **Pt10** NVMe errors | **Pt11** platform data | **Pt12** dmesg i2c |
|
||||||
|
| **Pt13** PCIe error counters | | | |
|
||||||
|
|
||||||
|
* The USB step takes its device node from `usb_target.sh`, not a hard-coded `/dev/sda1`.
|
||||||
|
|
||||||
|
**The SSD and USB stress durations are declared in `config.ttl`**
|
||||||
|
* `SSD_RUNTIME` / `SSD_COUNT` and `USB_RUNTIME` / `USB_COUNT` replace the values that were hard-coded in Script B, so a site changes them in one place. `COUNT` is passed straight through as `--passes`.
|
||||||
|
|
||||||
|
## 🐛 Bug fixes
|
||||||
|
|
||||||
|
**Script B left the global `timeout` at 15 s for the rest of the cdc_ncm section**
|
||||||
|
* The NCM probe sets `timeout = 15` and restored it only at `:skip_ping` — which the *success* path reaches several `wait`s later. Until then every `wait` gave up after 15 s instead of blocking, and a `wait` that returns without eating the prompt puts the whole macro a beat ahead of the DUT. It is now restored on the success path too.
|
||||||
|
|
||||||
|
**`goto skip_ping` in the reboot-cycle macro had no label to jump to**
|
||||||
|
* The probe was copied out of Script B without its `:skip_ping` label. Tera Term does not check labels when it loads a macro — it raises the error only when it actually jumps, which here means only when the NCM interface is missing. The failure mode was an error dialog stopping the whole cycle, on the one run where something was already wrong. The label is there now, and the `timeout` is restored **before** the branch so one line covers both paths.
|
||||||
|
|
||||||
|
**Two check points both numbered 12**
|
||||||
|
* `Dmesg_i2c` and `PCIE Error Counters` both announced themselves as `Check Pt12`. The second is now `Pt13`; Pt1 … Pt13 are unique.
|
||||||
|
|
||||||
|
## 📦 Downloads
|
||||||
|
|
||||||
|
| File | Contents |
|
||||||
|
|---|---|
|
||||||
|
| `Script_ABC_Blanton_V1.1.7.zip` | The full Tera Term working directory, including `Blanton_Script/` to copy onto the DUT |
|
||||||
|
|
||||||
|
**After copying to the DUT:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x ~/Blanton_Script/*.sh # see below
|
||||||
|
grep -rlU $'\r' ~/Blanton_Script # expect no output
|
||||||
|
```
|
||||||
|
|
||||||
|
`blanton_ber.sh`, `nfc_polling.sh`, `blanton_tr518.sh`, `blanton_multiphase_margin.sh`, `pwr_brick.sh` and the two `TH6_SWB*_power_readback.sh` are invoked through `./` or `~/`, so they need the execute bit along with `bmc_monitor.sh` and `usb_target.sh` — neither git nor a Windows/USB copy carries it reliably.
|
||||||
|
|
||||||
|
## ⚠️ Before you run
|
||||||
|
|
||||||
|
* **`--runtime` is the job's overall limit, not a per-pass one.** `qfx5252-stress-*` stops after `RUNTIME` seconds whatever `--passes` says, so `SSD_RUNTIME=600` is a **10 minute** stress, not 600 × `SSD_COUNT`. For a 24 hour soak set `RUNTIME` to `86400`. The shipped defaults are 600.
|
||||||
|
* **Script 5 has not been run on hardware yet.** Two things to confirm on the bench: that `wait "Booting in blind mode"` really appears in this build's boot output — it has no `timeout` guard, so a changed string waits forever — and that re-running `bmc-first-enroll` every cycle is safe.
|
||||||
|
* **Script 5 has no exit condition.** `while 1` with a `reboot` at the end of each round; stop it by closing the Tera Term macro.
|
||||||
|
* **`blanton_multiphase_margin.sh save` is permanent**, and must not be mixed with `margin.sh` — same rails, two access paths, no interlock. Never run it while the board is margined.
|
||||||
|
* **`READ_VIN` and `READ_IIN` are still not in the ADPM12200 coefficient table** — `pwr_brick.sh` decodes them with the voltage and current coefficients. Confirm before quoting brick Vin.
|
||||||
|
* **The BMC USB service log only exists on the USB stick.**
|
||||||
|
* **Script 4 (thermal/safety) has no teardown** — finish with `blanton_tr518.sh stop` and `kill $(jobs -p)`.
|
||||||
|
* **These three cannot share the switch**: `blanton_ber.sh`, `blanton_tr518.sh`, `blanton_traffic_linespeed`.
|
||||||
|
* **`FAN_SPEED` is 100.**
|
||||||
|
* **Still unverified from v1.1.0**: the `ce0` ingress mirror, the 120 s settle in `blanton_tr518.sh`, and `test mode nr=no` on stop.
|
||||||
|
|
||||||
|
## 🔗 Links
|
||||||
|
|
||||||
|
* [ARCHITECTURE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/ARCHITECTURE.md) — test flow, data models, constraints
|
||||||
|
* [CLAUDE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/CLAUDE.md) — commands and the bench gotchas
|
||||||
|
* [Blanton_Test_Flow.drawio](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/docs/Blanton_Test_Flow.drawio) — the scripts side by side
|
||||||
|
|
||||||
|
**Full changelog:** [V1.1.6...V1.1.7](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.1.6...V1.1.7)
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# v1.1.8 — The CPU stress no longer dies with your terminal
|
||||||
|
|
||||||
|
## ✨ New features
|
||||||
|
|
||||||
|
**`mlucas` now runs as a systemd unit, so it survives a lost session**
|
||||||
|
* The AMD CPU load is started as `systemd-run --unit=mlucas-amm --property=Type=exec --property=Restart=always --property=RestartSec=2`, instead of being backgrounded with `&` in the login shell. Script B and the thermal/safety macro (Script 4) both use it.
|
||||||
|
* As a shell job it belonged to that one terminal: close Tera Term, drop the console, reconnect on a different session, and the load was gone — while `jobs` from the new session showed nothing to tell you. A multi-day soak could spend most of its length with an idle CPU and produce thermal numbers that looked fine because nothing was loading the part.
|
||||||
|
* `Restart=always` brings it back if it exits on its own, and the log is appended (`>>`) inside the unit while being truncated (`>`) once before the unit starts, so a restart adds to the run rather than erasing it.
|
||||||
|
* Script B now prints `systemctl is-active mlucas-amm` beside `jobs`, both in the one-shot check and in every pass of the monitor loop. One word — `active` — tells you the CPU is still loaded.
|
||||||
|
|
||||||
|
> The old `&` line is kept commented out directly above the new one, to fall back to if `systemd-run` is not available on a build.
|
||||||
|
|
||||||
|
**Script C stops the unit and brings its log home**
|
||||||
|
* `systemctl stop mlucas-amm` was added next to the existing `kill $(jobs -p)`, and `mlucas_amm_log` is copied into `/host/hw-eval/jobs/` with the other stress logs.
|
||||||
|
* `kill $(jobs -p)` cannot reach a systemd unit, so without this the load would have run straight through the post-test snapshot and into the next test — every temperature and power reading taken at full load, with nothing in `show interfaces status` to reveal it.
|
||||||
|
|
||||||
|
**`EN_timestamp` — turn the per-line log timestamp on or off from `config.ttl`**
|
||||||
|
* Script A's `logopen` takes its 5th argument from the new flag: `logopen filename 0 1 1 EN_timestamp`. The argument order (`<file> <binary> <append> <PlainText> <timestamp>`) is now spelled out above the call.
|
||||||
|
|
||||||
|
**`BMC_USB_RUNTIME` — the BMC USB ping duration is a knob, not a constant**
|
||||||
|
* It was hard-coded to `-w 14400` (4 hours), which no longer matched the soak lengths the SSD and USB knobs were being set to. The shipped default is `172800` (2 days).
|
||||||
|
|
||||||
|
**The shipped stress defaults are now one hour**
|
||||||
|
* `SSD_RUNTIME` and `USB_RUNTIME` go from 600 to `3600`. v1.1.7 shipped a 10 minute stress by default.
|
||||||
|
|
||||||
|
## 🐛 Bug fixes
|
||||||
|
|
||||||
|
**`publish.sh` produced a different bundle depending on whose machine it ran on**
|
||||||
|
* `rsync` copied whatever sat in `src/Script_ABC_Blanton/`, so a developer with the `hammer/` mlucas binaries in their working tree shipped a ~100 MB zip while a fresh clone shipped ~200 KB. `hammer/` is now excluded from the bundle and ignored by git.
|
||||||
|
* `publish.sh -h` also printed the first lines of code along with the usage text, and would have truncated the usage block as the header grew. It now reads the header up to the first line of code.
|
||||||
|
|
||||||
|
## 📦 Downloads
|
||||||
|
|
||||||
|
| File | Contents |
|
||||||
|
|---|---|
|
||||||
|
| `Script_ABC_Blanton_V1.1.8.zip` | The full Tera Term working directory, including `Blanton_Script/` to copy onto the DUT |
|
||||||
|
|
||||||
|
**After copying to the DUT:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x ~/Blanton_Script/*.sh # see below
|
||||||
|
grep -rlU $'\r' ~/Blanton_Script # expect no output
|
||||||
|
ls ~/hammer/tools/amd/mlucas-avx2 # must already be there - see below
|
||||||
|
```
|
||||||
|
|
||||||
|
`blanton_ber.sh`, `nfc_polling.sh`, `blanton_tr518.sh`, `blanton_multiphase_margin.sh`, `pwr_brick.sh` and the two `TH6_SWB*_power_readback.sh` are invoked through `./` or `~/`, so they need the execute bit along with `bmc_monitor.sh` and `usb_target.sh` — neither git nor a Windows/USB copy carries it reliably.
|
||||||
|
|
||||||
|
## ⚠️ Before you run
|
||||||
|
|
||||||
|
* **Replace `config.ttl` along with the macros.** `EN_timestamp` and `BMC_USB_RUNTIME` are new, and Tera Term aborts the macro on an undefined variable rather than treating it as 0 — keeping an old `config.ttl` stops Script A at the `logopen` line.
|
||||||
|
* **`hammer/` is not in the bundle.** The ~99 MB of mlucas binaries comes with the DUT image, not from this repo. If `~/hammer/tools/amd/mlucas-avx2` is missing, Script B does not stop — it starts a unit that fails and is restarted every 2 seconds. Check for the file before you start.
|
||||||
|
* **The timestamp format is not in the macro.** `EN_timestamp` only decides whether there is one; the format lives in Tera Term's Setup → Additional settings → Log, stored in that PC's `TERATERM.INI`. Two benches running the same macro can produce differently stamped logs.
|
||||||
|
* **The three stress durations are deliberately different**: SSD and USB at 1 hour, the BMC USB ping at 2 days. Set each to match the soak you are actually running.
|
||||||
|
* **`--runtime` is the job's overall limit, not a per-pass one.** `qfx5252-stress-*` stops after `RUNTIME` seconds whatever `--passes` says. For a 24 hour soak set `RUNTIME` to `86400`.
|
||||||
|
* **`mlucas-amm` has not been run on hardware yet.** The unit resolves `~` through bash's fallback to the passwd entry, because systemd does not set `HOME` for a system service without `User=`. It should land on `/root/hammer`, the same path the interactive shell uses — confirm it on the bench, or change both paths to an absolute `/root/hammer/...`.
|
||||||
|
* **Script 4 uses the same unit but has no teardown.** The thermal/safety macro now starts `mlucas-amm` the same way Script B does, and it still ends at `while 1` — so stopping it means `blanton_tr518.sh stop` **and** `systemctl stop mlucas-amm`. Closing Tera Term does not stop the CPU load any more.
|
||||||
|
* **Script 5 (reboot cycle) is still unverified on hardware**, still has no exit condition, and `wait "Booting in blind mode"` still has no `timeout` guard.
|
||||||
|
* **`blanton_multiphase_margin.sh save` is permanent**, and must not be mixed with `margin.sh` — same rails, two access paths, no interlock.
|
||||||
|
* **`READ_VIN` and `READ_IIN` are still not in the ADPM12200 coefficient table.**
|
||||||
|
* **The BMC USB service log only exists on the USB stick.**
|
||||||
|
* **These three cannot share the switch**: `blanton_ber.sh`, `blanton_tr518.sh`, `blanton_traffic_linespeed`.
|
||||||
|
* **`FAN_SPEED` is 100.**
|
||||||
|
* **Still unverified from v1.1.0**: the `ce0` ingress mirror, the 120 s settle in `blanton_tr518.sh`, and `test mode nr=no` on stop.
|
||||||
|
|
||||||
|
## 🔗 Links
|
||||||
|
|
||||||
|
* [ARCHITECTURE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/ARCHITECTURE.md) — test flow, data models, constraints
|
||||||
|
* [CLAUDE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/CLAUDE.md) — commands and the bench gotchas
|
||||||
|
* [Blanton_Test_Flow.drawio](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/docs/Blanton_Test_Flow.drawio) — the scripts side by side
|
||||||
|
|
||||||
|
**Full changelog:** [V1.1.7...V1.1.8](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.1.7...V1.1.8)
|
||||||
+14
-2
@@ -7,6 +7,9 @@
|
|||||||
# publish/Script_ABC_Blanton_<Version>, taking <Version>
|
# publish/Script_ABC_Blanton_<Version>, taking <Version>
|
||||||
# from the "; Version : Vx.y.z" header of
|
# from the "; Version : Vx.y.z" header of
|
||||||
# 1_Blanton_Script_A.ttl.
|
# 1_Blanton_Script_A.ttl.
|
||||||
|
# V1.0.1 2026-09-06 Exclude hammer/ (the mlucas binaries) from the bundle,
|
||||||
|
# so the output no longer depends on whether the developer
|
||||||
|
# has them in their working tree.
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
#
|
#
|
||||||
# The version is READ FROM Script A rather than passed in, so the folder name
|
# The version is READ FROM Script A rather than passed in, so the folder name
|
||||||
@@ -33,7 +36,9 @@ info() { printf '[\033[34mINFO\033[0m] %s\n' "$*"; }
|
|||||||
ok() { printf '[\033[32m OK \033[0m] %s\n' "$*"; }
|
ok() { printf '[\033[32m OK \033[0m] %s\n' "$*"; }
|
||||||
die() { printf '[\033[31mERR \033[0m] %s\n' "$*" >&2; exit 1; }
|
die() { printf '[\033[31mERR \033[0m] %s\n' "$*" >&2; exit 1; }
|
||||||
|
|
||||||
usage() { sed -n '2,26p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'; exit 0; }
|
# Print the header block above, up to (but not including) the first line of
|
||||||
|
# code, so adding a Version History entry never truncates the usage text.
|
||||||
|
usage() { sed -n '2,/^set -u/p' "${BASH_SOURCE[0]}" | sed '$d' | sed 's/^# \{0,1\}//'; exit 0; }
|
||||||
|
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@@ -86,12 +91,19 @@ fi
|
|||||||
# Captured console logs are per-run and often carry DUT serials, so they are
|
# Captured console logs are per-run and often carry DUT serials, so they are
|
||||||
# never shipped; the empty logs/ directory itself is kept because Script A's
|
# never shipped; the empty logs/ directory itself is kept because Script A's
|
||||||
# logopen writes into it.
|
# logopen writes into it.
|
||||||
|
#
|
||||||
|
# hammer/ is excluded as well: it is ~99 MB of mlucas ELF binaries that the DUT
|
||||||
|
# image already carries, and it is gitignored. Without this exclude the bundle
|
||||||
|
# would depend on whether the developer happened to have the binaries sitting in
|
||||||
|
# src/ - 100 MB from one machine, 200 KB from a fresh clone.
|
||||||
mkdir -p -- "${DEST}" || die "cannot create ${DEST}"
|
mkdir -p -- "${DEST}" || die "cannot create ${DEST}"
|
||||||
if command -v rsync >/dev/null 2>&1; then
|
if command -v rsync >/dev/null 2>&1; then
|
||||||
rsync -a --exclude='*.log' "${SRC_DIR}/" "${DEST}/" || die "rsync failed"
|
rsync -a --exclude='*.log' --exclude='hammer/' "${SRC_DIR}/" "${DEST}/" \
|
||||||
|
|| die "rsync failed"
|
||||||
else
|
else
|
||||||
cp -a -- "${SRC_DIR}/." "${DEST}/" || die "cp failed"
|
cp -a -- "${SRC_DIR}/." "${DEST}/" || die "cp failed"
|
||||||
find "${DEST}" -type f -name '*.log' -delete
|
find "${DEST}" -type f -name '*.log' -delete
|
||||||
|
rm -rf -- "${DEST}/hammer"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Tera Term's logopen target, in case the source tree never had one
|
# Tera Term's logopen target, in case the source tree never had one
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
; =============================================================================
|
; =============================================================================
|
||||||
; Script A for Blanton
|
; Script A for Blanton
|
||||||
; Version : V1.1.6
|
; Version : V1.1.9
|
||||||
; Date : 2026-09-02
|
; Date : 2026-09-07
|
||||||
; Author : ETWen
|
; Author : ETWen
|
||||||
; =============================================================================
|
; =============================================================================
|
||||||
; Version History:
|
; Version History:
|
||||||
@@ -277,6 +277,213 @@
|
|||||||
; high and low while its neighbours sit the other way
|
; high and low while its neighbours sit the other way
|
||||||
; NC channels stay nominal in both (CONN14 CH10/11/13,
|
; NC channels stay nominal in both (CONN14 CH10/11/13,
|
||||||
; CONN15 CH10) - nothing to margin on an unused rail
|
; CONN15 CH10) - nothing to margin on an unused rail
|
||||||
|
; V1.1.7 2026-09-04 Blanton_Script/blanton_multiphase_margin.sh v1.1.0 Add the 'normal' sub-command
|
||||||
|
; Puts all 38 rails back to their nominal set point,
|
||||||
|
; from tools/Multiphase_Normal.txt - same rails and the
|
||||||
|
; same per-rail reporting as the margin profiles
|
||||||
|
; Until now the only way back from a margin was a power
|
||||||
|
; cycle, and 'save' run while margined would have
|
||||||
|
; committed the offsets to NVM, where a power cycle does
|
||||||
|
; not help either
|
||||||
|
; !! TH6_CORE is 0.8 V nominal but settles near 0.8591 V
|
||||||
|
; once the load line is active - reading back 0.859
|
||||||
|
; after 'normal' is the load line, not a failed write
|
||||||
|
; tools/Multiphase_Normal.txt Bench command reference for the above
|
||||||
|
; 5_Blanton_Script_Reboot_Cycle.ttl Created Reboot-cycle run - a STANDALONE script, not
|
||||||
|
; chained to A -> B -> C and not using hw-test-session:
|
||||||
|
; every cycle is a fresh boot, so there is nothing to
|
||||||
|
; carry over and nothing to tear down
|
||||||
|
; while 1: login -> sudo -i -> date -s -> fans -> wait_init
|
||||||
|
; -> Check Pt1..Pt13 -> show uptime -> reboot ->
|
||||||
|
; wait 'Booting in blind mode'
|
||||||
|
; cnt_cycle is printed in the banner of every round
|
||||||
|
; Pt1 DUT info (boot/version/fwutil/syseeprom/ssdhealth/
|
||||||
|
; TPM/NVMe) Pt2 BMC info + source the bash tools
|
||||||
|
; Pt3 mgmt ping Pt4 NFC poll (20 s)
|
||||||
|
; Pt5 SSD stress Pt6 USB stress (node from
|
||||||
|
; usb_target.sh, not a fixed sda1)
|
||||||
|
; Pt7 BMC USB net Pt8 100G port status + 15 s traffic
|
||||||
|
; Pt9 BER sweep Pt10 NVMe error info
|
||||||
|
; Pt11 platform data Pt12 dmesg i2c
|
||||||
|
; Pt13 PCIe error counters + ras-mc-ctl
|
||||||
|
; !! there is NO exit condition - the only way to stop it
|
||||||
|
; is to close the Tera Term macro
|
||||||
|
; !! NOT verified on hardware yet
|
||||||
|
; The cdc_ncm probe sets timeout = 15 and restores it to 0
|
||||||
|
; BEFORE the if, so both branches are covered in one line -
|
||||||
|
; the ping block below it waits on a 'sleep 10', which is
|
||||||
|
; already two thirds of the cap on a loaded DUT
|
||||||
|
; The probe was copied from Script B without its :skip_ping
|
||||||
|
; label, so 'goto skip_ping' had no target. Tera Term only
|
||||||
|
; raises that when it actually jumps, i.e. only when the
|
||||||
|
; NCM interface is missing - the label is now there
|
||||||
|
; Renumbered the second 'Check Pt12' (PCIe error counters)
|
||||||
|
; to Pt13; Pt1..Pt13 are now unique
|
||||||
|
; ScriptB Restore timeout = 0 on the cdc_ncm success path too
|
||||||
|
; It was only restored at :skip_ping, which the success
|
||||||
|
; path reaches several waits later - until then every wait
|
||||||
|
; was capped at 15 s instead of blocking
|
||||||
|
; .gitignore Ignore tmp/ - scripts not yet verified on hardware
|
||||||
|
; blanton_reboottest.sh (the bash port of the reboot cycle,
|
||||||
|
; for running without Tera Term) lives there until it has
|
||||||
|
; been run on a DUT. Unverified scripts must not reach the
|
||||||
|
; publish bundle: the tester cannot tell which ones to
|
||||||
|
; trust once they are side by side in Blanton_Script/
|
||||||
|
; config.ttl Add SSD_RUNTIME / SSD_COUNT / USB_RUNTIME / USB_COUNT
|
||||||
|
; The SSD and USB stress durations were hard-coded in
|
||||||
|
; ScriptB (--runtime 86400 --passes 5 / 1); they are now
|
||||||
|
; declared in one place per site
|
||||||
|
; !! --runtime is the job's OVERALL limit, not per pass:
|
||||||
|
; qfx5252-stress-* stops at RUNTIME seconds whatever
|
||||||
|
; --passes says. RUNTIME 600 = a 10 minute stress,
|
||||||
|
; not 600 x COUNT. For a 24 h soak set RUNTIME 86400
|
||||||
|
; ScriptB Build the SSD / USB stress commands from those knobs
|
||||||
|
; sprintf2 cmd_ssd ... SSD_RUNTIME SSD_COUNT, and the same
|
||||||
|
; for USB; the old hard-coded lines are left commented out
|
||||||
|
; next to them
|
||||||
|
; V1.1.8 2026-09-06
|
||||||
|
; ScriptA Drive logopen's timestamp flag from EN_timestamp
|
||||||
|
; logopen filename 0 1 1 EN_timestamp, with the argument
|
||||||
|
; order spelled out above the call: <file> <binary>
|
||||||
|
; <append> <PlainText> <timestamp>
|
||||||
|
; binary must stay 0. In binary mode Tera Term writes the
|
||||||
|
; raw stream and both PlainText and the timestamp are
|
||||||
|
; ignored
|
||||||
|
; !! EN_timestamp has to exist in config.ttl. An undefined
|
||||||
|
; variable aborts the macro at logopen, it is not read
|
||||||
|
; as 0
|
||||||
|
; !! the timestamp FORMAT lives in TERATERM.INI (Setup >
|
||||||
|
; Additional settings > Log), so it follows the PC and
|
||||||
|
; not this script. Two testers can produce differently
|
||||||
|
; stamped logs from one macro
|
||||||
|
; ScriptB Run mlucas as a systemd unit, not a shell background job
|
||||||
|
; systemd-run --unit=mlucas-amm --property=Type=exec
|
||||||
|
; --property=Restart=always --property=RestartSec=2
|
||||||
|
; The '&' job belonged to the interactive shell: it died
|
||||||
|
; with the session, and 'jobs' could not see it from a
|
||||||
|
; reconnected one, so a soak that lost its terminal quietly
|
||||||
|
; stopped loading the CPU
|
||||||
|
; The log is truncated with '>' before the unit starts and
|
||||||
|
; appended with '>>' inside it, so a restart adds to the
|
||||||
|
; run instead of erasing it
|
||||||
|
; 'systemctl is-active mlucas-amm' now sits beside 'jobs',
|
||||||
|
; both in the one-shot check and in the monitor loop at the
|
||||||
|
; end
|
||||||
|
; !! the old '&' line is kept commented out directly above
|
||||||
|
; it, to fall back to if systemd-run is unavailable
|
||||||
|
; ScriptB Take the BMC USB ping duration from BMC_USB_RUNTIME
|
||||||
|
; sprintf2 cmd '... -w %d ...' ncm_if BMC_USB_RUNTIME. It
|
||||||
|
; was hard-coded to 14400 (4 h), which no longer matched
|
||||||
|
; the soak the SSD and USB knobs were set for
|
||||||
|
; ScriptC Stop mlucas-amm and copy its log to the USB stick
|
||||||
|
; utils/kill_all_process.ttl is only "kill $(jobs -p)", and
|
||||||
|
; a systemd unit is not a shell job
|
||||||
|
; ScriptB's change on its own would have left mlucas
|
||||||
|
; loading all 16 cores through ScriptC and into the next
|
||||||
|
; run, so every temperature and power reading after it
|
||||||
|
; would have been taken under load
|
||||||
|
; cp ~/hammer/tools/amd/mlucas_amm_log /host/hw-eval/jobs/
|
||||||
|
; joins the other stress logs
|
||||||
|
; !! ScriptB and ScriptC change together. Whoever moves a
|
||||||
|
; stress job to systemd owns the matching stop in
|
||||||
|
; ScriptC
|
||||||
|
; Script4 Use the same mlucas-amm systemd unit as ScriptB
|
||||||
|
; The thermal / safety macro started mlucas the same way
|
||||||
|
; ScriptB used to, with '&', so it had the same failure:
|
||||||
|
; the load quietly ended when the console went away, in the
|
||||||
|
; one test where a long steady full load is the whole point
|
||||||
|
; 'systemctl is-active mlucas-amm' joins 'bgctl list' and
|
||||||
|
; 'jobs' in the monitor loop
|
||||||
|
; !! Script4 still has no teardown section, so the matching
|
||||||
|
; stop is manual: blanton_tr518.sh stop AND systemctl
|
||||||
|
; stop mlucas-amm. Closing Tera Term no longer stops the
|
||||||
|
; CPU load, and 'kill $(jobs -p)' never reached a unit
|
||||||
|
; config.ttl Add EN_timestamp and BMC_USB_RUNTIME, raise stress runtimes
|
||||||
|
; EN_timestamp = 1 feeds ScriptA's logopen; BMC_USB_RUNTIME
|
||||||
|
; = 172800 feeds ScriptB's ping unit
|
||||||
|
; SSD_RUNTIME and USB_RUNTIME 600 -> 3600, so the shipped
|
||||||
|
; default is a one hour stress rather than the ten minutes
|
||||||
|
; V1.1.7 went out with
|
||||||
|
; !! --runtime is still the job's OVERALL limit. RUNTIME
|
||||||
|
; 3600 = one hour of stress; COUNT does not multiply it.
|
||||||
|
; For a 2 day soak set RUNTIME 172800
|
||||||
|
; .gitignore Ignore src/Script_ABC_Blanton/hammer/
|
||||||
|
; ~99 MB of unstripped mlucas ELF binaries (avx512 / avx2 /
|
||||||
|
; avx / sse2 / generic-c) that ScriptB and the thermal
|
||||||
|
; macro chmod and run on the DUT
|
||||||
|
; !! they are deliberately NOT in git. A binary tree that
|
||||||
|
; large is permanent once committed and every clone pays
|
||||||
|
; for it forever; the DUT image already carries hammer/
|
||||||
|
; publish/publish.sh Exclude hammer/ from the delivery bundle
|
||||||
|
; rsync copies whatever sits in src/, so a developer who
|
||||||
|
; happened to have the binaries locally would have shipped
|
||||||
|
; a 100 MB zip while a clone shipped 200 KB. The bundle is
|
||||||
|
; now the same either way
|
||||||
|
; V1.1.9 2026-09-07
|
||||||
|
; Blanton_Script/bcm_dsc_scan.sh Created V1.2.0 - batch SerDes DSC dump
|
||||||
|
; Runs bcmcmd -n <unit> -c "dsh -c 'phydiag <port> dsc'"
|
||||||
|
; over the whole port list (1 x 100G + 445 x 200G ranges),
|
||||||
|
; both units, and leaves the raw log in <script_dir>/log
|
||||||
|
; before copying it to /host/hw-eval/jobs
|
||||||
|
; -f names the log (%u -> u0/u1, %t -> timestamp), -F
|
||||||
|
; overwrites, -u picks one unit, -n dry runs, -C skips the
|
||||||
|
; copy. -f takes a filename only; the directory comes from
|
||||||
|
; -o
|
||||||
|
; bcmcmd exits 0 even when the diag shell rejects a
|
||||||
|
; command, so success is judged by counting 'SERDES DISPLAY
|
||||||
|
; DIAG DATA END' markers, not by the exit code - the same
|
||||||
|
; trap blanton_traffic_linespeed.sh hit
|
||||||
|
; Paths come from $0, not $HOME, because Script A runs it
|
||||||
|
; after sudo -i and a literal ~ would depend on the
|
||||||
|
; environment. Ends with '### DSC_SCAN_DONE rc=<n>' for a
|
||||||
|
; TTL wait to key on
|
||||||
|
; Non-tty output is one line per port instead of a progress
|
||||||
|
; bar, so it does not flood the Tera Term log
|
||||||
|
; !! phydiag dsc is read-only and does not change any
|
||||||
|
; SerDes setting, but a full scan is ~10 min per run.
|
||||||
|
; ScriptA and ScriptC each do one, so the test is ~20
|
||||||
|
; min longer than before. Do not set DELAY to 0
|
||||||
|
; Blanton_Script/bcm_dsc_parse.sh Created V1.0.0 - offline DSC log to CSV
|
||||||
|
; Host side. -i <raw log> -o <prefix> produces
|
||||||
|
; <prefix>_lane.csv (one row per lane: TXEQ / RXFFE / DFE /
|
||||||
|
; EYE / SNR) and <prefix>_pm.csv (one row per pm_id:
|
||||||
|
; temperature / PLL / lane count / SNR-EYE stats)
|
||||||
|
; POSIX sh + awk, mawk compatible, no Python. Lane rows are
|
||||||
|
; read by the order of their bracket groups rather than
|
||||||
|
; fixed columns, so re-spacing by the SDK does not break
|
||||||
|
; it; a row whose group count is not 9 is marked UNPARSED
|
||||||
|
; on stderr instead of being parsed wrongly
|
||||||
|
; SD / LCK sticky '*' flags are kept as separate columns
|
||||||
|
; and not interpreted; a BER field of '!chk_en' means the
|
||||||
|
; checker was off and is passed through unchanged
|
||||||
|
; ScriptA Collect the SerDes DSC baseline before 'show uptime'
|
||||||
|
; ./Blanton_Script/bcm_dsc_scan.sh -f
|
||||||
|
; blanton_dsc_ScriptA.log -F
|
||||||
|
; The name has no %u, so the script inserts _u0 / _u1
|
||||||
|
; itself and unit 1 cannot overwrite unit 0 - that is where
|
||||||
|
; the file names ScriptC copies come from
|
||||||
|
; ScriptA / ScriptB / ScriptC Remove the commented-out 100G PRBS blocks
|
||||||
|
; The port_prbs_monitor.sh calls had been commented out in
|
||||||
|
; all three since bring-up, together with a second copy of
|
||||||
|
; the 100G port status block in ScriptA and the stale
|
||||||
|
; bmc_monitor_ddr.sh block in ScriptC
|
||||||
|
; port_prbs_monitor.sh still ships and still runs by hand;
|
||||||
|
; only the dead call sites are gone
|
||||||
|
; ScriptC Collect the closing DSC dump and carry the four logs out
|
||||||
|
; ./Blanton_Script/bcm_dsc_scan.sh -f
|
||||||
|
; blanton_dsc_ScriptC.log -F, then cp of
|
||||||
|
; blanton_dsc_Script{A,C}_u{0,1}.log into
|
||||||
|
; /host/hw-eval/jobs/
|
||||||
|
; The scan already copies its own output there; these four
|
||||||
|
; are a second pass so a failed copy inside the scan still
|
||||||
|
; leaves the data on the USB stick
|
||||||
|
; Blanton_Script Both new scripts need the execute bit on the DUT
|
||||||
|
; !! git records them 100644 like every other .sh here, and
|
||||||
|
; ScriptA / ScriptC invoke them as
|
||||||
|
; ./Blanton_Script/bcm_dsc_scan.sh, so they join
|
||||||
|
; bmc_monitor.sh and friends in the chmod +x line after
|
||||||
|
; deployment. Without it both scans fail with Permission
|
||||||
|
; denied and the macro walks straight past it
|
||||||
; =============================================================================
|
; =============================================================================
|
||||||
include "config.ttl"
|
include "config.ttl"
|
||||||
|
|
||||||
@@ -289,7 +496,11 @@ getdir mdir
|
|||||||
|
|
||||||
if EN_log = 1 then
|
if EN_log = 1 then
|
||||||
sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name strTestcase str_starttime
|
sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name strTestcase str_starttime
|
||||||
logopen filename 0 1 1 1
|
; logopen <file> <binary> <append> <PlainText> <timestamp>
|
||||||
|
; binary=0 text mode, so PlainText / timestamp are honoured
|
||||||
|
; append=1 keep earlier cycles, do not overwrite
|
||||||
|
; PlainText=1 strip the ANSI colour codes SONiC emits
|
||||||
|
logopen filename 0 1 1 EN_timestamp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
; ========== Root Login ==========
|
; ========== Root Login ==========
|
||||||
@@ -473,36 +684,6 @@ sendln "config save -y"
|
|||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "show interfaces status Ethernet513,Ethernet514"
|
sendln "show interfaces status Ethernet513,Ethernet514"
|
||||||
|
|
||||||
;=============================================================================================================
|
|
||||||
; ========== 100G PRBS ==========
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "~/Blanton_Script/port_prbs_monitor.sh start"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "sleep 10"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "~/Blanton_Script/port_prbs_monitor.sh status"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "~/Blanton_Script/port_prbs_monitor.sh stop"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "~/Blanton_Script/port_prbs_monitor.sh report"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "~/Blanton_Script/port_prbs_monitor.sh clear"
|
|
||||||
|
|
||||||
; ========== 100G Port Status ==========
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "sudo sfputil lpmode off Ethernet513"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "sudo sfputil lpmode off Ethernet514"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "config interface -n asic0 startup Ethernet513"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "config interface -n asic1 startup Ethernet514"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "config save -y"
|
|
||||||
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "show interfaces status Ethernet513,Ethernet514"
|
|
||||||
;=============================================================================================================
|
|
||||||
|
|
||||||
; ========== First Traffic Test ==========
|
; ========== First Traffic Test ==========
|
||||||
; Silent MAC
|
; Silent MAC
|
||||||
@@ -566,6 +747,10 @@ else
|
|||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
; ========== Collect bcm dsc data ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/bcm_dsc_scan.sh -f blanton_dsc_ScriptA.log -F"
|
||||||
|
|
||||||
; ========== Show Power on uptime ==========
|
; ========== Show Power on uptime ==========
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "show uptime"
|
sendln "show uptime"
|
||||||
|
|||||||
@@ -15,10 +15,15 @@ pause 1
|
|||||||
;sendln "command"
|
;sendln "command"
|
||||||
|
|
||||||
; ========== AMD CPU STRESS TEST ==========
|
; ========== AMD CPU STRESS TEST ==========
|
||||||
|
; Clear the log file first
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "> ~/hammer/tools/amd/mlucas_amm_log"
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln 'chmod +x ~/hammer/tools/amd/mlucas-avx2'
|
sendln 'chmod +x ~/hammer/tools/amd/mlucas-avx2'
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mlucas_amm_log 2>&1 &"
|
;sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mlucas_amm_log 2>&1 &"
|
||||||
|
sendln "systemd-run --unit=mlucas-amm --property=Type=exec --property=Restart=always --property=RestartSec=2 /bin/bash -c '~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 >> ~/hammer/tools/amd/mlucas_amm_log 2>&1'"
|
||||||
|
|
||||||
|
|
||||||
; ========== BMC DDR Stress Test ==========
|
; ========== BMC DDR Stress Test ==========
|
||||||
;wait prompt_sonic_root
|
;wait prompt_sonic_root
|
||||||
@@ -40,8 +45,10 @@ wait prompt_sonic_root
|
|||||||
sendln "bgctl run /usr/sbin/memtester 1G" ; Continue Execture
|
sendln "bgctl run /usr/sbin/memtester 1G" ; Continue Execture
|
||||||
|
|
||||||
; ========== SSD read/write ==========
|
; ========== SSD read/write ==========
|
||||||
|
sprintf2 cmd_ssd "bgctl run qfx5252-stress-ssd 1G --runtime %d --passes %d --write --force --log /host/hw-eval/jobs/qfx5252-stress-ssd.log" SSD_RUNTIME SSD_COUNT
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "bgctl run qfx5252-stress-ssd 1G --runtime 86400 --passes 5 --write --force --log /host/hw-eval/jobs/qfx5252-stress-ssd.log"
|
;sendln "bgctl run qfx5252-stress-ssd 1G --runtime 86400 --passes 5 --write --force --log /host/hw-eval/jobs/qfx5252-stress-ssd.log"
|
||||||
|
sendln cmd_ssd
|
||||||
|
|
||||||
; ========== USB read/write ==========
|
; ========== USB read/write ==========
|
||||||
; ---- Get USB partition node -> usb_dev ----
|
; ---- Get USB partition node -> usb_dev ----
|
||||||
@@ -52,7 +59,8 @@ waitregex '<<DEV=([^>]*)>>'
|
|||||||
usb_dev = groupmatchstr1
|
usb_dev = groupmatchstr1
|
||||||
|
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sprintf2 cmd "bgctl run qfx5252-stress-usb %s 256M --runtime 86400 --passes 1 --write --log /host/hw-eval/jobs/qfx5252-stress-usb.log" usb_dev
|
;sprintf2 cmd "bgctl run qfx5252-stress-usb %s 256M --runtime 86400 --passes 1 --write --log /host/hw-eval/jobs/qfx5252-stress-usb.log" usb_dev
|
||||||
|
sprintf2 cmd "bgctl run qfx5252-stress-usb %s 256M --runtime %d --passes %d --write --log /host/hw-eval/jobs/qfx5252-stress-usb.log" usb_dev USB_RUNTIME USB_COUNT
|
||||||
sendln cmd
|
sendln cmd
|
||||||
|
|
||||||
;wait prompt_sonic_root
|
;wait prompt_sonic_root
|
||||||
@@ -62,6 +70,8 @@ sendln cmd
|
|||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "jobs"
|
sendln "jobs"
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
|
sendln "systemctl is-active mlucas-amm"
|
||||||
|
wait prompt_sonic_root
|
||||||
sendln "bgctl list"
|
sendln "bgctl list"
|
||||||
|
|
||||||
; ========== BMC USB Test ==========
|
; ========== BMC USB Test ==========
|
||||||
@@ -73,6 +83,7 @@ if result = 0 then
|
|||||||
messagebox 'cdc_ncm interface not found. Ping test skipped.' 'ERROR'
|
messagebox 'cdc_ncm interface not found. Ping test skipped.' 'ERROR'
|
||||||
goto skip_ping
|
goto skip_ping
|
||||||
endif
|
endif
|
||||||
|
timeout = 0
|
||||||
strlen matchstr
|
strlen matchstr
|
||||||
cut_len = result - 6 ; 'NCMIF=' = 6 chars
|
cut_len = result - 6 ; 'NCMIF=' = 6 chars
|
||||||
strcopy matchstr 7 cut_len ncm_if ; -> ncm_if = "eth2" / "eth3"
|
strcopy matchstr 7 cut_len ncm_if ; -> ncm_if = "eth2" / "eth3"
|
||||||
@@ -85,7 +96,7 @@ wait prompt_sonic_root
|
|||||||
sendln 'systemctl stop qfx5252-bmc-usb-net-test.service 2>/dev/null || true'
|
sendln 'systemctl stop qfx5252-bmc-usb-net-test.service 2>/dev/null || true'
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln 'systemctl reset-failed qfx5252-bmc-usb-net-test.service 2>/dev/null || true'
|
sendln 'systemctl reset-failed qfx5252-bmc-usb-net-test.service 2>/dev/null || true'
|
||||||
sprintf2 cmd 'systemd-run --unit=qfx5252-bmc-usb-net-test --property=Type=exec /usr/bin/ping -I %s -i 1 -W 2 -w 14400 192.168.200.200' ncm_if
|
sprintf2 cmd 'systemd-run --unit=qfx5252-bmc-usb-net-test --property=Type=exec /usr/bin/ping -I %s -i 1 -W 2 -w %d 192.168.200.200' ncm_if BMC_USB_RUNTIME
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln cmd
|
sendln cmd
|
||||||
|
|
||||||
@@ -112,12 +123,6 @@ sendln "~/Blanton_Script/nfc_polling.sh status"
|
|||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "show interfaces status Ethernet513,Ethernet514"
|
sendln "show interfaces status Ethernet513,Ethernet514"
|
||||||
|
|
||||||
;=============================================================================================================
|
|
||||||
; ========== 100G PRBS ==========
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "~/Blanton_Script/port_prbs_monitor.sh start"
|
|
||||||
;=============================================================================================================
|
|
||||||
|
|
||||||
|
|
||||||
; ========== Traffic START ==========
|
; ========== Traffic START ==========
|
||||||
; Silent MAC
|
; Silent MAC
|
||||||
@@ -175,5 +180,7 @@ while 1
|
|||||||
sendln "bgctl list"
|
sendln "bgctl list"
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "jobs"
|
sendln "jobs"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "systemctl is-active mlucas-amm"
|
||||||
pause 60
|
pause 60
|
||||||
endwhile
|
endwhile
|
||||||
|
|||||||
@@ -12,6 +12,11 @@ pause 1
|
|||||||
|
|
||||||
; ========== Kill Process ==========
|
; ========== Kill Process ==========
|
||||||
include "utils/kill_all_process.ttl"
|
include "utils/kill_all_process.ttl"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "systemctl is-active mlucas-amm"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "systemctl stop mlucas-amm"
|
||||||
|
|
||||||
; bgctrl all stop
|
; bgctrl all stop
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "bgctl stop --all"
|
sendln "bgctl stop --all"
|
||||||
@@ -28,23 +33,6 @@ sendln "~/Blanton_Script/mgmt_ping_monitor.sh stop"
|
|||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "~/Blanton_Script/nfc_polling.sh stop"
|
sendln "~/Blanton_Script/nfc_polling.sh stop"
|
||||||
|
|
||||||
;=============================================================================================================
|
|
||||||
; 100G PRBS STOP
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "~/Blanton_Script/port_prbs_monitor.sh stop"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "sudo sfputil lpmode off Ethernet513"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "sudo sfputil lpmode off Ethernet514"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "config interface -n asic0 startup Ethernet513"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "config interface -n asic1 startup Ethernet514"
|
|
||||||
;=============================================================================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ========== TAKE DATA ==========
|
; ========== TAKE DATA ==========
|
||||||
include "utils/setup_pmon.ttl"
|
include "utils/setup_pmon.ttl"
|
||||||
include "utils/show_dmesg.ttl"
|
include "utils/show_dmesg.ttl"
|
||||||
@@ -61,15 +49,6 @@ include "utils/show_pcie_error_reg_SSD.ttl"
|
|||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "/usr/sbin/ras-mc-ctl --summary"
|
sendln "/usr/sbin/ras-mc-ctl --summary"
|
||||||
|
|
||||||
; ========== BMC DDR TAKE DATA ==========
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "./Blanton_Script/bmc_monitor_ddr.sh stop"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "./Blanton_Script/bmc_monitor.sh stop"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "cat ./Blanton_Script/log/bmc_poll.log"
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "cat ./Blanton_Script/log/bmc_ddr.log"
|
|
||||||
|
|
||||||
; ========== BMC Monitor TAKE DATA ==========
|
; ========== BMC Monitor TAKE DATA ==========
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
@@ -103,10 +82,6 @@ sendln "~/Blanton_Script/nfc_polling.sh report"
|
|||||||
; ========== 100G Port ==========
|
; ========== 100G Port ==========
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "show interfaces status Ethernet513,Ethernet514"
|
sendln "show interfaces status Ethernet513,Ethernet514"
|
||||||
;=============================================================================================================
|
|
||||||
;wait prompt_sonic_root
|
|
||||||
;sendln "cat ~/Blanton_Script/log/port_prbs.log "
|
|
||||||
;=============================================================================================================
|
|
||||||
|
|
||||||
; ========== CHECK Traffic counters ==========
|
; ========== CHECK Traffic counters ==========
|
||||||
if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then
|
if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then
|
||||||
@@ -175,6 +150,10 @@ else
|
|||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
; ========== Collect bcm dsc data ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/bcm_dsc_scan.sh -f blanton_dsc_ScriptC.log -F"
|
||||||
|
|
||||||
|
|
||||||
; ========== NVME Err Info ==========
|
; ========== NVME Err Info ==========
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
@@ -211,6 +190,8 @@ sendln cmd
|
|||||||
|
|
||||||
; ========== Copy Stress Log to USB ==========
|
; ========== Copy Stress Log to USB ==========
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
|
sendln "cp ~/hammer/tools/amd/mlucas_amm_log /host/hw-eval/jobs/"
|
||||||
|
wait prompt_sonic_root
|
||||||
sendln "cp ./Blanton_Script/log/bmc_usb_net.log /host/hw-eval/jobs/"
|
sendln "cp ./Blanton_Script/log/bmc_usb_net.log /host/hw-eval/jobs/"
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "cp ./Blanton_Script/log/bmc_poll.log /host/hw-eval/jobs/"
|
sendln "cp ./Blanton_Script/log/bmc_poll.log /host/hw-eval/jobs/"
|
||||||
@@ -218,8 +199,14 @@ wait prompt_sonic_root
|
|||||||
sendln "cp ./Blanton_Script/log/mgmt_ping.log /host/hw-eval/jobs/"
|
sendln "cp ./Blanton_Script/log/mgmt_ping.log /host/hw-eval/jobs/"
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "cp ./Blanton_Script/log/nfc_poll.log /host/hw-eval/jobs/"
|
sendln "cp ./Blanton_Script/log/nfc_poll.log /host/hw-eval/jobs/"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptA_u0.log /host/hw-eval/jobs/"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptA_u1.log /host/hw-eval/jobs/"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptC_u0.log /host/hw-eval/jobs/"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptC_u1.log /host/hw-eval/jobs/"
|
||||||
|
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
getdate ts_date "%Y%m%d"
|
getdate ts_date "%Y%m%d"
|
||||||
|
|||||||
@@ -129,11 +129,15 @@ include "utils/setup_pmon.ttl"
|
|||||||
include "utils/show_dmesg.ttl"
|
include "utils/show_dmesg.ttl"
|
||||||
|
|
||||||
; ========== Full Load ==========
|
; ========== Full Load ==========
|
||||||
; AMD CPU STRESS TEST
|
; AMD CPU STRESS TEST
|
||||||
|
; Clear the log file first
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "> ~/hammer/tools/amd/mlucas_amm_log"
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln 'chmod +x ~/hammer/tools/amd/mlucas-avx2'
|
sendln 'chmod +x ~/hammer/tools/amd/mlucas-avx2'
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mlucas_amm_log 2>&1 &"
|
;sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mlucas_amm_log 2>&1 &"
|
||||||
|
sendln "systemd-run --unit=mlucas-amm --property=Type=exec --property=Restart=always --property=RestartSec=2 /bin/bash -c '~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 >> ~/hammer/tools/amd/mlucas_amm_log 2>&1'"
|
||||||
|
|
||||||
; TR518 TEST
|
; TR518 TEST
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
@@ -154,5 +158,7 @@ while 1
|
|||||||
sendln "bgctl list"
|
sendln "bgctl list"
|
||||||
wait prompt_sonic_root
|
wait prompt_sonic_root
|
||||||
sendln "jobs"
|
sendln "jobs"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "systemctl is-active mlucas-amm"
|
||||||
pause 60
|
pause 60
|
||||||
endwhile
|
endwhile
|
||||||
|
|||||||
@@ -0,0 +1,419 @@
|
|||||||
|
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 "Reboot_Cycle" str_starttime
|
||||||
|
logopen filename 0 1 1 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
cnt_cycle = 0
|
||||||
|
|
||||||
|
while 1
|
||||||
|
cnt_cycle = cnt_cycle + 1
|
||||||
|
; ========== Root Login ==========
|
||||||
|
wait prompt_login
|
||||||
|
sendln "admin"
|
||||||
|
wait "Password:"
|
||||||
|
sendln "YourPaSsWoRd"
|
||||||
|
wait prompt_sonic
|
||||||
|
sendln "sudo -i"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sleep 10"
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strTitle "echo -e '\033[1;32mReboot Cycle : %d \033[0m'" cnt_cycle
|
||||||
|
sendln strTitle
|
||||||
|
|
||||||
|
; ========== Pre Setting ==========
|
||||||
|
; Make log directory
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "mkdir ./logs"
|
||||||
|
|
||||||
|
; Setting System Time
|
||||||
|
getdate datestr
|
||||||
|
gettime timestr
|
||||||
|
sprintf2 cmd 'sudo date -s "%s %s"' datestr timestr
|
||||||
|
sendln cmd
|
||||||
|
|
||||||
|
; ========== FAN SPEED ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "echo 18-0020 > /sys/bus/i2c/drivers/max31790/unbind"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sleep .5"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "echo 18-0020 > /sys/bus/i2c/drivers/max31790/bind"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "echo 25-0020 > /sys/bus/i2c/drivers/max31790/unbind"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sleep .5"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "echo 25-0020 > /sys/bus/i2c/drivers/max31790/bind"
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 fan_ctrl_cmd 'fan-speed-control.sh %d' FAN_SPEED
|
||||||
|
sendln fan_ctrl_cmd
|
||||||
|
|
||||||
|
wait "Set all configured fan channels to"
|
||||||
|
sendln "y"
|
||||||
|
|
||||||
|
; ========== Wait DUT Init ==========
|
||||||
|
include "utils/wait_init.ttl"
|
||||||
|
|
||||||
|
; ========== DUT Info ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt1 "echo -e '\033[36mCheck Pt1 : DUT Info\033[0m'"
|
||||||
|
sendln strCKPt1
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "show boot"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "show version"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "fwutil show status"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "show system-memory"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "show service"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "show platform syseeprom"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "show platform ssdhealth"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "qfx5252-tpm-version"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "/usr/sbin/nvme smart-log -H /dev/nvme0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "/usr/sbin/smartctl -x /dev/nvme0"
|
||||||
|
|
||||||
|
; ========== BMC version ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt2 "echo -e '\033[36mCheck Pt2 : BMC Info\033[0m'"
|
||||||
|
sendln strCKPt2
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "bmc-first-enroll"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "bmc-manager version"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "bmc-manager status"
|
||||||
|
|
||||||
|
; ========== Load Shell Script ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "source ~/Blanton_Script/blanton_fpga_pcimem.sh"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "source ~/Blanton_Script/blanton_cb_i2c.sh"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "source ~/Blanton_Script/blanton_icb_vi2c.sh"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "source ~/Blanton_Script/blanton_pwr_data.sh"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "source ~/Blanton_Script/blanton_traffic_linespeed.sh"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "source ~/Blanton_Script/LTC2980_Margin_Script/margin.sh"
|
||||||
|
|
||||||
|
; ========== CLEAR PCIE Error ==========
|
||||||
|
include "utils/show_pcie_error_reg_TH6_SWB0.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_TH6_SWB1.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_FPGA.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_BMC.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_DDR.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_I210.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_SSD.ttl"
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "/usr/sbin/ras-mc-ctl --summary"
|
||||||
|
|
||||||
|
; ========== Check PCIE tree + PCIE link status + GET PCIE bandwidth Test ==========
|
||||||
|
include "utils/pcie_bus.ttl"
|
||||||
|
|
||||||
|
; ========== TAKE DATA ==========
|
||||||
|
include "utils/setup_pmon.ttl"
|
||||||
|
include "utils/show_dmesg.ttl"
|
||||||
|
|
||||||
|
; ========== 10G/1G MGMT Ping Test ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt3 "echo -e '\033[36mCheck Pt3 : Mgmt Ping Test\033[0m'"
|
||||||
|
sendln strCKPt3
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/mgmt_ping_monitor.sh start"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
pause 30
|
||||||
|
sendln "~/Blanton_Script/mgmt_ping_monitor.sh stop"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "cat ~/Blanton_Script/log/mgmt_ping.log"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "~/Blanton_Script/mgmt_ping_monitor.sh clear"
|
||||||
|
|
||||||
|
; ========== NFC Test ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt4 "echo -e '\033[36mCheck Pt4 : NFC Test\033[0m'"
|
||||||
|
sendln strCKPt4
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "~/Blanton_Script/nfc_polling.sh start"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "~/Blanton_Script/nfc_polling.sh status"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sleep 20"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "~/Blanton_Script/nfc_polling.sh stop"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "~/Blanton_Script/nfc_polling.sh report"
|
||||||
|
|
||||||
|
; ========== SSD read/write ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt5 "echo -e '\033[36mCheck Pt5 : SSD Test\033[0m'"
|
||||||
|
sendln strCKPt5
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "qfx5252-stress-ssd 1G --runtime 30 --passes 2 --write --force --log /host/hw-eval/jobs/qfx5252-stress-ssd.log"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "cat /host/hw-eval/jobs/qfx5252-stress-ssd.log"
|
||||||
|
|
||||||
|
; ========== USB read/write ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt6 "echo -e '\033[36mCheck Pt6 : USB Test\033[0m'"
|
||||||
|
sendln strCKPt6
|
||||||
|
|
||||||
|
; ---- Get USB partition node -> usb_dev ----
|
||||||
|
usb_dev = ''
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln 'D=$(bash ~/Blanton_Script/usb_target.sh -o dev 2>/dev/null); echo "<<D""EV=${D:-NONE}>>"'
|
||||||
|
waitregex '<<DEV=([^>]*)>>'
|
||||||
|
usb_dev = groupmatchstr1
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 cmd "qfx5252-stress-usb %s 256M --runtime 30 --passes 2 --write --log /host/hw-eval/jobs/qfx5252-stress-usb.log" usb_dev
|
||||||
|
sendln cmd
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "cat /host/hw-eval/jobs/qfx5252-stress-usb.log"
|
||||||
|
|
||||||
|
; ========== BMC USB Test ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt7 "echo -e '\033[36mCheck Pt7 : BMC USB Test\033[0m'"
|
||||||
|
sendln strCKPt7
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln 'echo "NCMIF=$(ls -d /sys/bus/usb/drivers/cdc_ncm/*/net/* 2>/dev/null | head -n 1 | xargs -r basename)"'
|
||||||
|
; timeout is GLOBAL and sticky: left at 15, every 'wait' below gives up after
|
||||||
|
; 15 s instead of blocking, the macro runs ahead of the DUT and the whole
|
||||||
|
; cycle desynchronises. Restore it BEFORE the branch so both paths are
|
||||||
|
; covered - the ping block below waits on 'sleep 10', which is already two
|
||||||
|
; thirds of the 15 s cap on a loaded DUT.
|
||||||
|
timeout = 15
|
||||||
|
waitregex 'NCMIF=[A-Za-z0-9_-]+'
|
||||||
|
ncm_found = result ; hold it: 'result' is reused below
|
||||||
|
timeout = 0 ; restore, both paths
|
||||||
|
if ncm_found = 0 then
|
||||||
|
messagebox 'cdc_ncm interface not found. Ping test skipped.' 'ERROR'
|
||||||
|
goto skip_ping
|
||||||
|
endif
|
||||||
|
strlen matchstr
|
||||||
|
cut_len = result - 6 ; 'NCMIF=' = 6 chars
|
||||||
|
strcopy matchstr 7 cut_len ncm_if ; -> ncm_if = "eth2" / "eth3"
|
||||||
|
|
||||||
|
sprintf2 cmd 'ip -br link show %s' ncm_if
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln cmd
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln 'systemctl stop qfx5252-bmc-usb-net-test.service 2>/dev/null || true'
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln 'systemctl reset-failed qfx5252-bmc-usb-net-test.service 2>/dev/null || true'
|
||||||
|
sprintf2 cmd 'systemd-run --unit=qfx5252-bmc-usb-net-test --property=Type=exec /usr/bin/ping -I %s -i 1 -W 2 -w 14400 192.168.200.200' ncm_if
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln cmd
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sleep 10"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "systemctl stop qfx5252-bmc-usb-net-test.service"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "journalctl -u qfx5252-bmc-usb-net-test.service --no-pager"
|
||||||
|
|
||||||
|
:skip_ping
|
||||||
|
timeout = 0 ; backstop, same as Script B
|
||||||
|
|
||||||
|
; ========== 100G Port Setting ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sudo sfputil lpmode off Ethernet513"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sudo sfputil lpmode off Ethernet514"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "config interface -n asic0 startup Ethernet513"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "config interface -n asic1 startup Ethernet514"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "config save -y"
|
||||||
|
|
||||||
|
; ========== First Traffic Test ==========
|
||||||
|
; Silent MAC
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "config feature state lldp disabled"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "config save -y"
|
||||||
|
|
||||||
|
; ========== 100G Port Status ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt8 "echo -e '\033[36mCheck Pt8 : Port Status and 15sec Traffic \033[0m'"
|
||||||
|
sendln strCKPt8
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "show interfaces status Ethernet513,Ethernet514"
|
||||||
|
|
||||||
|
; ========== Traffic Test ==========
|
||||||
|
if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed ps"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed init"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed clear"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed show"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed start"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
pause 15
|
||||||
|
sendln "blanton_traffic_linespeed stop"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed report"
|
||||||
|
elseif SWB_UNIT0 = 1 && SWB_UNIT1 = 0 then
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed ps -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed init -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed clear -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed show -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed start -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
pause 15
|
||||||
|
sendln "blanton_traffic_linespeed stop -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed report -u 0"
|
||||||
|
elseif SWB_UNIT0 = 0 && SWB_UNIT1 = 1 then
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed ps -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed init -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed clear -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed show -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed start -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
pause 15
|
||||||
|
sendln "blanton_traffic_linespeed stop -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "blanton_traffic_linespeed report -u 1"
|
||||||
|
else
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
; ========== BER ==========
|
||||||
|
; PRBS takes the SerDes out of normal operation, so this runs AFTER the
|
||||||
|
; traffic report. sleep 30 matches blanton_ber.sh BER_INTERVAL - reporting
|
||||||
|
; earlier reads an interval that has not finished accumulating.
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt8 "echo -e '\033[36mCheck Pt9 : BER Test \033[0m'"
|
||||||
|
sendln strCKPt8
|
||||||
|
|
||||||
|
if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh init"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh start"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sleep 30"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh report"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh stop"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh clear"
|
||||||
|
elseif SWB_UNIT0 = 1 && SWB_UNIT1 = 0 then
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh init -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh start -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sleep 30"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh report -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh stop -u 0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh clear -u 0"
|
||||||
|
elseif SWB_UNIT0 = 0 && SWB_UNIT1 = 1 then
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh init -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh start -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "sleep 30"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh report -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh stop -u 1"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "./Blanton_Script/blanton_ber.sh clear -u 1"
|
||||||
|
else
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
; ========== NVME Err Info ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt9 "echo -e '\033[36mCheck Pt10 : NVME Err Info \033[0m'"
|
||||||
|
sendln strCKPt9
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "/usr/sbin/nvme smart-log -H /dev/nvme0"
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "/usr/sbin/smartctl -x /dev/nvme0"
|
||||||
|
|
||||||
|
; ========== TAKE DATA ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt10 "echo -e '\033[36mCheck Pt11 : Platform Data \033[0m'"
|
||||||
|
sendln strCKPt10
|
||||||
|
include "utils/setup_pmon.ttl"
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt12 "echo -e '\033[36mCheck Pt12 : Dmesg_i2c \033[0m'"
|
||||||
|
sendln strCKPt12
|
||||||
|
include "utils/show_dmesg.ttl"
|
||||||
|
|
||||||
|
; ========== Check PCIE error counters ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sprintf2 strCKPt13 "echo -e '\033[36mCheck Pt13 : PCIE Error Counters \033[0m'"
|
||||||
|
sendln strCKPt13
|
||||||
|
include "utils/show_pcie_error_reg_TH6_SWB0.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_TH6_SWB1.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_FPGA.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_BMC.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_DDR.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_I210.ttl"
|
||||||
|
include "utils/show_pcie_error_reg_SSD.ttl"
|
||||||
|
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "/usr/sbin/ras-mc-ctl --summary"
|
||||||
|
|
||||||
|
; ========== Show Power on uptime ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "show uptime"
|
||||||
|
|
||||||
|
; ========== Show Power on uptime ==========
|
||||||
|
wait prompt_sonic_root
|
||||||
|
sendln "reboot"
|
||||||
|
|
||||||
|
wait "Booting in blind mode"
|
||||||
|
endwhile
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# =============================================================================
|
||||||
|
# bcm_dsc_parse_V1.0.0.sh
|
||||||
|
#
|
||||||
|
# Author : ETWen
|
||||||
|
# Date : 20260906
|
||||||
|
#
|
||||||
|
# Version History
|
||||||
|
# V1.0.0 20260906 Initial Version
|
||||||
|
#
|
||||||
|
# Description:
|
||||||
|
# Parse Broadcom diag shell "phydiag <pm_id> dsc" raw log into CSV.
|
||||||
|
# 支援多個 pm_id 串接在同一份 log,以 "pm_id =" 當 record separator。
|
||||||
|
#
|
||||||
|
# Output:
|
||||||
|
# <prefix>_lane.csv : 每個 lane 一列(TXEQ / RXFFE / DFE / EYE / SNR ...)
|
||||||
|
# <prefix>_pm.csv : 每個 pm_id 一列(溫度 / PLL / lane 數 / SNR-EYE 統計)
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./bcm_dsc_parse_V1.0.0.sh -i dsc_raw.log [-o out_prefix]
|
||||||
|
#
|
||||||
|
# Design notes:
|
||||||
|
# - 純 POSIX sh + awk(mawk 相容),不依賴 Python。
|
||||||
|
# - Lane row 採「括號群組出現順序」抽取,而非固定欄位位置,對排版空白
|
||||||
|
# 變動免疫。SDK 若增減欄位,群組數不等於 9,該列會被標記 UNPARSED
|
||||||
|
# 並輸出到 stderr,不會靜默解析錯誤。
|
||||||
|
# - 已知 header 名稱數與資料欄數不一致之處:
|
||||||
|
# * (P RX, CDRxN, UC_CFG, UC_STS, RST, STP) 6 個名字 / 7 個值
|
||||||
|
# (RST 實際是 "0,0" 兩欄)
|
||||||
|
# * TXEQ 尾端多一個逗號
|
||||||
|
# * AVG_TMON 顯示為 "(11) 66C" 兩個 token
|
||||||
|
# - SD / LCK 的 "*" 為 sticky 旗標,本版拆成獨立欄位保留,不做判讀。
|
||||||
|
# - BER 欄若為 "!chk_en" 表示 checker 未開啟,值無效,原樣保留。
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IN=""
|
||||||
|
PREFIX="dsc"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 -i <raw_log> [-o <out_prefix>]" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
while getopts "i:o:h" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
i) IN="$OPTARG" ;;
|
||||||
|
o) PREFIX="$OPTARG" ;;
|
||||||
|
*) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
[ -n "$IN" ] || usage
|
||||||
|
[ -f "$IN" ] || { echo "ERROR: input not found: $IN" >&2; exit 2; }
|
||||||
|
|
||||||
|
LANE_CSV="${PREFIX}_lane.csv"
|
||||||
|
PM_CSV="${PREFIX}_pm.csv"
|
||||||
|
|
||||||
|
# 先去掉 CR(console / telnet log 常帶),再交給 awk
|
||||||
|
tr -d '\r' < "$IN" | awk -v LANE_CSV="$LANE_CSV" -v PM_CSV="$PM_CSV" '
|
||||||
|
function trim(s) { sub(/^[ \t]+/, "", s); sub(/[ \t]+$/, "", s); return s }
|
||||||
|
|
||||||
|
# 掃描一列,取出所有頂層括號群組到 G[],群組前的英數 prefix 到 P[],
|
||||||
|
# 其餘純量文字留在 REST。回傳群組數。
|
||||||
|
function split_groups(line, i, ch, d, buf, ng, rest, prefix) {
|
||||||
|
split("", G, ":"); split("", P, ":")
|
||||||
|
ng = 0; d = 0; buf = ""; rest = ""; prefix = ""
|
||||||
|
for (i = 1; i <= length(line); i++) {
|
||||||
|
ch = substr(line, i, 1)
|
||||||
|
if (ch == "(") {
|
||||||
|
d++
|
||||||
|
if (d == 1) {
|
||||||
|
buf = ""; prefix = ""
|
||||||
|
if (match(rest, /[A-Za-z_]+$/)) {
|
||||||
|
prefix = substr(rest, RSTART, RLENGTH)
|
||||||
|
rest = substr(rest, 1, RSTART - 1)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ch == ")") {
|
||||||
|
d--
|
||||||
|
if (d == 0) { ng++; G[ng] = buf; P[ng] = prefix; rest = rest " "; continue }
|
||||||
|
}
|
||||||
|
if (d > 0) { buf = buf ch; continue }
|
||||||
|
rest = rest ch
|
||||||
|
}
|
||||||
|
REST = rest
|
||||||
|
return ng
|
||||||
|
}
|
||||||
|
|
||||||
|
# 取括號群組的第 n 個子欄位(以逗號分隔)
|
||||||
|
function gf(idx, n, a, c) {
|
||||||
|
c = split(G[idx], a, ",")
|
||||||
|
if (n > c) return ""
|
||||||
|
return trim(a[n])
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_num(s) { return (s ~ /^[+-]?[0-9]+(\.[0-9]+)?$/) }
|
||||||
|
|
||||||
|
function reset_pm() {
|
||||||
|
core = ""; sdtype = ""; hw_lanes = ""; lane_sel = ""
|
||||||
|
live_temp = ""; avg_tmon = ""; pll_lock = ""
|
||||||
|
n_lane = 0; snr_min = ""; snr_max = ""; eye_min = ""; all_lck = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function flush_pm() {
|
||||||
|
if (pm == "") return
|
||||||
|
printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n",
|
||||||
|
pm, core, sdtype, hw_lanes, lane_sel, n_lane,
|
||||||
|
live_temp, avg_tmon, pll_lock,
|
||||||
|
(snr_min == "" ? "NA" : snr_min),
|
||||||
|
(eye_min == "" ? "NA" : eye_min),
|
||||||
|
(n_lane == 0 ? "NA" : (all_lck ? "PASS" : "FAIL")) > PM_CSV
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
pm = ""; in_lane = 0; core_row = 0; bad = 0
|
||||||
|
print "pm_id,core,lane,serdes_type,sd,sd_sticky,lck,lck_sticky,rxppm,txppm," \
|
||||||
|
"txeq_n3,txeq_n2,txeq_n1,txeq_m,txeq_p1,txeq_p2,txeq_sum," \
|
||||||
|
"rxffe_n3,rxffe_n2,rxffe_n1,rxffe_m,rxffe_p1,rxffe_p2," \
|
||||||
|
"dfe1,dfe2,pf_m,pf_l,pf_h,vga,dco,tp0,tp1,tp2,flt_m,flt_s," \
|
||||||
|
"nlc_u,nlc_l,eye_u,eye_m,eye_l,link_time,snr,ber," \
|
||||||
|
"live_temp,avg_tmon,pll_lock,rx_pol,cdr,uc_cfg,uc_sts,rst,stp" > LANE_CSV
|
||||||
|
print "pm_id,core,serdes_type,hw_lanes,lane_select,active_lanes," \
|
||||||
|
"live_temp,avg_tmon,pll_lock,snr_min,eye_min,lck_all" > PM_CSV
|
||||||
|
}
|
||||||
|
|
||||||
|
/^pm_id[ \t]*=/ { flush_pm(); pm = $NF; reset_pm(); in_lane = 0; next }
|
||||||
|
/^Core[ \t]*=/ { if (match($0, /Core[ \t]*=[ \t]*[0-9]+/)) { core = $0; sub(/.*Core[ \t]*=[ \t]*/, "", core); sub(/[^0-9].*/, "", core) } next }
|
||||||
|
/^SerDes type[ \t]*=/ { sdtype = $NF; next }
|
||||||
|
/^Rev ID # Lanes/ { hw_lanes = $NF; next }
|
||||||
|
/^lane_select[ \t]*=/ { lane_sel = $NF; next }
|
||||||
|
|
||||||
|
/^CORE[ \t]+RST_ST/ { core_row = 1; next }
|
||||||
|
core_row == 1 {
|
||||||
|
line = $0
|
||||||
|
gsub(/\([^)]*\)[ \t]*/, "", line) # 去掉 AVG_TMON 的 "(11)"
|
||||||
|
n = split(trim(line), c, /[ \t]+/)
|
||||||
|
if (n >= 15) { live_temp = c[9]; avg_tmon = c[10]; pll_lock = c[15] }
|
||||||
|
core_row = 0
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
/^LN[ \t]*\(/ { in_lane = 1; next }
|
||||||
|
/SERDES DISPLAY DIAG DATA END/ { in_lane = 0; next }
|
||||||
|
|
||||||
|
in_lane && /^[0-9]+[ \t]*\(/ {
|
||||||
|
ng = split_groups($0)
|
||||||
|
if (ng != 9) {
|
||||||
|
printf "UNPARSED (groups=%d) pm_id=%s: %s\n", ng, pm, $0 > "/dev/stderr"
|
||||||
|
bad++
|
||||||
|
next
|
||||||
|
}
|
||||||
|
nr = split(trim(REST), r, /[ \t]+/)
|
||||||
|
if (nr != 10) {
|
||||||
|
printf "UNPARSED (scalars=%d) pm_id=%s: %s\n", nr, pm, $0 > "/dev/stderr"
|
||||||
|
bad++
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
lane = r[1]
|
||||||
|
sd = r[2]; sd_st = (sd ~ /\*/) ? 1 : 0; gsub(/\*/, "", sd)
|
||||||
|
lck = r[3]; lck_st = (lck ~ /\*/) ? 1 : 0; gsub(/\*/, "", lck)
|
||||||
|
rxppm = r[4]; vga = r[5]; dco = r[6]; txppm = r[7]
|
||||||
|
link_time = r[8]; snr = r[9]; ber = r[10]
|
||||||
|
|
||||||
|
# TXEQ 六個 tap 與總和(僅在全為數值時計算)
|
||||||
|
tsum = 0; tok = 1
|
||||||
|
for (i = 1; i <= 6; i++) {
|
||||||
|
tq[i] = gf(7, i)
|
||||||
|
if (is_num(tq[i])) tsum += tq[i]; else tok = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,", pm, core, lane, sdtype, sd, sd_st, lck, lck_st, rxppm, txppm > LANE_CSV
|
||||||
|
printf "%s,%s,%s,%s,%s,%s,%s,", tq[1], tq[2], tq[3], tq[4], tq[5], tq[6], (tok ? tsum : "NA") > LANE_CSV
|
||||||
|
printf "%s,%s,%s,%s,%s,%s,", gf(4,1), gf(4,2), gf(4,3), gf(4,4), gf(4,5), gf(4,6) > LANE_CSV
|
||||||
|
printf "%s,%s,", gf(5,1), gf(5,2) > LANE_CSV
|
||||||
|
printf "%s,%s,%s,%s,%s,", gf(2,1), gf(2,2), gf(2,3), vga, dco > LANE_CSV
|
||||||
|
printf "%s,%s,%s,%s,%s,", gf(3,1), gf(3,2), gf(3,3), gf(6,1), gf(6,2) > LANE_CSV
|
||||||
|
printf "%s,%s,%s,%s,%s,", gf(8,1), gf(8,2), gf(9,1), gf(9,2), gf(9,3) > LANE_CSV
|
||||||
|
printf "%s,%s,%s,", link_time, snr, ber > LANE_CSV
|
||||||
|
printf "%s,%s,%s,", live_temp, avg_tmon, pll_lock > LANE_CSV
|
||||||
|
printf "%s,%s,%s,%s,%s/%s,%s\n", gf(1,1), gf(1,2), gf(1,3), gf(1,4), gf(1,5), gf(1,6), gf(1,7) > LANE_CSV
|
||||||
|
|
||||||
|
# per-PM 統計
|
||||||
|
n_lane++
|
||||||
|
if (lck != "1" || sd != "1") all_lck = 0
|
||||||
|
if (is_num(snr)) { if (snr_min == "" || snr + 0 < snr_min + 0) snr_min = snr }
|
||||||
|
for (i = 1; i <= 3; i++) {
|
||||||
|
e = gf(9, i)
|
||||||
|
if (is_num(e)) { if (eye_min == "" || e + 0 < eye_min + 0) eye_min = e }
|
||||||
|
}
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
END {
|
||||||
|
flush_pm()
|
||||||
|
if (bad > 0) printf "WARN: %d lane row(s) unparsed\n", bad > "/dev/stderr"
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
|
echo "OK: ${LANE_CSV}, ${PM_CSV}"
|
||||||
@@ -0,0 +1,335 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# =============================================================================
|
||||||
|
# bcm_dsc_scan.sh
|
||||||
|
#
|
||||||
|
# Author : ETWen
|
||||||
|
# Date : 20260906
|
||||||
|
#
|
||||||
|
# Version History
|
||||||
|
# V1.0.0 20260906 Initial Version
|
||||||
|
# V1.1.0 20260906 Log 預設輸出至 <script_dir>/log,掃描後自動複製到
|
||||||
|
# /host/hw-eval/jobs/;非 tty 環境改用逐行進度輸出,
|
||||||
|
# 避免灌爆 Tera Term logopen 的 log
|
||||||
|
# V1.2.0 20260906 新增 -f 自訂 log 檔名(支援 %u / %t 佔位符)與
|
||||||
|
# -F 強制覆蓋;預設不覆蓋既有檔案,自動加序號
|
||||||
|
#
|
||||||
|
# Description:
|
||||||
|
# 在 Blanton SONiC DUT 上批次執行 Broadcom diag shell 的
|
||||||
|
# "phydiag <port> dsc",收集 raw log 供離線解析。
|
||||||
|
#
|
||||||
|
# 實際下的指令為:
|
||||||
|
# bcmcmd -n <unit> -c "dsh -c 'phydiag <port> dsc'"
|
||||||
|
#
|
||||||
|
# Deployment:
|
||||||
|
# Script : /root/Blanton_Script/bcm_dsc_scan.sh
|
||||||
|
# Log : /root/Blanton_Script/log/dsc_raw_u<unit>_<YYYYmmdd_HHMMSS>.log
|
||||||
|
# Copy : /host/hw-eval/jobs/
|
||||||
|
#
|
||||||
|
# Log 檔名可用 -f 覆寫,支援兩個佔位符:
|
||||||
|
# %u -> u0 / u1
|
||||||
|
# %t -> YYYYmmdd_HHMMSS
|
||||||
|
# -f 只接受檔名,不接受路徑;目錄一律由 -o 決定。
|
||||||
|
# 同時掃兩個 unit 但檔名未含 %u 時,會自動在副檔名前插入 _u<unit>,
|
||||||
|
# 避免第二個 unit 覆蓋掉第一個。
|
||||||
|
#
|
||||||
|
# 路徑由 $0 推導,不依賴 $HOME。Script A 以 sudo -i 執行時 ~ 為 /root,
|
||||||
|
# 直接寫死 ~ 會有風險,故一律使用絕對路徑。
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./bcm_dsc_scan.sh # unit 0 與 1 都掃,掃完自動複製
|
||||||
|
# ./bcm_dsc_scan.sh -u 0 # 只掃 unit 0
|
||||||
|
# ./bcm_dsc_scan.sh -n # dry-run,只列出要掃的 port
|
||||||
|
# ./bcm_dsc_scan.sh -C # 不複製到 /host/hw-eval/jobs
|
||||||
|
# ./bcm_dsc_scan.sh -c /other/dir # 指定複製目的地
|
||||||
|
# ./bcm_dsc_scan.sh -u 0 -f dsc_before_reboot.log
|
||||||
|
# ./bcm_dsc_scan.sh -f blanton_dsc_%u_%t.log
|
||||||
|
#
|
||||||
|
# Exit code:
|
||||||
|
# 0 = 全部 port 皆取得完整 dump
|
||||||
|
# 1 = 有 port 未取得完整 dump,或複製失敗
|
||||||
|
# 2 = 參數 / 路徑錯誤
|
||||||
|
# 3 = 找不到 bcmcmd
|
||||||
|
#
|
||||||
|
# 結束時固定輸出一行 "### DSC_SCAN_DONE rc=<n>",供 TTL 端 wait 判斷。
|
||||||
|
#
|
||||||
|
# Design notes:
|
||||||
|
# - 純 POSIX sh,不依賴 bash / Python。
|
||||||
|
# - Port 清單以「範圍字串」定義在下方 PORTS_* 變數,展開後去重。
|
||||||
|
# 100G 清單先展開,故重複的 port 會被判定為 100G(目前僅 port 268)。
|
||||||
|
# - bcmcmd 即使指令失敗通常仍回傳 0,因此不以 exit code 判斷成功與否;
|
||||||
|
# 改由 marker 行 + "SERDES DISPLAY DIAG DATA END" 數量比對。
|
||||||
|
# - 先寫入本機 log 目錄再複製,而非直接寫遠端,避免中途失敗遺失整份資料。
|
||||||
|
#
|
||||||
|
# Assumptions:
|
||||||
|
# - unit 0 與 unit 1 使用相同的 port 清單。
|
||||||
|
# - phydiag 的參數為此清單中的 port 編號(非 port name)。
|
||||||
|
# - 由 root 執行(Script A 的 sudo -i 之後),故不呼叫 sudo。
|
||||||
|
#
|
||||||
|
# Cautions:
|
||||||
|
# - 全清單約 445 port x 2 unit,估計 10 分鐘,請勿把 DELAY 設為 0。
|
||||||
|
# - phydiag ... dsc 為唯讀操作,不會變更 SerDes 設定。
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
set -u
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Port list (以空白分隔的範圍或單一值)
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
PORTS_100G="268"
|
||||||
|
PORTS_200G="1-24 40-96 112-168 184-240 256-308 310-327 342-380 382-399 414-452 454-471 486-524 526-543 558-565"
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Paths / defaults
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) || exit 2
|
||||||
|
|
||||||
|
UNITS="0 1"
|
||||||
|
OUTDIR="${SCRIPT_DIR}/log"
|
||||||
|
COPYDIR="/host/hw-eval/jobs"
|
||||||
|
DELAY="0.2"
|
||||||
|
DRYRUN=0
|
||||||
|
DOCOPY=1
|
||||||
|
LOGNAME="" # -f 指定的 log 檔名,空字串表示使用預設命名
|
||||||
|
FORCE=0 # -F 允許覆蓋既有檔案
|
||||||
|
PROGRESS_EVERY=50 # 非 tty 環境每 N 筆印一行進度
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat >&2 << 'USAGE'
|
||||||
|
Usage: bcm_dsc_scan.sh [-u <0|1>] [-o <outdir>] [-f <logname>] [-F]
|
||||||
|
[-c <copydir>] [-C] [-d <sec>] [-n] [-h]
|
||||||
|
|
||||||
|
-u <unit> 只掃指定 unit。省略則 unit 0 與 1 都掃。
|
||||||
|
-o <dir> log 輸出目錄 (default: <script_dir>/log)
|
||||||
|
-f <name> 自訂 log 檔名(僅檔名,不含路徑)
|
||||||
|
佔位符: %u -> u0/u1 , %t -> YYYYmmdd_HHMMSS
|
||||||
|
default: dsc_raw_%u_%t.log
|
||||||
|
-F 允許覆蓋既有同名檔案 (default: 自動加序號 _1 / _2 ...)
|
||||||
|
-c <dir> 掃描後複製目的地 (default: /host/hw-eval/jobs)
|
||||||
|
-C 不複製
|
||||||
|
-d <sec> 每筆 phydiag 之間的間隔 (default: 0.2)
|
||||||
|
-n dry-run,列出展開後的 port 清單與指令,不實際執行
|
||||||
|
-h 顯示此說明
|
||||||
|
USAGE
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
while getopts "u:o:f:Fc:Cd:nh" opt; do
|
||||||
|
case "$opt" in
|
||||||
|
u)
|
||||||
|
case "$OPTARG" in
|
||||||
|
0|1) UNITS="$OPTARG" ;;
|
||||||
|
*) echo "ERROR: -u 只接受 0 或 1 (got: $OPTARG)" >&2; exit 2 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
o) OUTDIR="$OPTARG" ;;
|
||||||
|
f)
|
||||||
|
case "$OPTARG" in
|
||||||
|
"") echo "ERROR: -f 不可為空" >&2; exit 2 ;;
|
||||||
|
*/*) echo "ERROR: -f 只接受檔名,路徑請用 -o (got: $OPTARG)" >&2; exit 2 ;;
|
||||||
|
*) LOGNAME="$OPTARG" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
F) FORCE=1 ;;
|
||||||
|
c) COPYDIR="$OPTARG" ;;
|
||||||
|
C) DOCOPY=0 ;;
|
||||||
|
d) DELAY="$OPTARG" ;;
|
||||||
|
n) DRYRUN=1 ;;
|
||||||
|
*) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
mkdir -p "$OUTDIR" 2>/dev/null || { echo "ERROR: cannot create outdir: $OUTDIR" >&2; exit 2; }
|
||||||
|
[ -w "$OUTDIR" ] || { echo "ERROR: outdir not writable: $OUTDIR" >&2; exit 2; }
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# sleep 是否支援小數秒(busybox sleep 可能只吃整數)
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
if ! sleep "$DELAY" 2>/dev/null; then
|
||||||
|
echo "WARN: sleep '$DELAY' 不支援,改用 sleep 1" >&2
|
||||||
|
DELAY="1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# 展開 port 清單。100G 先展開,重複者以 100G 為準。
|
||||||
|
# 輸出格式: "<port>,<speed>",依 port 數值排序。
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
PORTFILE=$(mktemp) || { echo "ERROR: mktemp failed" >&2; exit 2; }
|
||||||
|
trap 'rm -f "$PORTFILE"' EXIT
|
||||||
|
trap 'echo "" >&2; echo "### DSC_SCAN_DONE rc=130 (INTERRUPTED)" >&2; rm -f "$PORTFILE"; exit 130' INT TERM
|
||||||
|
|
||||||
|
awk -v a="$PORTS_100G" -v b="$PORTS_200G" '
|
||||||
|
function expand(s, spd, n, i, j, p, k, lo, hi) {
|
||||||
|
n = split(s, p, /[ \t]+/)
|
||||||
|
for (i = 1; i <= n; i++) {
|
||||||
|
if (p[i] == "") continue
|
||||||
|
if (split(p[i], k, "-") == 2) { lo = k[1] + 0; hi = k[2] + 0 }
|
||||||
|
else { lo = p[i] + 0; hi = lo }
|
||||||
|
if (hi < lo) { printf "ERROR: bad range %s\n", p[i] > "/dev/stderr"; continue }
|
||||||
|
for (j = lo; j <= hi; j++) if (!(j in SPD)) SPD[j] = spd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BEGIN {
|
||||||
|
expand(a, "100G") # 先展開 100G,重複的 port 由 100G 取得
|
||||||
|
expand(b, "200G")
|
||||||
|
for (p in SPD) print p "," SPD[p]
|
||||||
|
}' | sort -t, -k1,1n > "$PORTFILE"
|
||||||
|
|
||||||
|
TOTAL=$(wc -l < "$PORTFILE" | tr -d ' ')
|
||||||
|
[ "$TOTAL" -gt 0 ] || { echo "ERROR: port list is empty" >&2; exit 2; }
|
||||||
|
|
||||||
|
N100=$(grep -c ',100G$' "$PORTFILE" || true)
|
||||||
|
N200=$(grep -c ',200G$' "$PORTFILE" || true)
|
||||||
|
|
||||||
|
echo "Script dir : $SCRIPT_DIR" >&2
|
||||||
|
echo "Log dir : $OUTDIR" >&2
|
||||||
|
echo "Port list : $TOTAL ports (200G x2: $N200, 100G: $N100)" >&2
|
||||||
|
echo "Units : $UNITS" >&2
|
||||||
|
echo "Delay : ${DELAY}s" >&2
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Dry-run
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
if [ "$DRYRUN" -eq 1 ]; then
|
||||||
|
for U in $UNITS; do
|
||||||
|
echo "--- unit $U ---"
|
||||||
|
while IFS=, read -r P SPD; do
|
||||||
|
printf 'bcmcmd -n %s -c "dsh -c '\''phydiag %s dsc'\''" # %s\n' "$U" "$P" "$SPD"
|
||||||
|
done < "$PORTFILE"
|
||||||
|
done
|
||||||
|
echo "### DSC_SCAN_DONE rc=0 (dry-run)" >&2
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
command -v bcmcmd > /dev/null 2>&1 || {
|
||||||
|
echo "ERROR: bcmcmd not found in PATH" >&2
|
||||||
|
echo "### DSC_SCAN_DONE rc=3" >&2
|
||||||
|
exit 3
|
||||||
|
}
|
||||||
|
|
||||||
|
# stderr 是 tty 才用 \r 進度條;被導向檔案(Tera Term logopen)時改逐行輸出
|
||||||
|
if [ -t 2 ]; then TTY=1; else TTY=0; fi
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Log 檔名處理
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# 純 POSIX 的字串取代,避免 sed 對檔名中的特殊字元誤判
|
||||||
|
replace_all() { # $1=haystack $2=needle $3=replacement
|
||||||
|
_s=$1; _n=$2; _r=$3; _out=""
|
||||||
|
while :; do
|
||||||
|
case "$_s" in
|
||||||
|
*"$_n"*)
|
||||||
|
_out="${_out}${_s%%"$_n"*}${_r}"
|
||||||
|
_s=${_s#*"$_n"}
|
||||||
|
;;
|
||||||
|
*) _out="${_out}${_s}"; break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
printf '%s' "$_out"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 依 unit 組出 log 檔名。未指定 -f 時使用預設命名。
|
||||||
|
build_logname() { # $1=unit
|
||||||
|
_u=$1
|
||||||
|
_n=${LOGNAME:-dsc_raw_%u_%t.log}
|
||||||
|
case "$_n" in *%u*) _has_u=1 ;; *) _has_u=0 ;; esac
|
||||||
|
_n=$(replace_all "$_n" '%u' "u${_u}")
|
||||||
|
_n=$(replace_all "$_n" '%t' "$TS")
|
||||||
|
# 掃兩個 unit 但檔名沒有 %u,第二個 unit 會覆蓋第一個,故自動加上 _u<unit>
|
||||||
|
if [ "$_has_u" -eq 0 ] && [ "$MULTI" -eq 1 ]; then
|
||||||
|
case "$_n" in
|
||||||
|
*.*) _n="${_n%.*}_u${_u}.${_n##*.}" ;;
|
||||||
|
*) _n="${_n}_u${_u}" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
printf '%s' "$_n"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 檔案已存在時自動加序號,避免覆蓋掉先前的掃描結果(-F 可強制覆蓋)
|
||||||
|
uniquify() { # $1=filename
|
||||||
|
_f=$1
|
||||||
|
[ -e "${OUTDIR}/${_f}" ] || { printf '%s' "$_f"; return; }
|
||||||
|
if [ "$FORCE" -eq 1 ]; then
|
||||||
|
echo "WARN: 覆蓋既有檔案 ${OUTDIR}/${_f}" >&2
|
||||||
|
printf '%s' "$_f"; return
|
||||||
|
fi
|
||||||
|
case "$_f" in
|
||||||
|
*.*) _b=${_f%.*}; _e=".${_f##*.}" ;;
|
||||||
|
*) _b=$_f; _e="" ;;
|
||||||
|
esac
|
||||||
|
_i=1
|
||||||
|
while [ -e "${OUTDIR}/${_b}_${_i}${_e}" ]; do _i=$((_i + 1)); done
|
||||||
|
echo "WARN: ${_f} 已存在,改用 ${_b}_${_i}${_e}(-F 可強制覆蓋)" >&2
|
||||||
|
printf '%s' "${_b}_${_i}${_e}"
|
||||||
|
}
|
||||||
|
|
||||||
|
MULTI=0
|
||||||
|
[ "$(echo "$UNITS" | wc -w | tr -d ' ')" -gt 1 ] && MULTI=1
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Scan
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
TS=$(date +%Y%m%d_%H%M%S)
|
||||||
|
RC=0
|
||||||
|
LOGS=""
|
||||||
|
|
||||||
|
for U in $UNITS; do
|
||||||
|
LOG="${OUTDIR}/$(uniquify "$(build_logname "$U")")"
|
||||||
|
: > "$LOG" || { echo "ERROR: cannot write $LOG" >&2; exit 2; }
|
||||||
|
LOGS="$LOGS $LOG"
|
||||||
|
|
||||||
|
printf '### SCAN_BEGIN unit=%s time=%s total=%s script=bcm_dsc_scan_V1.1.0\n' \
|
||||||
|
"$U" "$(date '+%Y-%m-%d %H:%M:%S')" "$TOTAL" >> "$LOG"
|
||||||
|
|
||||||
|
echo "[unit $U] scanning $TOTAL ports -> $LOG" >&2
|
||||||
|
|
||||||
|
SEQ=0
|
||||||
|
while IFS=, read -r P SPD; do
|
||||||
|
SEQ=$((SEQ + 1))
|
||||||
|
printf '### PORT unit=%s port=%s speed=%s seq=%s/%s\n' "$U" "$P" "$SPD" "$SEQ" "$TOTAL" >> "$LOG"
|
||||||
|
bcmcmd -n "$U" -c "dsh -c 'phydiag $P dsc'" >> "$LOG" 2>&1 || RC=1
|
||||||
|
|
||||||
|
if [ "$TTY" -eq 1 ]; then
|
||||||
|
printf '\r[unit %s] %s/%s port=%-5s' "$U" "$SEQ" "$TOTAL" "$P" >&2
|
||||||
|
elif [ $((SEQ % PROGRESS_EVERY)) -eq 0 ] || [ "$SEQ" -eq "$TOTAL" ]; then
|
||||||
|
printf '[unit %s] %s/%s port=%s\n' "$U" "$SEQ" "$TOTAL" "$P" >&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep "$DELAY"
|
||||||
|
done < "$PORTFILE"
|
||||||
|
|
||||||
|
[ "$TTY" -eq 1 ] && printf '\n' >&2
|
||||||
|
printf '### SCAN_END unit=%s time=%s\n' "$U" "$(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG"
|
||||||
|
|
||||||
|
# 概略檢查:每筆 PORT marker 應對應一個 dsc 區塊
|
||||||
|
MARK=$(grep -c '^### PORT ' "$LOG" || true)
|
||||||
|
DUMP=$(grep -c 'SERDES DISPLAY DIAG DATA END' "$LOG" || true)
|
||||||
|
if [ "$MARK" -ne "$DUMP" ]; then
|
||||||
|
echo "WARN: unit $U markers=$MARK dsc_blocks=$DUMP (有 port 未取得完整 dump)" >&2
|
||||||
|
RC=1
|
||||||
|
fi
|
||||||
|
echo "Saved: $LOG (${DUMP}/${MARK} dumps)" >&2
|
||||||
|
done
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Copy to job directory
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
if [ "$DOCOPY" -eq 1 ]; then
|
||||||
|
if mkdir -p "$COPYDIR" 2>/dev/null && [ -w "$COPYDIR" ]; then
|
||||||
|
for L in $LOGS; do
|
||||||
|
if cp -p "$L" "$COPYDIR/"; then
|
||||||
|
echo "Copied: $COPYDIR/$(basename "$L")" >&2
|
||||||
|
else
|
||||||
|
echo "ERROR: copy failed: $L -> $COPYDIR" >&2
|
||||||
|
RC=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
sync
|
||||||
|
else
|
||||||
|
echo "ERROR: copydir not writable: $COPYDIR (log 仍保留在 $OUTDIR)" >&2
|
||||||
|
RC=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "### DSC_SCAN_DONE rc=${RC}" >&2
|
||||||
|
exit "$RC"
|
||||||
@@ -3,6 +3,12 @@
|
|||||||
# blanton_multiphase_margin.sh -- multiphase VRM margin over the native i2c bus
|
# blanton_multiphase_margin.sh -- multiphase VRM margin over the native i2c bus
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Version History:
|
# Version History:
|
||||||
|
# V1.1.0 2026-09-04 Add 'normal' - puts every rail back to its nominal set
|
||||||
|
# point, from tools/Multiphase_Normal.txt. Same 38 rails
|
||||||
|
# and the same per-rail reporting as the margin profiles.
|
||||||
|
# Without it the only way back from a margin was a power
|
||||||
|
# cycle, and 'save' would have committed the margined
|
||||||
|
# values to NVM where a power cycle does not help either.
|
||||||
# V1.0.0 2026-09-01 First version. Bash port of tools/Multiphase_*.txt.
|
# V1.0.0 2026-09-01 First version. Bash port of tools/Multiphase_*.txt.
|
||||||
# high3 / low3 / comboA / comboB / save, -u 0|1|all.
|
# high3 / low3 / comboA / comboB / save, -u 0|1|all.
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -31,6 +37,7 @@
|
|||||||
# ./blanton_multiphase_margin.sh low3 # all rails -3%
|
# ./blanton_multiphase_margin.sh low3 # all rails -3%
|
||||||
# ./blanton_multiphase_margin.sh comboA # mixed high/low, set A
|
# ./blanton_multiphase_margin.sh comboA # mixed high/low, set A
|
||||||
# ./blanton_multiphase_margin.sh comboB # mixed high/low, set B
|
# ./blanton_multiphase_margin.sh comboB # mixed high/low, set B
|
||||||
|
# ./blanton_multiphase_margin.sh normal # back to the nominal set point
|
||||||
# ./blanton_multiphase_margin.sh save # commit to NVM (permanent)
|
# ./blanton_multiphase_margin.sh save # commit to NVM (permanent)
|
||||||
# ./blanton_multiphase_margin.sh high3 -u 0 # SWB0 only
|
# ./blanton_multiphase_margin.sh high3 -u 0 # SWB0 only
|
||||||
# ./blanton_multiphase_margin.sh high3 -n # print commands, touch nothing
|
# ./blanton_multiphase_margin.sh high3 -n # print commands, touch nothing
|
||||||
@@ -811,6 +818,200 @@ i2cset -f -y 14 0x20 0x00 0
|
|||||||
i2ctransfer -f -y 14 w3@0x20 0x21 0x2D 0x01
|
i2ctransfer -f -y 14 w3@0x20 0x21 0x2D 0x01
|
||||||
"
|
"
|
||||||
|
|
||||||
|
# --- normal ---------------------------------------------------------------
|
||||||
|
# Back to the nominal set point. TH6_CORE is 0.8 V nominal but settles near
|
||||||
|
# 0.8591 V once the load line is active, so a margin_status style read after
|
||||||
|
# this will not show exactly 0.8 V on that rail - that is the load line, not
|
||||||
|
# a failed write.
|
||||||
|
MP_DATA_normal="\
|
||||||
|
@ SWB0_0V9_ANLG0 0.900V
|
||||||
|
i2cset -f -y 13 0x25 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x25 0x21 0x83 0x00
|
||||||
|
i2cset -f -y 13 0x25 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x25 0x0D 0x74 0x10
|
||||||
|
@ SWB0_0V9_ANLG1 0.900V
|
||||||
|
i2cset -f -y 15 0x26 0x00 0
|
||||||
|
i2ctransfer -f -y 15 w3@0x26 0x21 0x83 0x00
|
||||||
|
i2cset -f -y 15 0x26 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x26 0x0D 0x74 0x10
|
||||||
|
@ SWB0_0V75_ANLG0 0.75V
|
||||||
|
i2cset -f -y 13 0x25 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x25 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x25 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x25 0x1D 0x5A 0x06
|
||||||
|
@ SWB0_0V75_ANLG1 0.75V
|
||||||
|
i2cset -f -y 15 0x26 0x00 1
|
||||||
|
i2ctransfer -f -y 15 w3@0x26 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x26 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x26 0x1D 0x5A 0x06
|
||||||
|
@ SWB0_PHYTILE_P0 0.75V
|
||||||
|
i2cset -f -y 13 0x21 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x21 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x21 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x21 0x0D 0xB2 0x0C
|
||||||
|
@ SWB0_PHYTILE_P1 0.75V
|
||||||
|
i2cset -f -y 13 0x21 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x21 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x21 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x21 0x1D 0x5A 0x06
|
||||||
|
@ SWB0_PHYTILE_P2 0.75V
|
||||||
|
i2cset -f -y 13 0x22 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x22 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x22 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x22 0x0D 0xB2 0x0C
|
||||||
|
@ SWB0_PHYTILE_P3 0.75V
|
||||||
|
i2cset -f -y 13 0x22 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x22 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x22 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x22 0x1D 0x5A 0x06
|
||||||
|
@ SWB0_PHYTILE_P4 0.75V
|
||||||
|
i2cset -f -y 15 0x23 0x00 0
|
||||||
|
i2ctransfer -f -y 15 w3@0x23 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x23 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x23 0x0D 0xB2 0x0C
|
||||||
|
@ SWB0_PHYTILE_P5 0.75V
|
||||||
|
i2cset -f -y 15 0x23 0x00 1
|
||||||
|
i2ctransfer -f -y 15 w3@0x23 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x23 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x23 0x1D 0x5A 0x06
|
||||||
|
@ SWB0_PHYTILE_P6 0.75V
|
||||||
|
i2cset -f -y 15 0x24 0x00 0
|
||||||
|
i2ctransfer -f -y 15 w3@0x24 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x24 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x24 0x0D 0xB2 0x0C
|
||||||
|
@ SWB0_PHYTILE_P7 0.75V
|
||||||
|
i2cset -f -y 15 0x24 0x00 1
|
||||||
|
i2ctransfer -f -y 15 w3@0x24 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x24 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x24 0x1D 0x5A 0x06
|
||||||
|
@ SWB0_PVDD1V5_CNDR0 1.5V
|
||||||
|
i2cset -f -y 13 0x29 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x29 0x21 0xFB 0x00
|
||||||
|
i2cset -f -y 13 0x29 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x29 0x0D 0x71 0x1F
|
||||||
|
@ SWB0_PVDD1V5_CNDR1 1.5V
|
||||||
|
i2cset -f -y 13 0x29 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x29 0x21 0xFB 0x00
|
||||||
|
i2cset -f -y 13 0x29 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x29 0x1D 0xB9 0x0F
|
||||||
|
@ SWB0_PVDDA_PHYT0 0.720V
|
||||||
|
i2cset -f -y 13 0x27 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x27 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 13 0x27 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x27 0x0D 0xF4 0x0B
|
||||||
|
@ SWB0_PVDDA_PHYT1 0.720V
|
||||||
|
i2cset -f -y 13 0x27 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x27 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 13 0x27 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x27 0x1D 0xFC 0x05
|
||||||
|
@ SWB0_PVDDA_PHYT2 0.720V
|
||||||
|
i2cset -f -y 15 0x28 0x00 0
|
||||||
|
i2ctransfer -f -y 15 w3@0x28 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 15 0x28 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x28 0x0D 0xF4 0x0B
|
||||||
|
@ SWB0_PVDDA_PHYT3 0.720V
|
||||||
|
i2cset -f -y 15 0x28 0x00 1
|
||||||
|
i2ctransfer -f -y 15 w3@0x28 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 15 0x28 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x28 0x1D 0xFC 0x05
|
||||||
|
@ SWB0_TH6_CORE 0.8V
|
||||||
|
i2cset -f -y 13 0x20 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x20 0x21 0x57 0x01
|
||||||
|
@ SWB1_0V9_ANLG0 0.900V
|
||||||
|
i2cset -f -y 14 0x25 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x25 0x21 0x83 0x00
|
||||||
|
i2cset -f -y 14 0x25 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x25 0x0D 0x74 0x10
|
||||||
|
@ SWB1_0V9_ANLG1 0.900V
|
||||||
|
i2cset -f -y 16 0x26 0x00 0
|
||||||
|
i2ctransfer -f -y 16 w3@0x26 0x21 0x83 0x00
|
||||||
|
i2cset -f -y 16 0x26 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x26 0x0D 0x74 0x10
|
||||||
|
@ SWB1_0V75_ANLG0 0.75V
|
||||||
|
i2cset -f -y 14 0x25 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x25 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x25 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x25 0x1D 0x5A 0x06
|
||||||
|
@ SWB1_0V75_ANLG1 0.75V
|
||||||
|
i2cset -f -y 16 0x26 0x00 1
|
||||||
|
i2ctransfer -f -y 16 w3@0x26 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x26 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x26 0x1D 0x5A 0x06
|
||||||
|
@ SWB1_PHYTILE_P0 0.75V
|
||||||
|
i2cset -f -y 14 0x21 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x21 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x21 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x21 0x0D 0xB2 0x0C
|
||||||
|
@ SWB1_PHYTILE_P1 0.75V
|
||||||
|
i2cset -f -y 14 0x21 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x21 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x21 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x21 0x1D 0x5A 0x06
|
||||||
|
@ SWB1_PHYTILE_P2 0.75V
|
||||||
|
i2cset -f -y 14 0x22 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x22 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x22 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x22 0x0D 0xB2 0x0C
|
||||||
|
@ SWB1_PHYTILE_P3 0.75V
|
||||||
|
i2cset -f -y 14 0x22 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x22 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x22 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x22 0x1D 0x5A 0x06
|
||||||
|
@ SWB1_PHYTILE_P4 0.75V
|
||||||
|
i2cset -f -y 16 0x23 0x00 0
|
||||||
|
i2ctransfer -f -y 16 w3@0x23 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x23 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x23 0x0D 0xB2 0x0C
|
||||||
|
@ SWB1_PHYTILE_P5 0.75V
|
||||||
|
i2cset -f -y 16 0x23 0x00 1
|
||||||
|
i2ctransfer -f -y 16 w3@0x23 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x23 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x23 0x1D 0x5A 0x06
|
||||||
|
@ SWB1_PHYTILE_P6 0.75V
|
||||||
|
i2cset -f -y 16 0x24 0x00 0
|
||||||
|
i2ctransfer -f -y 16 w3@0x24 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x24 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x24 0x0D 0xB2 0x0C
|
||||||
|
@ SWB1_PHYTILE_P7 0.75V
|
||||||
|
i2cset -f -y 16 0x24 0x00 1
|
||||||
|
i2ctransfer -f -y 16 w3@0x24 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x24 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x24 0x1D 0x5A 0x06
|
||||||
|
@ SWB1_PVDD1V5_CNDR0 1.5V
|
||||||
|
i2cset -f -y 14 0x29 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x29 0x21 0xFB 0x00
|
||||||
|
i2cset -f -y 14 0x29 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x29 0x0D 0x71 0x1F
|
||||||
|
@ SWB1_PVDD1V5_CNDR1 1.5V
|
||||||
|
i2cset -f -y 14 0x29 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x29 0x21 0xFB 0x00
|
||||||
|
i2cset -f -y 14 0x29 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x29 0x1D 0xB9 0x0F
|
||||||
|
@ SWB1_PVDDA_PHYT0 0.720V
|
||||||
|
i2cset -f -y 14 0x27 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x27 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 14 0x27 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x27 0x0D 0xF4 0x0B
|
||||||
|
@ SWB1_PVDDA_PHYT1 0.720V
|
||||||
|
i2cset -f -y 14 0x27 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x27 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 14 0x27 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x27 0x1D 0xFC 0x05
|
||||||
|
@ SWB1_PVDDA_PHYT2 0.720V
|
||||||
|
i2cset -f -y 16 0x28 0x00 0
|
||||||
|
i2ctransfer -f -y 16 w3@0x28 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 16 0x28 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x28 0x0D 0xF4 0x0B
|
||||||
|
@ SWB1_PVDDA_PHYT3 0.720V
|
||||||
|
i2cset -f -y 16 0x28 0x00 1
|
||||||
|
i2ctransfer -f -y 16 w3@0x28 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 16 0x28 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x28 0x1D 0xFC 0x05
|
||||||
|
@ SWB1_TH6_CORE 0.8V
|
||||||
|
i2cset -f -y 14 0x20 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x20 0x21 0x57 0x01
|
||||||
|
"
|
||||||
|
|
||||||
# --- save: STORE_USER_ALL per controller, no per-rail mapping ---------------
|
# --- save: STORE_USER_ALL per controller, no per-rail mapping ---------------
|
||||||
MP_DATA_save="\
|
MP_DATA_save="\
|
||||||
i2cset -f -y 13 0x25 0x00 0
|
i2cset -f -y 13 0x25 0x00 0
|
||||||
@@ -1007,6 +1208,7 @@ blanton_multiphase_margin.sh - multiphase VRM margin (native i2c, 38 rails)
|
|||||||
low3 every rail -3%
|
low3 every rail -3%
|
||||||
comboA mixed high/low, set A
|
comboA mixed high/low, set A
|
||||||
comboB mixed high/low, set B
|
comboB mixed high/low, set B
|
||||||
|
normal back to the nominal set point (undo a margin without a power cycle)
|
||||||
save commit to NVM -- PERMANENT, survives a power cycle
|
save commit to NVM -- PERMANENT, survives a power cycle
|
||||||
|
|
||||||
-u|--unit <0|1|all> SWB0 (i2c-13/15) / SWB1 (i2c-14/16); default both
|
-u|--unit <0|1|all> SWB0 (i2c-13/15) / SWB1 (i2c-14/16); default both
|
||||||
@@ -1041,6 +1243,7 @@ case "${SUB}" in
|
|||||||
low3) _mp_apply low3 "${MP_DATA_low3}" ;;
|
low3) _mp_apply low3 "${MP_DATA_low3}" ;;
|
||||||
comboA) _mp_apply comboA "${MP_DATA_comboA}" ;;
|
comboA) _mp_apply comboA "${MP_DATA_comboA}" ;;
|
||||||
comboB) _mp_apply comboB "${MP_DATA_comboB}" ;;
|
comboB) _mp_apply comboB "${MP_DATA_comboB}" ;;
|
||||||
|
normal) _mp_apply normal "${MP_DATA_normal}" ;;
|
||||||
save) _mp_save ;;
|
save) _mp_save ;;
|
||||||
-h|--help|"") usage ;;
|
-h|--help|"") usage ;;
|
||||||
*) _mp_err "unknown sub-command: ${SUB}"; usage; exit 1 ;;
|
*) _mp_err "unknown sub-command: ${SUB}"; usage; exit 1 ;;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ strTestcase="ENV" ;ENV,EMC,Margin...etc
|
|||||||
|
|
||||||
EN_Margin = 0 ; 1: Enable Margin Test, 0: Disable Margin Test
|
EN_Margin = 0 ; 1: Enable Margin Test, 0: Disable Margin Test
|
||||||
EN_log = 1 ; 1: Enable log, 0: Disable log
|
EN_log = 1 ; 1: Enable log, 0: Disable log
|
||||||
|
EN_timestamp = 1 ; 1: Enable timestamp in log, 0: Disable timestamp in log
|
||||||
|
|
||||||
;================================================================
|
;================================================================
|
||||||
; FAN_SPEED
|
; FAN_SPEED
|
||||||
@@ -17,6 +18,15 @@ FAN_SPEED = 100
|
|||||||
SWB_UNIT0 = 1 ; 1 = this DUT has switch unit 0, wait for it ; 0 = skip
|
SWB_UNIT0 = 1 ; 1 = this DUT has switch unit 0, wait for it ; 0 = skip
|
||||||
SWB_UNIT1 = 1 ; 1 = this DUT has switch unit 1, wait for it ; 0 = skip
|
SWB_UNIT1 = 1 ; 1 = this DUT has switch unit 1, wait for it ; 0 = skip
|
||||||
|
|
||||||
|
;================================================================
|
||||||
|
; Stress_Test
|
||||||
|
;================================================================
|
||||||
|
SSD_RUNTIME = 3600 ; Unit seconds, 3600 = 1 hour
|
||||||
|
SSD_COUNT = 240 ; Total time = SSD_RUNTIME * SSD_COUNT
|
||||||
|
USB_RUNTIME = 3600 ; Unit seconds, 3600 = 1 hour
|
||||||
|
USB_COUNT = 240 ; Total time = USB_RUNTIME * USB_COUNT
|
||||||
|
BMC_USB_RUNTIME = 172800 ; Unit seconds, 172800 = 2 days
|
||||||
|
|
||||||
;================================================================
|
;================================================================
|
||||||
; Prompt Definitions
|
; Prompt Definitions
|
||||||
;================================================================
|
;================================================================
|
||||||
|
|||||||
@@ -0,0 +1,188 @@
|
|||||||
|
//0.900V (nominal)
|
||||||
|
i2cset -f -y 13 0x25 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x25 0x21 0x83 0x00
|
||||||
|
i2cset -f -y 13 0x25 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x25 0x0D 0x74 0x10
|
||||||
|
//0.900V (nominal)
|
||||||
|
i2cset -f -y 15 0x26 0x00 0
|
||||||
|
i2ctransfer -f -y 15 w3@0x26 0x21 0x83 0x00
|
||||||
|
i2cset -f -y 15 0x26 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x26 0x0D 0x74 0x10
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 13 0x25 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x25 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x25 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x25 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 15 0x26 0x00 1
|
||||||
|
i2ctransfer -f -y 15 w3@0x26 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x26 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x26 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 13 0x21 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x21 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x21 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x21 0x0D 0xB2 0x0C
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 13 0x21 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x21 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x21 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x21 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 13 0x22 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x22 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x22 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x22 0x0D 0xB2 0x0C
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 13 0x22 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x22 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 13 0x22 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x22 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 15 0x23 0x00 0
|
||||||
|
i2ctransfer -f -y 15 w3@0x23 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x23 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x23 0x0D 0xB2 0x0C
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 15 0x23 0x00 1
|
||||||
|
i2ctransfer -f -y 15 w3@0x23 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x23 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x23 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 15 0x24 0x00 0
|
||||||
|
i2ctransfer -f -y 15 w3@0x24 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x24 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x24 0x0D 0xB2 0x0C
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 15 0x24 0x00 1
|
||||||
|
i2ctransfer -f -y 15 w3@0x24 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 15 0x24 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x24 0x1D 0x5A 0x06
|
||||||
|
//1.5V (nominal)
|
||||||
|
i2cset -f -y 13 0x29 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x29 0x21 0xFB 0x00
|
||||||
|
i2cset -f -y 13 0x29 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x29 0x0D 0x71 0x1F
|
||||||
|
//1.5V (nominal)
|
||||||
|
i2cset -f -y 13 0x29 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x29 0x21 0xFB 0x00
|
||||||
|
i2cset -f -y 13 0x29 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x29 0x1D 0xB9 0x0F
|
||||||
|
//0.720V
|
||||||
|
i2cset -f -y 13 0x27 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x27 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 13 0x27 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x27 0x0D 0xF4 0x0B
|
||||||
|
//0.720V
|
||||||
|
i2cset -f -y 13 0x27 0x00 1
|
||||||
|
i2ctransfer -f -y 13 w3@0x27 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 13 0x27 0x00 2
|
||||||
|
i2ctransfer -f -y 13 w3@0x27 0x1D 0xFC 0x05
|
||||||
|
//0.720V
|
||||||
|
i2cset -f -y 15 0x28 0x00 0
|
||||||
|
i2ctransfer -f -y 15 w3@0x28 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 15 0x28 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x28 0x0D 0xF4 0x0B
|
||||||
|
//0.720V
|
||||||
|
i2cset -f -y 15 0x28 0x00 1
|
||||||
|
i2ctransfer -f -y 15 w3@0x28 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 15 0x28 0x00 2
|
||||||
|
i2ctransfer -f -y 15 w3@0x28 0x1D 0xFC 0x05
|
||||||
|
//0.8V(nominal) , 0.8591V with load line
|
||||||
|
i2cset -f -y 13 0x20 0x00 0
|
||||||
|
i2ctransfer -f -y 13 w3@0x20 0x21 0x57 0x01
|
||||||
|
|
||||||
|
|
||||||
|
//0.900V (nominal)
|
||||||
|
i2cset -f -y 14 0x25 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x25 0x21 0x83 0x00
|
||||||
|
i2cset -f -y 14 0x25 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x25 0x0D 0x74 0x10
|
||||||
|
//0.900V (nominal)
|
||||||
|
i2cset -f -y 16 0x26 0x00 0
|
||||||
|
i2ctransfer -f -y 16 w3@0x26 0x21 0x83 0x00
|
||||||
|
i2cset -f -y 16 0x26 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x26 0x0D 0x74 0x10
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 14 0x25 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x25 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x25 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x25 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 16 0x26 0x00 1
|
||||||
|
i2ctransfer -f -y 16 w3@0x26 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x26 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x26 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 14 0x21 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x21 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x21 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x21 0x0D 0xB2 0x0C
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 14 0x21 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x21 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x21 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x21 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 14 0x22 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x22 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x22 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x22 0x0D 0xB2 0x0C
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 14 0x22 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x22 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 14 0x22 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x22 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 16 0x23 0x00 0
|
||||||
|
i2ctransfer -f -y 16 w3@0x23 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x23 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x23 0x0D 0xB2 0x0C
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 16 0x23 0x00 1
|
||||||
|
i2ctransfer -f -y 16 w3@0x23 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x23 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x23 0x1D 0x5A 0x06
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 16 0x24 0x00 0
|
||||||
|
i2ctransfer -f -y 16 w3@0x24 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x24 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x24 0x0D 0xB2 0x0C
|
||||||
|
//0.75V (nominal)
|
||||||
|
i2cset -f -y 16 0x24 0x00 1
|
||||||
|
i2ctransfer -f -y 16 w3@0x24 0x21 0x65 0x00
|
||||||
|
i2cset -f -y 16 0x24 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x24 0x1D 0x5A 0x06
|
||||||
|
//1.5V (nominal)
|
||||||
|
i2cset -f -y 14 0x29 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x29 0x21 0xFB 0x00
|
||||||
|
i2cset -f -y 14 0x29 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x29 0x0D 0x71 0x1F
|
||||||
|
//1.5V (nominal)
|
||||||
|
i2cset -f -y 14 0x29 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x29 0x21 0xFB 0x00
|
||||||
|
i2cset -f -y 14 0x29 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x29 0x1D 0xB9 0x0F
|
||||||
|
//0.720V (nominal)
|
||||||
|
i2cset -f -y 14 0x27 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x27 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 14 0x27 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x27 0x0D 0xF4 0x0B
|
||||||
|
//0.720V (nominal)
|
||||||
|
i2cset -f -y 14 0x27 0x00 1
|
||||||
|
i2ctransfer -f -y 14 w3@0x27 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 14 0x27 0x00 2
|
||||||
|
i2ctransfer -f -y 14 w3@0x27 0x1D 0xFC 0x05
|
||||||
|
//0.720V (nominal)
|
||||||
|
i2cset -f -y 16 0x28 0x00 0
|
||||||
|
i2ctransfer -f -y 16 w3@0x28 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 16 0x28 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x28 0x0D 0xF4 0x0B
|
||||||
|
//0.720V (nominal)
|
||||||
|
i2cset -f -y 16 0x28 0x00 1
|
||||||
|
i2ctransfer -f -y 16 w3@0x28 0x21 0x5F 0x00
|
||||||
|
i2cset -f -y 16 0x28 0x00 2
|
||||||
|
i2ctransfer -f -y 16 w3@0x28 0x1D 0xFC 0x05
|
||||||
|
//0.8V(nominal) , 0.8591V with load line
|
||||||
|
i2cset -f -y 14 0x20 0x00 0
|
||||||
|
i2ctransfer -f -y 14 w3@0x20 0x21 0x57 0x01
|
||||||
Reference in New Issue
Block a user