Script 4_1, blanton_tr518_thermal.sh, blanton_multiphase_read.sh and Script_User_Guide.md are added to the V1.2.7 block of Script A's history and to docs/release-notes/v1.2.7.md, which V1.2.7 is re-released with. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0131orciRKrejchsuDk6UpXk
47 KiB
Blanton Script User Guide
適用版本:Script A V1.2.7(2026-11) 對象:上機跑 A → B → C 的測試員,以及要在 DUT 上手動下
Blanton_Script/工具的人
本指南分兩部分:
- TTL Script A / B / C:Host 端準備、把
Blanton_Script/從 USB 放進 DUT、A → B → C 的跑法 - Blanton_Script 工具說明:DUT 上每一支
.sh的用法
目錄
Part 1 — TTL Script A / B / C
1.1 交付包內容
Script_ABC_Blanton_<Ver>/ ← Tera Term 的工作目錄(整包放在 Windows 上)
├── 1_Blanton_Script_A.ttl ← 基線(開頭收殘留 → 取基線數據 → 第一輪流量 / BER)
├── 2_Blanton_Script_B.ttl ← 壓力 soak(背景壓力 + while 1 每 60 秒取一次數據)
├── 3_Blanton_Script_C.ttl ← 收工(停壓力 → 收尾數據 → 判定 → log 拷 USB)
├── config.ttl ← 所有設定都在這裡
├── utils/*.ttl ← A/B/C 共用的片段(PMON、dmesg、PCIe 錯誤…)
├── logs/ ← Tera Term log 寫在這
├── 4_*.ttl / 5_*.ttl / 6_*.ttl ← 其他獨立測試(熱 / 開機循環 / BER 循環),不接 A→B→C
└── Blanton_Script/ ← ★ 要放到 DUT 的 ~/Blanton_Script/
| 腳本 | 用途 | 跟 A→B→C 的關係 |
|---|---|---|
1_Blanton_Script_A.ttl |
基線 | 第一支,唯一會開 log 的 |
2_Blanton_Script_B.ttl |
壓力 soak | A 之後,同一個 Tera Term 視窗 |
3_Blanton_Script_C.ttl |
收工 + 判定 | B 停掉之後,同一個視窗 |
4_Blanton_Script_thermal_safety.ttl |
熱 / 安規 | 獨立跑,沒有收尾段 |
4_1_Blanton_Script_thermal.ttl |
熱測:先 idle 300 輪,再 blanton_tr518_thermal.sh 滿載 |
獨立跑,沒有收尾段(結束要手動 blanton_tr518_thermal.sh stop + systemctl stop mlucas-amm) |
5_Blanton_Script_Boot_Cycle.ttl |
斷電開機循環 | 獨立跑,while 1 無止境 |
5_1_Blanton_Script_Boot_Cycle_Fast.ttl |
同上,拿掉流量只留 ps |
獨立跑 |
6_Blanton_Script_BER_Cycle.ttl |
Diag ↔ SONiC 冷開機量 BER | 獨立跑 |
1.2 Host 端準備(Windows)
- 把整個
Script_ABC_Blanton_<Ver>/複製到 Windows(例如D:\Blanton\)。 - 改密碼:
1_Blanton_Script_A.ttl的登入段是sendln "admin" wait "Password:" sendln "YourPaSsWoRd" ← 換成 DUT 實際的 admin 密碼YourPaSsWoRd是佔位字,不改 A 會卡在登入。(B / C 不登入,沿用 A 的 session。) - 確認
config.ttl的 prompt 跟 DUT hostname 一致(見 1.4)。 - Tera Term 連 DUT 的 COM port:115200-8-N-1。
- (建議)Tera Term → Setup → Additional settings → Log,確認時戳格式;格式存在這台電腦的
TERATERM.INI,不在腳本裡。
1.3 把 Blanton_Script 從 USB 放到 DUT
TTL 會直接呼叫 ~/Blanton_Script/xxx.sh(root 的家目錄 = /root),所以 跑 Script A 之前,DUT 上要先有 /root/Blanton_Script/。
Step 1:Windows 端把資料夾放進 USB
把交付包裡的 Blanton_Script/ 整個資料夾拷到 USB 隨身碟根目錄:
USB:\
└── Blanton_Script\
├── blanton_ber.sh
├── ...
└── LTC2980_Margin_Script\
⚠️ 不要在 Windows 上用記事本打開再存
.sh/.conf。存檔可能變成 CRLF 換行, 在 SONiC 上會直接掛($'\r': command not found),.conf被 source 時更會安靜地讀錯值。
Step 2:DUT 端掛 USB
# 登入並切 root
admin / <密碼>
sudo -i
# 找 USB 的 partition(通常是 /dev/sda1;看 TRAN 欄 = usb 的那顆)
lsblk -o NAME,SIZE,TRAN,FSTYPE,MOUNTPOINT
# 掛載(已掛過可跳過)
mkdir -p /mnt/usb
mount /dev/sda1 /mnt/usb # ← 依 lsblk 結果改 sda1
ls /mnt/usb # 應看到 Blanton_Script
Step 3:複製到家目錄
# 已經有舊版的話先備份(可略過)
[ -d ~/Blanton_Script ] && mv ~/Blanton_Script ~/Blanton_Script.bak_$(date +%Y%m%d-%H%M%S)
cp -r /mnt/usb/Blanton_Script ~/
Step 4:加執行權限 + 檢查換行(每次佈署都要做)
find ~/Blanton_Script -name '*.sh' -exec chmod +x {} +
grep -rlU $'\r' ~/Blanton_Script # ← 應該「沒有任何輸出」
- 為什麼一定要
chmod +x:從 Windows → USB 拷過來的檔案沒有執行權限。mgmt_ping_monitor.sh/bmc_monitor.sh/nfc_polling.sh的start內部是直接執行自己的路徑, 沒有 exec bit 會 Permission denied,而且不會報錯,只會得到一份空的 log。unused_lanes.sh也會檢查retimer_lanes.sh有沒有 exec bit。 grep有輸出 = 有檔案是 CRLF,修法:grep -rlU $'\r' ~/Blanton_Script | xargs sed -i 's/\r$//'
Step 5:確認 + 卸載
ls ~/Blanton_Script
bash ~/Blanton_Script/usb_target.sh -n -o both # 確認 USB 偵測得到(Script B/C 會用)
sync
umount /mnt/usb
USB 不要拔:Script B 會對它跑 USB 讀寫壓力,Script C 最後會把 log 拷進去。 測試期間 DUT 上只能插一支 USB 隨身碟(偵測到多支時
usb_target.sh會拒絕猜測,exit 2)。
另一個方法:base64 貼上
沒有 USB 時,可以把 Blanton_Script/ 打成 tar.gz 再轉 base64,在 Tera Term 分段貼上、
DUT 端解碼解壓。每段後面附 md5,對不上就重貼該段。(貼上檔請向開發端索取。)
1.4 config.ttl 設定
| 變數 | 預設 | 說明 |
|---|---|---|
project_name |
"Blanton" |
log 檔名前綴 |
strTestcase |
"ENV" |
log 檔名的測試類別(ENV / EMC / Margin…) |
EN_Margin |
0 |
1 = A / C 會跑 margin_status(9 顆 LTC2980 的電壓狀態) |
EN_TX_FIR |
0 |
1 = A / C 各跑一次 bcm_dsc_scan.sh(每次約 10 分鐘,整輪多 ~20 分鐘) |
EN_log |
1 |
1 = Script A 開 log |
EN_timestamp |
1 |
1 = log 每行帶時戳(必要變數,不可刪) |
FAN_SPEED |
100 |
風扇轉速 %,soak 是熱測試,預設全速 |
SWB_UNIT0 / SWB_UNIT1 |
1 / 1 |
這台 DUT 有沒有 switch unit 0 / 1。FDR 只在兩個都是 1 時才跑 |
SSD_RUNTIME / SSD_COUNT |
3600 / 240 |
SSD 壓力:--runtime 是整個 job 的總時限(秒),COUNT = --passes |
USB_RUNTIME / USB_COUNT |
3600 / 240 |
USB 壓力,同上 |
BMC_USB_RUNTIME |
172800 |
BMC USB 網路 ping 的總秒數(2 天)必要變數 |
prompt_login |
"sonic login:" |
登入提示 |
prompt_sonic |
"admin@sonic:~$" |
admin prompt |
prompt_sonic_root |
"root@sonic:~#" |
root prompt,每個 wait 都靠它 |
⚠️ hostname 不是
sonic的 DUT(例如root@Margin02:~#),要把三個 prompt 改成對應的字串, 否則 macro 會卡在第一個wait。⚠️
config.ttl少一個變數,macro 會當場中止(不是當成 0)。換新版 TTL 時,config.ttl一起換, 再把自己的設定值填回去。⚠️ SSD / USB 壓力的時間:
--runtime跑滿就停,--passes不會把它延長。 2 天 soak 要把SSD_RUNTIME/USB_RUNTIME改成172800。壓力提早結束時唯一線索是 Script B 每輪印的bgctl list數量變少,不會報警。
1.5 跑一輪測試:A → B → C
Tera Term 連 COM port (115200-8-N-1),DUT 停在 "sonic login:" 或正在開機
│
├─ Control → Macro → 1_Blanton_Script_A.ttl
│ 自動登入 → 基線 → 跳出 messagebox「Script A DONE / Start Script B」
│
├─ Control → Macro → 2_Blanton_Script_B.ttl
│ 起背景壓力 → while 1 每 ~60 秒取一次數據(不會自己停)
│ 泡到時間後:在 Tera Term 的 MACRO 小視窗按 End 停掉 macro,不要關 Tera Term 主視窗
│
└─ Control → Macro → 3_Blanton_Script_C.ttl
停壓力 → 收尾數據 → 流量報表 / BER → log 拷 USB →「GOOD JOB! Test Case DONE」
鐵則:
- A → B → C 必須在同一個 Tera Term 視窗、同一個 shell session。 B 的背景 job 跟 C 的
kill $(jobs -p)綁在同一個 shell;log 也只有 A 會開,B / C 是續寫。中途關掉視窗就得手動收程序,log 也斷了。 - B 停掉時,DUT 可能停在某個指令中間。等 prompt 回來再跑 C(必要時按一下 Enter)。
- DUT 上要有
~/hammer/tools/amd/mlucas-avx2(CPU 壓力,由 DUT image 帶,不在交付包裡)。
1.6 Script A 做了什麼
依序:
| # | 段落 | 主要指令 |
|---|---|---|
| 1 | 開 log、登入、切 root | logopen、sudo -i |
| 2 | 前置 | mkdir ./logs、date -s(用 Host 時間對時)、rm /host/hw-eval/jobs/* |
| 3 | 收前一輪殘留 | hw-test-session finish → bgctl reset --yes → bgctl stop --all → bgctl list → hw-test-session start |
| 4 | 風扇 | max31790 driver rebind → fan-speed-control.sh <FAN_SPEED> → 回答 y |
| 5 | 等 DUT 初始化 | utils/wait_init.ttl:每 60 秒 bcmcmd ps 數 up port,每個開啟的 unit ≥ 216 才往下 |
| 6 | DUT 資訊 | show boot / version / system-memory / service / platform syseeprom / ssdhealth、fwutil show status、TPM 版本、NVMe SMART |
| 7 | BMC | bmc-first-enroll、bmc-manager version / status |
| 8 | 載入工具 | source 6 支:blanton_fpga_pcimem / cb_i2c / icb_vi2c / pwr_data / traffic_linespeed / margin.sh |
| 9 | PCIe AER 基線 | utils/show_pcie_error_reg_*.ttl(TH6×2 / FPGA / BMC / DDR / I210 / SSD)、ras-mc-ctl --summary |
| 10 | PCIe tree | lspci -tvvv、lspci -vv |
| 11 | Margin(EN_Margin=1) |
utils/show_margin_status.ttl |
| 12 | PMON 快照 | utils/setup_pmon.ttl(溫度 / 風扇 / 電壓 / 電流 / SWB 功耗 / DDR5 / HSC / SSD / leak / TPM)+ utils/show_dmesg.ttl(最後會 dmesg -C) |
| 13 | Tray ID I2C stress | tray_id_stress.sh |
| 14 | 管理網路 ping | mgmt_ping_monitor.sh start → sleep 15 → stop → cat log → clear |
| 15 | NFC | nfc_polling.sh start → sleep 30 → stop → report |
| 16 | 100G port | sfputil lpmode off、config interface startup Ethernet513/514 |
| 17 | 關沒接線的 lane | unused_lanes.sh off(之後沒有任何地方 on 回來) |
| 18 | BER 基線 | blanton_ber.sh init → start → sleep 30 → report → stop → clear |
| 19 | 第一輪流量 + FDR | blanton_traffic_linespeed ps → init → fdr start → clear → fdr clear → show → start → sleep 40 → fdr rdcnt → stop → fdr stop → report |
| 20 | DSC(EN_TX_FIR=1) |
bcm_dsc_scan.sh -f blanton_dsc_ScriptA.log -F |
| 21 | 結束 | show uptime → messagebox |
單一 unit 的 DUT(
SWB_UNIT0/SWB_UNIT1只有一個是 1)會走-u 0/-u 1分支,沒有 FDR,流量只跑 15 秒。
1.7 Script B 做了什麼
起壓力(一次)
| 壓力 | 指令 |
|---|---|
| AMD CPU | systemd-run --unit=mlucas-amm ... mlucas-avx2(Restart=always,掉了會自己重起) |
| BMC DDR | bgctl run bmc-manager run '/usr/bin/memtester 64M' |
| BMC I2C 監控 | bmc_monitor.sh start |
| Host DDR | bgctl run /usr/sbin/memtester 1G |
| SSD | bgctl run qfx5252-stress-ssd 1G --runtime <SSD_RUNTIME> --passes <SSD_COUNT> ... |
| USB | bgctl run qfx5252-stress-usb <usb_dev> 256M --runtime <USB_RUNTIME> --passes <USB_COUNT> ... |
| BMC USB 網路 | systemd-run --unit=qfx5252-bmc-usb-net-test ... ping -I <cdc_ncm 網卡> 192.168.200.200 |
| 管理網路 | mgmt_ping_monitor.sh start |
| NFC | nfc_polling.sh start |
| SWB 流量 | blanton_traffic_linespeed init / clear / start + blanton_fdr.sh start / clear |
找不到 cdc_ncm 網卡時會跳 messagebox「cdc_ncm interface not found. Ping test skipped.」,按 OK 後繼續跑,只是少了 BMC USB 網路測試。
Soak 迴圈(while 1,每輪)
setup_pmon.ttl 快照 → bgctl list → jobs → systemctl is-active mlucas-amm → tray_id_stress.sh → blanton_fdr.sh rdcnt → sleep 60
每輪間隔 = 指令執行時間 + 60 秒,不是固定 1 分鐘。 看
bgctl list的 job 數有沒有變少,是判斷壓力有沒有提早結束的唯一方法。
1.8 Script C 做了什麼
| # | 段落 | 主要指令 |
|---|---|---|
| 1 | 停壓力 | kill $(jobs -p)、systemctl stop mlucas-amm、bgctl stop --all×2、systemctl stop qfx5252-bmc-usb-net-test、mgmt_ping_monitor.sh stop、nfc_polling.sh stop |
| 2 | 收尾快照 | setup_pmon.ttl、show_dmesg.ttl |
| 3 | PCIe AER / EDAC | 同 Script A 的 7 組 + ras-mc-ctl --summary → 跟 A 相減才是本輪錯誤 |
| 4 | BMC | bmc_monitor.sh stop;journalctl -u qfx5252-bmc-usb-net-test > ~/Blanton_Script/log/bmc_usb_net.log |
| 5 | 壓力結果 | cat SSD / USB stress log、mgmt_ping.log、nfc_polling.sh report |
| 6 | 流量判定 | blanton_fdr.sh rdcnt → blanton_traffic_linespeed stop → fdr stop → report |
| 7 | BER 收尾 | blanton_ber.sh init → start → sleep 30 → report → stop → clear |
| 8 | DSC(EN_TX_FIR=1) |
bcm_dsc_scan.sh -f blanton_dsc_ScriptC.log -F |
| 9 | NVMe / 開機原因 | nvme smart-log、smartctl -x、show reboot-cause |
| 10 | Margin(EN_Margin=1) |
show_margin_status.ttl |
| 11 | Log 拷 USB | 掛 USB 到 /mnt/usb → 把 mlucas / bmc_usb_net / bmc_poll / mgmt_ping / nfc_poll log 拷進 /host/hw-eval/jobs/ → cp -r /host/hw-eval/jobs/ /mnt/usb/jobs-<YYYYMMDD>_<HHMM> |
| 12 | 收工 | exit → 等 Script done → hw-test-session finish → bgctl reset --yes → messagebox |
1.9 Log 在哪裡
| Log | 位置 | 誰寫的 |
|---|---|---|
| 主 log(A+B+C 全部 console) | Windows:<Tera Term 工作目錄>\Logs\Blanton_<strTestcase>_<YYYYMMDD-HHMMSS>.log |
Script A logopen |
| 壓力 job log | DUT:/host/hw-eval/jobs/ |
qfx5252-stress-*、Script C 拷進來的 |
| 工具 log | DUT:~/Blanton_Script/log/(mgmt_ping.log / nfc_poll.log / bmc_poll.log / bmc_usb_net.log / blanton_dsc_*.log) |
各 .sh |
| USB 備份 | USB:/jobs-<YYYYMMDD>_<HHMM>/ |
Script C 最後一步 |
⚠️
bmc_usb_net.log不進主 log,USB 上那份是唯一一份。 ⚠️show_dmesg.ttl會dmesg -C,事後在 DUT 上dmesg撈不到舊訊息,只存在主 log 裡。
1.10 常見問題
| 症狀 | 原因 / 處理 |
|---|---|
A 一開始就停在 logopen |
config.ttl 是舊版,少了 EN_timestamp 之類的必要變數 → 換新版 config.ttl |
| A 卡在登入 | 密碼還是 YourPaSsWoRd,或 prompt 跟 hostname 不符 |
| A 卡在風扇那段 | 在等 Set all configured fan channels to 提示再回 y;提示字串改了就會永遠卡住 |
| A 卡在 wait_init | 有 unit 的 up port 一直 < 216,或 SWB_UNITx=1 但 DUT 沒那張板子 |
xxx.sh: Permission denied |
沒做 1.3 Step 4 的 chmod +x |
$'\r': command not found |
.sh 變成 CRLF → sed -i 's/\r$//' |
| mgmt_ping / nfc / bmc log 是空的 | 沒 chmod +x(start 不會報錯) |
| Script C 沒把 log 拷到 USB | USB 沒插、插了兩支、或檔案系統不能寫 → bash ~/Blanton_Script/usb_target.sh -o both 看錯誤碼 |
| 跑完 C 之後 CPU 還是滿載 | systemctl stop mlucas-amm 沒跑到 → 手動下一次 |
Part 2 — Blanton_Script 工具說明
2.0 通用規則
- 一律在 root 下跑:
sudo -i,工具在~/Blanton_Script/。 - 兩種用法:
- 直接執行:
~/Blanton_Script/xxx.sh <子指令> [選項](需要 exec bit) - source 後呼叫函式:
source ~/Blanton_Script/xxx.sh再下xxx <子指令>(A/B/C 對blanton_traffic_linespeed就是這樣用)
- 直接執行:
- 大部分工具都支援:
-u 0|1(只做一個 switch unit,預設兩個都做)、-n(dry-run,只印指令不碰硬體)、-d(印每一個底層指令)、-h(help)。 bcmcmd的 exit code 不能信:BCM shell 拒絕指令時照樣回 0,看輸出內容判斷。- 互斥:下面這幾支都會接管同一批 switch port,一次只能跑一支:
blanton_traffic_linespeed/blanton_ber/blanton_ber_debug/blanton_tr518/blanton_tr518_thermal/port_prbs_monitor/bcm_100g_dsc_cycle - 會寫 NVM(永久)的指令:
margin_save*、blanton_multiphase_margin.sh save—— 測試流程中絕不執行。
2.1 總覽表
| 工具 | 類別 | TTL 有沒有接 | 一句話 |
|---|---|---|---|
blanton_fpga_pcimem.sh |
底層 | A(source) | CB / PMC / ICB FPGA 暫存器讀寫,自動偵測 BDF |
blanton_cb_i2c.sh |
底層 | A(source) | CB FPGA 的 I2C master(Ch0~Ch17) |
blanton_icb_vi2c.sh |
底層 | A(source) | 經 CB 的 VI2C 走到 ICB / PDB(Ch0~Ch4) |
blanton_temp_sensor.sh |
量測 | — | CB + ICB 溫感 |
ddr5_temp.sh |
量測 | PMON | DDR5 DIMM 溫度 |
hsc_temp_readback.sh |
量測 | PMON | LTC4287 HSC 溫度 |
TH6_SWB0/1_power_readback.sh |
量測 | PMON | SWB 19 條軌 V×I + 總功耗(平台 sensor) |
blanton_multiphase_read.sh |
量測 | — | 直接讀多相 VRM 的 V / I / T(含原始 hex) |
blanton_pwr_data.sh |
量測 | A(source) | SWB VRM + PDB 讀值(經 CB FPGA I2C) |
pwr_brick.sh |
量測 | — | PDB / CPB power brick |
avt_pmpower.sh |
量測 | Script 4 / 4_1 | AMD CPU 封裝功耗(需 NDA 工具) |
LTC2980_Margin_Script/margin.sh |
Margin | A/C(EN_Margin) |
9 顆 LTC2980 電壓 margin |
blanton_multiphase_margin.sh |
Margin | — | 多相 VRM 38 條軌 margin |
blanton_traffic_linespeed.sh |
交換晶片 | A/B/C | SWB loopback 線速流量 + 判定 |
blanton_fdr.sh |
交換晶片 | A/B/C | FDR 統計(phydiag fdrstat) |
blanton_ber.sh |
交換晶片 | A/C | 全機 SerDes BER(PRBS)+ 判定 |
blanton_ber_debug.sh |
交換晶片 | — | BER 原始輸出(p=p31) |
blanton_tr518.sh |
交換晶片 | Script 4 | tr 518 負載(量功耗用) |
blanton_tr518_thermal.sh |
交換晶片 | Script 4_1 | tr 518 熱測參數版(未上機驗證) |
port_prbs_monitor.sh |
交換晶片 | — | 100G Ethernet513/514 PRBS |
unused_lanes.sh / retimer_lanes.sh |
交換晶片 | A(off) |
沒接線的 retimer lane / TH6 port 關 TX |
bcm_dsc_scan.sh / bcm_dsc_parse.sh |
DSC | A/C(EN_TX_FIR) |
SerDes DSC 擷取 / 轉 CSV |
bcm_100g_dsc_cycle.sh |
DSC | — | 100G link down/up 循環 + DSC(未上機驗證) |
mgmt_ping_monitor.sh |
背景監控 | A/B/C | 10G + 1G 管理網路 ping |
nfc_polling.sh |
背景監控 | A/B/C | NFC tag 輪詢 |
bmc_monitor.sh |
背景監控 | B/C | BMC free -m + I2C 寫讀圖樣 |
bmc_monitor_ddr.sh |
背景監控 | 已停用 | BMC memtester(改走 bgctl) |
tray_id_stress.sh |
其他 | A/B | Tray ID I2C 寫讀比對 |
usb_target.sh |
其他 | B/C | 找 USB 隨身碟、掛載 |
blantons_nfc_validate.py |
其他 | 由 nfc_polling 呼叫 | 客戶 NFC 驗證工具 v2.5 |
2.2 平台存取底層(source 進來用)
這三支是其他工具的基礎,平常不用直接下;debug 時 source 進來用。
source ~/Blanton_Script/blanton_fpga_pcimem.sh # 會印 [INFO] CB FPGA BDF = ...
source ~/Blanton_Script/blanton_cb_i2c.sh
source ~/Blanton_Script/blanton_icb_vi2c.sh
blanton_fpga_pcimem.sh
| 指令 | 說明 |
|---|---|
cb_fpga <offset> [value] |
讀 / 寫 CB FPGA 暫存器(32-bit) |
pmc_fpga / icb_fpga |
同上,其他 FPGA |
fpga_rescan |
重新偵測 BDF(換 DUT / 重新列舉後) |
FPGA_BDF=0000:05:00 fpga_rescan |
手動指定 BDF(偵測到多顆或選錯時) |
echo $FPGA_BDF_ACTIVE |
目前用的 BDF |
blanton_fpga_help |
help |
cb_fpga 0 0xD90 # 讀 RST_CAUSE_REG,讀得到 = BAR 通了
blanton_cb_i2c.sh
| 指令 | 說明 |
|---|---|
cb_i2c_init <ch> |
初始化通道 |
cb_i2c_scan <ch> |
掃描通道上的裝置 |
cb_i2c_read / cb_i2c_write |
讀寫 |
cb_pmbus_read / cb_pmbus_write |
PMBus 讀寫 |
cb_i2c_muxsel / cb_i2c_reset |
切 mux / 重置 |
blanton_cb_i2c_help |
help |
cb_i2c_init 11 && cb_i2c_scan 11 # Ch11 風扇控制器,應看到 0x20
blanton_icb_vi2c.sh
ICB / PDB 一律走這支(VI2C),不要走 VSPI(太慢會踩 SMBus timeout)。
| 指令 | 說明 |
|---|---|
vi2c_scan_all |
掃 ICB / PDB 五個通道 |
vi2c_scan <ch> / vi2c_init <ch> |
單一通道 |
vi2c_read / vi2c_write / vi2c_pmbus_read / vi2c_dump |
讀寫 |
vi2c_help |
help |
vi2c_scan只看 ACK,仲裁失敗(ARB_LOST)會被誤報成有裝置。
2.3 溫度 / 電壓 / 電流 / 功耗
blanton_temp_sensor.sh — CB + ICB 溫感
~/Blanton_Script/blanton_temp_sensor.sh # CB + ICB 一次
~/Blanton_Script/blanton_temp_sensor.sh -r # 多印 TMP432 remote1/remote2
~/Blanton_Script/blanton_temp_sensor.sh -c # 只 CB(-i 只 ICB)
~/Blanton_Script/blanton_temp_sensor.sh -n 10 -t 5 # 10 次、每次間隔 5 秒(-n 0 = 無限)
ddr5_temp.sh — DDR5 DIMM 溫度
~/Blanton_Script/ddr5_temp.sh # 預設 bus 5,位址 0x50 0x51
~/Blanton_Script/ddr5_temp.sh 5 0x50 # 指定 bus / 位址
hsc_temp_readback.sh — HSC 溫度
~/Blanton_Script/hsc_temp_readback.sh # LTC4287 HSC_MAIN(0x40) / HSC_STBY(0x45),bus 28,約 4 秒
TH6_SWB0_power_readback.sh / TH6_SWB1_power_readback.sh — SWB 軌功耗
~/Blanton_Script/TH6_SWB0_power_readback.sh
~/Blanton_Script/TH6_SWB1_power_readback.sh
- 讀
show platform voltage/show platform current各一次,算 19 條軌的 V×I,最後印TOTAL POWER。 - 某條軌在 sensor 表裡找不到時,stderr 印
WARN並當 0 W 計。 - 要量有負載的功耗:先
blanton_tr518.sh start。
blanton_multiphase_read.sh — 多相 VRM 讀值(含原始 hex)
~/Blanton_Script/blanton_multiphase_read.sh # 兩片 SWB
~/Blanton_Script/blanton_multiphase_read.sh -u 0 # 只 SWB0
~/Blanton_Script/blanton_multiphase_read.sh -n # 只印 i2c 指令
~/Blanton_Script/blanton_multiphase_read.sh -d # 印每個 i2c 指令與讀到的值
- 直接
i2cget讀 VRM(SWB0 = i2c-13/15,SWB1 = i2c-14/16),每顆一列:VOUT / VOUT2 / IOUT / IOUT2 / POUT / POUT2 / TEMP, 電壓電流後面括號是讀到的 PMBus 原始 word,例如0.740(0x0128);最後印每片 SWB 的 Total Power。 - POUT = V × I。讀完會把 PAGE 讀回確認沒被別人切走,被切走就重讀,一直不穩印
NA。 - 不要跟
blanton_multiphase_margin.sh同時跑(兩支都會切 PAGE)。 - ⚠️ 0x21 / 0x22 的 PU 名稱(PU105 / PU102)與
blanton_multiphase_margin.sh的 PHYTILE 對應相反,待上機確認;總功耗不受影響。
blanton_pwr_data.sh — SWB VRM / PDB(經 CB FPGA I2C)
source ~/Blanton_Script/blanton_pwr_data.sh
pwr_data # SWB0(預設)
pwr_data swb1 # SWB1
pwr_data pdb # PDB power brick + EFUSE(ICB VI2C ch4,mux 0x72 ch0)
pwr_data all # 三個都印
pwr_pdb_id # 讀 PDB 上每顆裝置的 MFR_ID / MFR_MODEL
pwr_data_help
讀不到或數值不合理時印
NA——寧可 NA 也不印看起來像數據的錯值。
pwr_brick.sh — PDB / CPB power brick
~/Blanton_Script/pwr_brick.sh show # Vin / Iin / Vout / Iout / Temp × 5 顆
~/Blanton_Script/pwr_brick.sh show -r # 多印 raw word
PB_TRIES=1 ~/Blanton_Script/pwr_brick.sh show -r # 看不經重試的原始行為
avt_pmpower.sh — AMD CPU 封裝功耗
~/Blanton_Script/avt_pmpower.sh -p ~/AVT_Linux_NDA_2.8.37/AVTCMD # 印 PM table + 摘要
~/Blanton_Script/avt_pmpower.sh -q -p ~/AVT_Linux_NDA_2.8.37/AVTCMD # 只印摘要
- AVT 是 NDA 工具,不在交付包裡:要先解壓到
~/AVT_Linux_NDA_2.8.37/,沒有就 exit 2。 - 數值是 SMU telemetry 不是量測,要準就對照 VR 的 PMBus READ_POUT。
- exit:0 OK / 1 參數錯 / 2 找不到 AVTCMD / 3 AVTCMD 失敗 / 4 解析不到功耗欄位。
2.4 電壓 Margin
⚠️ 改電壓會弄壞 DUT:套 profile 前確認該軌 OV / UV limit。 ⚠️
margin.sh(LTC2980)跟blanton_multiphase_margin.sh(多相 VRM)摸的是同一批軌,兩支不要同時用。 ⚠️ 會寫 NVM 的指令(margin_save*、... save)測試中絕不執行,斷電也不會還原。
LTC2980_Margin_Script/margin.sh — 9 顆 LTC2980
用 PMBus 控制 LTC2980 的電壓 margin。一個 .conf = 一顆 LTC2980(= 2 顆 LTC2977,每顆 8 channel,合起來 CH0~CH15)。
~/Blanton_Script/LTC2980_Margin_Script/
├── margin.sh ← 主程式(source 進來用)
├── settings/*.conf ← 每顆 LTC2980 的 channel 定義(Vnom、Net 名稱、I2C 位址)
├── profiles/*.conf ← 批次套用的 margin 組合
├── script/*.sh ← 多顆一起跑(status / apply / save)
└── logs/ ← 操作 log(主 log + detail log)
載入
cd ~/Blanton_Script/LTC2980_Margin_Script # ← profile 路徑是相對於目前目錄,先 cd 進來
source margin.sh
margin_init Blanton_SWB0_CONN14 # 指定要操作哪一顆(支援 TAB 補全)
可以載入的 9 顆:
margin_init 名稱 |
板 / 接頭 |
|---|---|
Blanton_CB_CONN13 |
CB 板 CONN13 |
Blanton_SWB0_CONN13 ~ Blanton_SWB0_CONN16 |
SWB0 板 CONN13 ~ 16 |
Blanton_SWB1_CONN13 ~ Blanton_SWB1_CONN16 |
SWB1 板 CONN13 ~ 16 |
函式一覽
| 函式 | 說明 |
|---|---|
margin_init <NAME> |
載入 settings/<NAME>.conf,之後的指令都作用在這一顆 |
margin_status [ch] |
讀 CH0~CH15(或指定 channel)的 Vout 與偏差 % |
margin_set <ch> <op> <change%> |
三合一:寫 margin 值 + 切 operation + 讀回驗證 |
margin_set_value <ch> <vnom> <change%> |
只寫 HIGH / LOW / OV / UV 暫存器 |
margin_operation <ch> <op> |
只切 OPERATION(不改 margin 值) |
margin_apply_profile <file> |
把一個 profile 套到目前載入的那顆 |
margin_save |
⚠️ 寫 NVM:目前這顆(2 顆 LTC2977) |
margin_save all |
⚠️ 寫 NVM:settings/ 底下全部 9 顆,跑完切回原本那顆 |
margin_save blanton |
⚠️ 寫 NVM:Blanton 專用,18 顆 LTC2977 走原生 i2c,不需 margin_init |
margin_debug [on|off] |
印出所有 i2c 指令(不帶參數 = 切換) |
margin_log [on|off] |
開關 log 記錄(預設開) |
<op> 對應的 OPERATION(PMBus 0x01)值:
| op | 值 | 說明 |
|---|---|---|
high |
0xA8 | margin high |
low |
0x98 | margin low |
nominal |
0x80 | 回標稱值 |
off |
0x00 | 關閉輸出 |
Channel 編號:ch / 8 決定是哪顆 LTC2977(0 = 低位址、1 = 高位址),ch % 8 是該顆的 page(0~7)。
常用範例
margin_status # 全部 channel
margin_status 3 # 只看 ch3
margin_set 0 high 8 # ch0 margin high 8%
margin_set 5 low 5 # ch5 margin low 5%
margin_set 3 nominal 8 # ch3 回標稱值
margin_operation 0 high # 只切 operation
margin_operation 0 nominal
margin_apply_profile profiles/combo_SWB_CONN13_high.conf # 批次套用(要在 LTC2980_Margin_Script/ 底下)
margin_apply_profile profiles/combo_normal.conf # 全部回 nominal
margin_init Blanton_SWB1_CONN16 # 換一顆
margin_apply_profile profiles/combo_SWB_CONN16_high.conf
Profile 一覽
| Profile | 適用 | 說明 |
|---|---|---|
combo_SWB_CONN13_high / _low |
只能套 SWB CONN13 | 每個 channel 依該板的軌給 3% 或 5% |
combo_SWB_CONN14_high / _low |
只能套 SWB CONN14 | 同上 |
combo_SWB_CONN15_high / _low |
只能套 SWB CONN15 | 同上 |
combo_SWB_CONN16_high / _low |
只能套 SWB CONN16 | 同上 |
comboA_SWB_CONN13~16 / comboB_SWB_CONN13~16 |
只能套對應 CONN | 棋盤式:相鄰軌一高一低;A、B 互補,兩個都跑完每條軌兩個方向都測到 |
comboA_CB / comboB_CB |
只能套 CB | 同上,CB 版 |
combo_high3 / combo_low3 |
通用 | 全部 channel ±3%(CB 用這組) |
combo_high5 / combo_low5 |
通用 | 全部 channel ±5% |
combo_normal |
通用 | 全部回 nominal |
all_off |
通用 | ⚠️ 全部 OPERATION off(關輸出) |
- SWB0 與 SWB1 的同號 CONN 共用同一個 profile(兩片板子的軌相同,只差 I2C bus)。
- ⚠️ per-CONN profile 套到別的 CONN 會 margin 到錯的軌,而且不會報錯。 套之前確認
margin_init載入的是哪一顆。 - 回到正常狀態用
combo_normal,不是all_off。
多顆一起跑(script/)
cd ~/Blanton_Script/LTC2980_Margin_Script
source script/margin_status_all.sh # 9 顆依序 margin_init + margin_status
source script/margin_apply_profile_all.sh # 每顆套各自的 profile(預設 SWB 用自己 CONN 的 _high,CB 用 combo_high3)
source script/margin_save_all.sh # ⚠️ 只寫其中幾顆的 NVM(全部 9 顆請用 margin_save all)
- 要改範圍:編各支 script 開頭的
BOARDS=( ... )陣列,註解掉不想跑的那行。 margin_apply_profile_all.sh另有PROFILES=( ... )陣列,PROFILES[i]套在BOARDS[i],只寫名稱(不含路徑和.conf),兩個陣列長度不同會直接報錯。- 跑 LOW 那一輪:把
PROFILES裡的_high全換成_low再跑一次。 - Script A / C 的
EN_Margin=1走的就是margin_status_all.sh+ 逐顆margin_status。
寫 NVM(⚠️ 永久,測試流程中絕不執行)
margin_save* 會把目前的 margin / OV / UV 設定永久寫進 NVM,斷電不會還原,可能蓋掉客戶出廠設定。
真的要寫之前,先用 margin_status_all.sh 確認每個 channel 的狀態正確。
| 指令 | 寫哪些 | 備註 |
|---|---|---|
margin_save |
目前載入的那顆(2 顆 LTC2977) | |
margin_save all |
settings/ 全部 9 顆 |
中途失敗不會停,最後印成功 / 失敗總結 |
margin_save blanton |
18 顆 LTC2977,走原生 i2c | 不需 margin_init、不動目前載入的那顆;2026-08-27 上機驗證 |
margin_save blanton 送出的就是這 18 行(PMBus STORE_USER_ALL = 0x15,send-byte,不帶 data):
i2cset -f -y 4 0x5C 0x15 ; i2cset -f -y 4 0x5E 0x15 # CB CONN13
i2cset -f -y 15 0x5C 0x15 ; i2cset -f -y 15 0x5E 0x15 # SWB0 CONN13
i2cset -f -y 13 0x5C 0x15 ; i2cset -f -y 13 0x5E 0x15 # SWB0 CONN14
i2cset -f -y 15 0x62 0x15 ; i2cset -f -y 15 0x64 0x15 # SWB0 CONN15
i2cset -f -y 13 0x62 0x15 ; i2cset -f -y 13 0x64 0x15 # SWB0 CONN16
i2cset -f -y 16 0x5C 0x15 ; i2cset -f -y 16 0x5E 0x15 # SWB1 CONN13
i2cset -f -y 14 0x5C 0x15 ; i2cset -f -y 14 0x5E 0x15 # SWB1 CONN14
i2cset -f -y 16 0x62 0x15 ; i2cset -f -y 16 0x64 0x15 # SWB1 CONN15
i2cset -f -y 14 0x62 0x15 ; i2cset -f -y 14 0x64 0x15 # SWB1 CONN16
| Linux bus | CB FPGA F3 通道 | 板 / 接頭 |
|---|---|---|
| 4 | (CPU 原生) | CB CONN13 |
| 13 | Ch6 | SWB0 CONN14 / CONN16 |
| 15 | Ch8 | SWB0 CONN13 / CONN15 |
| 14 | Ch7 | SWB1 CONN14 / CONN16 |
| 16 | Ch9 | SWB1 CONN13 / CONN15 |
- DUT 沒裝滿板子時:把
margin.sh開頭MARGIN_BLANTON_STORE陣列裡對應的行註解掉。 - 回報
/dev/i2c-N不存在 = FPGA 的 i2c adapter 沒起來;回報 NACK = 板子 / 晶片的問題。 - 每顆之間預設等 0.5 秒(
MARGIN_STORE_SETTLE),工具沒有去讀晶片的 busy bit,這段等待是唯一的緩衝。
注意事項
- 改電壓會弄壞 DUT:套 profile 前確認該軌的 OV / UV limit;部分 margin 電阻沒 populate,那些軌的電壓不會動,不是腳本壞了。
margin_status的偏差 % 是以VNOM(Blanton 實測中位數,2026-08-30 起)為分母;跨這個日期的 margin log 不能直接互比。- SWB 的 LTC2977 有兩條路可以到:一般功能走 CB FPGA(
cb_pmbus_*),margin_save blanton走原生 i2c。同一顆晶片不要兩條路同時用。 - margin 之前
margin.sh會自動把該 channel 的ON_OFF_CONFIG設成0x1a(否則 margin 不會生效),這只改 RAM,斷電會還原,不是 NVM 寫入;MARGIN_AUTO_ENABLE=0可關掉。 - log 在
LTC2980_Margin_Script/logs/:主 log 是摘要,每行帶(detail Line:N)對到 detail log 的完整輸出。
blanton_multiphase_margin.sh — 多相 VRM(38 條軌)
~/Blanton_Script/blanton_multiphase_margin.sh high3 # 全部 +3%
~/Blanton_Script/blanton_multiphase_margin.sh low3 # 全部 -3%
~/Blanton_Script/blanton_multiphase_margin.sh comboA # 混合 A
~/Blanton_Script/blanton_multiphase_margin.sh comboB # 混合 B(comboA 的高低對調)
~/Blanton_Script/blanton_multiphase_margin.sh normal # 回標稱值
~/Blanton_Script/blanton_multiphase_margin.sh high3 -u 0 # 只 SWB0
~/Blanton_Script/blanton_multiphase_margin.sh high3 -n # 只印指令
~/Blanton_Script/blanton_multiphase_margin.sh save # ⚠️ 永久寫 NVM
- 每條軌印一行:
SWB0_0V9_ANLG0 - 0.930V Configure Done。 - 改完用
blanton_multiphase_read.sh讀回確認。 normal之後 TH6_CORE 讀回約 0.859 V 不是 0.8 V,那是 load line,不是寫失敗。
2.5 交換晶片:流量 / BER / FDR / 負載
blanton_traffic_linespeed.sh — SWB loopback 線速流量
source ~/Blanton_Script/blanton_traffic_linespeed.sh
blanton_traffic_linespeed ps # 看有接線的 port link / speed
blanton_traffic_linespeed init # 建 VLAN 30..137,cdN <-> cdN+32
blanton_traffic_linespeed clear # 清計數器
blanton_traffic_linespeed show # 看計數器
blanton_traffic_linespeed start # 打流量
blanton_traffic_linespeed stop # 移除 VLAN 成員(--destroy 連 VLAN 一起砍)
blanton_traffic_linespeed report # 每一對 TX/RX 交叉比對 → PASS / FAIL / NA
blanton_traffic_linespeed run # ps → init → clear → start → report 一條龍
blanton_traffic_linespeed report -f <log> # 離線重解一份存下來的 console log
ps實際下的是bcmcmd -n <u> -c 'ps <有接線的 port 清單>';-p "<list>"換清單、TL_PS_PORTS=all看全部。report的 exit:0 全 PASS、2 有 FAIL / NA。- 判定是成對交叉比對(cdA 的 TX = cdB 的 RX),不看絕對值。
blanton_fdr.sh — FDR 統計
~/Blanton_Script/blanton_fdr.sh start # fdrstat STArt bin_group=both Interval=30
~/Blanton_Script/blanton_fdr.sh clear # fdrstat clear
~/Blanton_Script/blanton_fdr.sh rdcnt # fdrstat Counters(至少等 Interval 之後再讀)
~/Blanton_Script/blanton_fdr.sh stop # fdrstat STOp(⚠️ 關鍵字未上機驗證)
~/Blanton_Script/blanton_fdr.sh rdcnt -u 0 # 只 unit 0
~/Blanton_Script/blanton_fdr.sh start -i 60 # Interval 改 60 秒
- 原始輸出照印,不判定 PASS / FAIL。
- 印目前參數:
grep -E '^FDR_[A-Z_]+=' ~/Blanton_Script/blanton_fdr.sh - port 清單同 traffic 的有接線 port(不含 268),
FDR_PORTS="..."可改。
blanton_ber.sh — 全機 SerDes BER(PRBS)
~/Blanton_Script/blanton_ber.sh init # prbs set p=3 + prbs get(檢查每條 lane 有沒有鎖上)
~/Blanton_Script/blanton_ber.sh start # prbsstat STArt Interval=30
sleep 40 # ⚠️ 必須「大於」Interval
~/Blanton_Script/blanton_ber.sh report # 每條 lane 一列,BER < 1e-6 才 PASS,最後 summary
~/Blanton_Script/blanton_ber.sh stop # prbsstat STOp
~/Blanton_Script/blanton_ber.sh clear # prbs clear(解除 PRBS,lane 回正常運作)
- 選項:
-u 0|1、-c 1e-9(換門檻)、-F(只列失敗)、-f <log>(離線重解)、--tsv、--raw。 - summary 每個 unit 三列:
200G ports/100G p268/TOTAL。 - PRBS 跑的時候
show interfaces status會顯示 DOWN,這是正常的。clear之後才回正常。 - 某一組「一條 lane 都沒回報」算 FAIL。
blanton_ber_debug.sh — BER 原始輸出
~/Blanton_Script/blanton_ber_debug.sh # unit 0+1:set p=p31 → get×2 → STArt 30 → sleep 40 → Ber → STOp → clear
~/Blanton_Script/blanton_ber_debug.sh -u 0 # 單一 unit
BER_PORTS="...,268" ~/Blanton_Script/blanton_ber_debug.sh # 加 port 268
這支是
p=p31(已上機驗證),blanton_ber.sh是p=3,兩者量的碼型可能不同。
blanton_tr518.sh — tr 518 負載(量功耗用)
~/Blanton_Script/blanton_tr518.sh start # 兩個 unit,跑完等 120 秒讓功耗穩定
~/Blanton_Script/blanton_tr518.sh start -u 0 # 只 unit 0
~/Blanton_Script/blanton_tr518.sh start --no-wait # 不等
~/Blanton_Script/blanton_tr518.sh start -w 60 # 等 60 秒
~/Blanton_Script/blanton_tr518.sh stop # port cd lb=none
start 每個 unit 依序下:
bcmcmd -n <u> -c 'port cd lb=mac'
bcmcmd -n <u> -c 'l2 learn off'
bcmcmd -n <u> -c 'dsh -c "test mode nr=yes"'
bcmcmd -n <u> -c 'dsh -c "tr 518 Scenario=6 Profile=2 Count=260 PktSize=324 PortList=1-259,270-565 rm=ext CheckLinkTime=20 CheckDataTime=200 testphase=1"'
- 輸出有
TR 518 TEST PARAMETERS才算真的開始跑。 stop只解 loopback,l2 learn off與test mode nr=yes會留著。要一起還原:TR_RESTORE_LEARN=1 TR_RESTORE_TESTMODE=1 ~/Blanton_Script/blanton_tr518.sh stop # 每個 unit 多送:'l2 learn on'、'dsh -c "test mode nr=no"'(這兩行未上機驗證)
blanton_tr518_thermal.sh — tr 518 熱測參數版(未上機驗證)
用法、選項、stop 都跟 blanton_tr518.sh 一樣,只有 tr 518 參數不同:
bcmcmd -n <u> -c 'dsh -c "tr 518 Scenario=6 Profile=2 portstopktszstride=1 Count=260 PktSize=603,218 CheckLinkTime=20 CheckDataTime=200 TestPhase=1"'
參數覆蓋用 TR_THERMAL_ARGS="..."(不是 TR_TEST_ARGS)。
port_prbs_monitor.sh — 100G PRBS
bash ~/Blanton_Script/port_prbs_monitor.sh start # Ethernet513 + 514
bash ~/Blanton_Script/port_prbs_monitor.sh start a # 只 Ethernet513
bash ~/Blanton_Script/port_prbs_monitor.sh start b # 只 Ethernet514
bash ~/Blanton_Script/port_prbs_monitor.sh report # PASS / FAIL(沒跑的顯示 SKIP)
bash ~/Blanton_Script/port_prbs_monitor.sh stop # prbsstat STOp + prbs clear
PRBS 打起來時 link 顯示 down 是正常的,所以
start刻意不印 port status。
unused_lanes.sh / retimer_lanes.sh — 沒接線的 lane 關 TX
~/Blanton_Script/unused_lanes.sh status # 兩個 unit 全部列出 rx_lock / tx_off
~/Blanton_Script/unused_lanes.sh off # 預設 TX squelch
~/Blanton_Script/unused_lanes.sh off --asic 0 --th6 # 只 unit 0,連 retimer 後面的 TH6 port 一起關
~/Blanton_Script/unused_lanes.sh on # 開回來
~/Blanton_Script/retimer_lanes.sh 0 0x102 0xff status # 單顆 retimer:<asic> <addr> <lane_map> <off|on|status>
- lane 有 RX lock(有訊號進來)時
off會被拒絕(exit 2),--force才硬關。 - Script A 會
off,沒有任何腳本on回來;需要 DUT 回正常狀態時手動on。 - 兩支都要
chmod +x(unused_lanes.sh會檢查retimer_lanes.sh的 exec bit)。
2.6 SerDes DSC 擷取
bcm_dsc_scan.sh — DUT 端擷取
~/Blanton_Script/bcm_dsc_scan.sh # unit 0+1 全掃,約 10 分鐘
~/Blanton_Script/bcm_dsc_scan.sh -u 0 # 只掃一個 unit
~/Blanton_Script/bcm_dsc_scan.sh -f my.log -F # 自訂檔名 + 覆蓋
~/Blanton_Script/bcm_dsc_scan.sh -n # dry-run,只列要掃的 port
- log 在
~/Blanton_Script/log/,掃完自動 cp 到/host/hw-eval/jobs(-C關掉)。 - 結尾固定印
### DSC_SCAN_DONE rc=<n>,rc=0 才是全部 port 都拿到完整 dump。
bcm_dsc_parse.sh — raw log 轉 CSV
sh ~/Blanton_Script/bcm_dsc_parse.sh -i blanton_dsc_ScriptA_u0.log -o u0
# 產出 u0_lane.csv(每 lane 一列)+ u0_pm.csv(每 pm_id 一列)
Host / DUT 都能跑(純 sh + awk)。解不出來的列標成 UNPARSED 印到 stderr。
bcm_100g_dsc_cycle.sh — 100G link down/up 循環(未上機驗證)
~/Blanton_Script/bcm_100g_dsc_cycle.sh # 印說明
~/Blanton_Script/bcm_100g_dsc_cycle.sh 200 # 跑 200 輪
~/Blanton_Script/bcm_100g_dsc_cycle.sh 200 -d # 每行指令以 [CMD] 印出
~/Blanton_Script/bcm_100g_dsc_cycle.sh 20 -T # 跳過 tuning
~/Blanton_Script/bcm_100g_dsc_cycle.sh 1 -n # dry-run
log:~/dsc_log/100G_dsc_cycle_test_<ts>.log。
2.7 背景監控(start / stop 型)
這幾支共通:start 只等 1 秒就返回(不是跑完一輪)、start 會先清空 log、需要 exec bit。
⚠️
bmc_monitor.sh tail是tail -f,永遠不返回,TTL 裡絕對不要用。看 log 請用cat(nfc_polling.sh tail N不會卡住)。
mgmt_ping_monitor.sh — 10G + 1G 管理網路 ping
~/Blanton_Script/mgmt_ping_monitor.sh start # 背景,log/mgmt_ping.log
~/Blanton_Script/mgmt_ping_monitor.sh status
~/Blanton_Script/mgmt_ping_monitor.sh stop # 停 + 產出報表(每張卡最近 N 筆 + 統計 + 判定)
~/Blanton_Script/mgmt_ping_monitor.sh summary # 只看每段的 RESULT 行
~/Blanton_Script/mgmt_ping_monitor.sh clear
cat ~/Blanton_Script/log/mgmt_ping.log
- IP 設定在腳本開頭的 User Configurable Section(預設 eth0
192.168.1.99→192.168.1.30、eth1192.168.1.101→192.168.1.31),依現場網路改。 - 兩張卡同網段會 ARP flux:判讀看
RESULT行的nic_tx/nic_rx——ping 成功但nic_tx接近 0 = 封包從另一張卡出去的。
nfc_polling.sh — NFC tag 輪詢
~/Blanton_Script/nfc_polling.sh start # 背景
~/Blanton_Script/nfc_polling.sh status # pid、已跑幾輪、最後一筆結果
~/Blanton_Script/nfc_polling.sh report # PASS / FAIL / ERROR 統計(輪詢中也能跑)
~/Blanton_Script/nfc_polling.sh tail 50 # 最後 50 行(不會卡住)
~/Blanton_Script/nfc_polling.sh stop
~/Blanton_Script/nfc_polling.sh fg # 前景跑
- 每輪呼叫同目錄的
blantons_nfc_validate.py test --debug。 ERROR= 工具沒印出[PASS]/[FAIL]或逾時,跟「tag 讀不到(FAIL)」分開算。NFC_INTERVAL_SEC/NFC_TIMEOUT_SEC/NFC_ARGS可調(每個子指令都要帶)。
bmc_monitor.sh — BMC 記憶體 + I2C 圖樣
~/Blanton_Script/bmc_monitor.sh start # 背景,log/bmc_poll.log
~/Blanton_Script/bmc_monitor.sh status
~/Blanton_Script/bmc_monitor.sh stop
~/Blanton_Script/bmc_monitor.sh fg # 前景跑
cat ~/Blanton_Script/log/bmc_poll.log
每輪透過 bmc-manager run 在 BMC 上跑 free -m + I2C(bus 1, 0x41)寫 55 AA 55 AA / AA 55 AA 55 再讀回比對,間隔 10 秒。要加減指令改腳本開頭的 COMMANDS=( ... )。
bmc_monitor_ddr.sh — 已停用
BMC DDR 壓力已改成 Script B 的 bgctl run bmc-manager run '/usr/bin/memtester 64M'。檔案保留,用法同 bmc_monitor.sh(log 為 log/bmc_ddr.log)。
2.8 其他
tray_id_stress.sh — Tray ID I2C stress
~/Blanton_Script/tray_id_stress.sh # bus 34/35/38/39,0x70 reg 0x02:寫 0xA5/0x5A 讀回比對 → Summary
~/Blanton_Script/tray_id_stress.sh -n 100 # 重複 100 輪
~/Blanton_Script/tray_id_stress.sh -R # 跑完不還原(預設會寫回原值並讀回確認)
exit:0 全 PASS / 1 有 FAIL(讀回不符)或 ERROR(i2c 指令本身失敗)/ 2 參數錯。
usb_target.sh — 找 USB 隨身碟
bash ~/Blanton_Script/usb_target.sh # 掛好並印掛載點(預設 /mnt/usb)
bash ~/Blanton_Script/usb_target.sh -o dev # 印 partition(例如 /dev/sda1)
bash ~/Blanton_Script/usb_target.sh -o both # 印 "<dev> <mnt>"
bash ~/Blanton_Script/usb_target.sh -o id # 印 /dev/disk/by-id/... 路徑
bash ~/Blanton_Script/usb_target.sh -n -o both # 只偵測,不掛載
| exit | 意思 |
|---|---|
| 0 | 成功 |
| 1 | 找不到 USB 隨身碟 |
| 2 | 偵測到多支(拒絕猜) |
| 3 | 沒有可用的檔案系統 |
| 4 | 掛載失敗 |
| 5 | 掛上了但不能寫 |
blantons_nfc_validate.py — 客戶 NFC 驗證工具(v2.5)
python3 ~/Blanton_Script/blantons_nfc_validate.py inventory # 唯讀探測,不送 I2C、不寫硬體
python3 ~/Blanton_Script/blantons_nfc_validate.py test --debug # 切 VEN 並跑廠商 NCI 輪詢流程
python3 ~/Blanton_Script/blantons_nfc_validate.py --version
平常由 nfc_polling.sh 呼叫,不需要手動跑。
附錄:一頁速查
# 佈署
mount /dev/sda1 /mnt/usb && cp -r /mnt/usb/Blanton_Script ~/
find ~/Blanton_Script -name '*.sh' -exec chmod +x {} + ; grep -rlU $'\r' ~/Blanton_Script
# 載入(Script A 也是這 6 支)
source ~/Blanton_Script/blanton_fpga_pcimem.sh
source ~/Blanton_Script/blanton_cb_i2c.sh
source ~/Blanton_Script/blanton_icb_vi2c.sh
source ~/Blanton_Script/blanton_pwr_data.sh
source ~/Blanton_Script/blanton_traffic_linespeed.sh
source ~/Blanton_Script/LTC2980_Margin_Script/margin.sh
# 收拾一個被中斷的測試
kill $(jobs -p); systemctl stop mlucas-amm; bgctl stop --all; bgctl reset --yes
~/Blanton_Script/mgmt_ping_monitor.sh stop; ~/Blanton_Script/nfc_polling.sh stop; ~/Blanton_Script/bmc_monitor.sh stop
systemctl stop qfx5252-bmc-usb-net-test.service
blanton_traffic_linespeed stop; ~/Blanton_Script/blanton_fdr.sh stop
~/Blanton_Script/blanton_tr518.sh stop # 跑過 Script 4 / tr 518 時
~/Blanton_Script/unused_lanes.sh on # 需要 DUT 回正常狀態時