5 Commits
Author SHA1 Message Date
etwenandClaude Opus 5 215fed6e95 fix(stress): Keep the SSD and USB jobs alive for the whole soak
qfx5252-stress-usb was started with --runtime 60. It finished a minute
into an overnight run and the USB path sat idle for the rest of the
night - nothing failed, nothing said so, and the log looked complete.
SSD had the same shape at --runtime 3600. Both are now 86400, and the
BMC DDR memtester drops its loop count so it runs until stopped.

86400 is 24h, not forever. Past that SSD and USB die quietly and the
only clue is the shorter bgctl list Script B already prints each round.
Said so in the version history, the release notes and ARCHITECTURE.

Adds blanton_multiphase_margin.sh: the multiphase controllers on both
switch boards over the native i2c buses (SWB0 on i2c-13/15, SWB1 on
-14/-16), 19 rails each. high3/low3/comboA/comboB set voltages and print
one line per rail; save commits them and prints Multiphase Save All,
because that list has no per-rail mapping to report against.

Two hazards it carries: save is STORE_USER_ALL and permanent, and these
are NOT the LTC2980s margin.sh drives - the two tools reach the same
rails from opposite sides with no interlock between them.

The emitted commands were diffed against tools/Multiphase_*.txt: argv
identical for all five. The rail-to-netname mapping was cross-checked
against the bus numbers rather than trusted by line position - blocks
1..19 are all bus 13/15 and 20..38 all 14/16, matching the SWB0/SWB1
split of Multiphase_Netname.

blanton_traffic_linespeed v0.7.0 appends PatternRandom=yes to every tx
including ce0, and the defaults become tx 200 length=324. A fixed
pattern can sit on a benign bit sequence for a whole run; a changing one
is what exposes a weak lane. -r no forces fixed, -r "" omits the
argument for an SDK that will not take it. Bytes per burst went 51200 ->
64800, so absolute counter totals do not carry across this build - the
pair cross-check that decides PASS/FAIL does.

Script A -> V1.1.5.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-09-01 11:04:45 +08:00
etwenandClaude Opus 5 db44f72352 feat(thermal): Add a standalone thermal/safety run, and move margin out of the soak loop
4_Blanton_Script_thermal_safety.ttl brings the DUT up the way Script A
does, then loads it - mlucas-avx2 -cpu 0:15 in the background plus
blanton_tr518.sh start - and samples platform data and both switch
boards' rail power every minute. Power per rail under sustained full
load, over hours, is the whole point of it.

It is standalone: nothing starts it, it starts nothing, and it must not
share a DUT with Script B because both take over the cd ports.

It also has no teardown. When you interrupt it the unit is still in
port cd lb=mac / l2 learn off / test mode nr=yes and mlucas is still
running, and show interfaces status does not reveal any of that. Called
out in the version history, the release notes, CLAUDE.md gotchas and the
ARCHITECTURE future-work list, because whoever uses the box next will not
find out on their own.

Script B's per-round loop drops the margin scan. The loop is meant to be
a quick minute-by-minute sample and margin_status_all.sh walks nine
LTC2980s over I2C, which dominated the round. Script C takes it instead,
once, before show uptime. The trade-off is real: margin drift DURING the
soak is no longer visible, only a start and an end reading. Documented
rather than glossed over, with a suggestion (scan every N rounds) if it
needs to come back.

Script C also sends exit and waits for "Script done" before
hw-test-session finish, so finish runs in the login shell rather than
inside the session it is closing.

Adds docs/Blanton_Test_Flow.drawio: all four scripts side by side, with
the config flags that change each step marked, Script B's one real goto
drawn, and the A->B->C handoffs shown as the manual steps they are.

The new script arrived LF-only while every other .ttl is CRLF and
.gitattributes marks *.ttl as -text, so what is committed is exactly what
Tera Term reads. Converted.

Script A -> V1.1.4.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-08-31 22:19:38 +08:00
etwenandClaude Opus 5 9cc41f6fbd fix(margin): Reference VNOM to what the rails run at, and split profiles per CONN
86 of the 144 margin channels moved up +0.8% .. +2.5% to the measured
median for this platform (3.3 -> 3.38, 0.9 -> 0.915, 0.8 -> 0.82, ...).

That is not a display change. VNOM is the denominator of margin_status'
deviation %, and it is also the basis margin_set derives high/low/OV/UV
from - so both the number you read and the voltage you apply move with
it. A rail steady at 0.756 V used to read +0.80% against a nominal 0.75
and now reads 0.00%. Margin logs from before and after cannot be
compared: the reference moved, the hardware did not.

comboA/comboB are replaced by combo_SWB_CONN13..16_{high,low}. The
per-channel percentages are positional, so they follow the rails of one
specific board - applying a CONN13 profile to a CONN16 margins the wrong
rails and nothing detects it. SWB0 and SWB1 share a profile per CONN
because their rails are identical.

Fixes two things the deletion broke:
  - margin_apply_profile_all.sh still named comboA for all nine boards,
    which would now stop at "Profile not found" nine times over. It names
    the matching per-CONN profile instead, with CB on the generic
    combo_high3, and a note that the low pass is _high -> _low.
  - docs/LTC2980_channel_map.csv is generated from settings/*.conf, so
    all 86 changed rails were stale in it. Regenerated.

The eight new profiles also still carried comboA's header comment
("alternating high/low"), which describes neither what they contain nor
what they are for.

Script A -> V1.1.3.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-08-30 22:13:43 +08:00
etwenandClaude Opus 5 bc2b529c3a feat(nfc): Poll the NFC tag through the soak instead of sampling it once
nfc_polling.sh wraps blantons_nfc_validate.py in a background loop and
keeps score: start/stop/status/tail/report/clear/fg. Script A takes a
30s baseline, Script B starts the poll for the soak, Script C stops it
with the other monitors and reports.

report only reads the log, so it can be run mid-soak without disturbing
anything - and it says RUNNING so a snapshot is not read as the final
answer. Each round appends a machine-readable RESULT line, which keeps
the tally independent of the tool's wording.

ERROR is counted apart from FAIL. A round where the tool printed neither
[PASS] nor [FAIL] - crashed, missing, hung past the timeout - measured
nothing, and that is a different fault from a tag that would not read.
Rolling them together hides whichever one you are not looking for.

Two habits from earlier bugs are baked in: tail does not follow (tail -f
never returns and a macro waiting on the prompt hangs there), and the .py
is called through python3 rather than ./ (it arrives mode 100644 and a
USB copy carries no execute bit).

Also fixes Script C copying "nfc_polling.log" to the job dir when the
file is "nfc_poll.log". The cp failed, nothing checked it, and the run
finished looking fine - you would find out at the desk, with a job
archive that had no NFC log in it.

Script A -> V1.1.2.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-08-28 22:41:02 +08:00
etwenandClaude Opus 5 c3b0d49145 fix(session): Clear the last run's jobs and session before starting
After a run that ended badly - Tera Term closed, DUT rebooted mid-soak,
macro stopped by hand - the stress jobs kept running and the test session
stayed open. The next run then started on a box that was already loaded.
Nothing errored; the numbers were just quietly wrong.

Script A now opens with hw-test-session finish, bgctl reset --yes,
bgctl stop --all, then bgctl list. The list is the point of the sequence:
it is the one line in the log that proves the DUT was idle at the start.

Script A -> V1.1.1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-08-28 22:04:31 +08:00
44 changed files with 4846 additions and 260 deletions
+43 -7
View File
@@ -120,6 +120,7 @@ Blanton_TTL_Script/
│ ├── Blantons_FPGA_Registers_draft.docx # 同上,客戶原始 docx │ ├── Blantons_FPGA_Registers_draft.docx # 同上,客戶原始 docx
│ ├── Blantons_FPGA_Registers_Map_draft.xlsx │ ├── Blantons_FPGA_Registers_Map_draft.xlsx
│ ├── Blantons_PCIe_AER_and_DDR_EDAC_checks.pdf # AER / EDAC 檢查點依據 │ ├── Blantons_PCIe_AER_and_DDR_EDAC_checks.pdf # AER / EDAC 檢查點依據
│ ├── Blanton_Test_Flow.drawio # A/B/C + 熱安規四支的測試流程圖(draw.io)
│ ├── LTC2980_channel_map.csv # 9 個 settings/*.conf 合併:Board,CONN,Ch,NetName,Vnom144 列) │ ├── LTC2980_channel_map.csv # 9 個 settings/*.conf 合併:Board,CONN,Ch,NetName,Vnom144 列)
│ ├── TTL_Script_Blanton_Status_20260814.xlsx │ ├── TTL_Script_Blanton_Status_20260814.xlsx
│ └── TTL_Script_Blanton_Status_20260817.xlsx # ⭐ 最新:三支腳本逐項 StatusOK / On-Going + Owner │ └── TTL_Script_Blanton_Status_20260817.xlsx # ⭐ 最新:三支腳本逐項 StatusOK / On-Going + Owner
@@ -134,6 +135,8 @@ Blanton_TTL_Script/
│ ├── 100G_PRBS.txt # 100G PRBS 原始指令(port_prbs_monitor.sh 的來源) │ ├── 100G_PRBS.txt # 100G PRBS 原始指令(port_prbs_monitor.sh 的來源)
│ ├── TR518.txt # 內建封包測試 tr 518 → blanton_tr518.sh │ ├── TR518.txt # 內建封包測試 tr 518 → blanton_tr518.sh
│ ├── BER_Test.txt # 全機 PRBS BER 指令 → blanton_ber.sh │ ├── BER_Test.txt # 全機 PRBS BER 指令 → blanton_ber.sh
│ ├── Multiphase_{high3,low3,comboA,comboB,Save}.txt # → blanton_multiphase_margin.sh
│ ├── Multiphase_Netname # 38 條軌的 net 名稱(區塊順序對應)
│ ├── 100G_Traffic.txt # ce0 VLAN 138 打流 → blanton_traffic_linespeed.sh │ ├── 100G_Traffic.txt # ce0 VLAN 138 打流 → blanton_traffic_linespeed.sh
│ ├── fan_ctrl.txt # MAX31790 unbind/bind + fan-speed-control.sh 30 │ ├── fan_ctrl.txt # MAX31790 unbind/bind + fan-speed-control.sh 30
│ └── gen_channel_map.sh # settings/*.conf → docs/LTC2980_channel_map.csv(需 gawk │ └── gen_channel_map.sh # settings/*.conf → docs/LTC2980_channel_map.csv(需 gawk
@@ -152,6 +155,7 @@ Blanton_TTL_Script/
└── src/ └── src/
└── Script_ABC_Blanton/ # ← Tera Term 的工作目錄(整包給測試員) └── Script_ABC_Blanton/ # ← Tera Term 的工作目錄(整包給測試員)
├── 4_Blanton_Script_thermal_safety.ttl # 熱 / 安規:獨立跑,不接 A→B→C
├── config.ttl # 全域設定:testcase 名、EN_Margin / EN_log、三個 prompt 字串 ├── config.ttl # 全域設定:testcase 名、EN_Margin / EN_log、三個 prompt 字串
├── 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
@@ -188,6 +192,9 @@ Blanton_TTL_Script/
│ # eth0→TARGET_10G、eth1→TARGET_1G,兩張卡同時持續 ping │ # eth0→TARGET_10G、eth1→TARGET_1G,兩張卡同時持續 ping
├── port_prbs_monitor.sh # 100G uplink PRBS 測試(bcmcmd phy diag ├── port_prbs_monitor.sh # 100G uplink PRBS 測試(bcmcmd phy diag
├── blanton_ber.sh # 全機 SerDes BER 掃描(phydiag prbs / prbsstat ├── blanton_ber.sh # 全機 SerDes BER 掃描(phydiag prbs / prbsstat
├── blanton_multiphase_margin.sh # 多相 VRM margin(原生 i2c38 條軌)
├── nfc_polling.sh # NFC tag 背景輪詢 + PASS/FAIL 統計
├── blantons_nfc_validate.py # NFC/NCI 驗證工具(廠商提供,未修改)
├── blanton_tr518.sh # TR518 封包測試,量功耗前的負載來源 ├── blanton_tr518.sh # TR518 封包測試,量功耗前的負載來源
├── TH6_SWB0_power_readback.sh # SWB0 19 條軌 V×I + 總功耗 ├── TH6_SWB0_power_readback.sh # SWB0 19 條軌 V×I + 總功耗
├── TH6_SWB1_power_readback.sh # SWB1 同上 ├── TH6_SWB1_power_readback.sh # SWB1 同上
@@ -200,7 +207,9 @@ Blanton_TTL_Script/
├── margin.sh # margin_init/status/set/apply_profile/save ├── margin.sh # margin_init/status/set/apply_profile/save
# # v2.7.0margin_save all / margin_save blanton # # v2.7.0margin_save all / margin_save blanton
├── settings/*.conf # 一個 .conf = 一顆 LTC2980CB + SWB0/1 × CONN13~16 ├── settings/*.conf # 一個 .conf = 一顆 LTC2980CB + SWB0/1 × CONN13~16
├── profiles/*.conf # 16-ch 批次組合comboA/B、high3/5、low3/5、normal、off ├── profiles/*.conf # 16-ch 批次組合。SWB 為 per-CONN
# # combo_SWB_CONN13~16_{high,low}(百分比對應該片的軌)
# # 通用:high3/5、low3/5、normal、all_off
├── script/*_all.sh # 跨 9 顆 LTC2980 的批次 status / apply / save ├── script/*_all.sh # 跨 9 顆 LTC2980 的批次 status / apply / save
├── Ref/margin_command_trace.md # 指令追蹤參考(SWB 章節已標過期,見文件內警告) ├── Ref/margin_command_trace.md # 指令追蹤參考(SWB 章節已標過期,見文件內警告)
└── logs/ # margin 操作 log └── logs/ # margin 操作 log
@@ -241,11 +250,20 @@ Log 檔名規則:`<mdir>\Logs\<project_name>_<strTestcase>_<YYYYmmdd-HHMMSS>.l
| `CB_I2C_CH` | int | `TRANSPORT="swb"` 時的 FPGA I2C 通道(6/7/8/9 | | `CB_I2C_CH` | int | `TRANSPORT="swb"` 時的 FPGA I2C 通道(6/7/8/9 |
| `CHIPS[]` | string[2] | `"bus:addr"`index 0 → CH0~7、index 1 → CH8~15 | | `CHIPS[]` | string[2] | `"bus:addr"`index 0 → CH0~7、index 1 → CH8~15 |
| `CHIP_PRE_CMD[]` / `CHIP_POST_CMD[]` | string[1] | mux 切換等前後置指令,`;` 分隔多筆 | | `CHIP_PRE_CMD[]` / `CHIP_POST_CMD[]` | string[1] | mux 切換等前後置指令,`;` 分隔多筆 |
| `CH<n>_VNOM` | string | 標稱電壓`"-"` = 未使用 / NC | | `CH<n>_VNOM` | string | 這條軌的**基準電壓**`"-"` = 未使用 / NC |
| `CH<n>_NET` | string | 電路 net name(對照 schematic | | `CH<n>_NET` | string | 電路 net name(對照 schematic |
Channel 定址:`ch / 8``CHIPS[]` index`ch % 8` → LTC2977 PMBus PAGE0x00~0x07)。 Channel 定址:`ch / 8``CHIPS[]` index`ch % 8` → LTC2977 PMBus PAGE0x00~0x07)。
**`VNOM` 自 2026-08-30 起是「Blanton 實測中位數」,不是規格標稱值。** 144 條軌裡有 86 條
被改上去 +0.8% ~ +2.5%(例:`PVDD3_3V_SYNTH_LDO_*` 3.3 → 3.38、`P0V9_AVDD_*` 0.9 → 0.915、
`PVDD0_8V_T3` 0.8 → 0.82)。這件事影響兩處,**不是只有顯示**:
- `margin_status` 的偏差 % 是對 `VNOM` 算的 —— 以前一條穩定在 0.756 V 的軌顯示 `+0.80%`
現在顯示 `0.00%`。**舊 log 的偏差 % 不能跟新 log 直接比。**
- `margin_set` 的 high / low / OV / UV **全部由 `VNOM` 推算**`VNOM × (1 ± change%)`),
所以整個 margin 視窗跟著平移。同樣下 `+3%`,實際打到的絕對電壓比以前高。
**SWB 通道與位址對應(2026-08-19 上機驗證,`ababb2c`):** **SWB 通道與位址對應(2026-08-19 上機驗證,`ababb2c`):**
| FPGA I2C 通道 | 板 / 接頭 | LTC2977 位址(lo / hi | | FPGA I2C 通道 | 板 / 接頭 | LTC2977 位址(lo / hi |
@@ -342,16 +360,18 @@ PROFILE_CHANNELS=( "0:high:8" "1:low:8" ... ) # "channel:operation:change_perc
| 模組 | 進入點 | 功能 | | 模組 | 進入點 | 功能 |
|------|--------|------| |------|--------|------|
| **Script APre-test** | `1_Blanton_Script_A.ttl` V1.0.7 | root 登入 → `date -s` 對時 → 清 job log → `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** → 100G uplink 設定與狀態 → **一輪流量基線**`show uptime` | | **Script APre-test** | `1_Blanton_Script_A.ttl` V1.1.5 | 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 BStress** | `2_Blanton_Script_B.ttl` | `mlucas-avx2 -cpu 0:15` + `bgctl run``memtester` / SSD / USB 壓力 + BMC DDR`bmc-manager run memtester`)→ BMC USB net test(探測 cdc_ncm 介面,`systemd-run` 掛 4 小時 ping)→ 啟動 mgmt ping 監控 → `jobs` / `bgctl list` → traffic(依 `SWB_UNIT`)→ `while 1` 每輪完整 PMON + margin | | **Script BStress** | `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 CPost-test** | `3_Blanton_Script_C.ttl` | `kill $(jobs -p)` + `bgctl stop --all` / `reset` + 停 BMC USB unitmgmt ping → PMON + dmesg → 7 組 AER + `ras-mc-ctl` → BMC USB `journalctl``ip -s link show eth0/eth1``cat` mlucas log → traffic `stop` + `report`**BER 掃描**(依 `SWB_UNIT`)→ NVMe 健康 → `show reboot-cause` / `uptime`**job log 複製到 USB(帶時戳)**`hw-test-session finish` | | **Script CPost-test** | `3_Blanton_Script_C.ttl` | `kill $(jobs -p)` + `bgctl stop --all` / `reset` + 停 BMC USB unitmgmt ping**NFC 輪詢** → PMON + dmesg → 7 組 AER + `ras-mc-ctl` → BMC USB `journalctl``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` |
| **SWB loopback 流量** | `blanton_traffic_linespeed <sub> [-u 0\|1\|all]` | `init`VLAN 30..137,成對 `cdN`/`cdN+32`)→ `clear``start``tx 100 length=512`)→ `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 | | **Script 4Thermal / 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` |
| **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 相對 offset32-bit wordBDF 於 source 時自動偵測;`pmc/icb/swb0/swb1_fpga` 走 VSPI 窗口 | | **FPGA 暫存器存取** | `cb_fpga <fn> <addr> [data]``fpga_rescan` | pcimem 打 `resource0` + BAR 相對 offset32-bit wordBDF 於 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 裝置必需) |
| **ICB / PDB 存取** | `vi2c_init/scan/read/write``vi2c_scan_all` | CB F3 VI2C proxy~3.3 ms/reg,取代 VSPI 的 ~18 ms/reg(後者會踩 SMBus 2535 ms timeout | | **ICB / PDB 存取** | `vi2c_init/scan/read/write``vi2c_scan_all` | CB F3 VI2C proxy~3.3 ms/reg,取代 VSPI 的 ~18 ms/reg(後者會踩 SMBus 2535 ms timeout |
| **溫度** | `temp_cb` / `temp_icb` / `temp_all` | TMP7512-bit 左靠齊 ×0.0625)、TMP432(含 RANGE bit 的 64 偏移、remote1/2 | | **溫度** | `temp_cb` / `temp_icb` / `temp_all` | TMP7512-bit 左靠齊 ×0.0625)、TMP432(含 RANGE bit 的 64 偏移、remote1/2 |
| **電源資料** | `pwr_data` / `pwr_data_pdb` / `pwr_pdb_id` | SWB VRM 全軌 Vin/Vout/Iout/Temp 對齊表;MP29816 解析度**執行期從 `MFR_VOUT_SCALE_LOOP` 讀**,不寫死 | | **電源資料** | `pwr_data` / `pwr_data_pdb` / `pwr_pdb_id` | SWB VRM 全軌 Vin/Vout/Iout/Temp 對齊表;MP29816 解析度**執行期從 `MFR_VOUT_SCALE_LOOP` 讀**,不寫死 |
| **電壓 Margin** | `margin_init/status/set/apply_profile/save` + `*_all.sh` | 9 顆 LTC2980CB CONN13、SWB0/1 CONN13~16)批次 high/low margin 與狀態掃描。v2.6.0 起 SWB 路徑真正接上共用 cb_i2c 後端,並有 `margin_swb_info/probe/scan/reset/sem` 除錯包裝 | | **電壓 Margin** | `margin_init/status/set/apply_profile/save` + `*_all.sh` | 9 顆 LTC2980CB CONN13、SWB0/1 CONN13~16)批次 high/low margin 與狀態掃描。`VNOM` 為 Blanton 實測中位數(2026-08-30);SWB 的 profile 是 per-CONN,套錯 CONN 會 margin 到錯的軌且不報錯。v2.6.0 起 SWB 路徑真正接上共用 cb_i2c 後端,並有 `margin_swb_info/probe/scan/reset/sem` 除錯包裝 |
| **Multiphase VRM margin** | `blanton_multiphase_margin.sh {high3\|low3\|comboA\|comboB\|save} [-u 0\|1\|all]` | 兩片 SWB 的多相控制器(**不是** `margin.sh` 管的 LTC2980),走原生 i2c busSWB0 = `/dev/i2c-13`+`-15`、SWB1 = `-14`+`-16`。每片 19 條軌、共 38 條,逐條印 `SWB0_0V9_ANLG0 - 0.930V Configure Done``save` 沒有 per-rail 對應,只印 `Multiphase Save All`。⚠️ `save``STORE_USER_ALL`0x15TH6 core 用 0x17**永久寫 NVM**;⚠️ 與 `margin.sh` 從兩側摸同一批軌,**不可同時用** |
| **Margin 寫 NVM** | `margin_save` / `margin_save all` / `margin_save blanton` | ⚠️ 永久寫入。`0x15` 送 PMBus **send-byte**(不帶 data byte)。`all` = 依 `settings/` 走 9 顆、跑完還原原本載入的板子;`blanton` = 本平台捷徑,18 顆全走原生 i2c bus(`MARGIN_BLANTON_STORE` 表),不需 `margin_init`。每筆之間 `MARGIN_STORE_SETTLE`0.5s),工具**不 poll busy bit** | | **Margin 寫 NVM** | `margin_save` / `margin_save all` / `margin_save blanton` | ⚠️ 永久寫入。`0x15` 送 PMBus **send-byte**(不帶 data byte)。`all` = 依 `settings/` 走 9 顆、跑完還原原本載入的板子;`blanton` = 本平台捷徑,18 顆全走原生 i2c bus(`MARGIN_BLANTON_STORE` 表),不需 `margin_init`。每筆之間 `MARGIN_STORE_SETTLE`0.5s),工具**不 poll busy bit** |
| **管理網路 ping** | `mgmt_ping_monitor.sh {start\|stop\|status\|fg\|tail\|clear\|summary}` | 一輪 = 10G leg + 1G leg,各自 `ip address/route replace``ping -I <if>` 打自己的對端;兩張卡都保持 up。每 leg 記 `ip -s link show` 與該卡的 TX/RX packet delta,另出一行可 grep 的 `RESULT` | | **管理網路 ping** | `mgmt_ping_monitor.sh {start\|stop\|status\|fg\|tail\|clear\|summary}` | 一輪 = 10G leg + 1G leg,各自 `ip address/route replace``ping -I <if>` 打自己的對端;兩張卡都保持 up。每 leg 記 `ip -s link show` 與該卡的 TX/RX packet delta,另出一行可 grep 的 `RESULT` |
| **BMC 監控** | `bmc_monitor.sh {start\|stop\|status\|fg\|tail\|clear}` | 由 host 端 `bmc-manager run` 週期取樣 `free -m`,另加一組 **I2C 寫入/讀回圖樣測試**bus 1、addr 0x41、offset 0x00C0,寫 `55AA55AA` 讀回、再寫 `AA55AA55` 讀回)。B 啟動、C 停止並 `cat log/bmc_poll.log` | | **BMC 監控** | `bmc_monitor.sh {start\|stop\|status\|fg\|tail\|clear}` | 由 host 端 `bmc-manager run` 週期取樣 `free -m`,另加一組 **I2C 寫入/讀回圖樣測試**bus 1、addr 0x41、offset 0x00C0,寫 `55AA55AA` 讀回、再寫 `AA55AA55` 讀回)。B 啟動、C 停止並 `cat log/bmc_poll.log` |
@@ -360,6 +380,7 @@ PROFILE_CHANNELS=( "0:high:8" "1:low:8" ... ) # "channel:operation:change_perc
| **SerDes BER 掃描** | `blanton_ber.sh {init\|clear\|start\|stop\|report} [-u 0\|1\|all]` | 全機每個對接 port 的 PRBS BER`prbs set p=3` + `prbs get`(確認每條 lane 都鎖上)→ `prbsstat STArt Interval=30` →(等一個 interval)→ `prbsstat Ber``STOp``prbs clear``report` 一列一條 lane**BER < 1e-6 才 PASS**,最後跨 unit 的 summary 帶最差 lane。⚠️ PRBS 期間 link 顯示 DOWN、不過流量 | | **SerDes BER 掃描** | `blanton_ber.sh {init\|clear\|start\|stop\|report} [-u 0\|1\|all]` | 全機每個對接 port 的 PRBS BER`prbs set p=3` + `prbs get`(確認每條 lane 都鎖上)→ `prbsstat STArt Interval=30` →(等一個 interval)→ `prbsstat Ber``STOp``prbs clear``report` 一列一條 lane**BER < 1e-6 才 PASS**,最後跨 unit 的 summary 帶最差 lane。⚠️ PRBS 期間 link 顯示 DOWN、不過流量 |
| **TR518 負載** | `blanton_tr518.sh {start\|stop} [-u 0\|1\|all]` | `port cd lb=mac``l2 learn off``test mode nr=yes``tr 518 ... testphase=1`,然後 settle `TR_SETTLE_SEC`120s)再讓人量功耗。`stop` 只送 `port cd lb=none`(照 `TR518.txt`),L2 學習與 test mode **不會還原**`TR_RESTORE_*=1` 才會 | | **TR518 負載** | `blanton_tr518.sh {start\|stop} [-u 0\|1\|all]` | `port cd lb=mac``l2 learn off``test mode nr=yes``tr 518 ... testphase=1`,然後 settle `TR_SETTLE_SEC`120s)再讓人量功耗。`stop` 只送 `port cd lb=none`(照 `TR518.txt`),L2 學習與 test mode **不會還原**`TR_RESTORE_*=1` 才會 |
| **SWB 軌功耗** | `TH6_SWB{0,1}_power_readback.sh` | 讀 `show platform voltage/current` **各一次**,19 條軌 V×I 與總功耗。舊版每軌各讀一次(38 次呼叫、每軌不同時刻),總和是不同瞬間的加總 | | **SWB 軌功耗** | `TH6_SWB{0,1}_power_readback.sh` | 讀 `show platform voltage/current` **各一次**,19 條軌 V×I 與總功耗。舊版每軌各讀一次(38 次呼叫、每軌不同時刻),總和是不同瞬間的加總 |
| **NFC 讀取輪詢** | `nfc_polling.sh {start\|stop\|status\|tail\|report\|clear\|fg}` | 背景重複跑 `blantons_nfc_validate.py`,每輪追加一行機器可讀的 `RESULT=`(PASS/FAIL 取自工具自己的摘要行,兩者皆無則 **ERROR**,與 FAIL 分開計數)。`start` 會先清空 log`report` **只讀 logpolling 中隨時可跑**,並標示 `RUNNING` 免得快照被當最終結果。`tail` **不 follow** |
| **USB 目標偵測** | `usb_target.sh [-o dev\|mnt\|both\|id] [-n] [-r sec]` | 找出插入的 USB 儲存裝置,排除 `/``/host` 的底層碟(本平台可能從 USB DOM 開機),多顆時拒絕猜;掛載時會驗證真的可寫 | | **USB 目標偵測** | `usb_target.sh [-o dev\|mnt\|both\|id] [-n] [-r sec]` | 找出插入的 USB 儲存裝置,排除 `/``/host` 的底層碟(本平台可能從 USB DOM 開機),多顆時拒絕猜;掛載時會驗證真的可寫 |
| **打包交付** | `publish/publish.sh [-v Ver] [-f] [-z] [-n]` | 版號讀 Script A 檔頭,複製成 `publish/Script_ABC_Blanton_<Ver>/`,排除 `*.log`,可另出 zip | | **打包交付** | `publish/publish.sh [-v Ver] [-f] [-z] [-n]` | 版號讀 Script A 檔頭,複製成 `publish/Script_ABC_Blanton_<Ver>/`,排除 `*.log`,可另出 zip |
@@ -378,6 +399,7 @@ Script A ── logopen Logs/Blanton_Margin_<ts>.log ──┐ (之後所有畫
├─ 登入 admin → sudo -i → root@sonic:~# │ ├─ 登入 admin → sudo -i → root@sonic:~# │
├─ date -s "<host 時間>" ← 讓 DUT 時戳可對照 ├─ date -s "<host 時間>" ← 讓 DUT 時戳可對照
├─ rm /host/hw-eval/jobs/* ← 清掉上一輪的 job log ├─ rm /host/hw-eval/jobs/* ← 清掉上一輪的 job log
├─ hw-test-session finish / bgctl reset / stop --all / list (收前一輪)
├─ hw-test-session start / log / status ├─ hw-test-session start / log / status
├─ 風扇:max31790 unbind→sleep→bind18-0020 與 25-0020 各一次) ├─ 風扇:max31790 unbind→sleep→bind18-0020 與 25-0020 各一次)
│ → fan-speed-control.sh <FAN_SPEED> → 回答 y 確認 │ │ → fan-speed-control.sh <FAN_SPEED> → 回答 y 確認 │
@@ -786,6 +808,20 @@ 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 壓力會在
第 24 小時安靜結束,剩下的時間那兩項是閒置的。Script B 每輪都印 `bgctl list`,數量變少會看得到,
但**沒有任何東西會主動報警**。真的要跑更久,得把數字改大或加一段重啟 job 的邏輯。
- **`blanton_multiphase_margin.sh``margin.sh` 沒有互斥機制**:兩支從不同側(原生 i2c vs
LTC2980 PMBus)摸同一批軌,各自都假設自己是唯一的寫入者。目前只靠文件與 help 提醒,
沒有任何執行期檢查。
- **Script 4 沒有收尾段**`while 1` 之後就是檔案結尾,中斷時 DUT 停在 `port cd lb=mac` /
`l2 learn off` / `test mode nr=yes`,而且 `mlucas-avx2` 還在背景跑。要手動
`blanton_tr518.sh stop` + `kill`,否則下一輪任何測試都在被污染的狀態上開始
Script A 的 `bgctl reset/stop --all` 收得掉 job,但收不掉 bcm 的 loopback 設定)。
可考慮加一支對應的收尾腳本,或在檔尾用 `messagebox` 提示要下哪些指令。
- **margin 在 soak 期間不再取樣**V1.1.4):只剩 Script A 的起始值與 Script C 的結束值。
漂移發生在中間就看不到了。若要恢復,比較好的做法是在 B 的迴圈內每 N 輪才掃一次,
而不是每輪都掃。
- **`blanton_ber.sh``sleep 30``BER_INTERVAL` 是兩處要同步改的數字**:Script C 寫死 - **`blanton_ber.sh``sleep 30``BER_INTERVAL` 是兩處要同步改的數字**:Script C 寫死
`sendln "sleep 30"`,腳本預設 `BER_INTERVAL=30`。改一邊沒改另一邊,report 會讀到還沒累積完 `sendln "sleep 30"`,腳本預設 `BER_INTERVAL=30`。改一邊沒改另一邊,report 會讀到還沒累積完
一個 interval 的數字,而且不會有任何警告。 一個 interval 的數字,而且不會有任何警告。
+46 -2
View File
@@ -9,7 +9,7 @@ DUT 端的取數能力由一組 **bash 工具庫** 提供(CB FPGA `pcimem` →
完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。 完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。
**目前狀態(2026-08-28**Script A 為 **V1.1.0**A 集中記錄 A/B/C 三支的變更)。涵蓋 **目前狀態(2026-09-01**Script A 為 **V1.1.5**A 集中記錄所有 TTL 的變更)。涵蓋
PCIe AER / DDR EDAC / PMON+TPM / 電壓 margin9 顆 LTC2980/ SWB loopback 線速流量 / PCIe AER / DDR EDAC / PMON+TPM / 電壓 margin9 顆 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` 指定
@@ -20,7 +20,14 @@ Script B 的 soak 迴圈每輪印 `bgctl list` + `jobs`,並 `pause 60`V1.0.
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 維持循環)。
最後一次發布是 **V1.0.11**;SWB 的 I2C 通道與位址已於 2026-08-19 上機驗證。 Script A 開頭會先收掉前一輪殘留(`hw-test-session finish` + `bgctl reset/stop --all`),
`bgctl list` 確認沒有 job 留著佔資源。
NFC tag 讀取由 `nfc_polling.sh` 背景輪詢(A 做基線、B 起、C 停並 report)。
另有 **`4_Blanton_Script_thermal_safety.ttl`**(熱 / 安規,**獨立跑不接 A→B→C**,滿載後每分鐘
取 PMON + 兩片 SWB 的軌功耗;**沒有收尾段**,中斷後要手動 `blanton_tr518.sh stop`)。
流程圖:`docs/Blanton_Test_Flow.drawio`
最後一次發布是 **V1.1.4**;SWB 的 I2C 通道與位址已於 2026-08-19 上機驗證。
margin 的 `VNOM` 已於 2026-08-30 改為 Blanton 實測中位數(144 條軌中 86 條上調 0.8~2.5%)。
交付用 `./publish/publish.sh` 打包。 交付用 `./publish/publish.sh` 打包。
## 技術棧 ## 技術棧
@@ -110,6 +117,16 @@ bash ~/Blanton_Script/port_prbs_monitor.sh report # PASS/FAIL 統計(沒
bash ~/Blanton_Script/port_prbs_monitor.sh stop # 收尾會跑 prbsstat STOp + prbs clear bash ~/Blanton_Script/port_prbs_monitor.sh stop # 收尾會跑 prbsstat STOp + prbs clear
# ⚠️ PRBS 打起來時 link 會顯示 down,這是正常的 —— 所以 start 刻意不印 port status # ⚠️ PRBS 打起來時 link 會顯示 down,這是正常的 —— 所以 start 刻意不印 port status
# ── 多相 VRM margin(原生 i2c,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
./Blanton_Script/blanton_multiphase_margin.sh save # ⚠️ 永久寫 NVM
# -u 0 / -u 1 單邊(SWB0=i2c-13/15SWB1=i2c-14/16);-n 只印指令
# 逐條印 SWB0_0V9_ANLG0 - 0.930V Configure Donesave 只印 Multiphase Save All
# ⚠️ 這不是 margin.sh 管的 LTC2980,兩支摸同一批軌,不要同時用
# ── 全機 SerDes BERPRBS,期間 link 會顯示 DOWN)──── # ── 全機 SerDes BERPRBS,期間 link 會顯示 DOWN)────
./Blanton_Script/blanton_ber.sh init # prbs set p=3 + prbs get(檢查每條 lane 鎖定) ./Blanton_Script/blanton_ber.sh init # prbs set p=3 + prbs get(檢查每條 lane 鎖定)
./Blanton_Script/blanton_ber.sh start # prbsstat STArt Interval=30 ./Blanton_Script/blanton_ber.sh start # prbsstat STArt Interval=30
@@ -127,6 +144,16 @@ sleep 30 # 至少等一個 interval 再 rep
./Blanton_Script/blanton_tr518.sh stop # 只送 port cd lb=none ./Blanton_Script/blanton_tr518.sh stop # 只送 port cd lb=none
# ⚠️ stop 不還原 l2 learn / test modeTR_RESTORE_LEARN=1 / _TESTMODE=1 才會) # ⚠️ stop 不還原 l2 learn / test modeTR_RESTORE_LEARN=1 / _TESTMODE=1 才會)
# ── NFC tag 輪詢 ────────────────────────────────────
~/Blanton_Script/nfc_polling.sh start # 背景,start 會先清空 log
~/Blanton_Script/nfc_polling.sh status # pid、已跑幾輪、最後一筆結果
~/Blanton_Script/nfc_polling.sh report # PASS/FAIL/ERROR 統計,polling 中也能跑
~/Blanton_Script/nfc_polling.sh tail 50 # 最後 50 行(不 follow,不會卡住)
~/Blanton_Script/nfc_polling.sh stop
# log: ~/Blanton_Script/log/nfc_poll.log
# ERROR = 工具沒印出 [PASS]/[FAIL](或逾時),跟「tag 讀不到」分開算
# NFC_INTERVAL_SEC / NFC_TIMEOUT_SEC / NFC_ARGS 可調(要每個子指令都帶)
# ── USB 目標偵測 ──────────────────────────────────── # ── USB 目標偵測 ────────────────────────────────────
bash ~/Blanton_Script/usb_target.sh -o dev # /dev/sdX1 bash ~/Blanton_Script/usb_target.sh -o dev # /dev/sdX1
bash ~/Blanton_Script/usb_target.sh -o mnt # 掛好並回傳掛載點 bash ~/Blanton_Script/usb_target.sh -o mnt # 掛好並回傳掛載點
@@ -205,6 +232,23 @@ Tera Term 連 COM port (115200-8-N-1)
- ⚠️ **ICB/PDB 一律走 VI2C`blanton_icb_vi2c.sh`),不要走 VSPI**VSPI ~18 ms/reg 會讓 I2C - ⚠️ **ICB/PDB 一律走 VI2C`blanton_icb_vi2c.sh`),不要走 VSPI**VSPI ~18 ms/reg 會讓 I2C
byte 相間隔拉到 ~50 ms,踩中 SMBus 2535 ms timeout,裝置直接 NACK。實測全掃 9.4 s vs 34.0 s。 byte 相間隔拉到 ~50 ms,踩中 SMBus 2535 ms timeout,裝置直接 NACK。實測全掃 9.4 s vs 34.0 s。
- ⚠️ **I2C 讀一律 Repeated START**(不是 STOP + START),否則 PMBus/SMBus 裝置(VRM、EFUSE)不理。 - ⚠️ **I2C 讀一律 Repeated START**(不是 STOP + START),否則 PMBus/SMBus 裝置(VRM、EFUSE)不理。
- ⚠️ **`--runtime 86400` 是 24 小時上限**:超過一天的 soak,SSD / USB 壓力會安靜結束,
剩下的時間那兩項閒置。`bgctl list` 的數量變少是唯一的線索,**不會報警**
- ⚠️ **多相 VRM 與 LTC2980 是同一批軌的兩條路**`blanton_multiphase_margin.sh`(原生 i2c
`margin.sh`LTC2980 PMBus)都假設自己是唯一寫入者,**沒有互斥檢查**,只靠人記得
- ⚠️ **traffic 的計數器基準在 v0.7.0 變了**`tx 100 length=512``tx 200 length=324`
每 burst 的位元組數 +27%。PASS/FAIL 是成對交叉比對不受影響,但**絕對值不能跟舊 log 比**
- ⚠️ **Script 4thermal/safety)沒有收尾**`while 1` 之後就是檔尾。中斷後 DUT 停在
`port cd lb=mac` / `l2 learn off` / `test mode nr=yes``mlucas-avx2` 也還在背景。
下一個測試會在被污染的狀態上開始,而且 **`show interfaces status` 看不出來**。
收尾:`blanton_tr518.sh stop` + `kill $(jobs -p)`
- ⚠️ **Script 4 與 Script B 不能共用同一台 DUT**:兩者都會接管 `port cd` 的 loopback
- ⚠️ **`settings/*.conf``VNOM` 是實測中位數,不是規格值**(2026-08-30 起)。它同時是
`margin_status` 偏差 % 的分母、也是 `margin_set` 推算 high/low/OV/UV 的基準,所以改它會
同時移動「看到的數字」和「實際打出去的電壓」。**跨這個日期的 margin log 不能直接互比。**
- ⚠️ **SWB 的 margin profile 是 per-CONN 的**`combo_SWB_CONN13~16_{high,low}` 各自的百分比
對應該片板子的軌。套到別的 CONN 會 margin 到錯的軌,而且**不會報錯**。CB 沒有專屬 profile
用通用的 `combo_high3` / `combo_low3`
- ⚠️ **`margin_save` / `STORE_USER_ALL` 會永久寫 NVM**,斷電保留 → **測試流程中絕不執行** - ⚠️ **`margin_save` / `STORE_USER_ALL` 會永久寫 NVM**,斷電保留 → **測試流程中絕不執行**
以免覆蓋客戶出廠 config。`margin.sh` 的 auto-enable`ON_OFF_CONFIG=0x1a`)只改 RAM,斷電復原。 以免覆蓋客戶出廠 config。`margin.sh` 的 auto-enable`ON_OFF_CONFIG=0x1a`)只改 RAM,斷電復原。
v2.7.0 新增的 **`margin_save all` / `margin_save blanton` 一次寫 18 個 LTC2977** v2.7.0 新增的 **`margin_save all` / `margin_save blanton` 一次寫 18 個 LTC2977**
+172
View File
@@ -0,0 +1,172 @@
<mxfile host="app.diagrams.net" agent="Blanton_TTL_Script/tools" version="24.7.17">
<diagram id="blanton-test-flow" name="Blanton Test Flow">
<mxGraphModel dx="1400" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1670" pageHeight="1785" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="n11" value="Blanton (Project Helios) — 測試流程" style="text;html=1;align=center;verticalAlign=middle;fontSize=20;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="30" y="20" width="1610" height="34" as="geometry"/></mxCell>
<mxCell id="n12" value="來源:src/Script_ABC_Blanton/{1,2,3}_Blanton_Script_*.ttlScript A V1.1.3 · ⟨…⟩ = 由 config.ttl 的旗標決定" style="text;html=1;align=center;verticalAlign=middle;fontSize=11;fontColor=#666666;" vertex="1" parent="1"><mxGeometry x="30" y="54" width="1610" height="20" as="geometry"/></mxCell>
<mxCell id="n13" value="Script A — Pre-test(基線 / 環境建立)" style="swimlane;html=1;startSize=34;fillColor=#ffffff;strokeColor=#4d4d4d;fontSize=14;fontStyle=1;horizontal=1;" vertex="1" parent="1"><mxGeometry x="30" y="96" width="380" height="1459" as="geometry"/></mxCell>
<mxCell id="n14" value="&lt;b&gt;include config.ttl&lt;/b&gt;&lt;br&gt;project_name, strTestcase, EN_Margin,&lt;br&gt;EN_log, FAN_SPEED, SWB_UNIT0/1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="44" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="n15" value="&lt;b&gt;logopen&lt;/b&gt; Logs/&amp;lt;proj&amp;gt;_&amp;lt;case&amp;gt;_&amp;lt;ts&amp;gt;.log&lt;br&gt;&lt;i&gt;⟨EN_log = 1⟩&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="124" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e16" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n14" target="n15"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n17" value="&lt;b&gt;Root Login&lt;/b&gt;&lt;br&gt;login → sudo -i → root@sonic:~#" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="189" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e18" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n15" target="n17"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n19" value="&lt;b&gt;Pre Setting&lt;/b&gt;&lt;br&gt;date -s 對時 · rm /host/hw-eval/jobs/*" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="254" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e20" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n17" target="n19"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n21" value="&lt;b&gt;HW Test Session — 收前一輪&lt;/b&gt;&lt;br&gt;hw-test-session finish · bgctl reset --yes&lt;br&gt;bgctl stop --all · &lt;b&gt;bgctl list 必須空&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="319" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e22" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n19" target="n21"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n23" value="&lt;b&gt;hw-test-session start&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="399" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e24" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n21" target="n23"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n25" value="&lt;b&gt;FAN SPEED&lt;/b&gt;&lt;br&gt;max31790 rebind ×2 → fan-speed-control.sh $FAN_SPEED" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="449" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e26" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n23" target="n25"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n27" value="&lt;b&gt;Wait DUT Init&lt;/b&gt; utils/wait_init.ttl&lt;br&gt;輪詢 bcmcmd ps,兩 unit link up ≥ 216&lt;br&gt;&lt;i&gt;⟨SWB_UNIT0 / SWB_UNIT1⟩ · 無逾時出口&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="514" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e28" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n25" target="n27"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n29" value="&lt;b&gt;DUT Info&lt;/b&gt;&lt;br&gt;show boot/version/platform · fwutil · syseeprom&lt;br&gt;ssdhealth · TPM · NVMe" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="594" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e30" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n27" target="n29"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n31" value="&lt;b&gt;BMC&lt;/b&gt; bmc-first-enroll · version · status" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="674" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e32" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n29" target="n31"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n33" value="&lt;b&gt;Load Shell Script&lt;/b&gt;&lt;br&gt;source blanton_fpga_pcimem / cb_i2c / icb_vi2c /&lt;br&gt;temp_sensor / pwr_data / traffic_linespeed / margin" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="724" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e34" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n31" target="n33"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n35" value="&lt;b&gt;CLEAR PCIe Error&lt;/b&gt; ×7&lt;br&gt;TH6_SWB0 · TH6_SWB1 · FPGA · BMC · DDR · I210 · SSD" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="804" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e36" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n33" target="n35"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n37" value="&lt;b&gt;PCIe tree / link / bandwidth&lt;/b&gt; utils/pcie_bus.ttl" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="869" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e38" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n35" target="n37"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n39" value="&lt;b&gt;Check Margin&lt;/b&gt; margin_status_all.sh9 顆 LTC2980&lt;br&gt;&lt;i&gt;⟨EN_Margin = 1⟩&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="919" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e40" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n37" target="n39"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n41" value="&lt;b&gt;TAKE DATA&lt;/b&gt; setup_pmon.ttl9 項)+ show_dmesg.ttl" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="984" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e42" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n39" target="n41"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n43" value="&lt;b&gt;10G/1G MGMT Ping&lt;/b&gt;&lt;br&gt;start → 30s → report → clear" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="1034" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e44" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n41" target="n43"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n45" value="&lt;b&gt;NFC Test&lt;/b&gt;&lt;br&gt;start → status → 30s → stop → report" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="1099" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e46" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n43" target="n45"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n47" value="&lt;b&gt;100G Port Status&lt;/b&gt; Ethernet513 / 514" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="1164" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e48" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n45" target="n47"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n49" value="&lt;b&gt;100G PRBS&lt;/b&gt; port_prbs_monitor.sh&lt;br&gt;&lt;i&gt;整段註解 — bring-up 中&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;dashed=1;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;fontColor=#808080;" vertex="1" parent="n13"><mxGeometry x="18" y="1214" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e50" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n47" target="n49"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n51" value="&lt;b&gt;First Traffic Test(基線)&lt;/b&gt;&lt;br&gt;ps → init → clear → 15s → show → start → 15s → report&lt;br&gt;&lt;i&gt;⟨SWB_UNIT⟩ 兩邊 / -u 0 / -u 1 / skip&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="1279" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e52" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n49" target="n51"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n53" value="&lt;b&gt;Show power-on uptime&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n13"><mxGeometry x="18" y="1359" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e54" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n51" target="n53"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n55" value="messagebox 『Script A DONE / Start Script B』" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;align=center;verticalAlign=middle;fontSize=11;fontStyle=1;" vertex="1" parent="n13"><mxGeometry x="18" y="1409" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e56" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n53" target="n55"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n57" value="Script B — Stress(壓力 soak,人為中斷才結束)" style="swimlane;html=1;startSize=34;fillColor=#ffffff;strokeColor=#4d4d4d;fontSize=14;fontStyle=1;horizontal=1;" vertex="1" parent="1"><mxGeometry x="440" y="96" width="380" height="1014" as="geometry"/></mxCell>
<mxCell id="n58" value="&lt;b&gt;include config.ttl&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="44" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="n59" value="&lt;b&gt;CLEAR EVENT&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="94" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e60" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n58" target="n59"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n61" value="&lt;b&gt;AMD CPU Stress&lt;/b&gt; mlucas-avx2 -cpu 0:15" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="144" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e62" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n59" target="n61"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n63" value="&lt;b&gt;BMC DDR Stress&lt;/b&gt; bgctl run bmc-manager memtester" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="194" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e64" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n61" target="n63"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n65" value="&lt;b&gt;BMC Monitor&lt;/b&gt; bmc_monitor.sh start&lt;br&gt;free -m + I2C 寫入/讀回圖樣測試" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="244" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e66" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n63" target="n65"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n67" value="&lt;b&gt;DDR Memory Stress&lt;/b&gt; bgctl run memtester" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="309" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e68" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n65" target="n67"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n69" value="&lt;b&gt;SSD read/write&lt;/b&gt; bgctl run qfx5252-stress-ssd" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="359" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e70" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n67" target="n69"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n71" value="&lt;b&gt;USB read/write&lt;/b&gt; usb_target.sh -o dev → bgctl run&lt;br&gt;qfx5252-stress-usb" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="409" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e72" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n69" target="n71"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n73" value="&lt;b&gt;SHOW Background job&lt;/b&gt; bgctl list" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="474" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e74" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n71" target="n73"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n75" value="&lt;b&gt;BMC USB Test&lt;/b&gt; 偵測 cdc_ncm 介面" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="524" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e76" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n73" target="n75"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n77" value="&lt;b&gt;:skip_ping&lt;/b&gt; &lt;b&gt;timeout = 0&lt;/b&gt;(還原全域逾時)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="574" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e78" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n75" target="n77"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n79" value="&lt;b&gt;10G/1G MGMT Ping&lt;/b&gt; start → status" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="624" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e80" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n77" target="n79"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n81" value="&lt;b&gt;NFC Test&lt;/b&gt; start → status" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="674" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e82" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n79" target="n81"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n83" value="&lt;b&gt;100G Port&lt;/b&gt; lpmode off · config interface startup" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="724" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e84" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n81" target="n83"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n85" value="&lt;b&gt;100G PRBS&lt;/b&gt; &lt;i&gt;整段註解 — bring-up 中&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;dashed=1;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;fontColor=#808080;" vertex="1" parent="n57"><mxGeometry x="18" y="774" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e86" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n83" target="n85"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n87" value="&lt;b&gt;Traffic START&lt;/b&gt;&lt;br&gt;ps → init → clear → 15s → show → start&lt;br&gt;&lt;i&gt;⟨SWB_UNIT⟩ 兩邊 / -u 0 / -u 1 / skip&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="824" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e88" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n85" target="n87"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n89" value="&lt;b&gt;while 1 — soak 監控迴圈&lt;/b&gt;&lt;br&gt;setup_pmon.ttl9 項)&lt;br&gt;bgctl list + jobs&lt;br&gt;&lt;b&gt;pause 60&lt;/b&gt;&lt;br&gt;&lt;i&gt;V1.1.4 起 margin 移到 Script C&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n57"><mxGeometry x="18" y="904" width="344" height="94" as="geometry"/></mxCell>
<mxCell id="e90" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n87" target="n89"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n91" value="Script C — Post-test(收尾 / 判定 / 收 log" style="swimlane;html=1;startSize=34;fillColor=#ffffff;strokeColor=#4d4d4d;fontSize=14;fontStyle=1;horizontal=1;" vertex="1" parent="1"><mxGeometry x="850" y="96" width="380" height="1259" as="geometry"/></mxCell>
<mxCell id="n92" value="&lt;b&gt;include config.ttl&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="44" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="n93" value="&lt;b&gt;Kill Process&lt;/b&gt; utils/kill_all_process.ttl&lt;br&gt;kill $(jobs -p) · bgctl stop --all ×2&lt;br&gt;停 BMC USB service · mgmt_ping stop · &lt;b&gt;nfc stop&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="94" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e94" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n92" target="n93"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n95" value="&lt;b&gt;100G PRBS STOP&lt;/b&gt; &lt;i&gt;整段註解&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;dashed=1;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;fontColor=#808080;" vertex="1" parent="n91"><mxGeometry x="18" y="174" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e96" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n93" target="n95"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n97" value="&lt;b&gt;TAKE DATA&lt;/b&gt; setup_pmon.ttl + show_dmesg.ttl" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="224" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e98" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n95" target="n97"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n99" value="&lt;b&gt;Check PCIe error counters&lt;/b&gt; ×7(同 Script A" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="274" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e100" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n97" target="n99"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n101" value="&lt;b&gt;BMC DDR / BMC Monitor 取值&lt;/b&gt; cat bmc_ddr.log · bmc_poll.log" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="324" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e102" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n99" target="n101"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n103" value="&lt;b&gt;BMC USB Test result&lt;/b&gt; journalctl" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="374" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e104" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n101" target="n103"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n105" value="&lt;b&gt;CHECK Stress results&lt;/b&gt;&lt;br&gt;cat mlucas / memtester / ssd / usb log" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="424" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e106" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n103" target="n105"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n107" value="&lt;b&gt;10G/1G MGMT result&lt;/b&gt; ip -s link show eth0/eth1 · cat log" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="489" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e108" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n105" target="n107"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n109" value="&lt;b&gt;NFC Test result&lt;/b&gt; nfc_polling.sh report" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="539" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e110" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n107" target="n109"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n111" value="&lt;b&gt;100G Port&lt;/b&gt; show interfaces status" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="589" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e112" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n109" target="n111"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n113" value="&lt;b&gt;CHECK Traffic counters&lt;/b&gt;&lt;br&gt;stop → reportper-pair TX/RX + ce0&lt;br&gt;&lt;i&gt;⟨SWB_UNIT⟩ 兩邊 / -u 0 / -u 1 / skip&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="639" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e114" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n111" target="n113"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n115" value="&lt;b&gt;BER 掃描&lt;/b&gt; blanton_ber.sh&lt;br&gt;init → start → &lt;b&gt;sleep 30&lt;/b&gt; → report → stop → clear&lt;br&gt;&lt;i&gt;⟨SWB_UNIT⟩ · sleep 30 要與 BER_INTERVAL 同步&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="719" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e116" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n113" target="n115"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n117" value="&lt;b&gt;NVMe Err Info&lt;/b&gt; nvme smart-log · smartctl -x" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="799" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e118" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n115" target="n117"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n119" value="&lt;b&gt;show reboot-cause&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="849" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e120" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n117" target="n119"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n121" value="&lt;b&gt;Check Margin&lt;/b&gt; margin_status_all.sh9 顆)&lt;br&gt;&lt;i&gt;⟨EN_Margin = 1⟩ · V1.1.4 從 Script B 移來&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="899" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e122" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n119" target="n121"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n123" value="&lt;b&gt;show uptime&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="964" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e124" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n121" target="n123"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n125" value="&lt;b&gt;Copy Stress Log to USB&lt;/b&gt;&lt;br&gt;usb_target.sh → mount → cp 各 log 進 jobs/&lt;br&gt;→ 帶時戳複製到 /mnt/usb/" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="1014" width="344" height="64" as="geometry"/></mxCell>
<mxCell id="e126" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n123" target="n125"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n127" value="&lt;b&gt;exit&lt;/b&gt; → wait 『Script done』&lt;br&gt;離開 hw-test-session 的 shell" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="1094" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e128" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n125" target="n127"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n129" value="&lt;b&gt;hw-test-session finish&lt;/b&gt; · bgctl reset --yes" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n91"><mxGeometry x="18" y="1159" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e130" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n127" target="n129"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n131" value="messagebox 『GOOD JOB! Test Case DONE』" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;align=center;verticalAlign=middle;fontSize=11;fontStyle=1;" vertex="1" parent="n91"><mxGeometry x="18" y="1209" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e132" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n129" target="n131"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n133" value="Script 4 — Thermal &amp;amp; Safety(獨立跑,不接 A/B/C" style="swimlane;html=1;startSize=34;fillColor=#ffffff;strokeColor=#4d4d4d;fontSize=14;fontStyle=1;horizontal=1;" vertex="1" parent="1"><mxGeometry x="1260" y="96" width="380" height="929" as="geometry"/></mxCell>
<mxCell id="n134" value="&lt;b&gt;include config.ttl&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="44" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="n135" value="&lt;b&gt;logopen&lt;/b&gt; &lt;i&gt;⟨EN_log = 1⟩&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="94" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e136" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n134" target="n135"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n137" value="&lt;b&gt;Root Login&lt;/b&gt; → sudo -i" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="144" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e138" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n135" target="n137"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n139" value="&lt;b&gt;Pre Setting&lt;/b&gt; mkdir ./logs · date -s · rm jobs/*" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="194" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e140" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n137" target="n139"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n141" value="&lt;b&gt;HW Test Session&lt;/b&gt; finish → bgctl reset/stop --all → list&lt;br&gt;→ start → log → status" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="244" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e142" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n139" target="n141"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n143" value="&lt;b&gt;FAN SPEED&lt;/b&gt; max31790 rebind ×2 → fan-speed-control.sh" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="309" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e144" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n141" target="n143"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n145" value="&lt;b&gt;Wait DUT Init&lt;/b&gt; utils/wait_init.ttl&lt;br&gt;&lt;i&gt;無逾時出口&lt;/i&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="359" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e146" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n143" target="n145"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n147" value="&lt;b&gt;DUT Info&lt;/b&gt; boot/version/fwutil/system-memory/service&lt;br&gt;syseeprom · ssdhealth · TPM · NVMe" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="424" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e148" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n145" target="n147"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n149" value="&lt;b&gt;BMC&lt;/b&gt; enroll · version · status" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="489" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e150" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n147" target="n149"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n151" value="&lt;b&gt;CLEAR PCIe Error&lt;/b&gt; ×7 + ras-mc-ctl --summary" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="539" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e152" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n149" target="n151"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n153" value="&lt;b&gt;PCIe tree / link / bandwidth&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="589" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e154" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n151" target="n153"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n155" value="&lt;b&gt;TAKE DATA&lt;/b&gt; setup_pmon.ttl + show_dmesg.ttl" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="639" width="344" height="34" as="geometry"/></mxCell>
<mxCell id="e156" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n153" target="n155"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n157" value="&lt;b&gt;Full Load — CPU&lt;/b&gt;&lt;br&gt;chmod +x → mlucas-avx2 -s l -cpu 0:15 &amp;amp;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="689" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e158" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n155" target="n157"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n159" value="&lt;b&gt;Full Load — 資料面&lt;/b&gt;&lt;br&gt;blanton_tr518.sh start(含 120s settle" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="754" width="344" height="49" as="geometry"/></mxCell>
<mxCell id="e160" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n157" target="n159"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n161" value="&lt;b&gt;while 1 — 熱 / 安規監控迴圈&lt;/b&gt;&lt;br&gt;setup_pmon.ttl9 項)&lt;br&gt;TH6_SWB0 / SWB1_power_readback.sh&lt;br&gt;bgctl list + jobs&lt;br&gt;&lt;b&gt;pause 60&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="n133"><mxGeometry x="18" y="819" width="344" height="94" as="geometry"/></mxCell>
<mxCell id="e162" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#4d4d4d;" edge="1" parent="1" source="n159" target="n161"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="e163" value="人工啟動 Script B" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#d79b00;strokeWidth=2;dashed=1;fontSize=10;fontColor=#d79b00;" edge="1" parent="1" source="n55" target="n58"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="e164" value="soak 結束後人工中斷,啟動 Script C" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#d79b00;strokeWidth=2;dashed=1;fontSize=10;fontColor=#d79b00;" edge="1" parent="1" source="n89" target="n92"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="n165" value="圖例" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="30" y="1585" width="200" height="24" as="geometry"/></mxCell>
<mxCell id="n166" value="一般步驟" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="1"><mxGeometry x="30" y="1613" width="230" height="32" as="geometry"/></mxCell>
<mxCell id="n167" value="受 config.ttl 旗標影響" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="1"><mxGeometry x="280" y="1613" width="230" height="32" as="geometry"/></mxCell>
<mxCell id="n168" value="迴圈 / 持續執行" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="1"><mxGeometry x="530" y="1613" width="230" height="32" as="geometry"/></mxCell>
<mxCell id="n169" value="目前註解停用" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;dashed=1;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;fontColor=#808080;" vertex="1" parent="1"><mxGeometry x="30" y="1655" width="230" height="32" as="geometry"/></mxCell>
<mxCell id="n170" value="狀態變更 / 需留意" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;align=left;spacingLeft=8;verticalAlign=middle;fontSize=11;" vertex="1" parent="1"><mxGeometry x="280" y="1655" width="230" height="32" as="geometry"/></mxCell>
<mxCell id="n171" value="人工交接點" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;align=center;verticalAlign=middle;fontSize=11;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="530" y="1655" width="230" height="32" as="geometry"/></mxCell>
<mxCell id="n172" value="⚠️ 已知待辦:① 100G PRBS 三支腳本內呼叫仍註解(bring-up 中) ② wait_init.ttl 與風扇確認 wait 沒有逾時出口,起不來會無限等待 ③ Script C 的 sleep 30 需與 blanton_ber.sh 的 BER_INTERVAL 同步 ④ Script 4 沒有收尾段:中斷後 tr518 留下 port cd lb=mac / l2 learn off / test mode nr=yes,需手動 blanton_tr518.sh stop" style="text;html=1;align=left;verticalAlign=top;fontSize=11;fontColor=#b85450;" vertex="1" parent="1"><mxGeometry x="30" y="1703" width="1610" height="46" as="geometry"/></mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
+86 -86
View File
@@ -6,7 +6,7 @@ CB,CONN13,CH3,V1P8_ALW,1.8
CB,CONN13,CH4,PWR_APU_VDDIO_SUS,1.1 CB,CONN13,CH4,PWR_APU_VDDIO_SUS,1.1
CB,CONN13,CH5,PWR_VDD_MISC_RUN,0.75 CB,CONN13,CH5,PWR_VDD_MISC_RUN,0.75
CB,CONN13,CH6,PWR_APU_VDD_MEM_RUN,0.78 CB,CONN13,CH6,PWR_APU_VDD_MEM_RUN,0.78
CB,CONN13,CH7,V0P8_PHY2_DVDD,0.8 CB,CONN13,CH7,V0P8_PHY2_DVDD,0.816
CB,CONN13,CH8,V0P8_AVDD,0.8 CB,CONN13,CH8,V0P8_AVDD,0.8
CB,CONN13,CH9,V0P8_PHY,0.8 CB,CONN13,CH9,V0P8_PHY,0.8
CB,CONN13,CH10,V1P8_FPGA,1.8 CB,CONN13,CH10,V1P8_FPGA,1.8
@@ -14,132 +14,132 @@ CB,CONN13,CH11,V2P5_FPGA,2.5
CB,CONN13,CH12,V1P1_FPGA,1.1 CB,CONN13,CH12,V1P1_FPGA,1.1
CB,CONN13,CH13,P5V_STBY,5.0 CB,CONN13,CH13,P5V_STBY,5.0
CB,CONN13,CH14,P3V3_STBY,3.3 CB,CONN13,CH14,P3V3_STBY,3.3
CB,CONN13,CH15,V0P8_PHY2_AVDD,0.8 CB,CONN13,CH15,V0P8_PHY2_AVDD,0.816
SWB0,CONN13,CH0,P0V75_DVDD_47,0.75 SWB0,CONN13,CH0,P0V75_DVDD_47,0.75
SWB0,CONN13,CH1,P0V75_AVDD_47,0.75 SWB0,CONN13,CH1,P0V75_AVDD_47,0.756
SWB0,CONN13,CH2,P1V5_AVDD_47,1.5 SWB0,CONN13,CH2,P1V5_AVDD_47,1.524
SWB0,CONN13,CH3,P0V9_AVDD_47,0.9 SWB0,CONN13,CH3,P0V9_AVDD_47,0.915
SWB0,CONN13,CH4,P1V8_1,1.8 SWB0,CONN13,CH4,P1V8_1,1.816
SWB0,CONN13,CH5,PVDD3_3V_SYNTH_LDO_A3,3.3 SWB0,CONN13,CH5,PVDD3_3V_SYNTH_LDO_A3,3.38
SWB0,CONN13,CH6,PVDD3_3V_SYNTH_LDO_B1,3.3 SWB0,CONN13,CH6,PVDD3_3V_SYNTH_LDO_B1,3.38
SWB0,CONN13,CH7,P1V8_3,1.8 SWB0,CONN13,CH7,P1V8_3,1.816
SWB0,CONN13,CH8,P1V8_DVDDIO_3,1.8 SWB0,CONN13,CH8,P1V8_DVDDIO_3,1.8
SWB0,CONN13,CH9,P0V75_DVDD_39,0.75 SWB0,CONN13,CH9,P0V75_DVDD_39,0.75
SWB0,CONN13,CH10,P0V75_AVDD_39,0.75 SWB0,CONN13,CH10,P0V75_AVDD_39,0.756
SWB0,CONN13,CH11,P1V5_AVDD_39,1.5 SWB0,CONN13,CH11,P1V5_AVDD_39,1.524
SWB0,CONN13,CH12,P0V9_AVDD_39,0.9 SWB0,CONN13,CH12,P0V9_AVDD_39,0.915
SWB0,CONN13,CH13,PVDD1V5_2,1.5 SWB0,CONN13,CH13,PVDD1V5_2,1.5
SWB0,CONN13,CH14,PVDD1V8_DUT,1.8 SWB0,CONN13,CH14,PVDD1V8_DUT,1.8
SWB0,CONN13,CH15,PVDD_MDIO,1.2 SWB0,CONN13,CH15,PVDD_MDIO,1.2
SWB0,CONN14,CH0,P0V75_AVDD_7,0.75 SWB0,CONN14,CH0,P0V75_AVDD_7,0.756
SWB0,CONN14,CH1,P1V5_AVDD_7,1.5 SWB0,CONN14,CH1,P1V5_AVDD_7,1.524
SWB0,CONN14,CH2,P0V9_AVDD_7,0.9 SWB0,CONN14,CH2,P0V9_AVDD_7,0.915
SWB0,CONN14,CH3,P1V8_5,1.8 SWB0,CONN14,CH3,P1V8_5,1.816
SWB0,CONN14,CH4,P1V8_2,1.8 SWB0,CONN14,CH4,P1V8_2,1.816
SWB0,CONN14,CH5,PVDD3_3V_SYNTH_LDO_B2,3.3 SWB0,CONN14,CH5,PVDD3_3V_SYNTH_LDO_B2,3.38
SWB0,CONN14,CH6,PVDD3_3V_SYNTH_LDO_A2,3.3 SWB0,CONN14,CH6,PVDD3_3V_SYNTH_LDO_A2,3.38
SWB0,CONN14,CH7,PVDD3_3V_SYNTH_LDO_A1,3.3 SWB0,CONN14,CH7,PVDD3_3V_SYNTH_LDO_A1,3.38
SWB0,CONN14,CH8,PVDD1V5_TSC,1.5 SWB0,CONN14,CH8,PVDD1V5_TSC,1.516
SWB0,CONN14,CH9,PVDD1V5_ANLG,1.5 SWB0,CONN14,CH9,PVDD1V5_ANLG,1.516
SWB0,CONN14,CH10,NC,- SWB0,CONN14,CH10,NC,-
SWB0,CONN14,CH11,NC,- SWB0,CONN14,CH11,NC,-
SWB0,CONN14,CH12,PVDD1V5_1,1.5 SWB0,CONN14,CH12,PVDD1V5_1,1.5
SWB0,CONN14,CH13,NC,- SWB0,CONN14,CH13,NC,-
SWB0,CONN14,CH14,P1V8_DVDDIO_1,1.8 SWB0,CONN14,CH14,P1V8_DVDDIO_1,1.8
SWB0,CONN14,CH15,P0V75_DVDD_7,0.75 SWB0,CONN14,CH15,P0V75_DVDD_7,0.75
SWB0,CONN15,CH0,P1V5_AVDD_55,1.5 SWB0,CONN15,CH0,P1V5_AVDD_55,1.524
SWB0,CONN15,CH1,P0V9_AVDD_55,0.9 SWB0,CONN15,CH1,P0V9_AVDD_55,0.915
SWB0,CONN15,CH2,P0V75_DVDD_63,0.75 SWB0,CONN15,CH2,P0V75_DVDD_63,0.75
SWB0,CONN15,CH3,P0V75_AVDD_63,0.75 SWB0,CONN15,CH3,P0V75_AVDD_63,0.756
SWB0,CONN15,CH4,P1V5_AVDD_63,1.5 SWB0,CONN15,CH4,P1V5_AVDD_63,1.524
SWB0,CONN15,CH5,P0V9_AVDD_63,0.9 SWB0,CONN15,CH5,P0V9_AVDD_63,0.915
SWB0,CONN15,CH6,PVDD3_3V_SYNTH_LDO_B3,3.3 SWB0,CONN15,CH6,PVDD3_3V_SYNTH_LDO_B3,3.38
SWB0,CONN15,CH7,PVDD1V5_3,1.5 SWB0,CONN15,CH7,PVDD1V5_3,1.5
SWB0,CONN15,CH8,P0V85_STBY,0.85 SWB0,CONN15,CH8,P0V85_STBY,0.85
SWB0,CONN15,CH9,P1V8_STBY,1.8 SWB0,CONN15,CH9,P1V8_STBY,1.8
SWB0,CONN15,CH10,NC,- SWB0,CONN15,CH10,NC,-
SWB0,CONN15,CH11,P3V3_STBY,3.3 SWB0,CONN15,CH11,P3V3_STBY,3.3
SWB0,CONN15,CH12,PVDD0V9_2,0.9 SWB0,CONN15,CH12,PVDD0V9_2,0.91
SWB0,CONN15,CH13,P0V75_DVDD_55,0.75 SWB0,CONN15,CH13,P0V75_DVDD_55,0.75
SWB0,CONN15,CH14,P0V75_AVDD_55,0.75 SWB0,CONN15,CH14,P0V75_AVDD_55,0.756
SWB0,CONN15,CH15,P1V8_DVDDIO_4,1.8 SWB0,CONN15,CH15,P1V8_DVDDIO_4,1.8
SWB0,CONN16,CH0,PVDD1V5_0,1.5 SWB0,CONN16,CH0,PVDD1V5_0,1.5
SWB0,CONN16,CH1,P1V8_4,1.8 SWB0,CONN16,CH1,P1V8_4,1.816
SWB0,CONN16,CH2,PVDD3_3V_SYNTH_LDO_B5,3.3 SWB0,CONN16,CH2,PVDD3_3V_SYNTH_LDO_B5,3.38
SWB0,CONN16,CH3,PVDD3_3V_SYNTH_LDO_A5,3.3 SWB0,CONN16,CH3,PVDD3_3V_SYNTH_LDO_A5,3.38
SWB0,CONN16,CH4,PVDD3_3V_SYNTH_LDO_B4,3.3 SWB0,CONN16,CH4,PVDD3_3V_SYNTH_LDO_B4,3.38
SWB0,CONN16,CH5,PVDD3_3V_SYNTH_LDO_A4,3.3 SWB0,CONN16,CH5,PVDD3_3V_SYNTH_LDO_A4,3.38
SWB0,CONN16,CH6,P3V3,3.3 SWB0,CONN16,CH6,P3V3,3.327
SWB0,CONN16,CH7,PVDD0_8V_T3,0.8 SWB0,CONN16,CH7,PVDD0_8V_T3,0.82
SWB0,CONN16,CH8,P0V75_DVDD_1,0.75 SWB0,CONN16,CH8,P0V75_DVDD_1,0.75
SWB0,CONN16,CH9,P0V75_AVDD_1,0.75 SWB0,CONN16,CH9,P0V75_AVDD_1,0.756
SWB0,CONN16,CH10,P1V5_AVDD_1,1.5 SWB0,CONN16,CH10,P1V5_AVDD_1,1.524
SWB0,CONN16,CH11,P0V9_AVDD_1,0.9 SWB0,CONN16,CH11,P0V9_AVDD_1,0.915
SWB0,CONN16,CH12,PVDD0V9_0,0.9 SWB0,CONN16,CH12,PVDD0V9_0,0.915
SWB0,CONN16,CH13,PVDD0V9_1,0.9 SWB0,CONN16,CH13,PVDD0V9_1,0.91
SWB0,CONN16,CH14,PVDD0V9_3,0.9 SWB0,CONN16,CH14,PVDD0V9_3,0.915
SWB0,CONN16,CH15,PVDD1V2_T3,1.2 SWB0,CONN16,CH15,PVDD1V2_T3,1.224
SWB1,CONN13,CH0,P0V75_DVDD_47,0.75 SWB1,CONN13,CH0,P0V75_DVDD_47,0.75
SWB1,CONN13,CH1,P0V75_AVDD_47,0.75 SWB1,CONN13,CH1,P0V75_AVDD_47,0.756
SWB1,CONN13,CH2,P1V5_AVDD_47,1.5 SWB1,CONN13,CH2,P1V5_AVDD_47,1.524
SWB1,CONN13,CH3,P0V9_AVDD_47,0.9 SWB1,CONN13,CH3,P0V9_AVDD_47,0.915
SWB1,CONN13,CH4,P1V8_1,1.8 SWB1,CONN13,CH4,P1V8_1,1.816
SWB1,CONN13,CH5,PVDD3_3V_SYNTH_LDO_A3,3.3 SWB1,CONN13,CH5,PVDD3_3V_SYNTH_LDO_A3,3.38
SWB1,CONN13,CH6,PVDD3_3V_SYNTH_LDO_B1,3.3 SWB1,CONN13,CH6,PVDD3_3V_SYNTH_LDO_B1,3.38
SWB1,CONN13,CH7,P1V8_3,1.8 SWB1,CONN13,CH7,P1V8_3,1.816
SWB1,CONN13,CH8,P1V8_DVDDIO_3,1.8 SWB1,CONN13,CH8,P1V8_DVDDIO_3,1.8
SWB1,CONN13,CH9,P0V75_DVDD_39,0.75 SWB1,CONN13,CH9,P0V75_DVDD_39,0.75
SWB1,CONN13,CH10,P0V75_AVDD_39,0.75 SWB1,CONN13,CH10,P0V75_AVDD_39,0.756
SWB1,CONN13,CH11,P1V5_AVDD_39,1.5 SWB1,CONN13,CH11,P1V5_AVDD_39,1.524
SWB1,CONN13,CH12,P0V9_AVDD_39,0.9 SWB1,CONN13,CH12,P0V9_AVDD_39,0.915
SWB1,CONN13,CH13,PVDD1V5_2,1.5 SWB1,CONN13,CH13,PVDD1V5_2,1.5
SWB1,CONN13,CH14,PVDD1V8_DUT,1.8 SWB1,CONN13,CH14,PVDD1V8_DUT,1.8
SWB1,CONN13,CH15,PVDD_MDIO,1.2 SWB1,CONN13,CH15,PVDD_MDIO,1.2
SWB1,CONN14,CH0,P0V75_AVDD_7,0.75 SWB1,CONN14,CH0,P0V75_AVDD_7,0.756
SWB1,CONN14,CH1,P1V5_AVDD_7,1.5 SWB1,CONN14,CH1,P1V5_AVDD_7,1.524
SWB1,CONN14,CH2,P0V9_AVDD_7,0.9 SWB1,CONN14,CH2,P0V9_AVDD_7,0.915
SWB1,CONN14,CH3,P1V8_5,1.8 SWB1,CONN14,CH3,P1V8_5,1.816
SWB1,CONN14,CH4,P1V8_2,1.8 SWB1,CONN14,CH4,P1V8_2,1.816
SWB1,CONN14,CH5,PVDD3_3V_SYNTH_LDO_B2,3.3 SWB1,CONN14,CH5,PVDD3_3V_SYNTH_LDO_B2,3.38
SWB1,CONN14,CH6,PVDD3_3V_SYNTH_LDO_A2,3.3 SWB1,CONN14,CH6,PVDD3_3V_SYNTH_LDO_A2,3.38
SWB1,CONN14,CH7,PVDD3_3V_SYNTH_LDO_A1,3.3 SWB1,CONN14,CH7,PVDD3_3V_SYNTH_LDO_A1,3.38
SWB1,CONN14,CH8,PVDD1V5_TSC,1.5 SWB1,CONN14,CH8,PVDD1V5_TSC,1.516
SWB1,CONN14,CH9,PVDD1V5_ANLG,1.5 SWB1,CONN14,CH9,PVDD1V5_ANLG,1.516
SWB1,CONN14,CH10,NC,- SWB1,CONN14,CH10,NC,-
SWB1,CONN14,CH11,NC,- SWB1,CONN14,CH11,NC,-
SWB1,CONN14,CH12,PVDD1V5_1,1.5 SWB1,CONN14,CH12,PVDD1V5_1,1.5
SWB1,CONN14,CH13,NC,- SWB1,CONN14,CH13,NC,-
SWB1,CONN14,CH14,P1V8_DVDDIO_1,1.8 SWB1,CONN14,CH14,P1V8_DVDDIO_1,1.8
SWB1,CONN14,CH15,P0V75_DVDD_7,0.75 SWB1,CONN14,CH15,P0V75_DVDD_7,0.75
SWB1,CONN15,CH0,P1V5_AVDD_55,1.5 SWB1,CONN15,CH0,P1V5_AVDD_55,1.524
SWB1,CONN15,CH1,P0V9_AVDD_55,0.9 SWB1,CONN15,CH1,P0V9_AVDD_55,0.915
SWB1,CONN15,CH2,P0V75_DVDD_63,0.75 SWB1,CONN15,CH2,P0V75_DVDD_63,0.75
SWB1,CONN15,CH3,P0V75_AVDD_63,0.75 SWB1,CONN15,CH3,P0V75_AVDD_63,0.756
SWB1,CONN15,CH4,P1V5_AVDD_63,1.5 SWB1,CONN15,CH4,P1V5_AVDD_63,1.524
SWB1,CONN15,CH5,P0V9_AVDD_63,0.9 SWB1,CONN15,CH5,P0V9_AVDD_63,0.915
SWB1,CONN15,CH6,PVDD3_3V_SYNTH_LDO_B3,3.3 SWB1,CONN15,CH6,PVDD3_3V_SYNTH_LDO_B3,3.38
SWB1,CONN15,CH7,PVDD1V5_3,1.5 SWB1,CONN15,CH7,PVDD1V5_3,1.5
SWB1,CONN15,CH8,P0V85_STBY,0.85 SWB1,CONN15,CH8,P0V85_STBY,0.85
SWB1,CONN15,CH9,P1V8_STBY,1.8 SWB1,CONN15,CH9,P1V8_STBY,1.8
SWB1,CONN15,CH10,NC,- SWB1,CONN15,CH10,NC,-
SWB1,CONN15,CH11,P3V3_STBY,3.3 SWB1,CONN15,CH11,P3V3_STBY,3.3
SWB1,CONN15,CH12,PVDD0V9_2,0.9 SWB1,CONN15,CH12,PVDD0V9_2,0.91
SWB1,CONN15,CH13,P0V75_DVDD_55,0.75 SWB1,CONN15,CH13,P0V75_DVDD_55,0.75
SWB1,CONN15,CH14,P0V75_AVDD_55,0.75 SWB1,CONN15,CH14,P0V75_AVDD_55,0.756
SWB1,CONN15,CH15,P1V8_DVDDIO_4,1.8 SWB1,CONN15,CH15,P1V8_DVDDIO_4,1.8
SWB1,CONN16,CH0,PVDD1V5_0,1.5 SWB1,CONN16,CH0,PVDD1V5_0,1.5
SWB1,CONN16,CH1,P1V8_4,1.8 SWB1,CONN16,CH1,P1V8_4,1.816
SWB1,CONN16,CH2,PVDD3_3V_SYNTH_LDO_B5,3.3 SWB1,CONN16,CH2,PVDD3_3V_SYNTH_LDO_B5,3.38
SWB1,CONN16,CH3,PVDD3_3V_SYNTH_LDO_A5,3.3 SWB1,CONN16,CH3,PVDD3_3V_SYNTH_LDO_A5,3.38
SWB1,CONN16,CH4,PVDD3_3V_SYNTH_LDO_B4,3.3 SWB1,CONN16,CH4,PVDD3_3V_SYNTH_LDO_B4,3.38
SWB1,CONN16,CH5,PVDD3_3V_SYNTH_LDO_A4,3.3 SWB1,CONN16,CH5,PVDD3_3V_SYNTH_LDO_A4,3.38
SWB1,CONN16,CH6,P3V3,3.3 SWB1,CONN16,CH6,P3V3,3.327
SWB1,CONN16,CH7,PVDD0_8V_T3,0.8 SWB1,CONN16,CH7,PVDD0_8V_T3,0.82
SWB1,CONN16,CH8,P0V75_DVDD_1,0.75 SWB1,CONN16,CH8,P0V75_DVDD_1,0.75
SWB1,CONN16,CH9,P0V75_AVDD_1,0.75 SWB1,CONN16,CH9,P0V75_AVDD_1,0.756
SWB1,CONN16,CH10,P1V5_AVDD_1,1.5 SWB1,CONN16,CH10,P1V5_AVDD_1,1.524
SWB1,CONN16,CH11,P0V9_AVDD_1,0.9 SWB1,CONN16,CH11,P0V9_AVDD_1,0.915
SWB1,CONN16,CH12,PVDD0V9_0,0.9 SWB1,CONN16,CH12,PVDD0V9_0,0.915
SWB1,CONN16,CH13,PVDD0V9_1,0.9 SWB1,CONN16,CH13,PVDD0V9_1,0.91
SWB1,CONN16,CH14,PVDD0V9_3,0.9 SWB1,CONN16,CH14,PVDD0V9_3,0.915
SWB1,CONN16,CH15,PVDD1V2_T3,1.2 SWB1,CONN16,CH15,PVDD1V2_T3,1.224
1 Board CONN Ch NetName Vnom
6 CB CONN13 CH4 PWR_APU_VDDIO_SUS 1.1
7 CB CONN13 CH5 PWR_VDD_MISC_RUN 0.75
8 CB CONN13 CH6 PWR_APU_VDD_MEM_RUN 0.78
9 CB CONN13 CH7 V0P8_PHY2_DVDD 0.8 0.816
10 CB CONN13 CH8 V0P8_AVDD 0.8
11 CB CONN13 CH9 V0P8_PHY 0.8
12 CB CONN13 CH10 V1P8_FPGA 1.8
14 CB CONN13 CH12 V1P1_FPGA 1.1
15 CB CONN13 CH13 P5V_STBY 5.0
16 CB CONN13 CH14 P3V3_STBY 3.3
17 CB CONN13 CH15 V0P8_PHY2_AVDD 0.8 0.816
18 SWB0 CONN13 CH0 P0V75_DVDD_47 0.75
19 SWB0 CONN13 CH1 P0V75_AVDD_47 0.75 0.756
20 SWB0 CONN13 CH2 P1V5_AVDD_47 1.5 1.524
21 SWB0 CONN13 CH3 P0V9_AVDD_47 0.9 0.915
22 SWB0 CONN13 CH4 P1V8_1 1.8 1.816
23 SWB0 CONN13 CH5 PVDD3_3V_SYNTH_LDO_A3 3.3 3.38
24 SWB0 CONN13 CH6 PVDD3_3V_SYNTH_LDO_B1 3.3 3.38
25 SWB0 CONN13 CH7 P1V8_3 1.8 1.816
26 SWB0 CONN13 CH8 P1V8_DVDDIO_3 1.8
27 SWB0 CONN13 CH9 P0V75_DVDD_39 0.75
28 SWB0 CONN13 CH10 P0V75_AVDD_39 0.75 0.756
29 SWB0 CONN13 CH11 P1V5_AVDD_39 1.5 1.524
30 SWB0 CONN13 CH12 P0V9_AVDD_39 0.9 0.915
31 SWB0 CONN13 CH13 PVDD1V5_2 1.5
32 SWB0 CONN13 CH14 PVDD1V8_DUT 1.8
33 SWB0 CONN13 CH15 PVDD_MDIO 1.2
34 SWB0 CONN14 CH0 P0V75_AVDD_7 0.75 0.756
35 SWB0 CONN14 CH1 P1V5_AVDD_7 1.5 1.524
36 SWB0 CONN14 CH2 P0V9_AVDD_7 0.9 0.915
37 SWB0 CONN14 CH3 P1V8_5 1.8 1.816
38 SWB0 CONN14 CH4 P1V8_2 1.8 1.816
39 SWB0 CONN14 CH5 PVDD3_3V_SYNTH_LDO_B2 3.3 3.38
40 SWB0 CONN14 CH6 PVDD3_3V_SYNTH_LDO_A2 3.3 3.38
41 SWB0 CONN14 CH7 PVDD3_3V_SYNTH_LDO_A1 3.3 3.38
42 SWB0 CONN14 CH8 PVDD1V5_TSC 1.5 1.516
43 SWB0 CONN14 CH9 PVDD1V5_ANLG 1.5 1.516
44 SWB0 CONN14 CH10 NC -
45 SWB0 CONN14 CH11 NC -
46 SWB0 CONN14 CH12 PVDD1V5_1 1.5
47 SWB0 CONN14 CH13 NC -
48 SWB0 CONN14 CH14 P1V8_DVDDIO_1 1.8
49 SWB0 CONN14 CH15 P0V75_DVDD_7 0.75
50 SWB0 CONN15 CH0 P1V5_AVDD_55 1.5 1.524
51 SWB0 CONN15 CH1 P0V9_AVDD_55 0.9 0.915
52 SWB0 CONN15 CH2 P0V75_DVDD_63 0.75
53 SWB0 CONN15 CH3 P0V75_AVDD_63 0.75 0.756
54 SWB0 CONN15 CH4 P1V5_AVDD_63 1.5 1.524
55 SWB0 CONN15 CH5 P0V9_AVDD_63 0.9 0.915
56 SWB0 CONN15 CH6 PVDD3_3V_SYNTH_LDO_B3 3.3 3.38
57 SWB0 CONN15 CH7 PVDD1V5_3 1.5
58 SWB0 CONN15 CH8 P0V85_STBY 0.85
59 SWB0 CONN15 CH9 P1V8_STBY 1.8
60 SWB0 CONN15 CH10 NC -
61 SWB0 CONN15 CH11 P3V3_STBY 3.3
62 SWB0 CONN15 CH12 PVDD0V9_2 0.9 0.91
63 SWB0 CONN15 CH13 P0V75_DVDD_55 0.75
64 SWB0 CONN15 CH14 P0V75_AVDD_55 0.75 0.756
65 SWB0 CONN15 CH15 P1V8_DVDDIO_4 1.8
66 SWB0 CONN16 CH0 PVDD1V5_0 1.5
67 SWB0 CONN16 CH1 P1V8_4 1.8 1.816
68 SWB0 CONN16 CH2 PVDD3_3V_SYNTH_LDO_B5 3.3 3.38
69 SWB0 CONN16 CH3 PVDD3_3V_SYNTH_LDO_A5 3.3 3.38
70 SWB0 CONN16 CH4 PVDD3_3V_SYNTH_LDO_B4 3.3 3.38
71 SWB0 CONN16 CH5 PVDD3_3V_SYNTH_LDO_A4 3.3 3.38
72 SWB0 CONN16 CH6 P3V3 3.3 3.327
73 SWB0 CONN16 CH7 PVDD0_8V_T3 0.8 0.82
74 SWB0 CONN16 CH8 P0V75_DVDD_1 0.75
75 SWB0 CONN16 CH9 P0V75_AVDD_1 0.75 0.756
76 SWB0 CONN16 CH10 P1V5_AVDD_1 1.5 1.524
77 SWB0 CONN16 CH11 P0V9_AVDD_1 0.9 0.915
78 SWB0 CONN16 CH12 PVDD0V9_0 0.9 0.915
79 SWB0 CONN16 CH13 PVDD0V9_1 0.9 0.91
80 SWB0 CONN16 CH14 PVDD0V9_3 0.9 0.915
81 SWB0 CONN16 CH15 PVDD1V2_T3 1.2 1.224
82 SWB1 CONN13 CH0 P0V75_DVDD_47 0.75
83 SWB1 CONN13 CH1 P0V75_AVDD_47 0.75 0.756
84 SWB1 CONN13 CH2 P1V5_AVDD_47 1.5 1.524
85 SWB1 CONN13 CH3 P0V9_AVDD_47 0.9 0.915
86 SWB1 CONN13 CH4 P1V8_1 1.8 1.816
87 SWB1 CONN13 CH5 PVDD3_3V_SYNTH_LDO_A3 3.3 3.38
88 SWB1 CONN13 CH6 PVDD3_3V_SYNTH_LDO_B1 3.3 3.38
89 SWB1 CONN13 CH7 P1V8_3 1.8 1.816
90 SWB1 CONN13 CH8 P1V8_DVDDIO_3 1.8
91 SWB1 CONN13 CH9 P0V75_DVDD_39 0.75
92 SWB1 CONN13 CH10 P0V75_AVDD_39 0.75 0.756
93 SWB1 CONN13 CH11 P1V5_AVDD_39 1.5 1.524
94 SWB1 CONN13 CH12 P0V9_AVDD_39 0.9 0.915
95 SWB1 CONN13 CH13 PVDD1V5_2 1.5
96 SWB1 CONN13 CH14 PVDD1V8_DUT 1.8
97 SWB1 CONN13 CH15 PVDD_MDIO 1.2
98 SWB1 CONN14 CH0 P0V75_AVDD_7 0.75 0.756
99 SWB1 CONN14 CH1 P1V5_AVDD_7 1.5 1.524
100 SWB1 CONN14 CH2 P0V9_AVDD_7 0.9 0.915
101 SWB1 CONN14 CH3 P1V8_5 1.8 1.816
102 SWB1 CONN14 CH4 P1V8_2 1.8 1.816
103 SWB1 CONN14 CH5 PVDD3_3V_SYNTH_LDO_B2 3.3 3.38
104 SWB1 CONN14 CH6 PVDD3_3V_SYNTH_LDO_A2 3.3 3.38
105 SWB1 CONN14 CH7 PVDD3_3V_SYNTH_LDO_A1 3.3 3.38
106 SWB1 CONN14 CH8 PVDD1V5_TSC 1.5 1.516
107 SWB1 CONN14 CH9 PVDD1V5_ANLG 1.5 1.516
108 SWB1 CONN14 CH10 NC -
109 SWB1 CONN14 CH11 NC -
110 SWB1 CONN14 CH12 PVDD1V5_1 1.5
111 SWB1 CONN14 CH13 NC -
112 SWB1 CONN14 CH14 P1V8_DVDDIO_1 1.8
113 SWB1 CONN14 CH15 P0V75_DVDD_7 0.75
114 SWB1 CONN15 CH0 P1V5_AVDD_55 1.5 1.524
115 SWB1 CONN15 CH1 P0V9_AVDD_55 0.9 0.915
116 SWB1 CONN15 CH2 P0V75_DVDD_63 0.75
117 SWB1 CONN15 CH3 P0V75_AVDD_63 0.75 0.756
118 SWB1 CONN15 CH4 P1V5_AVDD_63 1.5 1.524
119 SWB1 CONN15 CH5 P0V9_AVDD_63 0.9 0.915
120 SWB1 CONN15 CH6 PVDD3_3V_SYNTH_LDO_B3 3.3 3.38
121 SWB1 CONN15 CH7 PVDD1V5_3 1.5
122 SWB1 CONN15 CH8 P0V85_STBY 0.85
123 SWB1 CONN15 CH9 P1V8_STBY 1.8
124 SWB1 CONN15 CH10 NC -
125 SWB1 CONN15 CH11 P3V3_STBY 3.3
126 SWB1 CONN15 CH12 PVDD0V9_2 0.9 0.91
127 SWB1 CONN15 CH13 P0V75_DVDD_55 0.75
128 SWB1 CONN15 CH14 P0V75_AVDD_55 0.75 0.756
129 SWB1 CONN15 CH15 P1V8_DVDDIO_4 1.8
130 SWB1 CONN16 CH0 PVDD1V5_0 1.5
131 SWB1 CONN16 CH1 P1V8_4 1.8 1.816
132 SWB1 CONN16 CH2 PVDD3_3V_SYNTH_LDO_B5 3.3 3.38
133 SWB1 CONN16 CH3 PVDD3_3V_SYNTH_LDO_A5 3.3 3.38
134 SWB1 CONN16 CH4 PVDD3_3V_SYNTH_LDO_B4 3.3 3.38
135 SWB1 CONN16 CH5 PVDD3_3V_SYNTH_LDO_A4 3.3 3.38
136 SWB1 CONN16 CH6 P3V3 3.3 3.327
137 SWB1 CONN16 CH7 PVDD0_8V_T3 0.8 0.82
138 SWB1 CONN16 CH8 P0V75_DVDD_1 0.75
139 SWB1 CONN16 CH9 P0V75_AVDD_1 0.75 0.756
140 SWB1 CONN16 CH10 P1V5_AVDD_1 1.5 1.524
141 SWB1 CONN16 CH11 P0V9_AVDD_1 0.9 0.915
142 SWB1 CONN16 CH12 PVDD0V9_0 0.9 0.915
143 SWB1 CONN16 CH13 PVDD0V9_1 0.9 0.91
144 SWB1 CONN16 CH14 PVDD0V9_3 0.9 0.915
145 SWB1 CONN16 CH15 PVDD1V2_T3 1.2 1.224
+42
View File
@@ -0,0 +1,42 @@
# v1.1.1 — A run no longer inherits the last one's leftovers
## 🐛 Bug fixes
**A previous run's jobs and session survived into the next one**
* Script A now clears the box before it starts: `hw-test-session finish`, `bgctl reset --yes`, `bgctl stop --all`, then `bgctl list` so you can see it came back empty.
* This matters after a run that ended badly — a closed Tera Term window, a DUT reboot mid-soak, a macro stopped by hand. The stress jobs kept running and the session stayed open, so the next run started on a box that was already loaded. Nothing failed; the numbers were just quietly wrong, and the only hint was a `bgctl list` nobody was reading.
* The `bgctl list` at the end is the point of the sequence, not decoration: it is the one line in the log that proves the DUT was idle when the run began.
## 📦 Downloads
| File | Contents |
|---|---|
| `Script_ABC_Blanton_V1.1.1.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` is invoked by Script C as `./Blanton_Script/blanton_ber.sh`, so it needs the execute bit along with `bmc_monitor.sh` and `usb_target.sh` — and neither git nor a Windows/USB copy carries it reliably. Without the `chmod` the BER section fails with `Permission denied` and the log simply has no BER in it.
## ⚠️ Before you run
* **`hw-test-session finish` at the start will complain if no session is open.** That is expected on a fresh DUT and does not stop the run.
* **These three tests cannot share the switch.** `blanton_ber.sh`, `blanton_tr518.sh` and `blanton_traffic_linespeed` all take over port loopback and L2 learning. Script C already orders BER after the traffic report.
* **PRBS takes the links down** while `blanton_ber.sh` is armed. That is the test working, not a fault.
* **`ce0` keeps running until you stop it.** If a run is interrupted between `start` and `stop`, the 100G port stays saturated with nothing in `show interfaces status` to hint at it.
* **Two numbers must stay in step**: Script C's `sleep 30` and `blanton_ber.sh`'s `BER_INTERVAL`.
* **`FAN_SPEED` is 100** — the fans run flat out unless you change `config.ttl`.
* **Declare the switch population** with `SWB_UNIT0` / `SWB_UNIT1`.
* **PRBS on the two 100G uplinks (`port_prbs_monitor.sh`) is still not wired into the macros.**
* **The three items listed as unverified in v1.1.0 are still unverified**: the `ce0` ingress mirror, the 120s settle in `blanton_tr518.sh`, and `test mode nr=no` on stop. See [v1.1.0](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/releases/tag/V1.1.0) for the one-command check on each.
## 🔗 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
**Full changelog:** [V1.1.0...V1.1.1](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.1.0...V1.1.1)
+63
View File
@@ -0,0 +1,63 @@
# v1.1.2 — NFC tag reads are now watched for the whole soak, not sampled once
## ✨ New features
**Background NFC polling**
* New `nfc_polling.sh` runs `blantons_nfc_validate.py` over and over in the background and keeps score. `start` / `stop` / `status` / `tail` / `report` / `clear` / `fg`.
* **`report` works while the poll is still running.** It only reads the log, so it never disturbs the run — and it labels itself `RUNNING` so a mid-soak snapshot is not mistaken for the final answer:
```
state : RUNNING (pid=2240323) -- this is a snapshot, the count is still moving
rounds : 240
PASS : 238
FAIL : 2
ERROR : 0 (tool did not produce a verdict)
RESULT : FAIL
--- tags seen ---
046F7BD2142290 238
```
* **`ERROR` is counted apart from `FAIL`.** A round where the tool printed neither `[PASS]` nor `[FAIL]` — it crashed, the file was missing, it hung past the timeout — did not measure anything. That is a different problem from a tag that would not read, and rolling the two together hides whichever one you are not looking for.
* `report` also lists which NFCID1s were seen and how often, and the last ten failures with their timestamps and reasons.
* `start` clears the log first, so a report always describes the run you just did rather than everything since the DUT was built.
* Script A takes a 30-second NFC baseline, Script B starts the poll for the soak, Script C stops it with the other monitors and reports.
## 🐛 Bug fixes
**The NFC log never reached the USB stick**
* Script C copied `nfc_polling.log`; the file is `nfc_poll.log`. The `cp` failed, nothing checked it, and the run finished looking fine — you would only notice back at the desk with a job archive that had no NFC log in it.
## 📦 Downloads
| File | Contents |
|---|---|
| `Script_ABC_Blanton_V1.1.2.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` and `nfc_polling.sh` are invoked by the macros 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. `blantons_nfc_validate.py` does **not** need it: `nfc_polling.sh` calls it through `python3` precisely so one more `chmod` cannot be forgotten.
## ⚠️ Before you run
* **`nfc_polling.sh start` clears the log.** Script B starts a fresh poll for the soak, which wipes Script A's baseline log — the baseline numbers are already in the master console log by then, but the file is gone.
* **NFC log path is `~/Blanton_Script/log/nfc_poll.log`** and it is copied into the job directory by Script C for the USB archive.
* **These three tests cannot share the switch.** `blanton_ber.sh`, `blanton_tr518.sh` and `blanton_traffic_linespeed` all take over port loopback and L2 learning. Script C already orders BER after the traffic report.
* **PRBS takes the links down** while `blanton_ber.sh` is armed. That is the test working, not a fault.
* **`ce0` keeps running until you stop it.** An interrupted run leaves the 100G port saturated with nothing in `show interfaces status` to hint at it.
* **Two numbers must stay in step**: Script C's `sleep 30` and `blanton_ber.sh`'s `BER_INTERVAL`.
* **`FAN_SPEED` is 100** — the fans run flat out unless you change `config.ttl`.
* **Declare the switch population** with `SWB_UNIT0` / `SWB_UNIT1`.
* **PRBS on the two 100G uplinks (`port_prbs_monitor.sh`) is still not wired into the macros.**
* **The three items listed as unverified in v1.1.0 are still unverified**: the `ce0` ingress mirror, the 120s settle in `blanton_tr518.sh`, and `test mode nr=no` on stop. See [v1.1.0](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/releases/tag/V1.1.0) for the one-command check on each.
## 🔗 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
**Full changelog:** [V1.1.1...V1.1.2](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.1.1...V1.1.2)
+59
View File
@@ -0,0 +1,59 @@
# v1.1.3 — Margin now measures against what this platform actually runs at
## ✨ New features
**Per-CONN margin profiles for the switch boards**
* `combo_SWB_CONN13_high` / `_low` through `combo_SWB_CONN16_high` / `_low` replace the old `comboA` / `comboB` pair. Each file's per-channel percentages follow the rails on *that* board, so a CONN13 profile is no longer a rough fit for CONN16.
* SWB0 and SWB1 share a profile per CONN — the two boards carry identical rails and differ only by I2C bus.
* A high pass and a low pass are now the same run with `_high` swapped for `_low`.
* **A profile applied to the wrong CONN margins the wrong rails and says nothing.** The percentages are positional, so nothing detects the mismatch. `margin_apply_profile_all.sh` now names the right profile per board instead of one name for all nine.
## 🐛 Bug fixes
**`VNOM` was the spec value, not what the rails actually sit at**
* 86 of the 144 channels moved up between +0.8% and +2.5% to the measured median for this platform — `PVDD3_3V_SYNTH_LDO_*` 3.3 → 3.38, `P0V9_AVDD_*` 0.9 → 0.915, `PVDD0_8V_T3` 0.8 → 0.82, and so on.
* **This is not a display change.** `VNOM` is the denominator of `margin_status`'s deviation %, *and* the basis `margin_set` derives high / low / OV / UV from. A rail sitting steady at 0.756 V used to read `+0.80%` against a nominal 0.75 and now reads `0.00%`; and asking for `+3%` now lands on a different absolute voltage than it did last week.
* **Margin logs from before and after this build cannot be compared directly.** The numbers moved because the reference moved, not because the hardware did.
**The batch profile script pointed at files that no longer exist**
* `margin_apply_profile_all.sh` still named `comboA` for all nine boards. With `comboA.conf` removed, every board would have stopped at `Profile not found` — a nine-line wall of errors on a script that is normally left to run.
**The channel map CSV was stale**
* `docs/LTC2980_channel_map.csv` is generated from `settings/*.conf`, so all 86 changed rails were wrong in it. Regenerated with `tools/gen_channel_map.sh`. It is output, not source — regenerate it, never hand-edit it.
## 📦 Downloads
| File | Contents |
|---|---|
| `Script_ABC_Blanton_V1.1.3.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` and `nfc_polling.sh` are invoked by the macros 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
* **Re-baseline your margin expectations.** Any pass/fail limits or golden logs derived from the old `VNOM` values need redoing against this build.
* **`margin_save` in any form writes NVM permanently** and now writes margin windows derived from the new reference. Run `margin_status_all.sh` first and never call it during a test.
* **SWB profiles are per-CONN.** Applying `combo_SWB_CONN13_high` to a CONN16 board is silently wrong.
* **These three tests cannot share the switch**: `blanton_ber.sh`, `blanton_tr518.sh` and `blanton_traffic_linespeed`.
* **PRBS takes the links down** while `blanton_ber.sh` is armed.
* **`ce0` keeps running until you stop it.**
* **Two numbers must stay in step**: Script C's `sleep 30` and `blanton_ber.sh`'s `BER_INTERVAL`.
* **`FAN_SPEED` is 100** — the fans run flat out unless you change `config.ttl`.
* **`nfc_polling.sh start` clears the log**, so Script B wipes Script A's NFC baseline file (the numbers are already in the console log).
* **The NFC tool is written for the customer's tag.** It polls Type A / B / F only and parses Type A strictly; a tag of another technology is never discovered and fails as `no RF interface activation notification received`. Without `--expected-id` it does not check identity, so a different tag of the same type still passes.
* **The three items listed as unverified in v1.1.0 are still unverified**: the `ce0` ingress mirror, the 120s 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
* [LTC2980_channel_map.csv](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/docs/LTC2980_channel_map.csv) — all 144 margin channels with the new `VNOM`
**Full changelog:** [V1.1.2...V1.1.3](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.1.2...V1.1.3)
+61
View File
@@ -0,0 +1,61 @@
# v1.1.4 — A thermal and safety run that loads the box and watches the rails
## ✨ New features
**`4_Blanton_Script_thermal_safety.ttl`**
* A **standalone** script — it is not part of the A → B → C chain and is not started by any of them. Run it on its own when the question is thermal or safety rather than functional.
* Brings the DUT up the same way Script A does (login, session reset, fan speed, `wait_init`, DUT inventory, BMC, PCIe error clear, `pcie_bus`, PMON, dmesg), then loads it: `mlucas-avx2 -cpu 0:15` in the background and `blanton_tr518.sh start` on the data plane.
* Then loops every minute: platform data, **both switch boards' rail power** via `TH6_SWB0/1_power_readback.sh`, and `bgctl list` / `jobs`. That is the point of the script — power per rail under sustained full load, sampled over hours.
* **It has no teardown.** When you interrupt it the DUT is still in `port cd lb=mac`, `l2 learn off` and `test mode nr=yes`, and `mlucas-avx2` is still running. Run `blanton_tr518.sh stop` and `kill $(jobs -p)` before anything else uses the box — nothing in `show interfaces status` reveals the leftover state.
* **It cannot share a DUT with Script B.** Both take over the `cd` ports.
**Test flow diagram**
* `docs/Blanton_Test_Flow.drawio` draws all four scripts side by side, with the config flags that change each step marked, the one real `goto` in Script B drawn, and the manual handoffs between A → B → C shown as such.
## 🐛 Bug fixes
**The soak loop spent most of its minute reading margin**
* Script B's per-round loop is meant to be a quick sample. `margin_status_all.sh` walks nine LTC2980s over I2C and dominated the round. The scan moved to Script C, which takes it once before `show uptime`.
* **The trade-off is real and worth knowing**: margin is now only measured at the start (Script A) and the end (Script C). Drift that happens *during* the soak is no longer visible.
**`hw-test-session finish` ran from inside the session's own shell**
* Script C now sends `exit` and waits for `Script done` first, so `finish` runs in the login shell that opened the session.
**The new script arrived with LF line endings**
* Every other `.ttl` in the repo is CRLF, and `.gitattributes` marks `*.ttl` as `-text` — whatever is committed is exactly what Tera Term gets. Converted to CRLF to match.
## 📦 Downloads
| File | Contents |
|---|---|
| `Script_ABC_Blanton_V1.1.4.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` 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
* **Script 4 leaves the switch loaded and looped back.** Always finish with `blanton_tr518.sh stop`. If the next test starts without it, traffic and BER results are meaningless and nothing warns you.
* **Do not run Script 4 and Script B on the same DUT.** Same ports, same L2 settings.
* **Margin is no longer sampled during the soak** — only Script A (start) and Script C (end).
* **Re-baseline your margin limits if you have not already**: `VNOM` became the measured median in v1.1.3, which moved both the deviation % and the margin window.
* **These three cannot share the switch**: `blanton_ber.sh`, `blanton_tr518.sh`, `blanton_traffic_linespeed`.
* **PRBS takes the links down** while `blanton_ber.sh` is armed.
* **`ce0` keeps circulating until you stop it.**
* **Two numbers must stay in step**: Script C's `sleep 30` and `blanton_ber.sh`'s `BER_INTERVAL`.
* **`FAN_SPEED` is 100** — relevant here more than anywhere: a thermal run at full fan is not the same test as one at 30%.
* **The three items listed as unverified in v1.1.0 are still unverified**: the `ce0` ingress mirror, the 120s settle in `blanton_tr518.sh`, and `test mode nr=no` on stop. The settle matters most for this release — Script 4 depends on `tr 518` still driving traffic minutes after it was started.
## 🔗 Links
* [Blanton_Test_Flow.drawio](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/docs/Blanton_Test_Flow.drawio) — the four scripts side by side
* [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
**Full changelog:** [V1.1.3...V1.1.4](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.1.3...V1.1.4)
+67
View File
@@ -0,0 +1,67 @@
# v1.1.5 — The stress jobs now last the whole soak
## 🐛 Bug fixes
**USB stress ran for sixty seconds of an overnight soak**
* `qfx5252-stress-usb` was started with `--runtime 60`. It finished a minute in and the USB path sat idle for the rest of the night. Nothing failed, nothing said so, and the run looked complete.
* SSD stress had the same shape at `--runtime 3600` — one hour of a soak that usually runs far longer.
* Both are now `--runtime 86400`, and the BMC DDR memtester lost its loop count (`64M 1``64M`) so it runs until it is stopped rather than finishing one pass.
* **86400 is 24 hours, not "forever".** A soak longer than a day leaves SSD and USB dead for the remainder. Script B prints `bgctl list` every round (since v1.0.10), so the shorter list is visible there — but nothing raises an alarm.
## ✨ New features
**Multiphase VRM margin**
* New `blanton_multiphase_margin.sh` drives the multiphase controllers on both switch boards over the native i2c buses — SWB0 on `/dev/i2c-13` and `-15`, SWB1 on `-14` and `-16`. 19 rails per board, 38 in all.
* `high3` / `low3` / `comboA` / `comboB` set the voltages and report one line per rail:
```
SWB0_0V9_ANLG0 - 0.930V Configure Done
SWB0_0V75_ANLG0 - 0.775V Configure Done
...
[ OK ] high3: 38 rail(s) configured
```
* `save` commits them. It has no per-rail mapping, so it reports as one operation: `Multiphase Save All`.
* `-u 0` / `-u 1` for a single board; rails belonging to the other board are skipped and counted separately, not failed.
* **`save` writes NVM permanently** (PMBus `STORE_USER_ALL`, and `0x17` on the TH6 core rail). A power cycle does not undo it.
* **These are not the LTC2980s that `margin.sh` drives.** The two tools reach the same rails from different sides and each assumes it is the only writer. There is no interlock — do not run both.
**Traffic bursts carry a random pattern**
* `blanton_traffic_linespeed` v0.7.0 appends `PatternRandom=yes` to every `tx`, `ce0` included. A fixed pattern can sit on a benign bit sequence for an entire run; a changing one is what makes a weak lane show itself.
* `-r no` forces the fixed pattern; `-r ""` leaves the argument off entirely, which is the pre-v0.7.0 wire format if a future SDK rejects it.
* Defaults change from `tx 100 length=512` to `tx 200 length=324`.
* **Counter totals are not comparable across this build**: 64800 bytes per burst instead of 51200, about 27% more. The PASS/FAIL cross-check compares a pair against each other and is unaffected — only absolute figures moved.
## 📦 Downloads
| File | Contents |
|---|---|
| `Script_ABC_Blanton_V1.1.5.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` 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
* **A soak longer than 24 hours needs the runtimes raised.** `--runtime 86400` is a ceiling; past it, SSD and USB are idle and only a shorter `bgctl list` hints at it.
* **`blanton_multiphase_margin.sh save` is permanent.** Read the rails back before committing, and never run it during a test.
* **Do not mix `blanton_multiphase_margin.sh` and `margin.sh`** — same rails, two different access paths, no interlock.
* **Traffic counters changed scale.** Any absolute thresholds taken from earlier logs need redoing.
* **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`.
* **Margin is only sampled at the start and end of a soak** (since v1.1.4), not during it.
* **`FAN_SPEED` is 100** — the fans run flat out unless you change `config.ttl`.
* **The three items listed as unverified in v1.1.0 are still unverified**: the `ce0` ingress mirror, the 120s settle in `blanton_tr518.sh`, and `test mode nr=no` on stop.
## 🔗 Links
* [Blanton_Test_Flow.drawio](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/docs/Blanton_Test_Flow.drawio) — the four scripts side by side
* [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
**Full changelog:** [V1.1.4...V1.1.5](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.1.4...V1.1.5)
+125 -2
View File
@@ -1,7 +1,7 @@
; ============================================================================= ; =============================================================================
; Script A for Blanton ; Script A for Blanton
; Version : V1.1.0 ; Version : V1.1.5
; Date : 2026-08-28 ; Date : 2026-09-01
; Author : ETWen ; Author : ETWen
; ============================================================================= ; =============================================================================
; Version History: ; Version History:
@@ -132,6 +132,107 @@
; tools/100G_Traffic.txt ; tools/100G_Traffic.txt
; tools/TR518.txt Corrected on the bench: port cd (not *:port all), ; tools/TR518.txt Corrected on the bench: port cd (not *:port all),
; testphase=1, and an explicit stop ; testphase=1, and an explicit stop
; V1.1.1 2026-08-28 ScriptA Clear a leftover session before starting a new run
; hw-test-session finish -> bgctl reset --yes ->
; bgctl stop --all -> bgctl list (must come back empty)
; A run that ended badly leaves jobs holding CPU and a
; session open; the next run used to inherit both, and
; the stress numbers were quietly wrong because of it
; V1.1.2 2026-08-28 Blanton_Script/nfc_polling.sh Add background NFC tag polling
; start / stop / status / tail / report / clear / fg
; wraps blantons_nfc_validate.py; start clears the log
; first, so a report covers this run only
; report works WHILE polling - it only reads the log,
; and says RUNNING so a snapshot is not read as final
; Each round appends a machine-readable RESULT line, so
; the tally never depends on the tool's wording
; PASS / FAIL come from the tool's own summary; ERROR
; means it produced neither, which is a different fault
; from a tag that would not read - counted separately
; tail does NOT follow (tail -f never returns, and a
; macro waiting on the prompt would hang there)
; Runs the .py through python3, not ./ - the file is
; mode 100644 and a USB copy carries no execute bit
; Blanton_Script/blantons_nfc_validate.py Vendor NFC/NCI validation tool (unmodified)
; ScriptA NFC baseline: start -> status -> 30s -> stop -> report
; ScriptB Start NFC polling for the soak, then status
; ScriptC Stop NFC polling with the other monitors, report it
; next to the mgmt ping log, and copy nfc_poll.log to
; the job dir for the USB archive
; Fix: that cp said nfc_polling.log - the file is
; nfc_poll.log, so the NFC log never reached the USB
; V1.1.3 2026-08-30 LTC2980_Margin_Script/settings/*.conf VNOM is now the measured median, not the spec value
; 86 of 144 rails moved up +0.8% .. +2.5%
; (3.3 -> 3.38, 0.9 -> 0.915, 0.8 -> 0.82, ...)
; This is NOT display-only: VNOM is the denominator of
; margin_status deviation % AND the basis margin_set
; derives high/low/OV/UV from, so the whole margin
; window shifts with it
; !! margin logs from before/after cannot be compared
; LTC2980_Margin_Script/profiles/ Add per-CONN SWB profiles, drop comboA/comboB
; combo_SWB_CONN13..16_{high,low} - the percentages
; follow that board rails, so applying one to a
; different CONN margins the wrong things, silently
; SWB0 and SWB1 share a profile per CONN (same rails)
; LTC2980_Margin_Script/script/*.sh Fix: margin_apply_profile_all.sh still pointed every
; board at comboA, which this change deleted - all 9
; boards would have failed with "Profile not found"
; docs/LTC2980_channel_map.csv Regenerated (tools/gen_channel_map.sh) - it is output
; V1.1.4 2026-08-31 4_Blanton_Script_thermal_safety.ttl Add the thermal / safety run - a STANDALONE script,
; not part of the A -> B -> C chain
; Script A style setup (login, session, fan, wait_init,
; DUT info, BMC, PCIe clear, pcie_bus, pmon, dmesg)
; then FULL LOAD: mlucas-avx2 -cpu 0:15 in the
; background + blanton_tr518.sh start
; then while 1: setup_pmon + TH6_SWB0/SWB1 power
; readback + bgctl list + jobs, pause 60
; !! no teardown section: after you interrupt it the
; unit is still on port cd lb=mac / l2 learn off /
; test mode nr=yes - run blanton_tr518.sh stop
; !! it drives the same ports as traffic and BER, so it
; cannot share a DUT with Script B
; ScriptB Drop the margin scan from the soak loop
; The loop is a fast per-minute sample; margin_status
; walks 9 LTC2980 over I2C and dominated the round
; ScriptC Take the margin scan instead, once, before uptime
; Trade-off: no margin drift DURING the soak any more,
; only a start (Script A) and end (Script C) reading
; ScriptC exit + wait "Script done" before hw-test-session
; finish - leaves the session shell first, so finish
; runs in the login shell that opened it
; docs/Blanton_Test_Flow.drawio Add the A/B/C + thermal flow diagram
; V1.1.5 2026-09-01 ScriptB Stress jobs now last the whole soak
; BMC DDR memtester 64M 1 -> 64M (loop count
; dropped = runs until stopped)
; SSD --runtime 3600 -> 86400
; USB --runtime 60 -> 86400
; The USB one finished after 60 SECONDS, so an
; overnight run had USB idle for all but the first
; minute and nothing said so
; !! 86400 is 24h: a soak longer than that leaves SSD
; and USB dead for the remainder - the per-round
; bgctl list (V1.0.10) is where that shows up
; Blanton_Script/blanton_multiphase_margin.sh Add multiphase VRM margin over the native i2c buses
; high3 / low3 / comboA / comboB / save, -u 0|1|all
; 38 rails (19 per SWB), one line each:
; SWB0_0V9_ANLG0 - 0.930V Configure Done
; save has no per-rail map, prints Multiphase Save All
; !! save is STORE_USER_ALL - permanent, survives a
; power cycle
; !! these are NOT the LTC2980s margin.sh drives; the
; two tools reach the same rails from different
; sides - do not run both
; Blanton_Script/blanton_traffic_linespeed.sh v0.7.0 tx gains PatternRandom, defaults change
; tx 100 length=512 -> tx 200 length=324
; every burst now ends PatternRandom=yes, ce0 included
; A fixed pattern can sit on a benign bit sequence for
; a whole run; random is what exposes a weak lane
; -r no forces the fixed pattern, -r "" omits the
; argument entirely (pre-v0.7.0 wire format)
; !! bytes per burst went 51200 -> 64800 (+27%), so
; counter totals are not comparable across this
; build - the PASS/FAIL cross-check is unaffected
; tools/Multiphase_*.txt Bench command references for the new script
; ============================================================================= ; =============================================================================
include "config.ttl" include "config.ttl"
@@ -171,6 +272,16 @@ wait prompt_sonic_root
sendln "rm /host/hw-eval/jobs/*" sendln "rm /host/hw-eval/jobs/*"
; ========== HW Test Session ========== ; ========== HW Test Session ==========
; Clear session
wait prompt_sonic_root
sendln "hw-test-session finish"
wait prompt_sonic_root
sendln "bgctl reset --yes"
wait prompt_sonic_root
sendln "bgctl stop --all"
wait prompt_sonic_root
sendln "bgctl list"
wait prompt_sonic_root wait prompt_sonic_root
sendln "hw-test-session start" sendln "hw-test-session start"
wait prompt_sonic_root wait prompt_sonic_root
@@ -290,6 +401,18 @@ sendln "cat ~/Blanton_Script/log/mgmt_ping.log"
wait prompt_sonic_root wait prompt_sonic_root
sendln "~/Blanton_Script/mgmt_ping_monitor.sh clear" sendln "~/Blanton_Script/mgmt_ping_monitor.sh clear"
; ========== NFC Test ==========
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 30"
wait prompt_sonic_root
sendln "~/Blanton_Script/nfc_polling.sh stop"
wait prompt_sonic_root
sendln "~/Blanton_Script/nfc_polling.sh report"
; ========== 100G Port Status ========== ; ========== 100G Port Status ==========
wait prompt_sonic_root wait prompt_sonic_root
+10 -7
View File
@@ -26,7 +26,8 @@ sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mluca
;wait prompt_sonic_root ;wait prompt_sonic_root
;sendln "./Blanton_Script/bmc_monitor.sh start" ;sendln "./Blanton_Script/bmc_monitor.sh start"
wait prompt_sonic_root wait prompt_sonic_root
sendln "bgctl run bmc-manager run '/usr/bin/memtester 64M 1'" ;sendln "bgctl run bmc-manager run '/usr/bin/memtester 64M 1'"
sendln "bgctl run bmc-manager run '/usr/bin/memtester 64M'" ; Continue Execture
; ========== BMC Monitor Test ========== ; ========== BMC Monitor Test ==========
wait prompt_sonic_root wait prompt_sonic_root
@@ -40,7 +41,7 @@ sendln "bgctl run /usr/sbin/memtester 1G" ; Continue Execture
; ========== SSD read/write ========== ; ========== SSD read/write ==========
wait prompt_sonic_root wait prompt_sonic_root
sendln "bgctl run qfx5252-stress-ssd 1G --runtime 3600 --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"
; ========== USB read/write ========== ; ========== USB read/write ==========
; ---- Get USB partition node -> usb_dev ---- ; ---- Get USB partition node -> usb_dev ----
@@ -51,7 +52,7 @@ 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 60 --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
sendln cmd sendln cmd
;wait prompt_sonic_root ;wait prompt_sonic_root
@@ -100,6 +101,12 @@ wait prompt_sonic_root
pause 3 pause 3
sendln "./Blanton_Script/mgmt_ping_monitor.sh status" sendln "./Blanton_Script/mgmt_ping_monitor.sh status"
; ========== NFC Test ==========
wait prompt_sonic_root
sendln "~/Blanton_Script/nfc_polling.sh start"
wait prompt_sonic_root
sendln "~/Blanton_Script/nfc_polling.sh status"
; ========== 100G Port ========== ; ========== 100G Port ==========
wait prompt_sonic_root wait prompt_sonic_root
@@ -168,9 +175,5 @@ while 1
sendln "bgctl list" sendln "bgctl list"
wait prompt_sonic_root wait prompt_sonic_root
sendln "jobs" sendln "jobs"
; ========== Check Margin ==========
if EN_Margin = 1 then
include "utils/show_margin_status.ttl"
endif
pause 60 pause 60
endwhile endwhile
@@ -25,6 +25,8 @@ wait prompt_sonic_root
sendln "~/Blanton_Script/mgmt_ping_monitor.sh status" sendln "~/Blanton_Script/mgmt_ping_monitor.sh status"
wait prompt_sonic_root wait prompt_sonic_root
sendln "~/Blanton_Script/mgmt_ping_monitor.sh stop" sendln "~/Blanton_Script/mgmt_ping_monitor.sh stop"
wait prompt_sonic_root
sendln "~/Blanton_Script/nfc_polling.sh stop"
;============================================================================================================= ;=============================================================================================================
; 100G PRBS STOP ; 100G PRBS STOP
@@ -92,6 +94,10 @@ sendln "cat /host/hw-eval/jobs/qfx5252-stress-usb.log"
wait prompt_sonic_root wait prompt_sonic_root
sendln "cat ~/Blanton_Script/log/mgmt_ping.log" sendln "cat ~/Blanton_Script/log/mgmt_ping.log"
; ========== NFC Test result ==========
wait prompt_sonic_root
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"
@@ -178,6 +184,11 @@ sendln "/usr/sbin/smartctl -x /dev/nvme0"
wait prompt_sonic_root wait prompt_sonic_root
sendln "show reboot-cause" sendln "show reboot-cause"
; ========== Check Margin ==========
if EN_Margin = 1 then
include "utils/show_margin_status.ttl"
endif
; ========== Show Power on uptime ========== ; ========== Show Power on uptime ==========
wait prompt_sonic_root wait prompt_sonic_root
sendln "show uptime" sendln "show uptime"
@@ -201,6 +212,8 @@ 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/"
wait prompt_sonic_root 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
sendln "cp ./Blanton_Script/log/nfc_poll.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"
@@ -211,6 +224,9 @@ sendln cmd
; ========== HW Test Session ========== ; ========== HW Test Session ==========
wait prompt_sonic_root wait prompt_sonic_root
sendln "exit"
wait "Script done"
wait prompt_sonic_root
sendln "hw-test-session finish" sendln "hw-test-session finish"
wait prompt_sonic_root wait prompt_sonic_root
sendln "bgctl reset --yes" sendln "bgctl reset --yes"
@@ -0,0 +1,158 @@
include "config.ttl"
flushrecv
;================================================================
; Log File Creation
;================================================================
gettime str_starttime "%Y%m%d-%H%M%S"
getdir mdir
if EN_log = 1 then
sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name strTestcase str_starttime
logopen filename 0 1 1 1
endif
; ========== Root Login ==========
wait prompt_login
sendln "admin"
wait "Password:"
sendln "YourPaSsWoRd"
wait prompt_sonic
sendln "sudo -i"
; ========== 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
;Stress log clear
wait prompt_sonic_root
sendln "rm /host/hw-eval/jobs/*"
; ========== HW Test Session ==========
; Clear session
wait prompt_sonic_root
sendln "hw-test-session finish"
wait prompt_sonic_root
sendln "bgctl reset --yes"
wait prompt_sonic_root
sendln "bgctl stop --all"
wait prompt_sonic_root
sendln "bgctl list"
wait prompt_sonic_root
sendln "hw-test-session start"
wait prompt_sonic_root
sendln "hw-test-session log"
wait prompt_sonic_root
sendln "hw-test-session status"
; ========== 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
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
;sendln "bmc-manager run 'cat /etc/issue'"
wait prompt_sonic_root
sendln "bmc-first-enroll"
wait prompt_sonic_root
sendln "bmc-manager version"
wait prompt_sonic_root
sendln "bmc-manager status"
; ========== 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"
; ========== Full Load ==========
; AMD CPU STRESS TEST
wait prompt_sonic_root
sendln 'chmod +x ~/hammer/tools/amd/mlucas-avx2'
wait prompt_sonic_root
sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mlucas_amm_log 2>&1 &"
; TR518 TEST
wait prompt_sonic_root
sendln "~/Blanton_Script/blanton_tr518.sh start"
while 1
; Base info polling
include "utils/setup_pmon.ttl"
; TH6 Power Polling
wait prompt_sonic_root
sendln "~/Blanton_Script/TH6_SWB0_power_readback.sh"
wait prompt_sonic_root
sendln "~/Blanton_Script/TH6_SWB1_power_readback.sh"
; Background jobs Check
wait prompt_sonic_root
sendln "bgctl list"
wait prompt_sonic_root
sendln "jobs"
pause 60
endwhile
@@ -72,13 +72,13 @@ margin_operation 0 high
margin_operation 0 nominal margin_operation 0 nominal
# 批次套用 profile(套在當前載入的 LTC2980 # 批次套用 profile(套在當前載入的 LTC2980
margin_apply_profile profiles/comboA.conf margin_apply_profile profiles/combo_SWB_CONN13_high.conf
margin_apply_profile profiles/comboB.conf margin_apply_profile profiles/combo_SWB_CONN13_low.conf
margin_apply_profile profiles/all_off.conf margin_apply_profile profiles/all_off.conf
# 切換到另一顆 LTC2980 # 切換到另一顆 LTC2980
margin_init Blanton_SWB1_CONN16 margin_init Blanton_SWB1_CONN16
margin_apply_profile profiles/comboA.conf margin_apply_profile profiles/combo_SWB_CONN16_high.conf
# 儲存到 NVM(斷電後保留) # 儲存到 NVM(斷電後保留)
margin_save # 只寫當前載入的那顆 margin_save # 只寫當前載入的那顆
@@ -108,7 +108,7 @@ BOARDS=(
## 一次套 profile 到所有 LTC2980 ## 一次套 profile 到所有 LTC2980
`script/margin_apply_profile_all.sh` 對多顆 LTC2980 依 `BOARDS[i]` 配對 `script/margin_apply_profile_all.sh` 對多顆 LTC2980 依 `BOARDS[i]` 配對
`PROFILES[i]` 套用 profile(預設全部 `comboA`)。 `PROFILES[i]` 套用 profile(預設 SWB 各用自己 CONN 的 `_high`CB 用 `combo_high3`)。
```bash ```bash
source script/margin_apply_profile_all.sh source script/margin_apply_profile_all.sh
@@ -124,8 +124,8 @@ BOARDS=(
) )
PROFILES=( PROFILES=(
"comboA" # Blanton_CB_CONN13 "combo_high3" # Blanton_CB_CONN13
"comboB" # Blanton_SWB0_CONN13 ← 改成 comboB "combo_SWB_CONN13_high" # Blanton_SWB0_CONN13
... ...
) )
``` ```
@@ -133,6 +133,10 @@ PROFILES=(
`PROFILES` 寫名字即可(不含路徑跟 `.conf`),script 會自動展開成 `PROFILES` 寫名字即可(不含路徑跟 `.conf`),script 會自動展開成
`profiles/<name>.conf`。兩個陣列長度不一致會直接報錯。 `profiles/<name>.conf`。兩個陣列長度不一致會直接報錯。
> ⚠️ **SWB 的 profile 是 per-CONN 的**:每個檔的百分比對應該片板子的軌,
> 套到別的 CONN 會 margin 到錯的東西(而且不會報錯)。這裡不能全部填同一個名字。
> HIGH / LOW 兩輪就是把 `_high` 全換成 `_low` 再跑一次。
## 一次把所有 LTC2980 寫入 NVM ## 一次把所有 LTC2980 寫入 NVM
> ⚠️ `margin_save` 會把當前 margin / OV / UV 設定**永久寫入 NVM** > ⚠️ `margin_save` 會把當前 margin / OV / UV 設定**永久寫入 NVM**
@@ -217,6 +221,22 @@ i2cset -f -y 14 0x62 0x15 ; i2cset -f -y 14 0x64 0x15 # SWB1 CONN16
不要讓它去打不存在的板子。bus 節點不存在(`/dev/i2c-N` 沒有)與晶片不回應(NACK 不要讓它去打不存在的板子。bus 節點不存在(`/dev/i2c-N` 沒有)與晶片不回應(NACK
會分別報不同訊息 —— 前者代表 FPGA 的 i2c adapter 根本沒 enumerate,後者才是板子的問題。 會分別報不同訊息 —— 前者代表 FPGA 的 i2c adapter 根本沒 enumerate,後者才是板子的問題。
## 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 專用** | 同上 |
| `combo_high3` / `combo_low3` | 通用 | 全部 channel ±3% |
| `combo_high5` / `combo_low5` | 通用 | 全部 channel ±5% |
| `combo_normal` | 通用 | 全部回 nominal |
| `all_off` | 通用 | 全部 OPERATION off |
SWB0 和 SWB1 的同號 CONN 共用同一個 profile(兩片板的軌完全相同,
只差 I2C bus)。CB CONN13 沒有專屬 profile,用通用的 `combo_high3` / `combo_low3`
## Operation 對應 ## Operation 對應
| 參數 | PMBus 0x01 值 | 說明 | | 參數 | PMBus 0x01 值 | 說明 |
@@ -1,22 +0,0 @@
# Profile: comboA - alternating high/low (even=high, odd=low)
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:high:8"
"1:low:8"
"2:high:8"
"3:low:8"
"4:high:8"
"5:low:8"
"6:high:8"
"7:low:8"
"8:high:8"
"9:low:8"
"10:high:8"
"11:low:8"
"12:high:8"
"13:low:8"
"14:high:8"
"15:low:8"
)
@@ -1,22 +0,0 @@
# Profile: comboB - inverse of comboA (even=low, odd=high)
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:low:8"
"1:high:8"
"2:low:8"
"3:high:8"
"4:low:8"
"5:high:8"
"6:low:8"
"7:high:8"
"8:low:8"
"9:high:8"
"10:low:8"
"11:high:8"
"12:low:8"
"13:high:8"
"14:low:8"
"15:high:8"
)
@@ -0,0 +1,24 @@
# Profile: combo_SWB_CONN13_high - every channel margin HIGH, per-channel percentage
# For the SWB CONN13 board only: the percentages follow that board's
# rails, so applying it to a different CONN margins the wrong things.
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:high:3"
"1:high:3"
"2:high:3"
"3:high:3"
"4:high:5"
"5:high:5"
"6:high:5"
"7:high:5"
"8:high:5"
"9:high:3"
"10:high:3"
"11:high:3"
"12:high:3"
"13:high:3"
"14:high:3"
"15:high:5"
)
@@ -0,0 +1,24 @@
# Profile: combo_SWB_CONN13_low - every channel margin LOW, per-channel percentage
# For the SWB CONN13 board only: the percentages follow that board's
# rails, so applying it to a different CONN margins the wrong things.
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:low:3"
"1:low:3"
"2:low:3"
"3:low:3"
"4:low:5"
"5:low:5"
"6:low:5"
"7:low:5"
"8:low:5"
"9:low:3"
"10:low:3"
"11:low:3"
"12:low:3"
"13:low:3"
"14:low:3"
"15:low:5"
)
@@ -0,0 +1,24 @@
# Profile: combo_SWB_CONN14_high - every channel margin HIGH, per-channel percentage
# For the SWB CONN14 board only: the percentages follow that board's
# rails, so applying it to a different CONN margins the wrong things.
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:high:3"
"1:high:3"
"2:high:3"
"3:high:5"
"4:high:5"
"5:high:5"
"6:high:5"
"7:high:5"
"8:high:3"
"9:high:3"
"10:nominal:5"
"11:nominal:5"
"12:high:3"
"13:nominal:5"
"14:high:5"
"15:high:3"
)
@@ -0,0 +1,24 @@
# Profile: combo_SWB_CONN14_low - every channel margin LOW, per-channel percentage
# For the SWB CONN14 board only: the percentages follow that board's
# rails, so applying it to a different CONN margins the wrong things.
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:low:3"
"1:low:3"
"2:low:3"
"3:low:5"
"4:low:5"
"5:low:5"
"6:low:5"
"7:low:5"
"8:low:3"
"9:low:3"
"10:nominal:5"
"11:nominal:5"
"12:low:3"
"13:nominal:5"
"14:low:5"
"15:low:3"
)
@@ -0,0 +1,24 @@
# Profile: combo_SWB_CONN15_high - every channel margin HIGH, per-channel percentage
# For the SWB CONN15 board only: the percentages follow that board's
# rails, so applying it to a different CONN margins the wrong things.
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:high:3"
"1:high:3"
"2:high:3"
"3:high:3"
"4:high:3"
"5:high:3"
"6:high:5"
"7:high:3"
"8:high:5"
"9:high:5"
"10:nominal:5"
"11:high:5"
"12:high:3"
"13:high:3"
"14:high:3"
"15:high:5"
)
@@ -0,0 +1,24 @@
# Profile: combo_SWB_CONN15_low - every channel margin LOW, per-channel percentage
# For the SWB CONN15 board only: the percentages follow that board's
# rails, so applying it to a different CONN margins the wrong things.
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:low:3"
"1:low:3"
"2:low:3"
"3:low:3"
"4:low:3"
"5:low:3"
"6:low:5"
"7:low:3"
"8:low:5"
"9:low:5"
"10:nominal:5"
"11:low:5"
"12:low:3"
"13:low:3"
"14:low:3"
"15:low:5"
)
@@ -0,0 +1,24 @@
# Profile: combo_SWB_CONN16_high - every channel margin HIGH, per-channel percentage
# For the SWB CONN16 board only: the percentages follow that board's
# rails, so applying it to a different CONN margins the wrong things.
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:high:3"
"1:high:5"
"2:high:5"
"3:high:5"
"4:high:5"
"5:high:5"
"6:high:5"
"7:high:3"
"8:high:3"
"9:high:3"
"10:high:3"
"11:high:3"
"12:high:3"
"13:high:3"
"14:high:3"
"15:high:3"
)
@@ -0,0 +1,24 @@
# Profile: combo_SWB_CONN16_low - every channel margin LOW, per-channel percentage
# For the SWB CONN16 board only: the percentages follow that board's
# rails, so applying it to a different CONN margins the wrong things.
# Applied to whichever LTC2980 is currently loaded via margin_init
# Format: "channel:operation:change_percent"
PROFILE_CHANNELS=(
"0:low:3"
"1:low:5"
"2:low:5"
"3:low:5"
"4:low:5"
"5:low:5"
"6:low:5"
"7:low:3"
"8:low:3"
"9:low:3"
"10:low:3"
"11:low:3"
"12:low:3"
"13:low:3"
"14:low:3"
"15:low:3"
)
@@ -17,17 +17,24 @@ BOARDS=(
"Blanton_SWB1_CONN16" "Blanton_SWB1_CONN16"
) )
# 對應的 profile 名稱(不含路徑與 .conf 副檔名),預設全部 comboA # 對應的 profile 名稱(不含路徑與 .conf 副檔名)
#
# SWB 的 profile 是 per-CONN 的:百分比對應該片板子的軌,套到別的 CONN 會 margin
# 到錯的東西,所以這裡不能全部填同一個名字。
#
# 這份預設是 HIGH 那一輪;LOW 那一輪把下面的 _high 全換成 _low 再跑一次
# (或 sed -i 's/_high/_low/' 這個檔)。
# CB 沒有 per-CONN profile,沿用通用的 combo_high3 / combo_low3。
PROFILES=( PROFILES=(
"comboA" # Blanton_CB_CONN13 "combo_high3" # Blanton_CB_CONN13 (低壓軌多,用通用 +3%)
"comboA" # Blanton_SWB0_CONN13 "combo_SWB_CONN13_high" # Blanton_SWB0_CONN13
"comboA" # Blanton_SWB0_CONN14 "combo_SWB_CONN14_high" # Blanton_SWB0_CONN14
"comboA" # Blanton_SWB0_CONN15 "combo_SWB_CONN15_high" # Blanton_SWB0_CONN15
"comboA" # Blanton_SWB0_CONN16 "combo_SWB_CONN16_high" # Blanton_SWB0_CONN16
"comboA" # Blanton_SWB1_CONN13 "combo_SWB_CONN13_high" # Blanton_SWB1_CONN13
"comboA" # Blanton_SWB1_CONN14 "combo_SWB_CONN14_high" # Blanton_SWB1_CONN14
"comboA" # Blanton_SWB1_CONN15 "combo_SWB_CONN15_high" # Blanton_SWB1_CONN15
"comboA" # Blanton_SWB1_CONN16 "combo_SWB_CONN16_high" # Blanton_SWB1_CONN16
) )
# --- Source margin.sh if not already loaded --- # --- Source margin.sh if not already loaded ---
@@ -41,7 +41,7 @@ CH3_VNOM="1.8"; CH3_NET="V1P8_ALW"
CH4_VNOM="1.1"; CH4_NET="PWR_APU_VDDIO_SUS" CH4_VNOM="1.1"; CH4_NET="PWR_APU_VDDIO_SUS"
CH5_VNOM="0.75"; CH5_NET="PWR_VDD_MISC_RUN" CH5_VNOM="0.75"; CH5_NET="PWR_VDD_MISC_RUN"
CH6_VNOM="0.78"; CH6_NET="PWR_APU_VDD_MEM_RUN" CH6_VNOM="0.78"; CH6_NET="PWR_APU_VDD_MEM_RUN"
CH7_VNOM="0.8"; CH7_NET="V0P8_PHY2_DVDD" CH7_VNOM="0.816"; CH7_NET="V0P8_PHY2_DVDD"
CH8_VNOM="0.8"; CH8_NET="V0P8_AVDD" CH8_VNOM="0.8"; CH8_NET="V0P8_AVDD"
CH9_VNOM="0.8"; CH9_NET="V0P8_PHY" CH9_VNOM="0.8"; CH9_NET="V0P8_PHY"
CH10_VNOM="1.8"; CH10_NET="V1P8_FPGA" CH10_VNOM="1.8"; CH10_NET="V1P8_FPGA"
@@ -49,4 +49,4 @@ CH11_VNOM="2.5"; CH11_NET="V2P5_FPGA"
CH12_VNOM="1.1"; CH12_NET="V1P1_FPGA" CH12_VNOM="1.1"; CH12_NET="V1P1_FPGA"
CH13_VNOM="5.0"; CH13_NET="P5V_STBY" CH13_VNOM="5.0"; CH13_NET="P5V_STBY"
CH14_VNOM="3.3"; CH14_NET="P3V3_STBY" CH14_VNOM="3.3"; CH14_NET="P3V3_STBY"
CH15_VNOM="0.8"; CH15_NET="V0P8_PHY2_AVDD" CH15_VNOM="0.816"; CH15_NET="V0P8_PHY2_AVDD"
@@ -35,18 +35,18 @@ CHIP_POST_CMD=(
# chip1: SWB0 (CONN13) # chip1: SWB0 (CONN13)
# ============================================================ # ============================================================
CH0_VNOM="0.75"; CH0_NET="P0V75_DVDD_47" CH0_VNOM="0.75"; CH0_NET="P0V75_DVDD_47"
CH1_VNOM="0.75"; CH1_NET="P0V75_AVDD_47" CH1_VNOM="0.756"; CH1_NET="P0V75_AVDD_47"
CH2_VNOM="1.5"; CH2_NET="P1V5_AVDD_47" CH2_VNOM="1.524"; CH2_NET="P1V5_AVDD_47"
CH3_VNOM="0.9"; CH3_NET="P0V9_AVDD_47" CH3_VNOM="0.915"; CH3_NET="P0V9_AVDD_47"
CH4_VNOM="1.8"; CH4_NET="P1V8_1" CH4_VNOM="1.816"; CH4_NET="P1V8_1"
CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_A3" CH5_VNOM="3.38"; CH5_NET="PVDD3_3V_SYNTH_LDO_A3"
CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_B1" CH6_VNOM="3.38"; CH6_NET="PVDD3_3V_SYNTH_LDO_B1"
CH7_VNOM="1.8"; CH7_NET="P1V8_3" CH7_VNOM="1.816"; CH7_NET="P1V8_3"
CH8_VNOM="1.8"; CH8_NET="P1V8_DVDDIO_3" CH8_VNOM="1.8"; CH8_NET="P1V8_DVDDIO_3"
CH9_VNOM="0.75"; CH9_NET="P0V75_DVDD_39" CH9_VNOM="0.75"; CH9_NET="P0V75_DVDD_39"
CH10_VNOM="0.75"; CH10_NET="P0V75_AVDD_39" CH10_VNOM="0.756"; CH10_NET="P0V75_AVDD_39"
CH11_VNOM="1.5"; CH11_NET="P1V5_AVDD_39" CH11_VNOM="1.524"; CH11_NET="P1V5_AVDD_39"
CH12_VNOM="0.9"; CH12_NET="P0V9_AVDD_39" CH12_VNOM="0.915"; CH12_NET="P0V9_AVDD_39"
CH13_VNOM="1.5"; CH13_NET="PVDD1V5_2" CH13_VNOM="1.5"; CH13_NET="PVDD1V5_2"
CH14_VNOM="1.8"; CH14_NET="PVDD1V8_DUT" CH14_VNOM="1.8"; CH14_NET="PVDD1V8_DUT"
CH15_VNOM="1.2"; CH15_NET="PVDD_MDIO" CH15_VNOM="1.2"; CH15_NET="PVDD_MDIO"
@@ -34,16 +34,16 @@ CHIP_POST_CMD=(
# ============================================================ # ============================================================
# chip1: SWB0 (CONN14) # chip1: SWB0 (CONN14)
# ============================================================ # ============================================================
CH0_VNOM="0.75"; CH0_NET="P0V75_AVDD_7" CH0_VNOM="0.756"; CH0_NET="P0V75_AVDD_7"
CH1_VNOM="1.5"; CH1_NET="P1V5_AVDD_7" CH1_VNOM="1.524"; CH1_NET="P1V5_AVDD_7"
CH2_VNOM="0.9"; CH2_NET="P0V9_AVDD_7" CH2_VNOM="0.915"; CH2_NET="P0V9_AVDD_7"
CH3_VNOM="1.8"; CH3_NET="P1V8_5" CH3_VNOM="1.816"; CH3_NET="P1V8_5"
CH4_VNOM="1.8"; CH4_NET="P1V8_2" CH4_VNOM="1.816"; CH4_NET="P1V8_2"
CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_B2" CH5_VNOM="3.38"; CH5_NET="PVDD3_3V_SYNTH_LDO_B2"
CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_A2" CH6_VNOM="3.38"; CH6_NET="PVDD3_3V_SYNTH_LDO_A2"
CH7_VNOM="3.3"; CH7_NET="PVDD3_3V_SYNTH_LDO_A1" CH7_VNOM="3.38"; CH7_NET="PVDD3_3V_SYNTH_LDO_A1"
CH8_VNOM="1.5"; CH8_NET="PVDD1V5_TSC" CH8_VNOM="1.516"; CH8_NET="PVDD1V5_TSC"
CH9_VNOM="1.5"; CH9_NET="PVDD1V5_ANLG" CH9_VNOM="1.516"; CH9_NET="PVDD1V5_ANLG"
CH10_VNOM="-"; CH10_NET="NC" CH10_VNOM="-"; CH10_NET="NC"
CH11_VNOM="-"; CH11_NET="NC" CH11_VNOM="-"; CH11_NET="NC"
CH12_VNOM="1.5"; CH12_NET="PVDD1V5_1" CH12_VNOM="1.5"; CH12_NET="PVDD1V5_1"
@@ -34,19 +34,19 @@ CHIP_POST_CMD=(
# ============================================================ # ============================================================
# chip1: SWB0 (CONN15) # chip1: SWB0 (CONN15)
# ============================================================ # ============================================================
CH0_VNOM="1.5"; CH0_NET="P1V5_AVDD_55" CH0_VNOM="1.524"; CH0_NET="P1V5_AVDD_55"
CH1_VNOM="0.9"; CH1_NET="P0V9_AVDD_55" CH1_VNOM="0.915"; CH1_NET="P0V9_AVDD_55"
CH2_VNOM="0.75"; CH2_NET="P0V75_DVDD_63" CH2_VNOM="0.75"; CH2_NET="P0V75_DVDD_63"
CH3_VNOM="0.75"; CH3_NET="P0V75_AVDD_63" CH3_VNOM="0.756"; CH3_NET="P0V75_AVDD_63"
CH4_VNOM="1.5"; CH4_NET="P1V5_AVDD_63" CH4_VNOM="1.524"; CH4_NET="P1V5_AVDD_63"
CH5_VNOM="0.9"; CH5_NET="P0V9_AVDD_63" CH5_VNOM="0.915"; CH5_NET="P0V9_AVDD_63"
CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_B3" CH6_VNOM="3.38"; CH6_NET="PVDD3_3V_SYNTH_LDO_B3"
CH7_VNOM="1.5"; CH7_NET="PVDD1V5_3" CH7_VNOM="1.5"; CH7_NET="PVDD1V5_3"
CH8_VNOM="0.85"; CH8_NET="P0V85_STBY" CH8_VNOM="0.85"; CH8_NET="P0V85_STBY"
CH9_VNOM="1.8"; CH9_NET="P1V8_STBY" CH9_VNOM="1.8"; CH9_NET="P1V8_STBY"
CH10_VNOM="-"; CH10_NET="NC" CH10_VNOM="-"; CH10_NET="NC"
CH11_VNOM="3.3"; CH11_NET="P3V3_STBY" CH11_VNOM="3.3"; CH11_NET="P3V3_STBY"
CH12_VNOM="0.9"; CH12_NET="PVDD0V9_2" CH12_VNOM="0.91"; CH12_NET="PVDD0V9_2"
CH13_VNOM="0.75"; CH13_NET="P0V75_DVDD_55" CH13_VNOM="0.75"; CH13_NET="P0V75_DVDD_55"
CH14_VNOM="0.75"; CH14_NET="P0V75_AVDD_55" CH14_VNOM="0.756"; CH14_NET="P0V75_AVDD_55"
CH15_VNOM="1.8"; CH15_NET="P1V8_DVDDIO_4" CH15_VNOM="1.8"; CH15_NET="P1V8_DVDDIO_4"
@@ -35,18 +35,18 @@ CHIP_POST_CMD=(
# chip1: SWB0 (CONN16) # chip1: SWB0 (CONN16)
# ============================================================ # ============================================================
CH0_VNOM="1.5"; CH0_NET="PVDD1V5_0" CH0_VNOM="1.5"; CH0_NET="PVDD1V5_0"
CH1_VNOM="1.8"; CH1_NET="P1V8_4" CH1_VNOM="1.816"; CH1_NET="P1V8_4"
CH2_VNOM="3.3"; CH2_NET="PVDD3_3V_SYNTH_LDO_B5" CH2_VNOM="3.38"; CH2_NET="PVDD3_3V_SYNTH_LDO_B5"
CH3_VNOM="3.3"; CH3_NET="PVDD3_3V_SYNTH_LDO_A5" CH3_VNOM="3.38"; CH3_NET="PVDD3_3V_SYNTH_LDO_A5"
CH4_VNOM="3.3"; CH4_NET="PVDD3_3V_SYNTH_LDO_B4" CH4_VNOM="3.38"; CH4_NET="PVDD3_3V_SYNTH_LDO_B4"
CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_A4" CH5_VNOM="3.38"; CH5_NET="PVDD3_3V_SYNTH_LDO_A4"
CH6_VNOM="3.3"; CH6_NET="P3V3" CH6_VNOM="3.327"; CH6_NET="P3V3"
CH7_VNOM="0.8"; CH7_NET="PVDD0_8V_T3" CH7_VNOM="0.82"; CH7_NET="PVDD0_8V_T3"
CH8_VNOM="0.75"; CH8_NET="P0V75_DVDD_1" CH8_VNOM="0.75"; CH8_NET="P0V75_DVDD_1"
CH9_VNOM="0.75"; CH9_NET="P0V75_AVDD_1" CH9_VNOM="0.756"; CH9_NET="P0V75_AVDD_1"
CH10_VNOM="1.5"; CH10_NET="P1V5_AVDD_1" CH10_VNOM="1.524"; CH10_NET="P1V5_AVDD_1"
CH11_VNOM="0.9"; CH11_NET="P0V9_AVDD_1" CH11_VNOM="0.915"; CH11_NET="P0V9_AVDD_1"
CH12_VNOM="0.9"; CH12_NET="PVDD0V9_0" CH12_VNOM="0.915"; CH12_NET="PVDD0V9_0"
CH13_VNOM="0.9"; CH13_NET="PVDD0V9_1" CH13_VNOM="0.91"; CH13_NET="PVDD0V9_1"
CH14_VNOM="0.9"; CH14_NET="PVDD0V9_3" CH14_VNOM="0.915"; CH14_NET="PVDD0V9_3"
CH15_VNOM="1.2"; CH15_NET="PVDD1V2_T3" CH15_VNOM="1.224"; CH15_NET="PVDD1V2_T3"
@@ -35,18 +35,18 @@ CHIP_POST_CMD=(
# chip1: SWB1 (CONN13) # chip1: SWB1 (CONN13)
# ============================================================ # ============================================================
CH0_VNOM="0.75"; CH0_NET="P0V75_DVDD_47" CH0_VNOM="0.75"; CH0_NET="P0V75_DVDD_47"
CH1_VNOM="0.75"; CH1_NET="P0V75_AVDD_47" CH1_VNOM="0.756"; CH1_NET="P0V75_AVDD_47"
CH2_VNOM="1.5"; CH2_NET="P1V5_AVDD_47" CH2_VNOM="1.524"; CH2_NET="P1V5_AVDD_47"
CH3_VNOM="0.9"; CH3_NET="P0V9_AVDD_47" CH3_VNOM="0.915"; CH3_NET="P0V9_AVDD_47"
CH4_VNOM="1.8"; CH4_NET="P1V8_1" CH4_VNOM="1.816"; CH4_NET="P1V8_1"
CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_A3" CH5_VNOM="3.38"; CH5_NET="PVDD3_3V_SYNTH_LDO_A3"
CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_B1" CH6_VNOM="3.38"; CH6_NET="PVDD3_3V_SYNTH_LDO_B1"
CH7_VNOM="1.8"; CH7_NET="P1V8_3" CH7_VNOM="1.816"; CH7_NET="P1V8_3"
CH8_VNOM="1.8"; CH8_NET="P1V8_DVDDIO_3" CH8_VNOM="1.8"; CH8_NET="P1V8_DVDDIO_3"
CH9_VNOM="0.75"; CH9_NET="P0V75_DVDD_39" CH9_VNOM="0.75"; CH9_NET="P0V75_DVDD_39"
CH10_VNOM="0.75"; CH10_NET="P0V75_AVDD_39" CH10_VNOM="0.756"; CH10_NET="P0V75_AVDD_39"
CH11_VNOM="1.5"; CH11_NET="P1V5_AVDD_39" CH11_VNOM="1.524"; CH11_NET="P1V5_AVDD_39"
CH12_VNOM="0.9"; CH12_NET="P0V9_AVDD_39" CH12_VNOM="0.915"; CH12_NET="P0V9_AVDD_39"
CH13_VNOM="1.5"; CH13_NET="PVDD1V5_2" CH13_VNOM="1.5"; CH13_NET="PVDD1V5_2"
CH14_VNOM="1.8"; CH14_NET="PVDD1V8_DUT" CH14_VNOM="1.8"; CH14_NET="PVDD1V8_DUT"
CH15_VNOM="1.2"; CH15_NET="PVDD_MDIO" CH15_VNOM="1.2"; CH15_NET="PVDD_MDIO"
@@ -34,16 +34,16 @@ CHIP_POST_CMD=(
# ============================================================ # ============================================================
# chip1: SWB1 (CONN14) # chip1: SWB1 (CONN14)
# ============================================================ # ============================================================
CH0_VNOM="0.75"; CH0_NET="P0V75_AVDD_7" CH0_VNOM="0.756"; CH0_NET="P0V75_AVDD_7"
CH1_VNOM="1.5"; CH1_NET="P1V5_AVDD_7" CH1_VNOM="1.524"; CH1_NET="P1V5_AVDD_7"
CH2_VNOM="0.9"; CH2_NET="P0V9_AVDD_7" CH2_VNOM="0.915"; CH2_NET="P0V9_AVDD_7"
CH3_VNOM="1.8"; CH3_NET="P1V8_5" CH3_VNOM="1.816"; CH3_NET="P1V8_5"
CH4_VNOM="1.8"; CH4_NET="P1V8_2" CH4_VNOM="1.816"; CH4_NET="P1V8_2"
CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_B2" CH5_VNOM="3.38"; CH5_NET="PVDD3_3V_SYNTH_LDO_B2"
CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_A2" CH6_VNOM="3.38"; CH6_NET="PVDD3_3V_SYNTH_LDO_A2"
CH7_VNOM="3.3"; CH7_NET="PVDD3_3V_SYNTH_LDO_A1" CH7_VNOM="3.38"; CH7_NET="PVDD3_3V_SYNTH_LDO_A1"
CH8_VNOM="1.5"; CH8_NET="PVDD1V5_TSC" CH8_VNOM="1.516"; CH8_NET="PVDD1V5_TSC"
CH9_VNOM="1.5"; CH9_NET="PVDD1V5_ANLG" CH9_VNOM="1.516"; CH9_NET="PVDD1V5_ANLG"
CH10_VNOM="-"; CH10_NET="NC" CH10_VNOM="-"; CH10_NET="NC"
CH11_VNOM="-"; CH11_NET="NC" CH11_VNOM="-"; CH11_NET="NC"
CH12_VNOM="1.5"; CH12_NET="PVDD1V5_1" CH12_VNOM="1.5"; CH12_NET="PVDD1V5_1"
@@ -34,19 +34,19 @@ CHIP_POST_CMD=(
# ============================================================ # ============================================================
# chip1: SWB1 (CONN15) # chip1: SWB1 (CONN15)
# ============================================================ # ============================================================
CH0_VNOM="1.5"; CH0_NET="P1V5_AVDD_55" CH0_VNOM="1.524"; CH0_NET="P1V5_AVDD_55"
CH1_VNOM="0.9"; CH1_NET="P0V9_AVDD_55" CH1_VNOM="0.915"; CH1_NET="P0V9_AVDD_55"
CH2_VNOM="0.75"; CH2_NET="P0V75_DVDD_63" CH2_VNOM="0.75"; CH2_NET="P0V75_DVDD_63"
CH3_VNOM="0.75"; CH3_NET="P0V75_AVDD_63" CH3_VNOM="0.756"; CH3_NET="P0V75_AVDD_63"
CH4_VNOM="1.5"; CH4_NET="P1V5_AVDD_63" CH4_VNOM="1.524"; CH4_NET="P1V5_AVDD_63"
CH5_VNOM="0.9"; CH5_NET="P0V9_AVDD_63" CH5_VNOM="0.915"; CH5_NET="P0V9_AVDD_63"
CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_B3" CH6_VNOM="3.38"; CH6_NET="PVDD3_3V_SYNTH_LDO_B3"
CH7_VNOM="1.5"; CH7_NET="PVDD1V5_3" CH7_VNOM="1.5"; CH7_NET="PVDD1V5_3"
CH8_VNOM="0.85"; CH8_NET="P0V85_STBY" CH8_VNOM="0.85"; CH8_NET="P0V85_STBY"
CH9_VNOM="1.8"; CH9_NET="P1V8_STBY" CH9_VNOM="1.8"; CH9_NET="P1V8_STBY"
CH10_VNOM="-"; CH10_NET="NC" CH10_VNOM="-"; CH10_NET="NC"
CH11_VNOM="3.3"; CH11_NET="P3V3_STBY" CH11_VNOM="3.3"; CH11_NET="P3V3_STBY"
CH12_VNOM="0.9"; CH12_NET="PVDD0V9_2" CH12_VNOM="0.91"; CH12_NET="PVDD0V9_2"
CH13_VNOM="0.75"; CH13_NET="P0V75_DVDD_55" CH13_VNOM="0.75"; CH13_NET="P0V75_DVDD_55"
CH14_VNOM="0.75"; CH14_NET="P0V75_AVDD_55" CH14_VNOM="0.756"; CH14_NET="P0V75_AVDD_55"
CH15_VNOM="1.8"; CH15_NET="P1V8_DVDDIO_4" CH15_VNOM="1.8"; CH15_NET="P1V8_DVDDIO_4"
@@ -35,18 +35,18 @@ CHIP_POST_CMD=(
# chip1: SWB1 (CONN16) # chip1: SWB1 (CONN16)
# ============================================================ # ============================================================
CH0_VNOM="1.5"; CH0_NET="PVDD1V5_0" CH0_VNOM="1.5"; CH0_NET="PVDD1V5_0"
CH1_VNOM="1.8"; CH1_NET="P1V8_4" CH1_VNOM="1.816"; CH1_NET="P1V8_4"
CH2_VNOM="3.3"; CH2_NET="PVDD3_3V_SYNTH_LDO_B5" CH2_VNOM="3.38"; CH2_NET="PVDD3_3V_SYNTH_LDO_B5"
CH3_VNOM="3.3"; CH3_NET="PVDD3_3V_SYNTH_LDO_A5" CH3_VNOM="3.38"; CH3_NET="PVDD3_3V_SYNTH_LDO_A5"
CH4_VNOM="3.3"; CH4_NET="PVDD3_3V_SYNTH_LDO_B4" CH4_VNOM="3.38"; CH4_NET="PVDD3_3V_SYNTH_LDO_B4"
CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_A4" CH5_VNOM="3.38"; CH5_NET="PVDD3_3V_SYNTH_LDO_A4"
CH6_VNOM="3.3"; CH6_NET="P3V3" CH6_VNOM="3.327"; CH6_NET="P3V3"
CH7_VNOM="0.8"; CH7_NET="PVDD0_8V_T3" CH7_VNOM="0.82"; CH7_NET="PVDD0_8V_T3"
CH8_VNOM="0.75"; CH8_NET="P0V75_DVDD_1" CH8_VNOM="0.75"; CH8_NET="P0V75_DVDD_1"
CH9_VNOM="0.75"; CH9_NET="P0V75_AVDD_1" CH9_VNOM="0.756"; CH9_NET="P0V75_AVDD_1"
CH10_VNOM="1.5"; CH10_NET="P1V5_AVDD_1" CH10_VNOM="1.524"; CH10_NET="P1V5_AVDD_1"
CH11_VNOM="0.9"; CH11_NET="P0V9_AVDD_1" CH11_VNOM="0.915"; CH11_NET="P0V9_AVDD_1"
CH12_VNOM="0.9"; CH12_NET="PVDD0V9_0" CH12_VNOM="0.915"; CH12_NET="PVDD0V9_0"
CH13_VNOM="0.9"; CH13_NET="PVDD0V9_1" CH13_VNOM="0.91"; CH13_NET="PVDD0V9_1"
CH14_VNOM="0.9"; CH14_NET="PVDD0V9_3" CH14_VNOM="0.915"; CH14_NET="PVDD0V9_3"
CH15_VNOM="1.2"; CH15_NET="PVDD1V2_T3" CH15_VNOM="1.224"; CH15_NET="PVDD1V2_T3"
File diff suppressed because it is too large Load Diff
@@ -6,7 +6,7 @@
# V0.1.0 2026-08-17 First version. Bash port of the three Tera Term macros # V0.1.0 2026-08-17 First version. Bash port of the three Tera Term macros
# utils/traffic_loopback_vlan_setting.ttl (VLAN 30..137, # utils/traffic_loopback_vlan_setting.ttl (VLAN 30..137,
# port pair cdN <-> cdN+32), utils/traffic_loopback_start.ttl # port pair cdN <-> cdN+32), utils/traffic_loopback_start.ttl
# (tx 100 length=512 VLantag=<vid>) and # (tx <count> length=<len> VLantag=<vid>) and
# utils/traffic_loopback_vlan_remove.ttl. # utils/traffic_loopback_vlan_remove.ttl.
# One DUT = two switch boards -> bcmcmd unit 0 and 1 # One DUT = two switch boards -> bcmcmd unit 0 and 1
# (bcmcmd -n <unit>), default both. # (bcmcmd -n <unit>), default both.
@@ -90,6 +90,16 @@
# With only one unit selected the summary reports # With only one unit selected the summary reports
# UNDECIDED (exit 3) instead of guessing. # UNDECIDED (exit 3) instead of guessing.
# TL_CE_ENABLE=0 restores the old cd-pairs-only behaviour. # TL_CE_ENABLE=0 restores the old cd-pairs-only behaviour.
# V0.7.0 2026-09-01 Change: tx bursts carry PatternRandom=yes and the defaults
# become tx 200 length=324 (were 100 / 512).
# Random payload keeps the bit pattern changing instead of
# repeating, which is what makes a marginal lane show up;
# a fixed pattern can sit on a benign sequence all run.
# TL_TX_RANDOM=no forces the fixed pattern, "" leaves the
# argument off entirely (pre-V0.7.0 wire format).
# NOTE: counters scale with count x length, so totals from
# before this build are not comparable - 200x324 moves
# about 27% more bytes per burst than 100x512.
# V0.6.0 2026-08-28 Add: ce0 traffic is now SUSTAINED, not a single burst. # V0.6.0 2026-08-28 Add: ce0 traffic is now SUSTAINED, not a single burst.
# A cd pair keeps its packets circulating because they # A cd pair keeps its packets circulating because they
# flood to the partner port; ce0 has no partner and a # flood to the partner port; ce0 has no partner and a
@@ -142,6 +152,8 @@
# aliases: -tx | --tx # aliases: -tx | --tx
# -l|--length <n> tx packet length (default $TL_TX_LENGTH) # -l|--length <n> tx packet length (default $TL_TX_LENGTH)
# aliases: -length | --len # aliases: -length | --len
# -r|--random <yes|no> tx PatternRandom (default $TL_TX_RANDOM;
# empty string omits the argument)
# -p|--ports <list|all> ps: port list ('all' = plain 'ps', every port) # -p|--ports <list|all> ps: port list ('all' = plain 'ps', every port)
# -T|--tolerance <n> report: allowed |delta| in packets (default 0; # -T|--tolerance <n> report: allowed |delta| in packets (default 0;
# -T 1 absorbs the normal snapshot skew) # -T 1 absorbs the normal snapshot skew)
@@ -161,7 +173,8 @@
# -h|--help help # -h|--help help
# #
# Environment overrides: # Environment overrides:
# BCMCMD_CMD=bcmcmd TL_UNITS="0 1" TL_TX_COUNT=100 TL_TX_LENGTH=512 # BCMCMD_CMD=bcmcmd TL_UNITS="0 1" TL_TX_COUNT=200 TL_TX_LENGTH=324
# TL_TX_RANDOM=yes
# TL_PS_PORTS="1-24,40-96,..." TL_TOLERANCE=0 TL_LOG_DIR=/tmp # TL_PS_PORTS="1-24,40-96,..." TL_TOLERANCE=0 TL_LOG_DIR=/tmp
# DEBUG_MODE=1 # DEBUG_MODE=1
# #
@@ -173,8 +186,14 @@
# === Config ================================================================== # === Config ==================================================================
BCMCMD_CMD="${BCMCMD_CMD:-bcmcmd}" BCMCMD_CMD="${BCMCMD_CMD:-bcmcmd}"
TL_UNITS="${TL_UNITS:-0 1}" # one DUT = two switch boards (0 and 1) TL_UNITS="${TL_UNITS:-0 1}" # one DUT = two switch boards (0 and 1)
TL_TX_COUNT="${TL_TX_COUNT:-100}" TL_TX_COUNT="${TL_TX_COUNT:-200}"
TL_TX_LENGTH="${TL_TX_LENGTH:-512}" TL_TX_LENGTH="${TL_TX_LENGTH:-324}"
# PatternRandom=yes|no is appended to every tx burst. Random payload exercises
# the SerDes with changing bit patterns instead of the repeating one a fixed
# pattern produces, which is what makes a marginal lane show up.
# Set to "" to leave the argument off entirely (pre-V0.7.0 behaviour).
TL_TX_RANDOM="${TL_TX_RANDOM:-yes}"
TL_DEFAULT_VLAN="${TL_DEFAULT_VLAN:-1}" TL_DEFAULT_VLAN="${TL_DEFAULT_VLAN:-1}"
TL_DEFAULT_VLAN_PBM="${TL_DEFAULT_VLAN_PBM:-cd}" TL_DEFAULT_VLAN_PBM="${TL_DEFAULT_VLAN_PBM:-cd}"
@@ -515,17 +534,23 @@ traffic_linespeed_start() {
_tl_units_check || return 1 _tl_units_check || return 1
_tl_is_uint "$TL_TX_COUNT" || { _tl_err "tx count '$TL_TX_COUNT' is not a positive integer (-tx|-c <n>)"; return 1; } _tl_is_uint "$TL_TX_COUNT" || { _tl_err "tx count '$TL_TX_COUNT' is not a positive integer (-tx|-c <n>)"; return 1; }
_tl_is_uint "$TL_TX_LENGTH" || { _tl_err "tx length '$TL_TX_LENGTH' is not a positive integer (-length|-l <n>)"; return 1; } _tl_is_uint "$TL_TX_LENGTH" || { _tl_err "tx length '$TL_TX_LENGTH' is not a positive integer (-length|-l <n>)"; return 1; }
local rnd=""
case "$TL_TX_RANDOM" in
yes|no) rnd=" PatternRandom=$TL_TX_RANDOM" ;;
"") rnd="" ;;
*) _tl_err "PatternRandom '$TL_TX_RANDOM' must be yes, no or empty (-r|--random)"; return 1 ;;
esac
local unit vid pa pb n fail local unit vid pa pb n fail
for unit in $TL_UNITS; do for unit in $TL_UNITS; do
n=0; fail=0 n=0; fail=0
_tl_info "unit $unit: tx $TL_TX_COUNT length=$TL_TX_LENGTH per VLAN 30..137" _tl_info "unit $unit: tx $TL_TX_COUNT length=$TL_TX_LENGTH${rnd} per VLAN 30..137"
while read -r vid pa pb <&3; do while read -r vid pa pb <&3; do
[ -z "$vid" ] && continue [ -z "$vid" ] && continue
_tl_bcm_q "$unit" "tx $TL_TX_COUNT length=$TL_TX_LENGTH VLantag=$vid" || fail=$((fail+1)) _tl_bcm_q "$unit" "tx $TL_TX_COUNT length=$TL_TX_LENGTH VLantag=$vid${rnd}" || fail=$((fail+1))
n=$((n+1)) n=$((n+1))
done 3<<< "$TL_PAIRS" done 3<<< "$TL_PAIRS"
if [ "$TL_CE_ENABLE" = "1" ]; then if [ "$TL_CE_ENABLE" = "1" ]; then
_tl_bcm_q "$unit" "tx $TL_TX_COUNT length=$TL_TX_LENGTH VLantag=$TL_CE_VLAN" || fail=$((fail+1)) _tl_bcm_q "$unit" "tx $TL_TX_COUNT length=$TL_TX_LENGTH VLantag=$TL_CE_VLAN${rnd}" || fail=$((fail+1))
n=$((n+1)) n=$((n+1))
fi fi
if [ "$fail" -eq 0 ]; then if [ "$fail" -eq 0 ]; then
@@ -949,7 +974,7 @@ traffic_linespeed_run() {
blanton_traffic_linespeed_help() { blanton_traffic_linespeed_help() {
echo -e "\033[1mblanton_traffic_linespeed.sh - SWB loopback line-speed traffic (bcmcmd)\033[0m" echo -e "\033[1mblanton_traffic_linespeed.sh - SWB loopback line-speed traffic (bcmcmd)\033[0m"
echo "" echo ""
echo -e " Units: \033[36m$TL_UNITS\033[0m tx: \033[36m$TL_TX_COUNT pkt x ${TL_TX_LENGTH}B\033[0m" echo -e " Units: \033[36m$TL_UNITS\033[0m tx: \033[36m$TL_TX_COUNT pkt x ${TL_TX_LENGTH}B\033[0m PatternRandom: \033[36m${TL_TX_RANDOM:-(不加)}\033[0m"
echo -e " VLANs: 30..137 ($(_tl_pair_count) loopback pairs, cdN <-> cdN+32)" echo -e " VLANs: 30..137 ($(_tl_pair_count) loopback pairs, cdN <-> cdN+32)"
[ "$TL_CE_ENABLE" = "1" ] && \ [ "$TL_CE_ENABLE" = "1" ] && \
echo -e " 100G : VLAN \033[36m$TL_CE_VLAN\033[0m port \033[36m$TL_CE_PORT\033[0m mode=\033[36m$TL_CE_MODE\033[0m (cross = unit0.$TL_CE_PORT <-> unit1.$TL_CE_PORT cabled)" echo -e " 100G : VLAN \033[36m$TL_CE_VLAN\033[0m port \033[36m$TL_CE_PORT\033[0m mode=\033[36m$TL_CE_MODE\033[0m (cross = unit0.$TL_CE_PORT <-> unit1.$TL_CE_PORT cabled)"
@@ -958,7 +983,7 @@ blanton_traffic_linespeed_help() {
echo -e " \033[33minit\033[0m step 1 vlan remove 1 pbm=cd, vlan create/add each pair" echo -e " \033[33minit\033[0m step 1 vlan remove 1 pbm=cd, vlan create/add each pair"
echo -e " \033[33mclear\033[0m step 2 clear c" echo -e " \033[33mclear\033[0m step 2 clear c"
echo -e " \033[33mshow\033[0m step 3/6 show c (run before and after traffic)" echo -e " \033[33mshow\033[0m step 3/6 show c (run before and after traffic)"
echo -e " \033[33mstart\033[0m step 4 tx <count> length=<len> VLantag=<vid> per VLAN" echo -e " \033[33mstart\033[0m step 4 tx <count> length=<len> VLantag=<vid> [PatternRandom=<yes|no>] per VLAN"
echo -e " \033[33mstop\033[0m step 5 vlan remove <vid> pbm=<pair> [--destroy also destroys]" echo -e " \033[33mstop\033[0m step 5 vlan remove <vid> pbm=<pair> [--destroy also destroys]"
[ "$TL_CE_ENABLE" = "1" ] && [ "$TL_CE_MIRROR" = "1" ] && \ [ "$TL_CE_ENABLE" = "1" ] && [ "$TL_CE_MIRROR" = "1" ] && \
echo -e " \033[33m^ also turns the $TL_CE_PORT mirror off -- without it the 100G loop keeps running\033[0m" echo -e " \033[33m^ also turns the $TL_CE_PORT mirror off -- without it the 100G loop keeps running\033[0m"
@@ -972,6 +997,7 @@ blanton_traffic_linespeed_help() {
echo -e " \033[33m-u|--unit\033[0m <0|1|all> bcmcmd unit(s); 'all' = 0 1 (default: $TL_UNITS)" echo -e " \033[33m-u|--unit\033[0m <0|1|all> bcmcmd unit(s); 'all' = 0 1 (default: $TL_UNITS)"
echo -e " \033[33m-c|--count|-tx\033[0m <n> tx packet count (default $TL_TX_COUNT)" echo -e " \033[33m-c|--count|-tx\033[0m <n> tx packet count (default $TL_TX_COUNT)"
echo -e " \033[33m-l|--length|-length\033[0m <n> tx packet length (default $TL_TX_LENGTH)" echo -e " \033[33m-l|--length|-length\033[0m <n> tx packet length (default $TL_TX_LENGTH)"
echo -e " \033[33m-r|--random\033[0m <yes|no> tx PatternRandom (default $TL_TX_RANDOM; \"\" 完全不加)"
echo -e " \033[33m-p|--ports\033[0m <list> ps port list, or 'all' for every port" echo -e " \033[33m-p|--ports\033[0m <list> ps port list, or 'all' for every port"
echo -e " \033[33m-T|--tolerance\033[0m <n> report: allowed |delta| pkts (default $TL_TOLERANCE; -T 1 = snapshot skew)" echo -e " \033[33m-T|--tolerance\033[0m <n> report: allowed |delta| pkts (default $TL_TOLERANCE; -T 1 = snapshot skew)"
echo -e " \033[33m-a|--all\033[0m report: kept for compatibility (all pairs are listed)" echo -e " \033[33m-a|--all\033[0m report: kept for compatibility (all pairs are listed)"
@@ -995,7 +1021,8 @@ blanton_traffic_linespeed_help() {
echo -e " blanton_traffic_linespeed report -u 1 -q | grep -v PASS" echo -e " blanton_traffic_linespeed report -u 1 -q | grep -v PASS"
echo -e " blanton_traffic_linespeed report -f /tmp/showc_unit1_*.log -a" echo -e " blanton_traffic_linespeed report -f /tmp/showc_unit1_*.log -a"
echo -e " blanton_traffic_linespeed show -u 1 | grep -iE 'error|discard|drop'" echo -e " blanton_traffic_linespeed show -u 1 | grep -iE 'error|discard|drop'"
echo -e " blanton_traffic_linespeed start -u 0 -tx 100 -length 512" echo -e " blanton_traffic_linespeed start -u 0 -tx 200 -length 324"
echo -e " blanton_traffic_linespeed start -r no # 固定樣式,不隨機"
echo -e " blanton_traffic_linespeed start -tx 100000 -length 9216 -d" echo -e " blanton_traffic_linespeed start -tx 100000 -length 9216 -d"
echo -e " blanton_traffic_linespeed stop --destroy" echo -e " blanton_traffic_linespeed stop --destroy"
echo "" echo ""
@@ -1019,6 +1046,7 @@ blanton_traffic_linespeed() {
shift 2 ;; shift 2 ;;
-c|--count|-tx|--tx) TL_TX_COUNT="$2"; shift 2 ;; -c|--count|-tx|--tx) TL_TX_COUNT="$2"; shift 2 ;;
-l|-length|--length|--len) TL_TX_LENGTH="$2"; shift 2 ;; -l|-length|--length|--len) TL_TX_LENGTH="$2"; shift 2 ;;
-r|--random|-PatternRandom|--pattern-random) TL_TX_RANDOM="$2"; shift 2 ;;
-p|--ports) TL_PS_PORTS="$2"; shift 2 ;; -p|--ports) TL_PS_PORTS="$2"; shift 2 ;;
-T|--tolerance) TL_TOLERANCE="$2"; shift 2 ;; -T|--tolerance) TL_TOLERANCE="$2"; shift 2 ;;
-f|--file) TL_REPORT_FILE="$2"; shift 2 ;; -f|--file) TL_REPORT_FILE="$2"; shift 2 ;;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,314 @@
#!/usr/bin/env bash
# =============================================================================
# nfc_polling.sh -- keep reading the NFC tag in the background, and tally it
# =============================================================================
# Version History:
# V1.0.0 2026-08-28 First version. start/stop/status/tail/report/clear/fg,
# wraps blantons_nfc_validate.py. 'report' works while the
# poll is still running.
# =============================================================================
#
# Each round runs blantons_nfc_validate.py once and appends a machine-readable
# verdict line, so 'report' never has to parse the tool's prose:
#
# [2026-08-28 15:04:11] NFC poll #000001 START
# ... the tool's own output ...
# [2026-08-28 15:04:14] NFC poll #000001 RESULT=PASS tag=046F7BD2142290
#
# The verdict comes from the tool's own [PASS] / [FAIL] summary line. If neither
# appears the round is ERROR, not FAIL -- "the tool did not run" and "the tag was
# not read" are different problems and get counted separately.
#
# Usage:
# ./nfc_polling.sh start # background, CLEARS the log first
# ./nfc_polling.sh status # running? pid, rounds so far, log size
# ./nfc_polling.sh tail [n] # last n lines (default 50) -- does NOT follow
# ./nfc_polling.sh report # PASS/FAIL tally; safe to run WHILE polling
# ./nfc_polling.sh stop
# ./nfc_polling.sh clear # delete the log (must be stopped)
# ./nfc_polling.sh fg # run in the foreground, Ctrl-C to stop
#
# Environment overrides:
# NFC_INTERVAL_SEC=10 NFC_TIMEOUT_SEC=60 NFC_MAX_ROUNDS=0 (0 = forever)
# NFC_ARGS="test --debug" NFC_LOG_DIR=<dir> NFC_BIN=<python3>
# =============================================================================
# --- User Configurable Section ----------------------------------------------
NFC_INTERVAL_SEC="${NFC_INTERVAL_SEC:-10}" # gap between rounds
NFC_TIMEOUT_SEC="${NFC_TIMEOUT_SEC:-60}" # kill a round that hangs (0 = never)
NFC_MAX_ROUNDS="${NFC_MAX_ROUNDS:-0}" # 0 = until 'stop'
# Called through python3 on purpose: blantons_nfc_validate.py arrives from git
# (mode 100644) and a Windows/USB copy does not carry the execute bit either, so
# "./blantons_nfc_validate.py" would fail with Permission denied on a fresh DUT.
NFC_PY="${NFC_PY:-python3}"
NFC_SCRIPT_NAME="${NFC_SCRIPT_NAME:-blantons_nfc_validate.py}"
# --debug is kept because that is the output that has been seen on the bench.
# It costs ~1.5 KB per round (~13 MB/day at a 10s interval), which is fine for a
# soak; drop it to "test" if you want a smaller log.
NFC_ARGS="${NFC_ARGS:-test --debug}"
NFC_LOG_DIR="${NFC_LOG_DIR:-}" # empty = <script dir>/log
NFC_LOG_NAME="${NFC_LOG_NAME:-nfc_poll.log}"
# -----------------------------------------------------------------------------
SCRIPT_NAME="$(basename -- "${BASH_SOURCE[0]}")"
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT_PATH="${SCRIPT_DIR}/${SCRIPT_NAME}"
NFC_SCRIPT="${NFC_SCRIPT:-${SCRIPT_DIR}/${NFC_SCRIPT_NAME}}"
[ -n "${NFC_LOG_DIR}" ] || NFC_LOG_DIR="${SCRIPT_DIR}/log"
LOG_FILE="${NFC_LOG_DIR}/${NFC_LOG_NAME}"
PID_FILE="${NFC_LOG_DIR}/${NFC_LOG_NAME%.log}.pid"
STOP=0
SLEEP_PID=""
ts() { date '+%Y-%m-%d %H:%M:%S'; }
die() { printf '[ERROR] %s\n' "$*" >&2; exit 1; }
on_signal() {
STOP=1
[ -n "${SLEEP_PID}" ] && kill "${SLEEP_PID}" 2>/dev/null
return 0
}
# sleep that a signal can cut short, so 'stop' does not wait out the interval
interruptible_sleep() {
local sec="$1"
[ "${sec}" -le 0 ] 2>/dev/null && return 0
sleep "${sec}" &
SLEEP_PID=$!
wait "${SLEEP_PID}" 2>/dev/null
SLEEP_PID=""
return 0
}
is_running() {
local pid
[ -f "${PID_FILE}" ] || return 1
pid="$(cat "${PID_FILE}" 2>/dev/null)"
[ -n "${pid}" ] || return 1
kill -0 "${pid}" 2>/dev/null || return 1
printf '%s' "${pid}"
return 0
}
# --- one round ---------------------------------------------------------------
# Appends START, the tool output, then a RESULT line. Everything about a round
# lands in the log even when the tool dies, so 'report' can still account for it.
run_one_round() {
local n="$1" out rc verdict tag reason
printf '[%s] NFC poll #%06d START\n' "$(ts)" "${n}"
if [ -n "${NFC_TIMEOUT_SEC}" ] && [ "${NFC_TIMEOUT_SEC}" -gt 0 ] 2>/dev/null \
&& command -v timeout >/dev/null 2>&1; then
out="$(timeout "${NFC_TIMEOUT_SEC}" "${NFC_PY}" "${NFC_SCRIPT}" ${NFC_ARGS} 2>&1)"; rc=$?
else
out="$("${NFC_PY}" "${NFC_SCRIPT}" ${NFC_ARGS} 2>&1)"; rc=$?
fi
printf '%s\n' "${out}"
# The tool's own summary decides. Exit status is only the fallback, because
# a tool that never printed a summary did not measure anything.
if printf '%s\n' "${out}" | grep -q '^\[PASS\]'; then
verdict="PASS"
elif printf '%s\n' "${out}" | grep -q '^\[FAIL\]'; then
verdict="FAIL"
elif [ "${rc}" -eq 124 ]; then
verdict="ERROR"; reason="round exceeded NFC_TIMEOUT_SEC=${NFC_TIMEOUT_SEC}s"
else
verdict="ERROR"; reason="no [PASS]/[FAIL] summary, exit=${rc}"
fi
tag="$(printf '%s\n' "${out}" | sed -n 's/.*NFCID1=\([0-9A-Fa-f]*\).*/\1/p' | tail -1)"
[ -n "${reason}" ] || reason="$(printf '%s\n' "${out}" | grep -m1 '^\[\(PASS\|FAIL\)\]' | cut -c8-)"
printf '[%s] NFC poll #%06d RESULT=%s tag=%s reason=%s\n' \
"$(ts)" "${n}" "${verdict}" "${tag:--}" "${reason:--}"
}
main_loop() {
local n=0
trap on_signal INT TERM
printf '[%s] ===== nfc_polling start : %s %s (interval %ss) =====\n' \
"$(ts)" "${NFC_PY}" "${NFC_SCRIPT}" "${NFC_INTERVAL_SEC}"
while [ "${STOP}" -eq 0 ]; do
n=$(( n + 1 ))
run_one_round "${n}"
if [ "${NFC_MAX_ROUNDS}" -gt 0 ] 2>/dev/null && [ "${n}" -ge "${NFC_MAX_ROUNDS}" ]; then
break
fi
[ "${STOP}" -eq 0 ] && interruptible_sleep "${NFC_INTERVAL_SEC}"
done
printf '[%s] ===== nfc_polling stop : %d round(s) =====\n' "$(ts)" "${n}"
}
# --- sub-commands ------------------------------------------------------------
do_start() {
local pid
pid="$(is_running)" && die "already running (pid=${pid})"
[ -r "${NFC_SCRIPT}" ] || die "cannot read ${NFC_SCRIPT}"
command -v "${NFC_PY}" >/dev/null 2>&1 || die "${NFC_PY} not found"
mkdir -p "${NFC_LOG_DIR}" || die "cannot create ${NFC_LOG_DIR}"
# start always begins a fresh log, so a report is about THIS run only
: > "${LOG_FILE}" || die "cannot write ${LOG_FILE}"
if command -v setsid >/dev/null 2>&1; then
setsid "${SCRIPT_PATH}" __daemon >/dev/null 2>&1 &
else
nohup "${SCRIPT_PATH}" __daemon >/dev/null 2>&1 &
disown 2>/dev/null
fi
sleep 1
pid="$(is_running)" || die "start failed, check ${LOG_FILE}"
printf 'started (pid=%s)\nlog: %s\n' "${pid}" "${LOG_FILE}"
}
do_daemon() {
mkdir -p "${NFC_LOG_DIR}" || die "cannot create ${NFC_LOG_DIR}"
exec >>"${LOG_FILE}" 2>&1
printf '%d\n' "$$" > "${PID_FILE}"
trap 'rm -f "${PID_FILE}"' EXIT
main_loop
}
do_stop() {
local pid i
pid="$(is_running)" || { printf 'not running\n'; rm -f "${PID_FILE}"; return 0; }
kill -TERM -"${pid}" 2>/dev/null || kill -TERM "${pid}" 2>/dev/null
for (( i = 0; i < 20; i++ )); do
kill -0 "${pid}" 2>/dev/null || break
sleep 0.5
done
if kill -0 "${pid}" 2>/dev/null; then
printf 'SIGTERM ignored, sending SIGKILL\n'
kill -KILL -"${pid}" 2>/dev/null || kill -KILL "${pid}" 2>/dev/null
fi
rm -f "${PID_FILE}"
printf 'stopped (pid=%s)\n' "${pid}"
}
# counts straight out of the log, so it is the same answer running or stopped
_tally() {
local f="$1"
[ -r "${f}" ] || { printf '0 0 0 0\n'; return; }
awk '
/RESULT=PASS/ { p++ }
/RESULT=FAIL/ { f++ }
/RESULT=ERROR/ { e++ }
/ START$/ { s++ }
END { printf "%d %d %d %d\n", s+0, p+0, f+0, e+0 }
' "${f}"
}
do_status() {
local pid started passed failed errored size
if pid="$(is_running)"; then
printf 'status : running (pid=%s)\n' "${pid}"
else
printf 'status : stopped\n'
fi
printf 'log : %s\n' "${LOG_FILE}"
if [ -r "${LOG_FILE}" ]; then
size="$(du -h "${LOG_FILE}" 2>/dev/null | cut -f1)"
read -r started passed failed errored <<< "$(_tally "${LOG_FILE}")"
printf 'size : %s\n' "${size:-?}"
printf 'rounds : %s started (PASS %s / FAIL %s / ERROR %s)\n' \
"${started}" "${passed}" "${failed}" "${errored}"
printf 'last : %s\n' "$(grep -a 'RESULT=' "${LOG_FILE}" | tail -1)"
else
printf 'size : (no log yet)\n'
fi
}
do_report() {
local pid started passed failed errored inflight verdict first last
[ -r "${LOG_FILE}" ] || die "no log at ${LOG_FILE} -- has it been started?"
read -r started passed failed errored <<< "$(_tally "${LOG_FILE}")"
inflight=$(( started - passed - failed - errored ))
echo "===== NFC polling report ====="
printf 'log : %s\n' "${LOG_FILE}"
if pid="$(is_running)"; then
printf 'state : RUNNING (pid=%s) -- this is a snapshot, the count is still moving\n' "${pid}"
else
printf 'state : stopped\n'
fi
first="$(grep -a -m1 ' START$' "${LOG_FILE}" | sed -n 's/^\[\([^]]*\)\].*/\1/p')"
last="$(grep -a 'RESULT=' "${LOG_FILE}" | tail -1 | sed -n 's/^\[\([^]]*\)\].*/\1/p')"
printf 'window : %s -> %s\n' "${first:-?}" "${last:-?}"
echo ""
printf 'rounds : %d\n' "${started}"
printf 'PASS : %d\n' "${passed}"
printf 'FAIL : %d\n' "${failed}"
printf 'ERROR : %d (tool did not produce a verdict)\n' "${errored}"
[ "${inflight}" -gt 0 ] && printf 'in flight: %d (round started, no result yet)\n' "${inflight}"
if [ "${started}" -eq 0 ]; then
verdict="NO DATA"
elif [ "${failed}" -gt 0 ] || [ "${errored}" -gt 0 ]; then
verdict="FAIL"
else
verdict="PASS"
fi
printf 'RESULT : %s\n' "${verdict}"
echo ""
echo "--- tags seen ---"
grep -a 'RESULT=PASS' "${LOG_FILE}" \
| sed -n 's/.* tag=\([0-9A-Fa-f]*\) .*/\1/p' \
| sort | uniq -c | sort -rn | awk '{printf " %-20s %s\n", $2, $1}'
grep -aq 'RESULT=PASS.* tag=[0-9A-Fa-f]' "${LOG_FILE}" || echo " (none)"
if [ "$(( failed + errored ))" -gt 0 ]; then
echo ""
echo "--- last 10 FAIL / ERROR ---"
grep -aE 'RESULT=(FAIL|ERROR)' "${LOG_FILE}" | tail -10 | sed 's/^/ /'
fi
echo ""
[ "${verdict}" = "FAIL" ] && return 2
return 0
}
usage() {
cat <<USAGE
${SCRIPT_NAME} - background NFC tag polling (wraps ${NFC_SCRIPT_NAME})
start run in the background; CLEARS the log first
stop stop it
status running? pid, rounds so far, last result
tail [n] last n lines of the log (default 50) -- does NOT follow
report PASS/FAIL tally -- safe to run WHILE polling
clear delete the log (must be stopped)
fg run in the foreground, Ctrl-C to stop
interval ${NFC_INTERVAL_SEC}s per-round timeout ${NFC_TIMEOUT_SEC}s rounds ${NFC_MAX_ROUNDS} (0 = forever)
log ${LOG_FILE}
A round is PASS or FAIL from the tool's own summary line; ERROR means it
produced neither, which is a different problem from a tag that would not read.
USAGE
}
case "${1:-}" in
start) do_start ;;
stop) do_stop ;;
status) do_status ;;
report) do_report ;;
# deliberately NOT 'tail -f': that never returns, and a TTL macro waiting on
# the prompt would hang there forever.
tail) [ -r "${LOG_FILE}" ] || die "no log at ${LOG_FILE}"
tail -n "${2:-50}" "${LOG_FILE}" ;;
clear)
is_running >/dev/null && die "still running, stop it first"
rm -f "${LOG_FILE}"
printf 'log cleared\n'
;;
fg) main_loop ;;
__daemon) do_daemon ;;
-h|--help|"") usage ;;
*) printf '[ERROR] unknown sub-command: %s\n\n' "$1" >&2; usage; exit 1 ;;
esac
+40
View File
@@ -0,0 +1,40 @@
SWB0_0V9_ANLG0
SWB0_0V9_ANLG1
SWB0_0V75_ANLG0
SWB0_0V75_ANLG1
SWB0_PHYTILE_P0
SWB0_PHYTILE_P1
SWB0_PHYTILE_P2
SWB0_PHYTILE_P3
SWB0_PHYTILE_P4
SWB0_PHYTILE_P5
SWB0_PHYTILE_P6
SWB0_PHYTILE_P7
SWB0_PVDD1V5_CNDR0
SWB0_PVDD1V5_CNDR1
SWB0_PVDDA_PHYT0
SWB0_PVDDA_PHYT1
SWB0_PVDDA_PHYT2
SWB0_PVDDA_PHYT3
SWB0_TH6_CORE
SWB1_0V9_ANLG0
SWB1_0V9_ANLG1
SWB1_0V75_ANLG0
SWB1_0V75_ANLG1
SWB1_PHYTILE_P0
SWB1_PHYTILE_P1
SWB1_PHYTILE_P2
SWB1_PHYTILE_P3
SWB1_PHYTILE_P4
SWB1_PHYTILE_P5
SWB1_PHYTILE_P6
SWB1_PHYTILE_P7
SWB1_PVDD1V5_CNDR0
SWB1_PVDD1V5_CNDR1
SWB1_PVDDA_PHYT0
SWB1_PVDDA_PHYT1
SWB1_PVDDA_PHYT2
SWB1_PVDDA_PHYT3
SWB1_TH6_CORE
+48
View File
@@ -0,0 +1,48 @@
i2cset -f -y 13 0x25 0x00 0
i2cset -f -y 13 0x25 0x15
i2cset -f -y 15 0x26 0x00 0
i2cset -f -y 15 0x26 0x15
i2cset -f -y 13 0x25 0x00 0
i2cset -f -y 13 0x25 0x15
i2cset -f -y 15 0x26 0x00 0
i2cset -f -y 15 0x26 0x15
i2cset -f -y 13 0x21 0x00 0
i2cset -f -y 13 0x21 0x15
i2cset -f -y 13 0x22 0x00 0
i2cset -f -y 13 0x22 0x15
i2cset -f -y 15 0x23 0x00 0
i2cset -f -y 15 0x23 0x15
i2cset -f -y 15 0x24 0x00 0
i2cset -f -y 15 0x24 0x15
i2cset -f -y 13 0x29 0x00 0
i2cset -f -y 13 0x29 0x15
i2cset -f -y 13 0x27 0x00 0
i2cset -f -y 13 0x27 0x15
i2cset -f -y 15 0x28 0x00 0
i2cset -f -y 15 0x28 0x15
i2cset -f -y 13 0x20 0x00 0
i2cset -f -y 13 0x20 0x17
i2cset -f -y 14 0x25 0x00 0
i2cset -f -y 14 0x25 0x15
i2cset -f -y 16 0x26 0x00 0
i2cset -f -y 16 0x26 0x15
i2cset -f -y 14 0x25 0x00 0
i2cset -f -y 14 0x25 0x15
i2cset -f -y 16 0x26 0x00 0
i2cset -f -y 16 0x26 0x15
i2cset -f -y 14 0x21 0x00 0
i2cset -f -y 14 0x21 0x15
i2cset -f -y 14 0x22 0x00 0
i2cset -f -y 14 0x22 0x15
i2cset -f -y 16 0x23 0x00 0
i2cset -f -y 16 0x23 0x15
i2cset -f -y 16 0x24 0x00 0
i2cset -f -y 16 0x24 0x15
i2cset -f -y 14 0x29 0x00 0
i2cset -f -y 14 0x29 0x15
i2cset -f -y 14 0x27 0x00 0
i2cset -f -y 14 0x27 0x15
i2cset -f -y 16 0x28 0x00 0
i2cset -f -y 16 0x28 0x15
i2cset -f -y 14 0x20 0x00 0
i2cset -f -y 14 0x20 0x17
+188
View File
@@ -0,0 +1,188 @@
//0.930V
i2cset -f -y 13 0x25 0x00 0
i2ctransfer -f -y 13 w3@0x25 0x21 0x89 0x00
i2cset -f -y 13 0x25 0x00 2
i2ctransfer -f -y 13 w3@0x25 0x0D 0x34 0x11
//0.930V
i2cset -f -y 15 0x26 0x00 0
i2ctransfer -f -y 15 w3@0x26 0x21 0x89 0x00
i2cset -f -y 15 0x26 0x00 2
i2ctransfer -f -y 15 w3@0x26 0x0D 0x34 0x11
//0.725V
i2cset -f -y 13 0x25 0x00 1
i2ctransfer -f -y 13 w3@0x25 0x21 0x60 0x00
i2cset -f -y 13 0x25 0x00 2
i2ctransfer -f -y 13 w3@0x25 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 15 0x26 0x00 1
i2ctransfer -f -y 15 w3@0x26 0x21 0x60 0x00
i2cset -f -y 15 0x26 0x00 2
i2ctransfer -f -y 15 w3@0x26 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 13 0x21 0x00 0
i2ctransfer -f -y 13 w3@0x21 0x21 0x60 0x00
i2cset -f -y 13 0x21 0x00 2
i2ctransfer -f -y 13 w3@0x21 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 13 0x21 0x00 1
i2ctransfer -f -y 13 w3@0x21 0x21 0x60 0x00
i2cset -f -y 13 0x21 0x00 2
i2ctransfer -f -y 13 w3@0x21 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 13 0x22 0x00 0
i2ctransfer -f -y 13 w3@0x22 0x21 0x60 0x00
i2cset -f -y 13 0x22 0x00 2
i2ctransfer -f -y 13 w3@0x22 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 13 0x22 0x00 1
i2ctransfer -f -y 13 w3@0x22 0x21 0x60 0x00
i2cset -f -y 13 0x22 0x00 2
i2ctransfer -f -y 13 w3@0x22 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 15 0x23 0x00 0
i2ctransfer -f -y 15 w3@0x23 0x21 0x60 0x00
i2cset -f -y 15 0x23 0x00 2
i2ctransfer -f -y 15 w3@0x23 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 15 0x23 0x00 1
i2ctransfer -f -y 15 w3@0x23 0x21 0x60 0x00
i2cset -f -y 15 0x23 0x00 2
i2ctransfer -f -y 15 w3@0x23 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 15 0x24 0x00 0
i2ctransfer -f -y 15 w3@0x24 0x21 0x60 0x00
i2cset -f -y 15 0x24 0x00 2
i2ctransfer -f -y 15 w3@0x24 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 15 0x24 0x00 1
i2ctransfer -f -y 15 w3@0x24 0x21 0x60 0x00
i2cset -f -y 15 0x24 0x00 2
i2ctransfer -f -y 15 w3@0x24 0x1D 0x0A 0x06
//1.545V
i2cset -f -y 13 0x29 0x00 0
i2ctransfer -f -y 13 w3@0x29 0x21 0x04 0x01
i2cset -f -y 13 0x29 0x00 2
i2ctransfer -f -y 13 w3@0x29 0x0D 0x91 0x20
//1.545V
i2cset -f -y 13 0x29 0x00 1
i2ctransfer -f -y 13 w3@0x29 0x21 0x04 0x01
i2cset -f -y 13 0x29 0x00 2
i2ctransfer -f -y 13 w3@0x29 0x1D 0x49 0x10
//0.745V
i2cset -f -y 13 0x27 0x00 0
i2ctransfer -f -y 13 w3@0x27 0x21 0x64 0x00
i2cset -f -y 13 0x27 0x00 2
i2ctransfer -f -y 13 w3@0x27 0x0D 0x94 0x0C
//0.745V
i2cset -f -y 13 0x27 0x00 1
i2ctransfer -f -y 13 w3@0x27 0x21 0x64 0x00
i2cset -f -y 13 0x27 0x00 2
i2ctransfer -f -y 13 w3@0x27 0x1D 0x4C 0x06
//0.745V
i2cset -f -y 15 0x28 0x00 0
i2ctransfer -f -y 15 w3@0x28 0x21 0x64 0x00
i2cset -f -y 15 0x28 0x00 2
i2ctransfer -f -y 15 w3@0x28 0x0D 0x94 0x0C
//0.745V
i2cset -f -y 15 0x28 0x00 1
i2ctransfer -f -y 15 w3@0x28 0x21 0x64 0x00
i2cset -f -y 15 0x28 0x00 2
i2ctransfer -f -y 15 w3@0x28 0x1D 0x4C 0x06
//0.885V
i2cset -f -y 13 0x20 0x00 0
i2ctransfer -f -y 13 w3@0x20 0x21 0x62 0x01
//0.930V
i2cset -f -y 14 0x25 0x00 0
i2ctransfer -f -y 14 w3@0x25 0x21 0x89 0x00
i2cset -f -y 14 0x25 0x00 2
i2ctransfer -f -y 14 w3@0x25 0x0D 0x34 0x11
//0.930V
i2cset -f -y 16 0x26 0x00 0
i2ctransfer -f -y 16 w3@0x26 0x21 0x89 0x00
i2cset -f -y 16 0x26 0x00 2
i2ctransfer -f -y 16 w3@0x26 0x0D 0x34 0x11
//0.725V
i2cset -f -y 14 0x25 0x00 1
i2ctransfer -f -y 14 w3@0x25 0x21 0x60 0x00
i2cset -f -y 14 0x25 0x00 2
i2ctransfer -f -y 14 w3@0x25 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 16 0x26 0x00 1
i2ctransfer -f -y 16 w3@0x26 0x21 0x60 0x00
i2cset -f -y 16 0x26 0x00 2
i2ctransfer -f -y 16 w3@0x26 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 14 0x21 0x00 0
i2ctransfer -f -y 14 w3@0x21 0x21 0x60 0x00
i2cset -f -y 14 0x21 0x00 2
i2ctransfer -f -y 14 w3@0x21 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 14 0x21 0x00 1
i2ctransfer -f -y 14 w3@0x21 0x21 0x60 0x00
i2cset -f -y 14 0x21 0x00 2
i2ctransfer -f -y 14 w3@0x21 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 14 0x22 0x00 0
i2ctransfer -f -y 14 w3@0x22 0x21 0x60 0x00
i2cset -f -y 14 0x22 0x00 2
i2ctransfer -f -y 14 w3@0x22 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 14 0x22 0x00 1
i2ctransfer -f -y 14 w3@0x22 0x21 0x60 0x00
i2cset -f -y 14 0x22 0x00 2
i2ctransfer -f -y 14 w3@0x22 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 16 0x23 0x00 0
i2ctransfer -f -y 16 w3@0x23 0x21 0x60 0x00
i2cset -f -y 16 0x23 0x00 2
i2ctransfer -f -y 16 w3@0x23 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 16 0x23 0x00 1
i2ctransfer -f -y 16 w3@0x23 0x21 0x60 0x00
i2cset -f -y 16 0x23 0x00 2
i2ctransfer -f -y 16 w3@0x23 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 16 0x24 0x00 0
i2ctransfer -f -y 16 w3@0x24 0x21 0x60 0x00
i2cset -f -y 16 0x24 0x00 2
i2ctransfer -f -y 16 w3@0x24 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 16 0x24 0x00 1
i2ctransfer -f -y 16 w3@0x24 0x21 0x60 0x00
i2cset -f -y 16 0x24 0x00 2
i2ctransfer -f -y 16 w3@0x24 0x1D 0x0A 0x06
//1.545V
i2cset -f -y 14 0x29 0x00 0
i2ctransfer -f -y 14 w3@0x29 0x21 0x04 0x01
i2cset -f -y 14 0x29 0x00 2
i2ctransfer -f -y 14 w3@0x29 0x0D 0x91 0x20
//1.545V
i2cset -f -y 14 0x29 0x00 1
i2ctransfer -f -y 14 w3@0x29 0x21 0x04 0x01
i2cset -f -y 14 0x29 0x00 2
i2ctransfer -f -y 14 w3@0x29 0x1D 0x49 0x10
//0.745V
i2cset -f -y 14 0x27 0x00 0
i2ctransfer -f -y 14 w3@0x27 0x21 0x64 0x00
i2cset -f -y 14 0x27 0x00 2
i2ctransfer -f -y 14 w3@0x27 0x0D 0x94 0x0C
//0.745V
i2cset -f -y 14 0x27 0x00 1
i2ctransfer -f -y 14 w3@0x27 0x21 0x64 0x00
i2cset -f -y 14 0x27 0x00 2
i2ctransfer -f -y 14 w3@0x27 0x1D 0x4C 0x06
//0.745V
i2cset -f -y 16 0x28 0x00 0
i2ctransfer -f -y 16 w3@0x28 0x21 0x64 0x00
i2cset -f -y 16 0x28 0x00 2
i2ctransfer -f -y 16 w3@0x28 0x0D 0x94 0x0C
//0.745V
i2cset -f -y 16 0x28 0x00 1
i2ctransfer -f -y 16 w3@0x28 0x21 0x64 0x00
i2cset -f -y 16 0x28 0x00 2
i2ctransfer -f -y 16 w3@0x28 0x1D 0x4C 0x06
//0.885V
i2cset -f -y 14 0x20 0x00 0
i2ctransfer -f -y 14 w3@0x20 0x21 0x62 0x01
+188
View File
@@ -0,0 +1,188 @@
//0.870V
i2cset -f -y 13 0x25 0x00 0
i2ctransfer -f -y 13 w3@0x25 0x21 0x7D 0x00
i2cset -f -y 13 0x25 0x00 2
i2ctransfer -f -y 13 w3@0x25 0x0D 0xB4 0x0F
//0.870V
i2cset -f -y 15 0x26 0x00 0
i2ctransfer -f -y 15 w3@0x26 0x21 0x7D 0x00
i2cset -f -y 15 0x26 0x00 2
i2ctransfer -f -y 15 w3@0x26 0x0D 0xB4 0x0F
//0.775V
i2cset -f -y 13 0x25 0x00 1
i2ctransfer -f -y 13 w3@0x25 0x21 0x6A 0x00
i2cset -f -y 13 0x25 0x00 2
i2ctransfer -f -y 13 w3@0x25 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 15 0x26 0x00 1
i2ctransfer -f -y 15 w3@0x26 0x21 0x6A 0x00
i2cset -f -y 15 0x26 0x00 2
i2ctransfer -f -y 15 w3@0x26 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 13 0x21 0x00 0
i2ctransfer -f -y 13 w3@0x21 0x21 0x6A 0x00
i2cset -f -y 13 0x21 0x00 2
i2ctransfer -f -y 13 w3@0x21 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 13 0x21 0x00 1
i2ctransfer -f -y 13 w3@0x21 0x21 0x6A 0x00
i2cset -f -y 13 0x21 0x00 2
i2ctransfer -f -y 13 w3@0x21 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 13 0x22 0x00 0
i2ctransfer -f -y 13 w3@0x22 0x21 0x6A 0x00
i2cset -f -y 13 0x22 0x00 2
i2ctransfer -f -y 13 w3@0x22 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 13 0x22 0x00 1
i2ctransfer -f -y 13 w3@0x22 0x21 0x6A 0x00
i2cset -f -y 13 0x22 0x00 2
i2ctransfer -f -y 13 w3@0x22 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 15 0x23 0x00 0
i2ctransfer -f -y 15 w3@0x23 0x21 0x6A 0x00
i2cset -f -y 15 0x23 0x00 2
i2ctransfer -f -y 15 w3@0x23 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 15 0x23 0x00 1
i2ctransfer -f -y 15 w3@0x23 0x21 0x6A 0x00
i2cset -f -y 15 0x23 0x00 2
i2ctransfer -f -y 15 w3@0x23 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 15 0x24 0x00 0
i2ctransfer -f -y 15 w3@0x24 0x21 0x6A 0x00
i2cset -f -y 15 0x24 0x00 2
i2ctransfer -f -y 15 w3@0x24 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 15 0x24 0x00 1
i2ctransfer -f -y 15 w3@0x24 0x21 0x6A 0x00
i2cset -f -y 15 0x24 0x00 2
i2ctransfer -f -y 15 w3@0x24 0x1D 0xAA 0x06
//1.455V
i2cset -f -y 13 0x29 0x00 0
i2ctransfer -f -y 13 w3@0x29 0x21 0xF2 0x00
i2cset -f -y 13 0x29 0x00 2
i2ctransfer -f -y 13 w3@0x29 0x0D 0x51 0x1E
//1.455V
i2cset -f -y 13 0x29 0x00 1
i2ctransfer -f -y 13 w3@0x29 0x21 0xF2 0x00
i2cset -f -y 13 0x29 0x00 2
i2ctransfer -f -y 13 w3@0x29 0x1D 0x29 0x0F
//0.695V
i2cset -f -y 13 0x27 0x00 0
i2ctransfer -f -y 13 w3@0x27 0x21 0x5A 0x00
i2cset -f -y 13 0x27 0x00 2
i2ctransfer -f -y 13 w3@0x27 0x0D 0x54 0x0B
//0.695V
i2cset -f -y 13 0x27 0x00 1
i2ctransfer -f -y 13 w3@0x27 0x21 0x5A 0x00
i2cset -f -y 13 0x27 0x00 2
i2ctransfer -f -y 13 w3@0x27 0x1D 0xAC 0x05
//0.695V
i2cset -f -y 15 0x28 0x00 0
i2ctransfer -f -y 15 w3@0x28 0x21 0x5A 0x00
i2cset -f -y 15 0x28 0x00 2
i2ctransfer -f -y 15 w3@0x28 0x0D 0x54 0x0B
//0.695V
i2cset -f -y 15 0x28 0x00 1
i2ctransfer -f -y 15 w3@0x28 0x21 0x5A 0x00
i2cset -f -y 15 0x28 0x00 2
i2ctransfer -f -y 15 w3@0x28 0x1D 0xAC 0x05
//0.753V
i2cset -f -y 13 0x20 0x00 0
i2ctransfer -f -y 13 w3@0x20 0x21 0x2D 0x01
//0.870V
i2cset -f -y 14 0x25 0x00 0
i2ctransfer -f -y 14 w3@0x25 0x21 0x7D 0x00
i2cset -f -y 14 0x25 0x00 2
i2ctransfer -f -y 14 w3@0x25 0x0D 0xB4 0x0F
//0.870V
i2cset -f -y 16 0x26 0x00 0
i2ctransfer -f -y 16 w3@0x26 0x21 0x7D 0x00
i2cset -f -y 16 0x26 0x00 2
i2ctransfer -f -y 16 w3@0x26 0x0D 0xB4 0x0F
//0.775V
i2cset -f -y 14 0x25 0x00 1
i2ctransfer -f -y 14 w3@0x25 0x21 0x6A 0x00
i2cset -f -y 14 0x25 0x00 2
i2ctransfer -f -y 14 w3@0x25 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 16 0x26 0x00 1
i2ctransfer -f -y 16 w3@0x26 0x21 0x6A 0x00
i2cset -f -y 16 0x26 0x00 2
i2ctransfer -f -y 16 w3@0x26 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 14 0x21 0x00 0
i2ctransfer -f -y 14 w3@0x21 0x21 0x6A 0x00
i2cset -f -y 14 0x21 0x00 2
i2ctransfer -f -y 14 w3@0x21 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 14 0x21 0x00 1
i2ctransfer -f -y 14 w3@0x21 0x21 0x6A 0x00
i2cset -f -y 14 0x21 0x00 2
i2ctransfer -f -y 14 w3@0x21 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 14 0x22 0x00 0
i2ctransfer -f -y 14 w3@0x22 0x21 0x6A 0x00
i2cset -f -y 14 0x22 0x00 2
i2ctransfer -f -y 14 w3@0x22 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 14 0x22 0x00 1
i2ctransfer -f -y 14 w3@0x22 0x21 0x6A 0x00
i2cset -f -y 14 0x22 0x00 2
i2ctransfer -f -y 14 w3@0x22 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 16 0x23 0x00 0
i2ctransfer -f -y 16 w3@0x23 0x21 0x6A 0x00
i2cset -f -y 16 0x23 0x00 2
i2ctransfer -f -y 16 w3@0x23 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 16 0x23 0x00 1
i2ctransfer -f -y 16 w3@0x23 0x21 0x6A 0x00
i2cset -f -y 16 0x23 0x00 2
i2ctransfer -f -y 16 w3@0x23 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 16 0x24 0x00 0
i2ctransfer -f -y 16 w3@0x24 0x21 0x6A 0x00
i2cset -f -y 16 0x24 0x00 2
i2ctransfer -f -y 16 w3@0x24 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 16 0x24 0x00 1
i2ctransfer -f -y 16 w3@0x24 0x21 0x6A 0x00
i2cset -f -y 16 0x24 0x00 2
i2ctransfer -f -y 16 w3@0x24 0x1D 0xAA 0x06
//1.455V
i2cset -f -y 14 0x29 0x00 0
i2ctransfer -f -y 14 w3@0x29 0x21 0xF2 0x00
i2cset -f -y 14 0x29 0x00 2
i2ctransfer -f -y 14 w3@0x29 0x0D 0x51 0x1E
//1.455V
i2cset -f -y 14 0x29 0x00 1
i2ctransfer -f -y 14 w3@0x29 0x21 0xF2 0x00
i2cset -f -y 14 0x29 0x00 2
i2ctransfer -f -y 14 w3@0x29 0x1D 0x29 0x0F
//0.695V
i2cset -f -y 14 0x27 0x00 0
i2ctransfer -f -y 14 w3@0x27 0x21 0x5A 0x00
i2cset -f -y 14 0x27 0x00 2
i2ctransfer -f -y 14 w3@0x27 0x0D 0x54 0x0B
//0.695V
i2cset -f -y 14 0x27 0x00 1
i2ctransfer -f -y 14 w3@0x27 0x21 0x5A 0x00
i2cset -f -y 14 0x27 0x00 2
i2ctransfer -f -y 14 w3@0x27 0x1D 0xAC 0x05
//0.695V
i2cset -f -y 16 0x28 0x00 0
i2ctransfer -f -y 16 w3@0x28 0x21 0x5A 0x00
i2cset -f -y 16 0x28 0x00 2
i2ctransfer -f -y 16 w3@0x28 0x0D 0x54 0x0B
//0.695V
i2cset -f -y 16 0x28 0x00 1
i2ctransfer -f -y 16 w3@0x28 0x21 0x5A 0x00
i2cset -f -y 16 0x28 0x00 2
i2ctransfer -f -y 16 w3@0x28 0x1D 0xAC 0x05
//0.753V
i2cset -f -y 14 0x20 0x00 0
i2ctransfer -f -y 14 w3@0x20 0x21 0x2D 0x01
+188
View File
@@ -0,0 +1,188 @@
//0.930V
i2cset -f -y 13 0x25 0x00 0
i2ctransfer -f -y 13 w3@0x25 0x21 0x89 0x00
i2cset -f -y 13 0x25 0x00 2
i2ctransfer -f -y 13 w3@0x25 0x0D 0x34 0x11
//0.930V
i2cset -f -y 15 0x26 0x00 0
i2ctransfer -f -y 15 w3@0x26 0x21 0x89 0x00
i2cset -f -y 15 0x26 0x00 2
i2ctransfer -f -y 15 w3@0x26 0x0D 0x34 0x11
//0.775V
i2cset -f -y 13 0x25 0x00 1
i2ctransfer -f -y 13 w3@0x25 0x21 0x6A 0x00
i2cset -f -y 13 0x25 0x00 2
i2ctransfer -f -y 13 w3@0x25 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 15 0x26 0x00 1
i2ctransfer -f -y 15 w3@0x26 0x21 0x6A 0x00
i2cset -f -y 15 0x26 0x00 2
i2ctransfer -f -y 15 w3@0x26 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 13 0x21 0x00 0
i2ctransfer -f -y 13 w3@0x21 0x21 0x6A 0x00
i2cset -f -y 13 0x21 0x00 2
i2ctransfer -f -y 13 w3@0x21 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 13 0x21 0x00 1
i2ctransfer -f -y 13 w3@0x21 0x21 0x6A 0x00
i2cset -f -y 13 0x21 0x00 2
i2ctransfer -f -y 13 w3@0x21 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 13 0x22 0x00 0
i2ctransfer -f -y 13 w3@0x22 0x21 0x6A 0x00
i2cset -f -y 13 0x22 0x00 2
i2ctransfer -f -y 13 w3@0x22 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 13 0x22 0x00 1
i2ctransfer -f -y 13 w3@0x22 0x21 0x6A 0x00
i2cset -f -y 13 0x22 0x00 2
i2ctransfer -f -y 13 w3@0x22 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 15 0x23 0x00 0
i2ctransfer -f -y 15 w3@0x23 0x21 0x6A 0x00
i2cset -f -y 15 0x23 0x00 2
i2ctransfer -f -y 15 w3@0x23 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 15 0x23 0x00 1
i2ctransfer -f -y 15 w3@0x23 0x21 0x6A 0x00
i2cset -f -y 15 0x23 0x00 2
i2ctransfer -f -y 15 w3@0x23 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 15 0x24 0x00 0
i2ctransfer -f -y 15 w3@0x24 0x21 0x6A 0x00
i2cset -f -y 15 0x24 0x00 2
i2ctransfer -f -y 15 w3@0x24 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 15 0x24 0x00 1
i2ctransfer -f -y 15 w3@0x24 0x21 0x6A 0x00
i2cset -f -y 15 0x24 0x00 2
i2ctransfer -f -y 15 w3@0x24 0x1D 0xAA 0x06
//1.545V
i2cset -f -y 13 0x29 0x00 0
i2ctransfer -f -y 13 w3@0x29 0x21 0x04 0x01
i2cset -f -y 13 0x29 0x00 2
i2ctransfer -f -y 13 w3@0x29 0x0D 0x91 0x20
//1.545V
i2cset -f -y 13 0x29 0x00 1
i2ctransfer -f -y 13 w3@0x29 0x21 0x04 0x01
i2cset -f -y 13 0x29 0x00 2
i2ctransfer -f -y 13 w3@0x29 0x1D 0x49 0x10
//0.745V
i2cset -f -y 13 0x27 0x00 0
i2ctransfer -f -y 13 w3@0x27 0x21 0x64 0x00
i2cset -f -y 13 0x27 0x00 2
i2ctransfer -f -y 13 w3@0x27 0x0D 0x94 0x0C
//0.745V
i2cset -f -y 13 0x27 0x00 1
i2ctransfer -f -y 13 w3@0x27 0x21 0x64 0x00
i2cset -f -y 13 0x27 0x00 2
i2ctransfer -f -y 13 w3@0x27 0x1D 0x4C 0x06
//0.745V
i2cset -f -y 15 0x28 0x00 0
i2ctransfer -f -y 15 w3@0x28 0x21 0x64 0x00
i2cset -f -y 15 0x28 0x00 2
i2ctransfer -f -y 15 w3@0x28 0x0D 0x94 0x0C
//0.745V
i2cset -f -y 15 0x28 0x00 1
i2ctransfer -f -y 15 w3@0x28 0x21 0x64 0x00
i2cset -f -y 15 0x28 0x00 2
i2ctransfer -f -y 15 w3@0x28 0x1D 0x4C 0x06
//0.885V
i2cset -f -y 13 0x20 0x00 0
i2ctransfer -f -y 13 w3@0x20 0x21 0x62 0x01
//0.930V
i2cset -f -y 14 0x25 0x00 0
i2ctransfer -f -y 14 w3@0x25 0x21 0x89 0x00
i2cset -f -y 14 0x25 0x00 2
i2ctransfer -f -y 14 w3@0x25 0x0D 0x34 0x11
//0.930V
i2cset -f -y 16 0x26 0x00 0
i2ctransfer -f -y 16 w3@0x26 0x21 0x89 0x00
i2cset -f -y 16 0x26 0x00 2
i2ctransfer -f -y 16 w3@0x26 0x0D 0x34 0x11
//0.775V
i2cset -f -y 14 0x25 0x00 1
i2ctransfer -f -y 14 w3@0x25 0x21 0x6A 0x00
i2cset -f -y 14 0x25 0x00 2
i2ctransfer -f -y 14 w3@0x25 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 16 0x26 0x00 1
i2ctransfer -f -y 16 w3@0x26 0x21 0x6A 0x00
i2cset -f -y 16 0x26 0x00 2
i2ctransfer -f -y 16 w3@0x26 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 14 0x21 0x00 0
i2ctransfer -f -y 14 w3@0x21 0x21 0x6A 0x00
i2cset -f -y 14 0x21 0x00 2
i2ctransfer -f -y 14 w3@0x21 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 14 0x21 0x00 1
i2ctransfer -f -y 14 w3@0x21 0x21 0x6A 0x00
i2cset -f -y 14 0x21 0x00 2
i2ctransfer -f -y 14 w3@0x21 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 14 0x22 0x00 0
i2ctransfer -f -y 14 w3@0x22 0x21 0x6A 0x00
i2cset -f -y 14 0x22 0x00 2
i2ctransfer -f -y 14 w3@0x22 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 14 0x22 0x00 1
i2ctransfer -f -y 14 w3@0x22 0x21 0x6A 0x00
i2cset -f -y 14 0x22 0x00 2
i2ctransfer -f -y 14 w3@0x22 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 16 0x23 0x00 0
i2ctransfer -f -y 16 w3@0x23 0x21 0x6A 0x00
i2cset -f -y 16 0x23 0x00 2
i2ctransfer -f -y 16 w3@0x23 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 16 0x23 0x00 1
i2ctransfer -f -y 16 w3@0x23 0x21 0x6A 0x00
i2cset -f -y 16 0x23 0x00 2
i2ctransfer -f -y 16 w3@0x23 0x1D 0xAA 0x06
//0.775V
i2cset -f -y 16 0x24 0x00 0
i2ctransfer -f -y 16 w3@0x24 0x21 0x6A 0x00
i2cset -f -y 16 0x24 0x00 2
i2ctransfer -f -y 16 w3@0x24 0x0D 0x52 0x0D
//0.775V
i2cset -f -y 16 0x24 0x00 1
i2ctransfer -f -y 16 w3@0x24 0x21 0x6A 0x00
i2cset -f -y 16 0x24 0x00 2
i2ctransfer -f -y 16 w3@0x24 0x1D 0xAA 0x06
//1.545V
i2cset -f -y 14 0x29 0x00 0
i2ctransfer -f -y 14 w3@0x29 0x21 0x04 0x01
i2cset -f -y 14 0x29 0x00 2
i2ctransfer -f -y 14 w3@0x29 0x0D 0x91 0x20
//1.545V
i2cset -f -y 14 0x29 0x00 1
i2ctransfer -f -y 14 w3@0x29 0x21 0x04 0x01
i2cset -f -y 14 0x29 0x00 2
i2ctransfer -f -y 14 w3@0x29 0x1D 0x49 0x10
//0.745V
i2cset -f -y 14 0x27 0x00 0
i2ctransfer -f -y 14 w3@0x27 0x21 0x64 0x00
i2cset -f -y 14 0x27 0x00 2
i2ctransfer -f -y 14 w3@0x27 0x0D 0x94 0x0C
//0.745V
i2cset -f -y 14 0x27 0x00 1
i2ctransfer -f -y 14 w3@0x27 0x21 0x64 0x00
i2cset -f -y 14 0x27 0x00 2
i2ctransfer -f -y 14 w3@0x27 0x1D 0x4C 0x06
//0.745V
i2cset -f -y 16 0x28 0x00 0
i2ctransfer -f -y 16 w3@0x28 0x21 0x64 0x00
i2cset -f -y 16 0x28 0x00 2
i2ctransfer -f -y 16 w3@0x28 0x0D 0x94 0x0C
//0.745V
i2cset -f -y 16 0x28 0x00 1
i2ctransfer -f -y 16 w3@0x28 0x21 0x64 0x00
i2cset -f -y 16 0x28 0x00 2
i2ctransfer -f -y 16 w3@0x28 0x1D 0x4C 0x06
//0.885V
i2cset -f -y 14 0x20 0x00 0
i2ctransfer -f -y 14 w3@0x20 0x21 0x62 0x01
+188
View File
@@ -0,0 +1,188 @@
//0.870V
i2cset -f -y 13 0x25 0x00 0
i2ctransfer -f -y 13 w3@0x25 0x21 0x7D 0x00
i2cset -f -y 13 0x25 0x00 2
i2ctransfer -f -y 13 w3@0x25 0x0D 0xB4 0x0F
//0.870V
i2cset -f -y 15 0x26 0x00 0
i2ctransfer -f -y 15 w3@0x26 0x21 0x7D 0x00
i2cset -f -y 15 0x26 0x00 2
i2ctransfer -f -y 15 w3@0x26 0x0D 0xB4 0x0F
//0.725V
i2cset -f -y 13 0x25 0x00 1
i2ctransfer -f -y 13 w3@0x25 0x21 0x60 0x00
i2cset -f -y 13 0x25 0x00 2
i2ctransfer -f -y 13 w3@0x25 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 15 0x26 0x00 1
i2ctransfer -f -y 15 w3@0x26 0x21 0x60 0x00
i2cset -f -y 15 0x26 0x00 2
i2ctransfer -f -y 15 w3@0x26 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 13 0x21 0x00 0
i2ctransfer -f -y 13 w3@0x21 0x21 0x60 0x00
i2cset -f -y 13 0x21 0x00 2
i2ctransfer -f -y 13 w3@0x21 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 13 0x21 0x00 1
i2ctransfer -f -y 13 w3@0x21 0x21 0x60 0x00
i2cset -f -y 13 0x21 0x00 2
i2ctransfer -f -y 13 w3@0x21 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 13 0x22 0x00 0
i2ctransfer -f -y 13 w3@0x22 0x21 0x60 0x00
i2cset -f -y 13 0x22 0x00 2
i2ctransfer -f -y 13 w3@0x22 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 13 0x22 0x00 1
i2ctransfer -f -y 13 w3@0x22 0x21 0x60 0x00
i2cset -f -y 13 0x22 0x00 2
i2ctransfer -f -y 13 w3@0x22 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 15 0x23 0x00 0
i2ctransfer -f -y 15 w3@0x23 0x21 0x60 0x00
i2cset -f -y 15 0x23 0x00 2
i2ctransfer -f -y 15 w3@0x23 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 15 0x23 0x00 1
i2ctransfer -f -y 15 w3@0x23 0x21 0x60 0x00
i2cset -f -y 15 0x23 0x00 2
i2ctransfer -f -y 15 w3@0x23 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 15 0x24 0x00 0
i2ctransfer -f -y 15 w3@0x24 0x21 0x60 0x00
i2cset -f -y 15 0x24 0x00 2
i2ctransfer -f -y 15 w3@0x24 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 15 0x24 0x00 1
i2ctransfer -f -y 15 w3@0x24 0x21 0x60 0x00
i2cset -f -y 15 0x24 0x00 2
i2ctransfer -f -y 15 w3@0x24 0x1D 0x0A 0x06
//1.455V
i2cset -f -y 13 0x29 0x00 0
i2ctransfer -f -y 13 w3@0x29 0x21 0xF2 0x00
i2cset -f -y 13 0x29 0x00 2
i2ctransfer -f -y 13 w3@0x29 0x0D 0x51 0x1E
//1.455V
i2cset -f -y 13 0x29 0x00 1
i2ctransfer -f -y 13 w3@0x29 0x21 0xF2 0x00
i2cset -f -y 13 0x29 0x00 2
i2ctransfer -f -y 13 w3@0x29 0x1D 0x29 0x0F
//0.695V
i2cset -f -y 13 0x27 0x00 0
i2ctransfer -f -y 13 w3@0x27 0x21 0x5A 0x00
i2cset -f -y 13 0x27 0x00 2
i2ctransfer -f -y 13 w3@0x27 0x0D 0x54 0x0B
//0.695V
i2cset -f -y 13 0x27 0x00 1
i2ctransfer -f -y 13 w3@0x27 0x21 0x5A 0x00
i2cset -f -y 13 0x27 0x00 2
i2ctransfer -f -y 13 w3@0x27 0x1D 0xAC 0x05
//0.695V
i2cset -f -y 15 0x28 0x00 0
i2ctransfer -f -y 15 w3@0x28 0x21 0x5A 0x00
i2cset -f -y 15 0x28 0x00 2
i2ctransfer -f -y 15 w3@0x28 0x0D 0x54 0x0B
//0.695V
i2cset -f -y 15 0x28 0x00 1
i2ctransfer -f -y 15 w3@0x28 0x21 0x5A 0x00
i2cset -f -y 15 0x28 0x00 2
i2ctransfer -f -y 15 w3@0x28 0x1D 0xAC 0x05
//0.753V
i2cset -f -y 13 0x20 0x00 0
i2ctransfer -f -y 13 w3@0x20 0x21 0x2D 0x01
//0.870V
i2cset -f -y 14 0x25 0x00 0
i2ctransfer -f -y 14 w3@0x25 0x21 0x7D 0x00
i2cset -f -y 14 0x25 0x00 2
i2ctransfer -f -y 14 w3@0x25 0x0D 0xB4 0x0F
//0.870V
i2cset -f -y 16 0x26 0x00 0
i2ctransfer -f -y 16 w3@0x26 0x21 0x7D 0x00
i2cset -f -y 16 0x26 0x00 2
i2ctransfer -f -y 16 w3@0x26 0x0D 0xB4 0x0F
//0.725V
i2cset -f -y 14 0x25 0x00 1
i2ctransfer -f -y 14 w3@0x25 0x21 0x60 0x00
i2cset -f -y 14 0x25 0x00 2
i2ctransfer -f -y 14 w3@0x25 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 16 0x26 0x00 1
i2ctransfer -f -y 16 w3@0x26 0x21 0x60 0x00
i2cset -f -y 16 0x26 0x00 2
i2ctransfer -f -y 16 w3@0x26 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 14 0x21 0x00 0
i2ctransfer -f -y 14 w3@0x21 0x21 0x60 0x00
i2cset -f -y 14 0x21 0x00 2
i2ctransfer -f -y 14 w3@0x21 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 14 0x21 0x00 1
i2ctransfer -f -y 14 w3@0x21 0x21 0x60 0x00
i2cset -f -y 14 0x21 0x00 2
i2ctransfer -f -y 14 w3@0x21 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 14 0x22 0x00 0
i2ctransfer -f -y 14 w3@0x22 0x21 0x60 0x00
i2cset -f -y 14 0x22 0x00 2
i2ctransfer -f -y 14 w3@0x22 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 14 0x22 0x00 1
i2ctransfer -f -y 14 w3@0x22 0x21 0x60 0x00
i2cset -f -y 14 0x22 0x00 2
i2ctransfer -f -y 14 w3@0x22 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 16 0x23 0x00 0
i2ctransfer -f -y 16 w3@0x23 0x21 0x60 0x00
i2cset -f -y 16 0x23 0x00 2
i2ctransfer -f -y 16 w3@0x23 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 16 0x23 0x00 1
i2ctransfer -f -y 16 w3@0x23 0x21 0x60 0x00
i2cset -f -y 16 0x23 0x00 2
i2ctransfer -f -y 16 w3@0x23 0x1D 0x0A 0x06
//0.725V
i2cset -f -y 16 0x24 0x00 0
i2ctransfer -f -y 16 w3@0x24 0x21 0x60 0x00
i2cset -f -y 16 0x24 0x00 2
i2ctransfer -f -y 16 w3@0x24 0x0D 0x12 0x0C
//0.725V
i2cset -f -y 16 0x24 0x00 1
i2ctransfer -f -y 16 w3@0x24 0x21 0x60 0x00
i2cset -f -y 16 0x24 0x00 2
i2ctransfer -f -y 16 w3@0x24 0x1D 0x0A 0x06
//1.455V
i2cset -f -y 14 0x29 0x00 0
i2ctransfer -f -y 14 w3@0x29 0x21 0xF2 0x00
i2cset -f -y 14 0x29 0x00 2
i2ctransfer -f -y 14 w3@0x29 0x0D 0x51 0x1E
//1.455V
i2cset -f -y 14 0x29 0x00 1
i2ctransfer -f -y 14 w3@0x29 0x21 0xF2 0x00
i2cset -f -y 14 0x29 0x00 2
i2ctransfer -f -y 14 w3@0x29 0x1D 0x29 0x0F
//0.695V
i2cset -f -y 14 0x27 0x00 0
i2ctransfer -f -y 14 w3@0x27 0x21 0x5A 0x00
i2cset -f -y 14 0x27 0x00 2
i2ctransfer -f -y 14 w3@0x27 0x0D 0x54 0x0B
//0.695V
i2cset -f -y 14 0x27 0x00 1
i2ctransfer -f -y 14 w3@0x27 0x21 0x5A 0x00
i2cset -f -y 14 0x27 0x00 2
i2ctransfer -f -y 14 w3@0x27 0x1D 0xAC 0x05
//0.695V
i2cset -f -y 16 0x28 0x00 0
i2ctransfer -f -y 16 w3@0x28 0x21 0x5A 0x00
i2cset -f -y 16 0x28 0x00 2
i2ctransfer -f -y 16 w3@0x28 0x0D 0x54 0x0B
//0.695V
i2cset -f -y 16 0x28 0x00 1
i2ctransfer -f -y 16 w3@0x28 0x21 0x5A 0x00
i2cset -f -y 16 0x28 0x00 2
i2ctransfer -f -y 16 w3@0x28 0x1D 0xAC 0x05
//0.753V
i2cset -f -y 14 0x20 0x00 0
i2ctransfer -f -y 14 w3@0x20 0x21 0x2D 0x01