扫码关注公众号
CMIS Module Manager 是一款用于调测和管理符合 CMIS(Common Management Interface Specification)标准的光模块的桌面工具。支持读取模块身份信息、实时监控光功率与温度、配置数据通道(DataPath)、执行环回 / PRBS 诊断,以及直接读写任意寄存器。
本工具自 v2.3.0 起按 OIF CMIS 5.4(2026-05-21 发布)解码。 5.4 与 5.3 完全向后兼容——规范原文即写明"5.3 合规的模块也是 5.4 合规的", 所以手上的 5.3 模块行为不变,界面上只是不会出现 5.4 才有的那几项。 界面中凡是 5.4 才引入的内容,名称后都带一个 5.4 徽标——字段名后如此,卡片标题后也如此。
| 5.4 变更 | 寄存器 / 章节 | 本工具 |
|---|---|---|
| E14 模块通道数上限从 32 提升到 256 | 01h:142[1:0] = 11b 时改读 01h:174[4:0] |
已支持 连接时读取,界面按实际通道数铺开,跨 Bank 读写。
逃逸路径由 mock_24lane 演示(其余 profile 的通道数旧字段都拼得出来,走不到这条路) |
| E1 通道默认极性广告 | 01h:171–172(Table 8-57) |
已支持 Module Info 的 Default Polarity 行 |
| 新增页广告(0Ch/0Dh/60h/61h/62h) | 01h:173–174(Table 8-58) |
已支持 Module Info 的 Extra Pages 行 |
| E13 媒体通道交换能力广告 | 01h:252[5](Table 8-62) |
已支持 广告位 + Page 6Dh 的重定向暂存/使能/提交(见 §12) |
| E10 散热器类型 | 00h:61[7:4](Table 8-18) |
已支持 Module Info 的 Heatsink Type 行 |
| E17 300 GHz 频率栅格 | 04h:129[5]、04h:166–169,栅格码 1001b |
已支持 Laser Tuning 的栅格列表与下拉 |
| E9 可编程相对光功率监督门限 | 04h:196[6]、12h:216–217、12h:128–135[1] |
已支持 Laser Tuning 卡片显示门限偏移与每通道使能 |
| E2 接口 ID 扩展为 12 位 UID(4 位 GID + 8 位 ID) | 1Ch NAD 内的 GID 字段 |
暂不适用 规范注明现存所有 UID 的 GID 均为 0, 非零 GID 只能经 NAD(Page 1Ch)广告,本工具读基本应用描述符 |
| E12 可复位收发采集计数器 | Page 61h / 60h:192–193 | 已支持 四类计数器读取 + 按通道复位(见 §12) |
| E4 固件加载管理 | Page 0Dh(Table 8-75/8-76)+ CDB | 部分支持 Page 0Dh 的固件状态只读显示(各 Bank 有效 / 已提交 / 运行中、版本、Build、描述),见 5.4 页面的 Firmware Loads 卡片;下载、提交等 CDB 命令流程不实现 |
| E11 性能管理 | Page 0Ch + CDB | 未实现 本工具不实现 CDB 命令流程(Page 0Ch 的特性声明照常显示) |
| E3/E6/E7/E8 新增 CDB 命令 | Chapter 9 | 未实现 同上 |
| E15 VDM 降采样省电选项 | 7.1.2 / 8.27.8 | 不适用 本工具不实现 VDM(5.4 的 VDM 变更为 none) |
命名变更:DataPathID → DPIDX、NPID → NPIDX |
6.2.3.2.2 等 | 已同步 见 §9.3 的 AppSelect 说明 |
| 术语变更:"flat memory" 改称 static memory | 6.3.2.3 | 已同步 |
mock_1600g_dr8(8×200G,单 Bank)与 mock_1600g_16lane(16×100G,双 Bank)。
mock_1600g_dr8 按该草案
第 180 章建模,下表每一行都能在规范里查到出处;表里没有的项目一律是演示数据(见表下说明)。
| 项目 | 取值 | 出处 |
|---|---|---|
| PHY 类型名 | 1.6TBASE-DR8(不是 1600GBASE-DR8) | Clause 180 |
| 每通道波特率 / 调制 | 106.25 GBd PAM4(约 200 Gb/s) | Table 180–7 |
| 波长范围 | 1304.5 ~ 1317.5 nm | Table 180–7 |
| 传输距离 | 2 m ~ 500 m | Table 180–6 |
| 每通道发送光功率 | −3.1 ~ +4 dBm → 即本工具显示的 Tx 高/低告警门限 | Table 180–7 |
| 每通道接收光功率 | −6.1 ~ +4 dBm → 即 Rx 高/低告警门限 | Table 180–8 |
| 整条链路 pre-FEC 误码率上限 | 2.921×10⁻⁴(超过它 RS-FEC 就纠不动了) | §174A.6 |
| 其中分给光模块本身的份额 | 2.28×10⁻⁴(余下分给两端的 AUI)→ mock_1600g_dr8 模拟在 1.5×10⁻⁴,落在这个份额之内 | Table 174A–1 |
1e-4 量级,比 800G 模块差几个数量级,这不是故障;判定要用分给模块的 2.28×10⁻⁴,
不是整条链路的 2.921×10⁻⁴。mock_1600g_16lane 只有主机侧对得上 802.3dj——16 通道 × 约 100 Gb/s 即
1.6TAUI-16 C2M(Annex 120G);它的光口跑 100G/lane,属 802.3df 的 PMD 而非第 180 章,
所以门限保持通用值。
mock_1600g_16lane 覆盖。
首次接真实宽通道模块时,请先用 Raw Registers 核对 01h:142 与 01h:174
的广告值与界面显示的通道数是否一致。
| Backend | 说明 |
|---|---|
mock_coherent | 模拟 800GBASE-LR1 数据中心 coherent lite(DP-16QAM, 单波长 O 波段, SMF 10km),光参数按 IEEE P802.3dj/D3.1 第 185 章建模,无需硬件 |
mock_coherent_zr | 模拟 800G 可调谐相干模块(C-band DWDM, ZR 类),本工具唯一支持 Laser Tuning 的 profile |
mock_dr8 | 模拟 800GBASE-DR8(8×100G PAM4, SMF 500m, EML 1310nm),无需硬件 |
mock_sr8 | 模拟 800GBASE-SR8(8×100G PAM4, OM4 100m, VCSEL 850nm),无需硬件 |
mock_fr4x2 | 模拟 2× 400GBASE-FR4(CWDM4 SMF 2km, EML 1310nm),无需硬件 |
mock_1600g_dr8 | 模拟 1.6TBASE-DR8(8 × 106.25 GBd PAM4, SMF 500m, 功率等级 8 / 26 W),光参数按 IEEE P802.3dj/D3.1 第 180 章建模,自报 CMIS 5.4 并广告全部 5.4 可选页 |
mock_1600g_16lane | 模拟 1.6T 16×100G(主机侧即 1.6TAUI-16 C2M,16 通道 / 双 Bank, 功率等级 8 / 28 W),用于演示跨 Bank 读写与 5.4 新增字段 |
mock_aoc | 模拟一根 400G 有源光缆(AOC),20 m。
媒介不可分离——光纤是焊死在模块上的,所以它有连接器类型「无可分离连接器」、
有线缆长度、也有线缆传播时延(01h:148-149,这个寄存器正是为这种模块定义的)。
其余分页 profile 的媒介都是可插拔的,所以几条「为线缆组件写的」逻辑此前只有平坦内存的 DAC 可对照,
传播时延那一条则一个模块都没有。 |
mock_fewmon | 模拟一块只实现了部分监控项的 800G DR8。
CMIS 把每一项监控都定义为可选,由 01h:159-160 广告自己有哪些;
这块模块没有电源电压监控、没有发送光功率监控、也没有偏置电流监控,
只保留温度和接收光功率。用来演示「模块没有这一项」和「这一项读数为 0」是两回事。 |
mock_zr16 | 模拟一块 16 通道的可调谐模块 (C-band,功率等级 5 / 16 W)。它存在的理由只有一个:Page 12h 是按介质通道分 Bank 的 (每 Bank 8 条),而其余可调谐 profile 都正好 8 条、一个 Bank 装得下, 于是「写第二个 Bank」这条路从来没人走过。 |
mock_24lane | 模拟一块 24 通道 / 三 Bank 的模块(功率等级 8 / 30 W)。
24 是旧字段拼不出来的通道数(旧字段只能表达 8 / 16 / 32),
因此它是唯一会走 CMIS 5.4 通道数逃逸路径的 profile:
01h:142[1:0] = 11b 时改读 01h:174[4:0] |
ch341 | 通过 CH341 USB 转 I2C 适配器连接真实模块 |
ch347 | 通过 CH347 USB 转 I2C 适配器连接真实模块 |
ftdi | 通过 FTDI 系列芯片连接真实模块 |
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10 / Windows 11(64 位) |
| 硬件接口 | USB 端口(使用真实模块时) |
| 驱动程序 |
使用真实模块时需提前安装对应 USB 驱动: · CH341:从 WCH 官网下载 CH341SER.EXE,安装后 CH341DLL.dll 自动注册到系统· CH347:从 WCH 官网下载 CH347SER.EXE(串口驱动)+ CH347DLL.dll(I2C 通信库,需另行获取,详见第 3 节)· CH341 安装驱动后 DLL 自动进入 System32;CH347 可能需要手动将 CH347DLL.dll 放入 EXE 同目录或 System32· Mock 模式(不接硬件)无需安装任何驱动 · WCH 官网(国内): www.wch.cn 官网(国际):www.wch-ic.com
|
| 运行时依赖 | 无需安装 Python 或任何运行时,双击 EXE 即可运行 |
使用 CH341 或 CH347 适配器连接真实光模块前,需先在 Windows 中安装对应的 WCH USB 驱动。Mock 模式无需此步骤。
| 外观特征 | 芯片型号 | 需安装的驱动 |
|---|---|---|
| 黑色小板,常见于淘宝低价 I2C 适配器 | CH341A | CH341 驱动 |
| 蓝色板,支持更高速率(USB 2.0 High-Speed) | CH347 | CH347 驱动 |
www.wch.cnwww.wch-ic.comCH341 或 CH347),进入产品页 → 下载 → Windows 驱动压缩包CH341SER.ZIP,内含 CH341SER.EXECH347SER.ZIP,内含 CH347SER.EXECH347DLL.dll。如果安装后工具仍显示 unavailable,需从 WCH 官网搜索 "CH347EVT"(开发资料包)下载,在压缩包内找到 CH347DLL.dll,复制到 CMIS_Module_Manager.exe 同一目录下即可SETUP.EXE(或 CH341SER.EXE / CH347SER.EXE)。USB-SERIAL CH341 (COM×)USB Enhanced Serial Port (COM×)
CMIS_Module_Manager.exe。ch341 或 ch347 选项(状态 available)。01h:155.6 说「发射端可调谐」时才存在。
工具此前不看这一位就去读,于是读回来的其实是厂商名那几个字节,
再按栅格位图解码——一块根本没有可调谐激光器的模块,
调谐页上会显示 「支持 6.25 / 12.5 / 25 / 50 / 150 GHz 五种栅格」,
以及一个「123.36 到 −163.28 dBm」的可编程功率范围
(上下限还是反的)。01h:155.6:这一位是 0 就根本不去读那一页,
页面直接说明该模块没有 Page 04h/12h。
1111b——它的含义是
「不可用 / Not available」,是一个有意义的值,不是空档。1001b(300 GHz)就停了。
于是一条处于 1111b 的通道,悬停提示显示「Not available」,
同一行的下拉框却显示「15」——同一个寄存器,同一行上两个答案。1010b–1110b)
也统一用后端解出来的写法,不再各猜各的。
01h:159-160),
而不是跟着 01h:157-158——后者只管 Tx 故障、丢失信号、
CDR 失锁、自适应均衡失败这四类。01h:157-158 判断,于是那 20 个门限标志
在没有对应监控项的模块上被画成绿点——
「这里一切正常」,可根本就没有在测。
现在它们显示 n/a,「监控」汇总列在三项全无时也显示 n/a;
模块有的那几项照常显示,是逐项判断的。01h:159-160 里广告自己到底有哪几项。
没有的那一项,寄存器仍然存在,只是读出来是 0。0.0000 V 是模块没通电,0.000 mA 是激光器灭了,
0 微瓦换算成 dBm 是量程底部——而且会被标成红色告警。
也就是说,工具在替一块根本没有这项监控的模块报一个它从没说过的故障。01h:160.0),
不参与告警配色。模块实现了的那些监控照常显示——这是逐项判断的,
不会因为缺一项就把整行藏掉。
10h–5Fh、60h–62h、
6Dh、9Fh、A0h–AFh):
同一个页号 + 同一个地址,在不同 Bank 上是不同通道的寄存器,
Bank b 对应第 8b+1 到 8b+8 条通道。01h、
02h)、或填在下半区(0x00–0x7F,本来就不分页也不分 Bank),
都会直接报错,而不是默默给你 Bank 0 的内容。ftd2xx 通道,
用 FTDI 官方驱动即可,不再需要 Zadig 替换驱动
(替换驱动会让机器上其它 FTDI 软件用不了,这也是原来那条 ftdi
通道的代价)。CH341DLL.dll 会自动注册到系统,EXE 无需额外配置,
开箱即用。0xFF;
而 CH341 的接口看不到缺失的 ACK,会把这次读当成成功返回。FF 当数据解析了,界面上会出现一只
根本不存在的模块:CMIS 15.15、256 通道、
模块状态 Reserved、厂商名一串乱码、温度 -0.0039 °C。FF 或全 00
就判定总线上没有模块应答,直接拒绝连接并说明读到了什么、该检查哪几项
(模块是否插到位、适配器的 I2C 线是否接对、地址是否为 0x50)。
CH347SER.EXE 安装的是串口驱动(设备管理器可识别设备),但 I2C 通信所需的 CH347DLL.dll 可能不会自动安装到系统。若工具显示 CH347 unavailable,请从 WCH 官网下载 CH347EVT 开发资料包,找到 CH347DLL.dll,复制到 EXE 同目录或 System32 下。
CMIS_Module_Manager.exe,双击运行。CMIS Module Manager v2.175.0 starting on http://127.0.0.1:5000其中
v2.175.0 即当前版本号,界面标题旁和左侧栏底部也会显示,便于确认版本。http://127.0.0.1:5000)。
程序只监听本机 127.0.0.1,默认端口 5000。
cmis_settings.json,和 EXE 放在同一个文件夹里;
下次启动直接用它。删掉这个文件就回到默认的 5000。CMIS_PORT=5005 可临时指定端口,它优先于已保存的设置
(界面上会注明)。为什么要这样:macOS 上的「隔空播放接收器」就占用 5000 端口;在 Windows 上, 服务器绑定端口时的方式允许与已经在监听的程序共用同一个端口, 结果浏览器连到哪一个由系统决定——你可能看到的是别的程序,甚至是一个 403 错误页。 现在启动时会先检测,被占用就明确告诉你。
把鼠标停在任意一个设置项(复选框、下拉框、数值输入框)或信息表格的任意一行上, 会弹出该项对应的寄存器信息,无需再去翻规范手册核对地址:
| 提示行 | 含义 |
|---|---|
| 第 1 行 | CMIS 规范中的字段名(如 AutoSquelchDisableTx1) |
| 第 2 行 | 所在 Page 与字节地址,十进制与十六进制并列(如 Page 10h · byte 131 (0x83)) |
| 第 3 行 | 该字节当前实际读回的值,同时给出三种进制并各自标明:
0x05 hex = 0b00000101 bin = 5 dec |
| 第 4 行 | 该控件占用的位,以及 0/1 各代表什么 |
标题右侧版本徽章旁有 ↑ Update 按钮,点击即联网检查 GitHub 上是否有新版本:
update.log 里106.14.76.130)。点 Update 后工具会各测一次实际速度(约 10–40 秒,
取决于网络),然后从快的那个下载;下载中若该源失败,会自动切到另一个
并接着已下载的部分继续,不用重来。哪个源快因时因地而异,所以是每次实测而不是写死。
Updating… 58%),
测速结束后还会提示这次是从哪个源下载的。下载期间界面照常可用,
可以继续看监控、读寄存器——下载在后台线程进行,不占用界面。
16 MB 在快网上几秒完成,在慢速链路上可能要几十分钟,
只要百分比还在涨就是正常的,不要以为程序卡死而去关掉它_cmis_download 文件夹里,明天再点 Update 会接着上次的进度传。
切换到另一个版本时,旧版本残留的半成品会被自动清掉,不会长期占着磁盘git pull。
本工具只在你点击该按钮时才联网,平时不会主动访问外部网络。
/api/ 接口还会拒绝由其它网页发起的请求——
你在浏览器里打开的任何站点,都无法借你的浏览器去连接模块、改寄存器或触发升级。
即便有人把自己的域名解析到你本机(DNS rebinding),接口同样会因 Host 不在白名单而被拒。
http://127.0.0.1:5000(或你设置的端口)都能正常显示界面——
因为光是拿到页面并不能操作模块,所有能碰模块的入口都在 /api/ 下面。
可用的本机地址有三个:127.0.0.1、localhost、[::1](带或不带当前端口号,默认 :5000)。
Content-Type: application/json,否则返回 415;
且必须用上面三个本机地址访问,用本机主机名会被拒。
寄存器工具里一个裸数字容易被误读,因此界面上所有数值都可判别进制:
| 进制 | 写法 | 出现位置 |
|---|---|---|
| 十六进制 | 0x 前缀,如 0x83 |
寄存器地址、Interface ID、Raw 十六进制转储 |
| 二进制 | 0b 前缀,如 0b00000101 |
位掩码,如 Applications 表的 Host Lane Assign |
| 十进制 | 无前缀,表头标注 dec |
通道号、lane 数、带单位的监控值 |
表头的灰色小字会注明该列的进制与所属寄存器;悬停提示则同时给出三种进制,无需心算换算。
点右上角的 ⚙ Display 打开显示设置。四项设置改动立即生效,无需确认, 并保存在本机浏览器里,下次打开自动沿用。未连接模块时也能调整。
| 设置 | 可选项 | 说明 |
|---|---|---|
| 主题 Theme |
Midnight(默认深色) Light 浅色 High contrast 高对比 Warm 护眼暖色 |
Light 适合白天强光或投影;High contrast 适合车间、远距离查看; Warm 降低蓝光,适合长时间盯屏。切换主题时告警红/黄、阈值染色、状态徽标会整套跟着变, 保证任何主题下数值都清晰可读。 |
| 界面缩放 UI scale |
Auto(默认) 80% / 90% / 100% / 115% / 125% / 150% |
整个界面等比放大或缩小,含文字、间距、表格。 Auto 会按你显示器的可用宽度自动选一档:1900px 以上放大到 115%, 2400px 以上 135%,3000px 以上 150%,其余保持 100%。手动选定后就不再自动变。 |
| 字号 Text size |
Compact / Normal / Large / Extra large | 只放大文字、不放大边距,与"界面缩放"是两件事。 它对最小的那些字(寄存器地址注释、状态标记)提升最明显—— 选 Extra large 时这些 10px 的小字会长到 14px,而标题只从 18px 到 22px。 |
| 字体 Font |
System default 微软雅黑 思源黑体 全等宽 |
只影响界面文字。寄存器地址、十六进制转储、监控数值永远保持等宽字体, 不受此项影响——否则数字列会对不齐,直接影响读数。 所列字体均取自系统,未选中的字体若系统没装会自动回退。 |
若想恢复出厂外观,打开显示设置点 Reset to defaults 即可。
只有 Monitoring 卡片会在读取失败时把数据置灰并显示过期横幅。其余所有卡片—— Squelch、Loopback、PRBS、Module Thresholds、DataPath、BER、SNR、Error/Bit Counters、 Module Control、Applications——失败时的表现是:
点击左侧 Backend 下拉菜单,选择对应接口类型:
| Backend | 模拟类型 | 典型场景 | 特征 |
|---|---|---|---|
mock_coherent |
800GBASE-LR1(802.3dj 第 185 章) | 数据中心 coherent lite / 园区 10km | DP-16QAM 123.6364 GBd,单波长固定载波(228.675 THz ± 20 GHz,约 1311 nm),不可调谐,13 W |
mock_coherent_zr |
800G 相干可调谐(C-band,ZR 类) | DWDM 长途 / DCI | 支持 Laser Tuning,Pre-FEC BER ~1e-9,16 W |
mock_dr8 |
800GBASE-DR8 | 数据中心内 500m | 8×100G PAM4,SMF MPO 1×16,EML 1310nm,14 W |
mock_sr8 |
800GBASE-SR8 | 机架内 100m (OM4) | 8×100G PAM4,MMF MPO 1×16,VCSEL 850nm,12 W(Bias 极低) |
mock_fr4x2 |
2× 400GBASE-FR4 | 园区 / 楼栋间 2km | CWDM4 × 2,双 LC,EML 1310nm,15 W |
Mock 模块的所有 CMIS 寄存器值(Vendor Name、Connector、Media Interface Technology、Application Descriptors、Power Class 等)均按 CMIS 5.4 规范和实际产品特征构造。仅 mock_coherent_zr 支持 Laser Tuning 功能(mock_coherent 建模的 800GBASE-LR1 是固定载波,802.3dj 未给它定义调谐栅格);mock_1600g_16lane 是一块 16 通道、自报 CMIS 5.4 的模块,用于演示多 Bank 与 5.4 新增字段。
ch341 — CH341A USB-I2C 适配器ch347 — CH347 USB-I2C 适配器(更高速)ftdi — FTDI FT232H/FT2232H 系列点击 ↻ Refresh Backends 可重新扫描(插入 USB 适配器后刷新)。标注 (unavailable) 的选项表示驱动或硬件不可用。
| 字段 | 说明 | 典型值 |
|---|---|---|
| Bus / Device Index | USB 适配器编号,通常为 0 | 0 |
| I2C Address | 光模块 I2C 地址,支持十六进制或十进制 | 0x50 或 80 |
Connected — ch341 bus:0 addr:0x50;标签页解锁;自动加载 Module Info。点击红色 Disconnect 按钮,断开当前连接并清空所有数据。
连接成功后自动加载,显示模块的身份信息、能力广告与当前运行状态。所有字段寄存器地址严格按 CMIS 5.4 规范(OIF-CMIS-05.4.pdf Table 8-26)。
| 字段 | 说明 | Page / Addr |
|---|---|---|
| Module Type | SFF-8024 Identifier(如 QSFP-DD、OSFP、CMIS-Compliant) | Lower / 0x00 |
| CMIS Revision | 模块自报的 CMIS 规范版本(0x53=5.3、0x54=5.4)。上半字节=主版本,下半字节=次版本。本工具按 5.4 解码,5.3 模块完全兼容 | Lower / 0x01 |
| Memory Model | Paged(支持多页)/ Flat(只有 Page 00h) | Lower / 0x02[7] |
| Reconfiguration | 模块支持哪几种重配置流程(SteppedConfigOnly + AutoCommissioning)。regular 对应 ApplyDPInit,hot 对应 ApplyImmediate;模块不支持哪一个,对应的写入就会被默默忽略 | Lower / 0x02[6],[1:0] |
| MCI Max Speed | 模块支持的管理总线最高速率(本工具只走 I2C,按 I2C 一列解:0=400 kHz、1=1 MHz、2=3.4 MHz)。3–15 是保留值,工具直接显示编号而不自己编一个速率出来 | Lower / 0x02[5:2] |
| Media Type | MMF / SMF / Passive Copper / Active Cable / BASE-T | Lower / 0x55 |
| Module State | 当前状态机(见下表);处于 ModuleFault 时同时显示故障原因(ModuleFaultCause,Table 8-16),原因为 0 时写明未报告 | Lower / 0x03[3:1] · 0x29 |
| Vendor Name | 厂商名称,16 字节 ASCII | 00h / 0x81–0x90 |
| Vendor OUI | IEEE 厂商 OUI,3 字节十六进制 | 00h / 0x91–0x93 |
| Vendor P/N | 厂商料号,16 字节 ASCII | 00h / 0x94–0xA3 |
| Vendor Rev | 产品版本,2 字节 ASCII | 00h / 0xA4–0xA5 |
| Vendor S/N | 序列号,16 字节 ASCII | 00h / 0xA6–0xB5 |
| Date Code | 生产日期码 YYMMDDLL(Y=年, M=月, D=日, L=批次) | 00h / 0xB6–0xBD |
| CLEI Code | CLEI 设备识别码,10 字节 ASCII | 00h / 0xBE–0xC7 |
| 字段 | 说明 | Page / Addr |
|---|---|---|
| Power Class | 模块功耗等级 Class 1–8(bits[7:5]) | 00h / 0xC8 |
| Max Power | 最大功耗(W),原始值 × 0.25 | 00h / 0xC9 |
| Cable Length | 线缆长度(米)。仅对 Copper/Active Cable 有效;普通光模块按规范这里写 0,显示为 "—(transceiver,见 Link Length)" | 00h / 0xCA |
| Link Length | 模块在每种光纤上的最大支持距离(Table 8-45)。SMF 以 km 计,带两位倍率;OM5/OM4/OM3 以 2 m 为单位,OM2 以 1 m 为单位。不支持的光纤类型写 0,所以只会列出真正支持的那几种 | 01h / 0x84–0x89 |
| Connector Type | 光口类型:LC / MPO-12 / MPO-16 / SC / CS / SN / RJ45 等(SFF-8024 Table 4-3) | 00h / 0xCB |
| Host / Media Interface ID | 应用码里的主机电接口与媒体接口编号,本工具按 SFF-8024 Rev 4.14 解出名称一并显示(如 0x83 = 1.6TAUI-8 C2M、0x7F = 1.6TBASE-DR8)。CMIS 本身不定义这些编码,只存编号并指向 SFF-8024。同一编号在多模与单模光纤上含义不同,按模块的 Media Type 选表。遇到比编码表更新的编号会显示 Unknown (0x..) 而不是留空——留空会让人以为模块什么都没报 | Lower / 0x56+ |
| Media Interface Tech | 媒体接口技术:850nm VCSEL / 1310 EML / C-band Tunable / Cu Equalized 等 | 00h / 0xD4 |
| Host Lanes | 主机侧最大并发 lane 数(指一个通道组内;CMIS 限定单个 Application 最多 8 条通道,见 5.4 §6.4.1)。模块物理通道总数见 Module Lanes 行——16 通道模块这两处分别显示 8 和 16,并不矛盾。遍历全部 Application Descriptor,把主机 lane 区间互不重叠的应用相加(不是取最大值)——例如 2×400G-FR4 两个应用各占 4 条不重叠的 lane,结果是 8 而不是 4 | Lower / 0x56+ |
| Media Lanes | 媒体侧最大并发 lane 数(与 Host Lanes 同一套非重叠相加规则) | Lower / 0x56+ |
| FW Revision | 激活固件 主版本.次版本 | Lower / 0x27–0x28 |
| Inactive FW | 备份固件的 主版本.次版本(Table 8-44)。模块内部常带两份固件,升级后想确认新镜像到底落在哪一份,看的就是这一行 | 01h / 0x80–0x81 |
| HW Revision | 硬件版本 主版本.次版本 | 01h / 0x82–0x83 |
00h:202 报自己的实际长度;
普通可插拔光模块反过来。所以看到一行是 "—" 并不代表模块没报距离,
而是该看另一行。两行都是 "—" 才是真的没广播(比如可调相干模块,
实际距离取决于线路系统,不是光纤类型的固定属性)。
| 字段 | 说明 | Page / Addr |
|---|---|---|
| Temperature | 模块内部温度,signed16 ÷ 256 (°C) | Lower / 0x0E–0x0F |
| Supply Voltage | 供电电压,uint16 × 100 µV | Lower / 0x10–0x11 |
| Module Flags | 六个模块级监控(温度 / 电压 / Aux1–3 / 自定义)的告警和警告标志,逐项列出:告警红色、警告黄色;两次刷新之间出现过的保留 ●! 记录 | Lower / 0x09–0x0B |
| Interrupt | 模块有没有在向主机请求中断(IntL 线)。规范里叫 InterruptDeasserted,取值是反的:1 表示没在请求;有标志置位时下方写明它们在哪一页、哪个 Bank(Lower 4–7 标志汇总) | Lower / 0x03[0] |
| Masked module alarms | 只在有已置位但被屏蔽的模块级标志时出现:这些情况模块在报告,却不会为它们拉起中断线 | Lower / 0x1F–0x24 |
| Module State Changes | ModuleStateChangedFlag:进入 ModuleLowPwr、ModuleReady 或 ModuleFault 时置位(Table 6-9)——复位会点亮,切一次低功耗再回来同样会;保留 ●! 历史 | Lower / 0x08[0] |
| Module Restarts | 由 Host Scratchpad 判断模块是否真的重启过(8.16.13);无法判断时写明原因(见「Module State Changes 与 Module Restarts」) | 13h / 0xB8–0xBF |
| Firmware Faults | 模块 / DSP 固件错误与异常固件指示(Table 8-9);已读清的保留 ●! 记录,被屏蔽时标 masked | Lower / 0x08[3:1] |
| Custom Monitor | 只在模块声明有自定义监控时出现:编码由厂商定义,只显示它的告警 / 警告标志 | Lower / 0x0B[7:4] |
| CDB Command Complete | 只在模块声明支持 CDB(01h:163.7-6)时出现:每个 CDB 实例一项,命令执行完时模块置位(7.2.5.2);已读清的保留 ●! 记录,被屏蔽时标 masked。命令成功与否看 CdbStatus(Lower 37–38) | Lower / 0x08[7:6] |
| 状态 | 编码 (bits[3:1]) | 含义 |
|---|---|---|
ModuleLowPwr | 001b | 模块处于低功耗模式 |
ModulePwrUp | 010b | 模块正在上电初始化 |
ModuleReady | 011b | 模块正常工作 正常 |
ModulePwrDn | 100b | 模块正在下电 |
ModuleFault | 101b | 模块故障 异常;原因见 Lower 41,只有复位能离开(6.3.2.5.8) |
点击右上角 ↻ Refresh 手动刷新。
ModuleReady 时,这一页以前会报出根本不该被当真的告警。
规范把话说得很直接:模块级监控读数只有在 ModuleReady 状态下
才被要求满足精度指标;告警 / 警告标志的语义,也只在 ModuleReady 状态下有保证。ModuleLowPwr)之后,
Tx 光功率读回 -40 dBm,表格就按低告警标成红色:
一块只是睡着了的模块,被界面说成故障。ModuleReady 时,表格顶部会写明当前是哪个状态、以及为什么这些数不作数,
数值照常显示(模块确实这么答的,看着模块下电的人需要看到它),
但不再上告警配色——颜色才是那个「下结论」的动作。
概要行里按额定温度范围给温度上色,同样只在 ModuleReady 时才做。
回到 ModuleReady 后一切照旧。
DPInitialized 和 DPActivated 两个状态下有保证——
七个状态里就这两个。-40 dBm,表格就按低告警标成红色。
而这期间模块本身一直是 ModuleReady,
所以上一条(模块级)的判断不会触发,也不该触发——
那是另一个范围的另一条规矩。结果就是:你自己刚关掉的通道,
界面回头告诉你它坏了。ModuleReady
且本通道的数据通道处于 DPInitialized / DPActivated,
两个条件都满足才上告警配色。不满足时该通道的
Tx 光功率、Tx 偏置、Rx 光功率三格转为淡色,
悬停提示里写明本通道当前是哪个状态、以及为什么这些数不作数。
数值照常显示。通道重新起来后一切照旧。
| 列 | 说明 | Page / Addr |
|---|---|---|
| Lane | 通道编号(8 通道模块 1–8;16 通道模块 1–16,第 9 条起在 Bank 1,地址同第 1 条) | — |
| Tx Power | 发送光功率(µW 和 dBm) | 11h / 0x9A+((n−1)%8)×2 |
| Tx Bias | 发送偏置电流(mA)。寄存器每个计数是 2 µA 乘以 01h:160.4-3 的倍率(×1 / ×2 / ×4,Table 8-99),列标题写出本模块一个计数是多少 µA | 11h / 0xAA+((n−1)%8)×2 |
| Rx Power | 接收光功率(µW 和 dBm) | 11h / 0xBA+((n−1)%8)×2 |
| DataPath State | 数据通道状态,4 bits/lane(见下表枚举) | 11h / 0x80–0x83 |
| Output | 该 lane 的 Tx / Rx 输出是否真的在送有效信号(1 bit/lane) | 11h / 0x84 Rx、0x85 Tx |
| Config Status | 上次 Apply 配置的结果(ConfigSuccess / ConfigRejected / ConfigInProgress 等) | 11h / 0xCA–0xCD |
| 编码 | 名称 | 说明 |
|---|---|---|
0x1 | Deactivated | 未激活 |
0x2 | Init | 初始化中 |
0x3 | Deinit | 去初始化中 |
0x4 | Activated | 已激活 正常 |
0x5 | TxTurnOn | 发送启动中 |
0x6 | TxTurnOff | 发送关闭中 |
0x7 | Initialized | 初始化完成(未激活发送) |
| 颜色 | 含义 |
|---|---|
| 正常 | 功率在该 lane 适用的 Low/High Alarm 阈值之间(Tx 优先用 Page 62h 的每-lane 值,没有则用 Page 02h) |
| 橙色 | 功率低于模块的 Tx/Rx Power Low Alarm |
| 红色 | 功率高于模块的 Tx/Rx Power High Alarm |
顶部摘要栏同步显示温度和电压。温度按模块在 01h:146–147 声明的工作温度范围判断:超出上限为红色,距上限 5°C 以内为橙色(这 5°C 余量是本工具定的,不是模块的);模块没声明范围时不着色。电压低于模块在 01h:150 声明的最低值时为红色。模块不在 ModuleReady 状态时,温度照实显示、不做判断。
这是 CMIS 排障时最容易踩的一条,与工具无关,是规范的设计:
因此记住它是主机的责任,本工具替你记:Lane Flags 表里,某个 Flag 曾经触发过、 但现在已经恢复的通道,会保留一个 ●! 标记,与"从未触发"(●) 区分开。点Clear flag history 清空这份记录、从当下重新开始计。 换模块或重新连接也会自动清空。
规范 Table 6-21 规定每个通道 Flag 在哪些 DataPath 状态下可以置位。通道处于 DPDeactivated、DPInit、DPDeinit 时,Tx LOS、Tx / Rx CDR LOL、各项低侧告警 / 警告和 Rx Output 不会被置位;DPInitialized 下 Tx 输出被主机关掉或强制静音时,Tx 光功率低侧和全部 Tx 偏置 Flag 也不会。这些格子显示灰色 n/a——这一位是 0 不代表通道没问题,只是模块此时不报。Tx Failure、Rx LOS 以及高侧告警在任何状态下都会报,照常显示。告警汇总列里如果有部分 Flag 不适用,绿点旁会标 partial。
Lane Flags 表第一列是 DP Changed(11h:134)。按 CMIS 6.3.3,
模块在数据通道经过真实过渡后进入稳定态时置位这一位——换句话说,
它是模块自己记下的"这条通道掉下去又回来了"。
Monitoring 表新增一列 Output,分两行显示 Tx 和 Rx,
读的是 11h:132(OutputStatusRx)和 11h:133(OutputStatusTx)。
CMIS 5.4 Table 8-95 把这两个字节定为只读、必需:
1 表示该路输出信号有效,0 表示被静音或无效。
10h:130 OutputDisableTx)10h:132)10h:138)Lane Flags 表同时新增一列 Rx Output(11h:153)。
按 8.14.2,只有 Rx 侧有这个变化标志(闩锁、读清),
因为只有 Rx 输出的通断会让主机采取动作;Tx 侧规范明确说不定义。
11h:132 本身看不出来;
这个 Flag 是唯一的记录,和其它标志一样会保留
●! 历史标记。
DataPath Config 表里的 DP Deinit 那一列以前只是个显示(Deinit / Active),
点不动。而 10h:128(Table 8-78)按规范是
可读写、必需的,它是唯一能主动停用一条数据通道的手段。
现在它是复选框。按 Table 8-78,一条 Data Path 的所有通道必须取相同值, 所以勾一个会自动带上同条通道的其余几路——在你按 Apply 之前就看得到 会发生什么。两条通道互不影响:停用后四路时,前四路照常运行。
这一节只关系到直接调 REST 接口的人(写脚本、或让 Claude Code 驱动工具)。界面操作不受影响,因为它每次都把全部字段一起发。
app_select 不提及就默认
全部为 1——只发一个极性改动,会把每一路的 Application 重配成 1。
PRBS 一次请求里有四个引擎(主机/媒体侧的产生器和检测器)。它此前是校验一个、写一个:如果第四个引擎的参数非法,前三个已经写进模块了,然后才返回错误。
这条规矩激光器调谐接口一直就有(代码里写着「所有写入先算好并校验完,再一起下发」),只是没推广到 PRBS。现在 PRBS 也是:先把四个引擎全部算好校验完,再统一下发;任何一个不合法,一个字节都不写。
现在所有写入接口统一为:
patterns,每一条通道的码型都被悄悄改成 0 号(PRBS31Q),反相 / 字节交换 / FEC 位置掩码一起清零,然后回复「成功」。target_power 少了 _dbm)被静默丢弃,通道号照改、发射功率没动,回复却是「参数已写入」。enable 拼成 enabled 直接被忽略,回复「成功」,什么也没切换。low_pwr_request_sw,写进去只认 low_pwr——
五个控制里四个如此。把读到的状态原样写回去,四个控制都静默无效。
现在两种写法都接受。
按 CMIS 6.2.3.3.1,Apply 必须对该 Data Path 的所有通道同时触发——
是那一条通道,不是整个模块。工具以前每次都写 0xFF。
分组依据是 Application 声明的主机通道宽度:
一个占 4 条通道的 Application,1–4 路和 5–8 路就是两条独立的 Data Path。
接口返回里多了一个 applied_lanes,写明这次到底重启了哪几路。
129–142 按规范是“独立于数据通道状态机或控制集”的直接控制:
极性翻转、Tx 关断、静默写下去就生效。
以前只翻一下极性再点 Apply,会为一个本来不需要 Apply 的改动
重启全部数据通道。
DPInit / DPDeinit /
DPTxTurnOn / DPTxTurnOff)时收到的 Apply,
模块直接忽略(这条针对支持免中断重配置的模块);DPInitialized /
DPActivated 之外的任何状态都会被忽略。DPDeactivated 上用 Apply(规范推荐的正是这个用法)。
只支持分步重配置的模块行为不变。ModuleLowPwr)时,DataPath 照样可以配置——这正是规范推荐的上电流程。
规范 8.13.1:DPDeinit 这个字节,模块只在 ModuleReady 状态下才会去读;同一段接着说:
主机可以在低功耗状态下先把全部 DPDeinit 位置上,阻止数据通道在上电后自动启动(附录 D.1.3 第 6 步)。
低功耗下所有数据通道都是 DPDeactivated,按 Table 6-3,这时的 Apply 是「只拷贝」:
校验暂存配置并拷进 Active Control Set,真正的初始化要等模块进入 ModuleReady。DPDeactivated,取消勾选才会起来。DPInitialized / DPActivated 下起作用。
模块处于 ModuleFault(只响应复位)或 ModulePwrUp / ModulePwrDn
这两个过渡状态时,这三个操作会被拒绝,并写明模块当前在哪个状态。10h:129–142 的逐通道控制(极性翻转、输出关断、Squelch)规范明确列为
「与数据通道状态机和控制集无关」、写入即生效;暂存 AppSelect 也只是写内存——
这些在任何模块状态下都不受限制。
01h:167 里自己声明了两个上电 / 下电过渡最长要多久,
本工具内置的分页演示模块,全都声明「下电最长 1–5 秒」。
可工具写完控制字节只等了 50 毫秒,页面再过 200 毫秒 就去读状态——
对任何真按自己声明的时间来走的模块,这时读回来的还是按下之前的状态,
却被当作这次操作的结果显示出来。
于是:提示条是绿的(「已请求低功耗」),状态栏还写着 ModuleReady,
操作员自然会再点一次。01h:167)等的。ModuleReady,取决于它回来时那两个低功耗请求位——
所以只等到「状态不再变化」为止。ModuleReady(Eq. 6-4),所以等待时长还要加上 DPTxTurnOff(01h:168)和 DPDeinit(01h:144)的声明时长。6Dh:128 里声明了一次提交最长要多久,
工具本来就把这个值读出来并显示了,然后转头等自己写死的 100 毫秒。2:命令正在执行中——工具也正确解码成「进行中」,
可表格下面那行提示只看「生效了没有」,于是照样写着
「暂存的映射尚未生效 —— 请点提交」。
模块明明说了「我正在做」,界面却叫你把正在执行的命令再下一遍。01h:169 里声明的那一小部分)才会用新页回答;
等不够就会读回上一页的内容——这正是本工具最看重的一条时序规则,
漏了它的表现是时有时无的数据错乱,很难查。14h:132.7 是锁存 + 读后自清的标志:
读一次就没了。它带出来的那句提示说的是——
用参考时钟的发生器 / 检测器「在它恢复之前都不能当真」。
可这条提示以前只看当前这次读到没读到,
于是刷新一次就不见了,
看上去像是参考时钟已经回来了——而模块从没这么说过。
丢失期间产出和校验的数据,在标志被清掉之后依然是可疑的。点 Apply 提交的是整个 Staged Control Set,
而工具以前只读其中的 AppSelect 和几个掩码。
它的另一半是信号完整性(SI)控制,在 Page 10h 的
153–173(Table 8-83 / 8-84):自适应 Tx 均衡、主机控制的均衡目标值、
Rx CDR 旁路、Rx 输出均衡的前/后游标、Rx 输出幅度。
ConfigRejectedInvalidSI(5h)本就是一个合法的拒绝理由,
工具也会把它显示出来——但它指向的值在界面上无处可查。
ConfigRejectedInvalidSI(5h)指向的那半边
后 8 条通道无处可查。DataPath Config 页现在多了一张 Signal Integrity 表,逐通道列出这些值。
列是动态的——只列出 01h:161–162(Table 8-54)声明支持的那几项,
表尾写出模块声明的上限(01h:153–154)。
目前是只读的:先解决“看不到”,修改交给后续。
CDREnableRx 清零的含义是该通道的 CDR 被旁路,信号不再被重定时。01h:151.4(Table 8-50)决定 Rx 光功率监控报的是
OMA(光调制幅度)还是平均功率。
这是两个不同的物理量,在调制信号上相差好几个 dB,
而接收灵敏度限值在规范里是按其中一个写的。
同一个字节里还有几位值得知道:151.7 探测器是
PIN 还是 APD;151.3 Rx LOS 响应的是 OMA 还是 Pav(与上面那位独立);
151.2 / 151.1 是 Rx LOS 和 Tx 关断的快速模式时序。
01h:151.0(TxDisableIsModuleWide)置位时,
任何一路的 OutputDisableTx 会关掉全部 Tx 输出。
下部内存 18–23 是三个普通的 S16 寄存器,
但它们到底测的是什么,由 01h:145(Table 8-50)里的三个位决定:
| 寄存器 | 位 = 0 | 位 = 1 |
|---|---|---|
| Aux1 Lower 18–19 | 自定义(厂商定义,无通用单位) | TEC 电流 |
| Aux2 Lower 20–21 | 激光器温度(1/256 °C) | TEC 电流 |
| Aux3 Lower 22–23 | 激光器温度(1/256 °C) | 附加电源电压(100 µV) |
01h:145 就拿这三个数,它们既没有单位也没有含义——
Aux2 的同一个数可能是摄氏度,也可能是 TEC 电流百分比。
工具此前把它们原样返回、界面一个都不显示,
于是制冷模块的激光器温度和 TEC 电流就白白扔了。
现在 Module Info 里按声明的含义逐行列出,带各自的单位。 TEC 电流是有符号百分比(占模块最大 TEC 电流幅度的比例): 正值是加热,负值是制冷。规范里没有任何寄存器给出那个最大值, 所以无法诚实地换算成安培,工具也不会自己编一个。
01h:159.4-2 声明这三个监控到底存不存在。
不存在就一行也不显示,而不是显示三个 0——
0 °C 和“TEC 没在工作”都是看上去很合理的读数。
非制冷模块(内置的 DR8 / SR8 / FR4)本来就没有;
两个相干演示模块是制冷的,三项都有。
规范 Table 8-99:LaserBiasTx 以「2 µA 为单位,再乘以 Table 8-53 的倍率」——倍率在 01h:160.4-3(×1 / ×2 / ×4)。工具换算读数时一直乘了倍率,但 Monitoring 表 Tx Bias 列的标题固定写着 uint16×2µA,在 ×2、×4 的模块上(内置的相干可调谐演示模块就是 ×2)一个计数其实是 4 µA 或 8 µA。
现在:列标题按模块写,例如 uint16×4µA (2µA × 2, 01h:160.4-3);倍率为保留值 11b 时写 × ?。监控接口的回复多了 tx_bias_scale。手册 8.1 节的表格也补上了这一点和第 9 条以后通道的地址写法。
BER 是误码数除以比特数。一个窗口一个比特都没数过时,模块在那里放的也是 0——最常见的是还没结束过门控的 · last gate 行(模块声明支持门控结果时,连上就是一整行 0),以及刚启用的检测器。规范 Table 8-128 说累计时长要从 TotalBitsCount 推出来。
现在:模块同时报告误码计数(13h:130.1)时,BER 卡片会对照同一窗口的计数器(Selector 02h–05h / 12h–15h),TotalBitsCount 为 0 的通道显示 —(悬停有说明),接口里每条通道多了 host_measured / media_measured。同一个依据也修正了另一处:检测器停下时数过比特但零误码的通道,以前因为 BER 是 0 被显示成 off,现在显示 0 held。
BER、误码计数、SNR 都是先写 Page 14h 的 DiagnosticsSelector(14h:128),等 tDDCS,再读结果窗口。规范 Table 8-136 规定:模块不支持的值会退回 0,而 Selector 00h 的内容是全零(Table 8-137)。
现在:每个 Bank 写完选择器都会读回;没被接受的 Bank,它的通道显示 —,表格下方写明是哪个选择器、哪个 Bank、读回了什么。接口在 /api/module/ber、/counters、/snr 的回复里加了 selector_refused。演示模块按自己 13h:129–130 的声明退回所有不支持的选择器(包括保留值和厂商自定义值)。
Lower 8 的 bit 6–7 是 CdbCmdCompleteFlag1/2(Table 8-9):CDB 命令执行完,模块置位对应实例的这一位(7.2.5.2)。它和同一字节的其它标志一样是闩锁、读后清除的,而 Module Info 每次刷新都会读这个字节。
9Fh:129 即发送),发完再去读 Lower 8,完成标志早已被下一次刷新清掉,看不到。
现在:模块声明支持 CDB 时,Module Info 多一行 CDB Command Complete,每个实例一项——当前置位显示 command complete,已被读清的保留 ●! a command completed since last clear,屏蔽位(Lower 31 bit 6–7)置位时标 masked;与其它标志共用 Clear flag history。它不是告警,不会点亮 ⚠。命令成功与否仍看 CdbStatus(Lower 37–38,Table 8-13)。Raw Registers 读 Lower 8–13 前的清除提示也写明了这一块包含 CDB 命令完成标志。
Table 6-21 规定 TuningCompleteFlag 在 DPDeactivated、DPInit、DPDeinit 下是 N/A,模块在这些状态下不得置位(6.3.4.2);而换栅格或信道只能在 DPDeactivated 下进行(7.5.2)。所以在停下的数据通道上换信道后,Tuning Flags 列的 Tuned 要等数据通道回到 DPInitialized 才出现。
现在:Apply 的读取按刷新时的规则记下除 TuningComplete 外的所有标志,波长失锁会留在 Tuning Flags 列的历史里;接口回复里的 completed 列出报了 TuningComplete 的通道,页面提示 lane N reports TuningComplete,还没报时提示在停下的数据通道上要等它起来。
同一轮:PRBS Generator 卡片下方补了 LOL 图例(PatternGeneratorLOL,14h/0x88·0x89),Checker 卡片的图例补全了 ●!、– 和 gate done;第 10 章按页面现状更新——10.5 原来说「BER 读取无需 PRBS 使能」,BER 实际来自 PRBS 检测器(规范 8.17)。
光功率寄存器以 0.1 µW 为单位(Table 8-99、8-65),能表达的最小功率是 −40 dBm;读数为 0 就是没有光,没有对应的 dBm 值(−∞)。
现在:0 µW 显示为 0.0 µW / −∞ dBm;阈值为 0 µW 时显示 −∞ 0 µW,悬停说明低阈值永远不会触发(高阈值则任何读数都超过)。监控表按这个语义上色。接口里对应的 *_dbm 为 null,阈值接口另给出每个功率阈值的 *_uw。
Page 10h / 12h / 13h / 15h 是按 Bank 分的:Bank b 对应通道 8b+1 到 8b+8,所以 16 通道模块上的第 9 条通道是 Bank 1 的 Lane1,字节和位都与第 1 条通道相同。
11h / 0x9A+(n−1)×2)对第 9 条通道算出来是 0xAA——那是 Tx 偏置的寄存器。
现在:字段名一律写成 Bank 内的通道号并注明 Bank(例如 DPDeinitLane1 (Bank 1)),列头公式写成 ((n−1)%8),即通道在所属 Bank 内的序号。
DataPath 表 AppSelect 列的悬停说明以前写的是「DataPathID bits 3-1」——这是 CMIS 5.4 已改名为 DPIDX 的字段,而且没写里面存的是多少;16 通道模块上第 9 条通道还被标成 10h:0x99 / 11h:0xD6,那是自适应均衡的寄存器,DPConfigLane 按 Bank 计,Bank 1 的第 1 条通道仍在 0x91 / 0xCE。
现在:悬停说明写出暂存的 AppSelCode、DPIDX(以及这个数据通路从第几条通道开始)和 ExplicitControl,地址按所在 Bank 标注。接口 /api/module/datapath 每条通道新增 staged_dpidx、staged_explicit_control。
规范 6.2.3.2.2:数据通路的 DPID 是它占用的最低主机通道号,DPIDX = DPID − 1;「DPConfigLane 里的 DPIDX 字段按 DPIDX 指明这条通道属于哪个数据通路」(Table 8-102 的 bit 3-1)。
10h:145–152)里每条通道都写 DPIDX 0。一个 800G 模块拆成 2×400G(通道 1–4、5–8 各一个 4 通道数据通路)时,这等于告诉模块通道 5–8 也属于从通道 1 开始的那个数据通路——这不是该 Application 能占用的通道组合,真实模块会回 ConfigRejectedInvalidDataPath。而且 DataPath 页每次写入都会重写这几个字节,光改一下极性,就可能把模块原本正确的暂存配置改坏。演示模块只按 Application 宽度分组、从不看 DPIDX,所以一直没暴露。
现在:工具按 Application 的主机通道宽度把通道分成数据通路,每条通道写入所在数据通路的 DPIDX(Bank 内计,未使用的通道写 0),ExplicitControl 位保留模块里原有的值。演示模块在 Apply 时检查 DPIDX,指向别的数据通路的通道会得到 ConfigRejectedInvalidDataPath;它默认的暂存控制集也与活动控制集一致。
规范 8.16.12:「模块可以拒绝它不支持的环回设置(相关寄存器位不变)」。工具在写入前已经按 13h:128 的声明拦下不支持的环回类型、主机侧和媒体侧同时环回、模块没有的媒体通道;但模块还可能因为别的原因拒绝。
现在:写入后逐个 Bank 读回。模块没收下的设置会报错(409),写明哪一项写的是多少、读回是多少;页面随即重新读取,勾选框显示模块实际的状态。写入前的输入错误照旧保留你改过的勾选。
规范 8.12:Page 0Dh 用来「在寄存器里给出固件状态信息,不强迫主机使用 CDB 消息」——哪个 Bank(A、B、固定的出厂 Load)有效、哪个已提交(复位或上电后运行它)、哪个正在运行,以及每个 Load 的主 / 次版本、Build 号和描述(Table 8-75、8-76)。规范 7.3.1:「从 CMIS 5.4 起,版本信息的全部四项都能在 Page 0Dh 的寄存器里读到」。
现在:模块声明支持 Page 0Dh(01h:173.6)时,5.4 页面出现 Firmware Loads 卡片,逐个 Bank 列出有效 / 已提交 / 运行中、版本、Build、描述。正在运行的 Load 版本与 Lower 39–40 报的不一致、或没有任何 Bank 报告在运行时,卡片下方会写明。mock_1600g_dr8 演示了这一页。
规范 Table 8-16:Lower 41 ModuleFaultCause 记录模块进入 ModuleFault 的原因——1 TEC 失控、2 数据存储损坏、3 程序存储损坏、4 发送器故障、5 接收器故障、6 温度相关故障,32–63 为厂商自定义;0 表示没有检测到故障或不支持这一字段。ModuleFault 只响应复位(6.3.2.5.8)。
现在:模块处于 ModuleFault 时,Module State 一行显示红色的 ModuleFault 和原因(例如「cause: TEC runaway」);原因为 0 时写明「cause not reported」。顶栏同时出现红色 ✖ 图标,悬停说明原因并提示只有复位能让它离开。演示模块进入 ModuleFault 后一直保持到复位,复位时原因清零。
规范 Table 8-9:Lower 0x09–0x0B 里每个模块级监控(温度、电压、Aux1–3、自定义)都有高 / 低告警和高 / 低警告四个标志,闩锁、读清。
现在:这一行改名为 Module Flags,逐项列出是哪个监控的哪一级——告警红色、警告黄色——两次刷新之间出现过的保留 ●! 「since last clear」,点 Clear flag history 清掉。只有告警才显示「⚠ Alarm Active」;只有警告时显示黄色「▲ Warning」,顶栏图标也分开。接口 /api/module/status 新增 warning_active,alarm_active 只算告警。
规范 Table 6-9:ModuleStateChangedFlag 只在进入 ModuleLowPwr、ModuleReady、ModuleFault 时置位;如果新状态的退出条件在进入时就已满足(例如复位后没有被要求保持低功耗),这一次不置位。真正判断模块是否重启,规范 8.16.13 给的是 Host Scratchpad:模块每次固件重启都会把它清零。
现在:原来那一行改名为 Module State Changes,显示「State changed since last clear」;新增 Module Restarts 一行,由 Host Scratchpad 判断(说明见「Module State Changes 与 Module Restarts」一节)。顶栏 ↺ 悬停会说明是重启还是状态变化。演示模块复位时清零 Host Scratchpad,并按 Table 6-9 置位 ModuleStateChangedFlag。
规范 Table 8-127:13h:177.7 StartStopIsGlobal 置 1 时,在一个 Bank 上改启停控制——160 / 168 的检测器使能、177.5 ResetErrorInformation——「如同在所有 Bank 上做了同样的改动」。以哪个 Bank 的这一位为准,看写的是哪个 Bank。门控测量并且只有全局定时器(13h:129.3 = 0)时这一位被忽略(Table 8-129)。
现在:这一位生效时,PRBS Checker 表里勾一个 Bank 的通道,其它 Bank 同一位置的勾选框会跟着一起变;各 Bank 使能不一致的请求会被拒绝(400),并指出是哪两条通道。模块没有的媒体通道不算不一致。工具读每个 Bank 的 13h:177.7,任一 Bank 置位就按「作用于所有 Bank」处理。发生器的使能不是启停控制,不受影响。演示模块把检测器使能和 177.5 的改动带到所有 Bank,只带改动的那几位;门控 + 全局定时器时不带。
规范 Table 8-128 ~ 8-130:检测器的使能位(13h:160 主机侧、13h:168 媒体侧)就是误码计数的开关。启用原本关闭的检测器时,这些通道的计数清零后开始累积,门控定时器也从 0 开始;关闭检测器时计数停止,结果仍可通过选择器 01h–05h(以及支持时的 11h–15h)读到。模块声明测量期间不更新(13h:129.4 = 0)时,检测器在跑时数字不动,关掉或门控到时才出结果。
mock_fr4x2 数字照样每次都变。PRBS 的 LOL 标志也不对:任何一个引擎在锁定过程中,整个 bank 八条通道全部置位,锁上后直接写 0——只启用一条通道,另外七条也显示失锁;锁上之后才读的主机则根本看不到这次失锁。
现在:演示模块每个检测器各自计数,只在启用期间累加,启用时清零重来,关闭时停住并保留结果;BER 就是它计到的误码数除以比特数。LOL 只在正在锁定的那条通道上置位,闩锁到被读取为止。BER 表和误码计数表里,没有检测器在运行的通道显示灰色 off;检测器已关闭、留有结果的显示数值并标 held(悬停有说明);一个检测器都没开时表下写明「No pattern checker is running」。PRBS 表里没有运行的发生器 / 检测器,Lock 一栏显示「–」,不再是表示已锁定的绿点。
规范 Table 8-97:11h:135 的 FailureFlagTx(以前叫 Tx Fault)表示「发送部分内部失效,导致不确定的故障」,闩锁、读清。
现在:演示模块不模拟发送器失效,关断输出不会再置位这个标志;真有置位时会一直保持到被读取。Flags 表的列名改为规范现在的名字 Tx Failure(悬停说明原名 Tx Fault)。
规范 Table 8-8:Lower 0x04–0x07 是标志汇总,每个 Bank 一个字节,分别表示 Page 11h / 12h / 14h / 2Ch 上「至少有一个标志置位」(Bank 0 的 Page 11h 那一位是必需的)。清除汇总位要去读对应页上的标志本身。
现在:Module Info 的 Interrupt 一行下方写明「Flags set on: Page 11h / Page 12h bank 1 …」,Page 2Ch 会注明「VDM — not shown by this tool」。演示模块按各页实际置位的标志维护这四个字节。
规范 8.1.3.8(CMIS 5.4 维护项 M11):主机遇到保留值时,「应当把它理解为未知、不可用或超出已知范围」。
01h:160[4:3])读到保留的 11b 时按 ×1 处理,于是每个偏置读数和偏置门限都用一个模块没说过的单位显示,最多差 4 倍;Lower 0x02[1:0] AutoCommissioning 在「只支持分步重配置」时读到保留的 11b,被当成「两种都不支持」,ApplyImmediate 因此被拒绝——理由是模块并没有说过的。
现在:偏置倍率为 11b 时,Monitoring 的 Tx Bias 列和阈值卡片的偏置门限显示 unknown(悬停说明原因),不再给出数字;AutoCommissioning 为 11b 时,Module Info 显示「unknown」,ApplyImmediate 不再以「不支持」为由拒绝,但「过渡状态下不接受 Apply」的保护照旧。
规范 Table 8-68:04h:128 的第 n 位声明栅格码 n(3.125–75 GHz),04h:129[6] 声明 150 GHz,04h:129[5] 声明 300 GHz;04h:130–169 的信道范围对每个栅格都是必需字段,本身不代表支持与否。
现在:栅格下拉和范围提示只按声明位列出,[0, 0] 的单信道栅格照常列出;改到未声明的栅格会被拒绝并说明原因(通道本来就停在某个未声明栅格上时,可以原样写回)。演示模块也按声明位判断,未声明的栅格即使信道为 0 也会报 TuningNotAccepted。
规范 Table 8-109:FineTuningEnableTx(12h:128[0])和 FineTuningOffsetTx(12h:152–167)的类型是 RW Adv.,由 04h:129 声明;CMIS 5.4 的缺陷修正里也专门写了一条「Page 12h 的微调控件是声明才有,不是必需」。8.1.3.7:Adv. 字段「在明确相关的功能声明里标明时才支持」。
04h:129[7],一律给出微调偏移输入框,写入时也总是写这两个控件,还拿 04h:192–195 做范围检查——而在不支持微调的模块上,这几个字节什么都不代表。
现在:模块未声明微调时,微调偏移框变灰并说明原因,页面不再发送微调字段;接口拒绝非零偏移和「启用微调」(说明 04h:129.7 未置位),偏移为 0 时不写偏移寄存器。演示模块在未声明微调时不会把偏移算进频率。
规范前言里有两份变更清单:第 8–10 页是 Rev 5.3 的,第 11–12 页才是 Rev 5.4 的。主机侧通道切换(01h:252[7]、Page 1Dh)在 5.3 的清单里(E14),Table 6-21 的 Page 12h 几行(E07)和 Page 02h 阈值随 Application 变化的提示也都是 5.3 加的。
现在:Module Info 每一行写明它显示的字段,是否带 5.4 徽标由清单决定;清单只收 5.4 变更清单里列出的内容,每一项都能在某个接口的返回里找到。Host Lane Switching 的行和卡片不再带 5.4 徽标,手册相关几处改为 5.3,第 12 章的 5.4 可选页表里去掉了 1Dh(12.4a 注明它是 5.3 引入的)。
规范 Table 8-9:Lower 0x08 除了 bit 0 的 ModuleStateChangedFlag,还有三个固件标志——bit 1 ModuleFirmwareErrorFlag(主固件自检发现故障)、bit 2 DataPathFirmwareErrorFlag(DSP 等辅助器件的固件故障)、bit 3 AbnormalFwIndicationFlag(CMIS 5.4 新增:正在运行的固件与标称版本不一致)。都是闩锁、读清。
现在 Module Info 多了一行 Firmware Faults:当前置位的显示为红字,已被读清的保留 ●! … since last clear,对应的屏蔽位(Lower 0x1F)置位时标出 masked;前两个固件错误还会在顶部摘要栏出现 ✖。与其它标志共用 Clear flag history。它们不算「监控值超阀值」,不会点亮 ⚠。CdbCmdCompleteFlag(bit 6–7)当时不显示;v2.172.0 起另有一行 CDB Command Complete(见上文)。
规范 Table 8-138:14h:134 / 14h:135 是逐通道的 PatternCheckGatingCompleteFlag(主机侧 / 媒体侧),「门控完成时,这一位会被置位」——闩锁、读清。它是「上一个门控结果已经就绪」的唯一信号。
现在:工具把它记进 Flag 历史,PRBS 页的主机侧 / 媒体侧检测表在对应通道的 LOL 一栏后面标出 gate done(悬停说明结果在 BER / 计数表的 last gate 行里),点「Clear flag history」后清掉。演示模块在门控到时,为正在运行检测器的通道(13h:160 / 13h:168)置位,每个 bank 各自置位。
规范 Table 8-137 把诊断选择器分成两组:01h–06h 是「实时结果」,11h–15h 是「最近一个已完成门控周期的结果(在门控周期内保持不变)」,模块在 13h:129.5 GatingResultsSupported 声明是否提供。Table 8-129 自动重启门控那一行写得很明白:门控到时,当前误码信息清零、门控重新开始,「主机必须用选择器 11h–15h 读取上一个门控时段的误码信息」。
现在:模块声明支持时,BER 表和误码/比特计数表下面多出几行 · last gate,是上一个完整门控周期的结果(选择器 11h / 12h–15h),在下一个周期结束前保持不变;还没有完成过门控时是 0,测量窗口说明里会写明。演示模块:门控到时把结果复制到 11h–15h;开了自动重启(13h:177.4,且 13h:129.2 声明支持)就清零重新计数,否则停止计数;ResetErrorInformation(13h:177.5)置 1 时冻结并复制,清 0 时重新开始、11h–15h 不变;改门控时间开始新一轮;每个 bank 各有自己的门控;不支持的选择器按规范回到 00h,数据区全 0。
规范 Eq. 6-12:DPDeactivateS = DPReDeinitS OR DPTxDisableT OR DPTxForceSquelchT,后两项是对这条数据通道所有媒体通道取「或」。表注:「在 DPActivated 或 DPTxTurnOn 下,对一条或多条媒体通道设置 OutputDisableTx 或 OutputSquelchForceTx,会让整条数据通道经 DPTxTurnOff 转到 DPInitialized。」附录 D.1.3 的软件上电流程就是先把 Tx 全关,让数据通道初始化后停在 DPInitialized,再打开 Tx。Table 6-18:DPInitialized 下每一路 Tx 输出看它自己的 OutputDisableTx / OutputSquelchForceTx。
现在:演示模块在任一路 Tx 被关断或强制静音时,把整条数据通道经 TxTurnOff 带到 Initialized,恢复后经 TxTurnOn 回到 Activated;带着 Tx 关断初始化、退出低功耗或放开 DP Deinit 的数据通道停在 Initialized;Initialized 下没被关的通道照常发光,Rx 侧照常转发;复位把 Tx 关断和强制静音恢复为 0。16 通道演示模块的第 9–16 通道同样如此。工具在 DataPath 和 Squelch 页的这类写入之后提示「Data Path L1–8 leaves DPActivated for DPInitialized」,Output 列的悬停说明也按 Initialized 下的规则改写。
规范 8.13.1:模块只在 ModuleReady 下评估 DPDeinit;「主机可以在低功耗状态下把全部 DPDeinit 位置上,阻止自动初始化」——附录 D.1.3 软件上电流程的第 6 步就是这么做的。Table 6-3:对 DPDeactivated 通道的 ApplyDPInit 是「只拷贝」,先写进 Active Control Set,再经状态机初始化;6.3.3 也说 Active Control Set 在 ModuleLowPwr 和 ModuleReady 下都可以更新。
现在:低功耗下 DP Deinit 和 Apply 都会写入,提示「Provisioned in ModuleLowPwr」;退出低功耗后,没被按住的数据通道按 Active Control Set 初始化,被按住的保持 DPDeactivated。ApplyImmediate 仍被拒绝(DPDeactivated 下不起作用);模块处于 ModuleFault、ModulePwrUp / ModulePwrDn 时,这三个操作被拒绝并说明原因。演示模块:低功耗下 16 个通道都是 DPDeactivated;低功耗下的 Apply 只写进 Active Control Set,上电时才初始化(DPInitPending 随之清除,阈值随之更新);复位把所有 bank 的 DPDeinit 恢复为 0。
规范 Table 8-3:从 WO(只写)元素读,得到的是不可预测的值;从 WO/SC 元素读,得到 0——WO/SC「主要用于需要保护写入数据隐私的场合」。Page 10h 的 ApplyDPInit 和 ApplyImmediate 还规定:「这个字节必须用单字节 WRITE 写入」。
00h:118–125,WO/SC)读回成刚写进去的密码,ApplyDPInit 一直读回上次写的 0xFF;Raw Registers 的十六进制显示把它们当成普通数值;Raw Registers 还能把触发字节夹在一次多字节写入里发出去。
现在:演示模块的只写字节读出来是 0,夹在多字节写入里的触发字节不生效;工具拒绝把 10h:143 / 10h:144 夹在多字节写入里(提示单独写);Raw Registers 读到只写字节时,在十六进制显示上方标出「write-only……not what was written」。
规范 Table 8-3:「对只读元素的 WRITE 是允许的,但没有任何效果。」
00h:129 能改掉厂商名,写 Lower 0 能改掉模块标识,Module Info 随后就显示新的身份——和真实模块的行为正好相反。
现在演示模块只接受主机能写的位置(控制、掩码、密码、页映射,Page 10h,12h / 13h / 14h / 1Dh / 6Dh / 60h 的可写部分等),写到广告、状态、Flag、监控值和 Page 00h–04h、0Ch、11h、1Ch、61h、62h 上的值会被忽略。写入操作本身仍然回报成功——规范说的是「允许但无效果」;写完用 Read 读回就能看到值没变。真实模块不受影响。
CMIS 5.3 给 Table 6-21 加了 Page 12h 的几行(E07):WavelengthUnlocked 在 DPDeactivated、DPDeinit 下不报,TuningComplete 在 DPDeactivated、DPInit、DPDeinit 下不报。
现在先看是否在调谐(显示 Tuning...),数据通道处于 DPDeactivated / DPDeinit 时显示 n/a 并悬停说明,其余情况才显示 Locked / Unlocked。接口每条通道新增 tuning_flags_not_allowed。
规范 Table 8-68:04h:190–191 FineTuningResolution 是激光器微调的步进(单位 0.001 GHz)。偏移寄存器本身能写任何 0.001 GHz 的值,而规范里没有一个 Flag 会指出「这个偏移落在两个步进之间」——模块只会自己取整到某处。
04h:192–195),微调输入框固定按 0.001 GHz 步进。在按 100 MHz 步进的激光器上,写 0.05 GHz 也会回报「已应用」,激光器实际停在哪里没人知道。
现在不是整数个步进的偏移直接拒绝(400),提示两边最近的可用值;微调输入框按模块声明的步进走,悬停说明步进。演示模块声明 1 MHz,所以演示里任何 0.001 GHz 的值都可用。
规范 Table 8-68 给每种栅格定了信道编号:大多数是 193.1 + n × 间隔,但有三种不是——
193.1 + n × 0.025,n 必须是 3 的倍数193.1 + (n+3) × 0.025,n 必须是 6 的倍数193.1 + (n−9) × 0.0125,n 必须是 24 的倍数现在:不是该栅格信道的编号直接拒绝(400),什么都不写;只改栅格、不改信道时,用原来的信道号一起判断。激光调谐表的信道输入框按栅格步进(×3 / ×6 / ×24),范围提示里注明倍数,悬停显示这个信道按 Table 8-68 对应的频率,可以和模块实测频率对照。演示模块的频率、信道范围和「无效信道」标志也都按这张表来。
规范 7.5.2:「选择另一个光信道(栅格间隔或信道号)时,模块必须处于 DPDeactivated 状态。在其它 Data Path 状态下改信道,可能导致未定义的行为,因为模块可能在改动之前或之后调谐激光器。」微调偏移和目标输出功率则可以在 Data Path 不处于过渡状态时修改。
现在:承载该媒体通道的 Data Path 不在 DPDeactivated 时,改栅格或信道会被拒绝(409),什么都不写,并说明原因;Data Path 处于过渡状态时,微调和目标功率也会被拒绝。页面每次 Apply 都会重发所有字段,值没变的不算修改。激光调谐表里,Data Path 在运行时栅格和信道输入框锁定,悬停说明要先在 DataPath 页用 DP Deinit 停下;表格下方加了一行说明。通道 9 以后的寄存器悬停提示也改为引用各自 Bank 的地址(以前通道 9 指向的是 Bank 0 里通道 1 的字节)。
规范 Table 8-127(时钟与测量控制)在 Page 13h 上,而 13h 是分 Bank 的:每组 8 条通道都有自己的码型时钟源(13h:176 / 178)和自己的门控时间、自动重启、更新周期(13h:177)。只有启停动作可以设成对所有 Bank 生效(177.7)。
现在每个 Bank 都读。Diagnostics 的测量窗口说明里,设置与 Bank 0 不同的 Bank 会单独列出(门控时间、自动重启、更新周期);PRBS 卡片上各 Bank 时钟源不同时逐个列出;参考时钟丢失的提示,只要某个 Bank 里的引擎用了参考时钟就算在内。各 Bank 一致时显示和以前一样。
16 / 24 通道演示模块完整模拟的是 Bank 0,后面的 Bank 只做了部分模拟。上一版修了其中一处(DPDeinit),这次又找到两处写到后面 Bank 的操作,却落到了 Bank 0 的模型上:
工具本身每个 Bank 都写对了,是演示模块显示错了通道。现在后面的 Bank 各自响应:Apply 立即把暂存配置放进该 Bank 的 Active Control Set 并报 ConfigSuccess(完整的校验和状态机流程仍只在 Bank 0 模拟);码型锁定按 Bank 计时。真实模块不受影响。
DataPath、Squelch、Loopback、PRBS 的写入接口里,通道掩码既可以是按 Bank 的字节列表,也可以是一个数。
0xFFFF),结果是 1–8 停下、9–16 被释放;
现在一个数就是覆盖所有通道的掩码(第 i 位对应通道 i+1),按 Bank 拆开写入;超出模块通道范围的位直接拒绝(400),什么都不写。列表形式照旧,每个 Bank 一个字节。页面本身一直按 Bank 发送,不受影响;DataPath 表里通道 9 以后的寄存器悬停提示,现在引用的是它自己那个 Bank 的字节。演示模块的后面几个 Bank 也会响应 DPDeinit 了。
规范 7.9.4:「主机必须保证,任何已初始化或已激活的 Data Path,在媒体通道切换配置变化时要么整条受影响,要么完全不受影响。」模块只是「应当」校验(结果码 5「与活动 Data Path 不一致」)——不校验的模块会照单提交,把一条 Data Path 拆成两半。
2,1,4,3,5,6,7,8,在所有内置的媒体通道切换演示模块上,都是在交换那条 8 通道 Data Path 里的两条通道。
现在提交前先检查:如果某条已过 DPInit 的 Data Path(DPInitialized / DPActivated 及二者之间),它的媒体通道只有一部分会换到别处,就拒绝这次提交,什么都不写,并说明是哪条 Data Path、哪几条通道。比较的基准是交换机当前的连接(6Dh:184–191),不是初始的一一对应。只暂存、不提交不受影响。Data Path 停下来后可以随意调整。示例改成了 5,6,7,8,1,2,3,4:前后两半对调,任何对齐的 Data Path 都是整条移动。
目前只能判断第一组 8 条通道里的 Data Path(多于 8 条通道的模块,后面各组的媒体通道分配规范没有写明,本工具不猜)。
规范 7.9:每组始终有 8 条外部媒体通道,而内部媒体通道数 n 取决于模块(7.9.1:由应用描述符和 00h:210 声明)。7.9.3 规定重定向寄存器只有前 n 个填 1–8 的目标,n 小于 8 时其余填 0;7.9.4 要求的是「n 条内部通道一对一映射到 8 条外部通道中的 n 条」——只有 n = 8 时才是置换。
5,0,0,0,0,0,0,0,把唯一的内部通道放到外部通道 5)会被拒绝;模块自己填的 0 被标成红色「不是置换」;反而可能给模块没有的内部通道写目标。
现在按 7.9.3 判断:模块有的每条内部通道各对应一条不同的外部通道 1–8,没有的填 0。表格里没有的通道显示 none,悬停说明依据;输入框的示例也按模块的通道数给出。8 条内部通道都有的模块,规则和以前一样就是置换。ZR 相干演示模块只有 1 条内部媒体通道,现在声明支持媒体通道切换,可以直接试 5,0,0,0,0,0,0,0。
规范 Eq. 6-6:DPDeinitS = (NOT ModuleReadyT) OR LowPwrS OR DPDeinitT——低功耗请求本身就会让所有数据通道停下来。Eq. 6-4 / 6-5 又规定:只有所有数据通道都到了 DPDeactivated,模块才离开 ModuleReady。所以从正在运行的模块进入低功耗,要依次走完 DPTxTurnOff、DPDeinit,再走 ModulePwrDn。
01h:167)等,超时就报「模块在声明的时间后仍处于 ModuleReady」。数据通道停得比下电慢的模块,明明在按规范先停通道,却会被报成没理会请求。演示模块是瞬间切换的,看不出这个问题。
现在,如果请求时还有数据通道没停,等待时长是三段声明之和:DPTxTurnOff(01h:168,只在有通道开着 Tx 时计入)+ DPDeinit(01h:144)+ ModulePwrDn(01h:167)。任何一段模块没声明,就不替它编一个数字。真等满了还没到,提示里会写明「模块会先让所有数据通道停下,全部到 DPDeactivated 后才离开 ModuleReady」。数据通道都已停下时,仍只按 ModulePwrDn 等。
规范 Table 6-21(逐通道 Flag 符合性规则)规定了模块在哪些 DataPath 状态下可以置位每个通道 Flag。CMIS 5.3 又给这张表加了 Page 12h 的几行。在 DPDeactivated、DPInit、DPDeinit 下,模块不报 Tx LOS、两个 CDR LOL、所有低侧告警/警告和 Rx 输出变化;DPInitialized 下,主机关掉或强制静音了 Tx 输出的通道,也不报 Tx 光功率低侧和全部 Tx 偏置 Flag(表注 1)。
现在这些格子显示 n/a,悬停说明依据和当前状态;告警汇总列在部分 Flag 不适用时,绿点旁标 partial,悬停列出哪些不在其内。已经置位的 Flag 照常显示——Flag 是闩锁的,状态变化前触发的那一次仍然有效。接口里每条通道多了 datapath_state 和 not_allowed。演示模块也按这张表只在允许的状态下置位。
规范 8.5 节:Page 02h 的告警 / 警告阈值「可能取决于已投入使用的 Application,因此每次投入新的 Application 时都可能改变(包括校验和)」;模块在 Data Path 以新 Application 到达 DPInitialized 时更新它们。CMIS 5.3 把这一点作为提示写进了 Page 02h。
现在每次监控刷新都带上每条通道正在使用的 Application(11h:206–213)。某条通道的 Application 变了,或它的 Data Path 刚过了 DPInit,工具就重新读取阈值,先读完再着色。Module Thresholds 卡片下方加了一行说明。
ZR 相干演示模块(mock_coherent_zr)的 AppSel 2 带有自己的一组光功率阈值(演示值),在 DataPath Config 页切到 AppSel 2 就能看到卡片随之更新。
CMIS 5.3 新增了主机侧通道切换(7.8 节、Page 1Dh,由 01h:252[7] 声明):每组 8 条通道内,可以把电气主机通道(线真正接的那条)连到另一条名义通道上。Application 和 Data Path 寄存器按名义通道编号——所以切换生效时,DataPath、Monitoring、Flags 各面板上的「通道 1」不一定是插在电气通道 1 上的那一路。
现在:Module Info 多一行 Host Lane Switching(支持 / 不支持);支持的模块在 DataPath Config 标签页多一张 Host Lane Switching 卡片(在 Media Lane Switching 上方),逐条电气通道列出已下发(1Dh:136–143)和当前生效(1Dh:184–191)的名义通道,以及上次提交结果。有通道被换到别处时,卡片顶部写明是哪几条电气通道,并提醒其它面板的通道号是名义通道。多于 8 条通道的模块逐组读取,目标显示为绝对通道号。
这张卡片只读。24 通道演示模块声明支持,第一组里电气通道 1、2 互换,可以直接看到提示。
在 24 通道演示模块上关掉通道 1,通道 9 和 17 的 Tx 输出状态也跟着显示「关」,而它们自己的光功率照常——这是演示模块的问题,不是工具读错:工具按 Bank 逐个读 11h:132–133(Table 8-95),演示模块却把 Bank 0 算出来的输出状态写进了 Page 11h 的每一个 Bank。
现在演示模块的每个 Bank 按自己的 Tx 关闭、强制静噪、Rx 输出关闭和通路状态给出输出状态;后面 Bank 的通道关掉后光功率也会随之变暗,重新打开恢复原值。连接时不会在这些通道上误报「Rx 输出变化」标志。真实模块不受影响。
上一版把 Table 7-8 的 NA 值用到了监控面板。同一张表还规定了:实测激光频率(Page 12h,U32)的 NA 值是 0;SNR(U16)是 0;码型 BER(F16)是 0.5;码型误码数(U64)是最大值。
现在这四处都显示 NA 并写明依据;误码数是 NA 时,由它算出的 BER 也显示 NA(「no valid error count」)。F16 的 0.5 有不止一种编码,按数值识别。未声明支持的模块照原样显示。
规范 7.10.2 / Table 7-8 给每个基础监控量规定了一个 NA 值——模块拿不到有效采样时填的特殊数值:温度、TEC 电流、激光器温度是 -32768;Vcc、Tx 偏置、Tx 光功率是 0;Rx 光功率分两种,0 表示通道未使用,1 表示通道在用但暂时没有有效采样。模块在 0Ch:192.7(NaSupported,Table 8-73)声明它使用这些值。
现在模块声明支持 NA 值时,这些读数显示为 NA,并写明原因(Rx 光功率会区分「通道未使用」和「暂无有效采样」);悬停说明依据。没有声明的模块,数值照原样显示——工具不会自己认定 -128 °C 不可能。Tx 关闭的通道在这些模块上报 0,按规范就是 Tx 光功率的 NA 值,所以会显示 NA。
顺带修正:Module Info 里的温度 / 电压行,模块没实现该监控时以前会显示「undefined °C」,现在显示「not implemented」。
规范 Table 10-2:从复位释放到模块能读出寄存器默认值,最长 2 秒(tMgmtInit);Table 8-11 说软件复位「和把 Reset 硬件信号拉低足够时间再释放效果相同」,所以这 2 秒同样适用于 Control 面板上的复位按钮。这段时间里模块可以对任何读写都不应答,之后才开始上电(ModulePwrUp)。
01h:167,演示模块是 100–500 ms)算,复位后的第一次读取也不重试。在一个真用满 MgmtInit 时间的模块上,复位后第一次读状态就直接报错,页面的等待也可能在模块一次都没应答之前就结束了。
现在复位的等待预算是「2 秒 MgmtInit(Table 10-2)+ ModulePwrUp 声明时长」,复位后的读写在这 2 秒内被拒会自动重试;超过仍不应答,才报错。进入/退出低功耗不经过 MgmtInit,照旧只按声明时长等。
规范 Table 10-8 的注 1:「这里给出的数值是 MaxDurationDPTxTurnOff 和 MaxDurationDPTxTurnOn(01h:168)这类声明时长的上限」——Tx 输出关断最长 100 ms(ton_txdis),开启最长 400 ms(toff_txdis)。
现在这两个状态取「模块声明」和「规范上限」中更严的那个来判断;上限来自规范时,提示会写明「超过了 CMIS 允许的时间(Table 10-8,模块声明的是……)」,而不是说模块自己怎么声明的。模块声明得比规范更严时,仍按模块的来。DPInit / DPDeinit 规范没有另设上限,照旧按声明判断。
规范 Table 10-4:一次 WRITE 之后,模块可以在最长 10 ms(tWRITE,总线上叫 tNACK)内拒绝接下来的任何读写;写非易失存储器(Page 03h 用户 EEPROM,规范 8.7)之后最长 80 ms。5.2.3 给主机的办法是:按最坏时序等待、被拒后重试,或先探测模块是否就绪。
现在每次写入之后,工具会在规范允许的拒绝期内(一般 10 ms,Page 03h 为 80 ms)对被拒的读写自动重试;超过这个时限仍被拒,才作为真正的错误报告——不会无限等下去。没有写入在先时,被拒就是被拒,不重试。
规范 5.2.5.1:用和寄存器同样长的一次 READ 读一个多字节只读标量,模块保证读到的是同一时刻的值——「这条尤其适用于任何 2、4、8 字节的状态或监控寄存器」。而「对多个寄存器或寄存器数组的 READ 不保证一致」。
工具显示的会变的多字节量,之前都是整块读的:
现在这些量都按各自的长度逐个读取:U16 读 2 字节,U32 读 4 字节,计数器(U64)读 8 字节。代价是读寄存器的次数变多,刷新会略慢一点。Raw Registers 仍按你给的长度读取——在监控区整块读时,单个值同样不保证一致。
规范 5.2.2.2:「一次成功的 WRITE 写入最多 8 个字节」;更长的只有第 8 章明确允许的地方才行。被拒绝的 WRITE「对模块没有任何作用」。
读取早就按这个上限分块了,写入却没有。两处会一次写超过 8 字节:
13h:224–255,最长 32 字节;Table 8-134 并没有放宽)现在超过 8 字节的写入会拆成多次、每次最多 8 字节;Raw Registers 写完会注明分了几次(规范 5.2.5.2:多字节写入本来就不保证是一次整体写入)。刚好 8 字节的写入(比如一个 PRBS 引擎块、8 个 AppSel 字节)照旧一次写完。
唯一的例外是 Page 9Fh 的 CDB 消息头:写到 9Fh:129 就会发出 CDB 命令(规范 7.2.3),拆开写会让命令在消息头还没写完时就发出。所以超过 8 字节、又包含字节 129 的写入会被拒绝,并提示先写其余部分、最后写含 129 的那段。
内置模拟模块现在也会拒绝超过 8 字节的 WRITE,于是整套测试就成了一次全面检查:其它所有写入口都没有超过这个上限。
13h:177.7 StartStopIsGlobal(Table 8-127)置 1 时,在一个 Bank 上写启停控制——177.5 的复位、160 / 168 的检测器使能——等同于在所有 Bank 上同时写。
Table 8-129 给了一个例外:门控测量、并且模块只有一个全局 gate 定时器(13h:129.3 = 0)时,这个位被忽略。测量窗口那一行把这个例外当成了整条规则:只要 129.3 = 0 就说「被忽略」,不门控时也这么说。而不门控的情况归 Table 8-128 管,那里 177.7 = 1 有专门的一行:切换 177.5 会复位「所有 Bank 的所有通道」。
现在:
13h:129.7-6 = 00b)时按不门控处理。这一节规范带着编辑注释「应改写以更清楚」,Table 8-130 里还有「因为 129.3 = 0 所以被忽略」这种与表名矛盾的行。工具只采用规范说得明确的部分,不自己补全。
Table 8-11:Lower 0x1A[7] BankBroadcastEnable 置 1 时,对通道分 Bank 的页上任何控制寄存器的写入,都会同时写进所有 Bank。
工具早先给 DataPath 和 Squelch 的写入加了这项检查,后来媒体通道切换也加了。另外四个同样逐 Bank 写入的地方却没有:
现在这四处也会拒绝各 Bank 不一致的请求,说明是哪一项,原配置不动;各 Bank 取同一个值时照常写入。激光调谐会指出会被连带改动的媒体通道,例如 setting the channel of media lane 3 would set it on media lane 11 too。PRBS 检查的是每个 Bank 实际要写的整块内容,包括请求里没提、沿用原值的字段。
规则属于写入方式,不属于最先发现它的那个面板:凡是选 Bank 再写的地方都要问这一句。
上一版把「按媒体通道」这条规则教给了 Page 10h 的通道控制。Page 13h 上有同一类控制,却被漏掉了:
MediaSideOutputLoopbackEnable / MediaSideInputLoopbackEnable,Table 8-131)环回的是媒体通道——Figure 8-2 的示意图上就写着「只画出一条媒体通道」。现在:
00h:210 和对应的表;置灰但保留原值。null。主机侧照旧。规则属于寄存器家族:凡是按媒体通道索引的控制,都要问一句「这条媒体通道在不在」。
Table 8-79 把 Page 10h 上的三项通道控制定义为按媒体通道:OutputDisableTx(「媒体通道 <i> 的 Tx 输出禁用」)、AutoSquelchDisableTx 和 OutputSquelchForceTx。
写这三项的两个面板——DataPath 表的 TX Enable 列、Squelch 表的两行 Tx——都按主机通道排行,也没有说明索引的其实是另一侧。
现在:
00h:210 和 Table 8-79;置灰但保留原值——页面整字节回写,清掉反而成了一次改动。01h:151.0)同步勾选时,跳过置灰的格子。上一版让诊断页学会了「媒体通道可能不存在」;这一版是同一条规则的写入一侧——规则属于寄存器家族,不属于最先发现它的那个面板。
Page 14h 的诊断数据按侧命名(Table 8-139):MediaSideSNRLane<i>、MediaSideBERLane<i>,以及「媒体通道 1–4 / 5–8 的误码与比特计数」——都是媒体通道。
相干模块把 8 条主机通道汇进一路光载波,只有 1 条媒体通道,00h:210 会说明缺哪几条。Monitoring 和 Flags 早已照此处理(不存在的媒体通道显示 n/a),诊断页却没有。
mock_coherent 上,SNR、BER、误码计数三张表都给出了8 条媒体侧读数,其中 7 条是模块根本没有的通道——比如第 8 条的媒体 BER 显示为 9.92e-05,那是对「不存在的东西」的测量。
现在这三张表对不存在的媒体通道显示 n/a,悬停说明依据是 00h:210;接口里对应的值为 null,并附 media_lanes_present 列表。主机侧不受影响。
误码计数表还有一个反方向的问题:一条通道一个比特都没计数时,接口给出 BER 0.0——也就是「零误码」,这是一个结论;而页面只显示大于 0 的值,于是真正零误码的测量(比如一万亿比特里没有一个错)也显示成「—」。「没有测量」和「完美的测量」看上去一模一样。现在没计到比特时为 null(显示「—」),零误码显示为 0,并说明这是零计数而非测得的下限。
DataPath 页的 Apply 会拒绝模块会静默丢弃的请求,并说明:「this would report success and change nothing」。
这不只是上一版加的那一条。检查下来,五种拒绝全部如此:配置进行中、数据通路处于过渡态、非初始化态下的 ApplyImmediate、模块不支持 ApplyImmediate、以及同时要两个触发器。
现在这五种判断都挪到了任何写入之前:被拒绝的请求对 Page 10h 一个字节都不写,提示说「什么都没变」就真的什么都没变。不被拒绝的请求照常写入,规范要求的「DPDeinit 与 Apply 同一次写入」的释放流程也不受影响。
一个已经生效了的「拒绝」,比不拒绝更糟——它恰好在模块发生变化的那一刻,告诉操作员去别处找原因。
上一节的规则是按数据通路的:规范 6.2.4.2 说模块忽略的是「那些通道上的新触发」,并且「不在那些通道所属的数据通路上执行」——不是整个模块。工具从 v2.115.0 起就是这样判断的。
mock_fr4x2(两个 400G 端口)上,端口 1 正在重配时对空闲的端口 2 按 Apply,工具正确地放行了,演示模块却悄悄扔掉——通道 5–8 从没进入 ConfigInProgress,生效的 Application 也没变。
一个比规范更严的演示模块,教给人的是一条规范里没有的规矩。现在演示模块每条数据通路各自跑自己的命令、各自计时:两个端口可以同时重配、各自报告结果;一次触发如果同时点到忙和闲的两条数据通路,只在闲的那条上执行;忙的那条仍然照规范忽略。
规范 6.2.4.2:
工具此前已经拦下了 6.2.4 里另外两种「静默丢弃」——数据通路处于过渡态、以及在非初始化状态下用 ApplyImmediate——唯独漏了这一种。
现在,只要本次要触发的通道里有任何一条仍在 ConfigInProgress,请求就会被拒绝,并点名是哪几条通道;不会写出触发位。等上一条命令出结果(Monitoring 页 Config Status 列)再按即可。
Table 8-196 对 EnableMediaLaneRedirection(6Dh:152)的定义是:
注意是「没有效果」,不是「被拒绝」:模块什么都不改,也不写任何 RedirectionCommitResult,所以它从不说自己忽略了什么。
现在这种 commit 会被直接拒绝,且在写任何东西之前——同一请求里的映射也不会被暂存,不会留下半截操作。判断时按「这次请求自己的 Enable 已经写入之后」来算,因为 Enable 先写、Commit 后写。6Dh 按 bank 分组启用,任何一组处于禁用都会被拒绝,错误信息会点名是哪一组。只「暂存」(Stage)不受影响——那本来就是启用之前准备映射用的。
表下的提示也改了:模块处于禁用状态时,它会说「先勾 Enable,再 Commit」,而不是让你再按一次 Commit。
结果列按类着色。Table 8-196 的结果码 3–6 都是拒绝,大于 6 的是保留值。此前它们全部以同一种中性文字显示,「Rejected: conflicts with active DataPath」和「Success」看上去是同一类回答,保留码则显示成「Code 7」。现在成功为绿、执行中为黄、拒绝为红,保留码写作「Reserved (7)」。
Module Info 里的 Default Polarity 读的是 01h:171-172,一共八个位。规范 8.4.13 说得很清楚:
所以这八个位到底在说哪些通道,取决于通道数和一项声明,而不是取决于寄存器本身:
现在这一行会按实际适用的通道铺开(第三种情况下列出 1、9),并在后面注明它说的是哪一组通道、依据是哪一节。
规范 8.30 说「Page 60h 的每个 bank 对应 8 条通道」。工具把各 bank 读到的结果直接首尾相接,却没有重新编号——于是一个 24 通道模块返回的数据里,有三条通道都叫「1 号」。
界面上那张表是按位置渲染的,所以看着是对的;错的是每一条数据自己声称的通道号。这种错法不会在屏幕上露馅,只会在有人拿这份数据去对通道时才发作。现在跨 bank 统一编号为 1…N。
●! 历史标记、DP Changed 的文字——那是「Lane Flags」表的说明,而 Lane Flags 卡片下面一句说明都没有。
放在极性表下面它是错的:60h:128-129 是 RO(Table 8-188),不是 RO/COR——那里没有任何东西是锁存的,读它不清除任何东西,这张表里也没有 DP Changed 这一列。工具自己那张「读后自清」清单里本来就没有 Page 60h。两段说明现在都回到了各自的表下面。
信号完整性表里,Tx EQ Recall 填的是缓冲区编号(10h:154-155,Table 8-83:01b 是 1 号、10b 是 2 号);而 01h:161.6-5 声明的是缓冲区数量(Table 8-54:01b 表示一个、10b 表示两个)。两者本来就该比一比,而工具从来没比过。
这一列本来就被单独拎出来渲染过(编号不是量值,1 和 2 是两个缓冲区的名字,不是「更大 / 更小」),而一旦离开通用单元格,它也就离开了通用单元格里那两道「对照模块声明」的检查——旁边的 Tx Input EQ 有上限检查,Rx Amplitude 有编码集检查,只有它什么都没有。
这一列比旁边几列更要紧。规范 6.2.5 说其它暂存的信号完整性值只在 ExplicitControl 置位时才被采用(而本工具写的是清零),唯独 recall 例外——「recall,如果支持,在 ExplicitControl 未置位时同样生效」。所以它是本工具每一次 Apply 都会真正带上的那一个。
现在越界的那一格标红,并写明模块声明了几个缓冲区、以及 Apply 带上它会收到 ConfigRejectedInvalidSI。11b 仍按「保留值」单独标注——它根本没指向任何缓冲区,和「指向一个不存在的缓冲区」是两种不同的错。
声明本身是保留值(11b)时,表下会明说。那种情况下模块没告诉你它有几个缓冲区,下面的编号一个都没法核对;而一张会检查别的列的表在这里一声不吭,读起来就像「查过了,没问题」。
Table 8-3 里另外两种访问类型让「读」本身撒谎,而 Lower 26.3 的 SoftwareReset 正是其中之一(Table 8-11 把它定为 WO/SC):
工具里有两个地方相信了这一位。
一是面板。它和另外四个 RW 位并排显示在同一列状态点里,悬停提示写着「Reset in progress」或「Idle」。两个都不对:不管模块在干什么,那个点都是灭的;而它唯一可能亮的时刻,意思是这次读发生得太早,不是「正在复位」。
0x1A 把几个互不相干的控制打包在一起,所以每次改动都先读回来再合并(这本身是早先一轮的修复:免得切低功耗时顺手清掉 SquelchMethodSelect)。合并却是从读回来的整个字节开始的——于是一次落在那个瞬态窗口里的读,会把第 3 位原样写回去:在一次毫不相干的改动中间,又触发了一次软复位,没有任何人要求过它。
这个窗口等不过去。「evaluated and cleared」在整份规范里只出现一次,就在 Table 8-3,旁边没有给任何时间。所以读-改-写永远无法确认自己已经在窗口之外,只能不信任读回来的那一位:现在合并前先把写-only 的触发位剥掉,只有明确点名要复位的调用者才能触发它——「复位模块」按钮照常工作。
面板那一格现在写的是 WO/SC trigger,不再是一个状态点;访问类型由后端随数值一起送来,页面不另存一份——同一张规范表抄两遍,正是两边开始打架的方式。另外四个位是 RW,照常显示状态。
规范 Table 8-3 定义了六种访问类型,其中一种让「读」本身成为破坏性操作:
这些字节就是锁存标志——模块记录「发生过某件事」的地方:某条数据通路弹过、某个检测器失锁过、某次调谐被拒绝过。模块不保留第二份。本工具每一个会读这些字节的面板,都会把结果折进「标志历史」,正是为了这个原因;而裸寄存器面板不会——在那里它们只是一串数字。
11h:134,模块攒下来的故障记录就没了,而且没有任何提示。十六进制转储看起来完全一样——不管那些字节里原本有没有东西。
现在读之前会先问,并写明具体哪几个字节、以及它们记录的是什么:
This read clears what it returns.
11h:134-137 — lane Flags (Tables 8-96 to 8-98) — data path state
changes, Tx failure, LOS, CDR loss of lock, ...
CMIS Table 8-3: all bits in a clear-on-read byte are cleared by the
module once the byte has been read. ... the module keeps no second
copy. ... a raw read cannot, so whatever comes back is the only
record left.
Read anyway?
读完之后,转储顶部会再说一遍——那个确认框一按就没了,而屏幕上的这些字节已经是仅存的记录。
六个块,包括两个本工具没有面板、但这个面板能够到的:模块级标志(Lower 8-13)、通道标志(11h:134-153)、激光器调谐标志(12h:231-238)、诊断标志(14h:132-139)、Network Path 标志(17h:128)、VDM 门限穿越标志(2Ch 整页)。12h:230 故意不在其中——那个汇总寄存器是普通 RO,读它不清任何东西。
范围会按实际读到的字节裁剪。只读了两个字节却提示「整块 134-153 被清掉了」是夸大其词,而一个学会了「这个提示会夸大」的操作员,很快就不再看它了。
上一版处理了 Monitoring 表的混侧问题。这一版是同一件事在 Flags 面板上,而且更大、也更绕——因为这里连「Tx 归一侧、Rx 归另一侧」这个直觉都是错的。Table 8-96 到 8-98 对每一行都写明了:
| 字节 | 标志 | 规范原话 |
|---|---|---|
| 134 | DPStateChanged | host lane |
| 135 | FailureFlagTx | affecting media lane |
| 136-138 | LOSFlagTx / CDRLOLFlagTx / AdaptiveInputEqFail | host lane(Tx 的输入来自主机) |
| 139-146 | Tx 光功率 / 偏置的门限标志 | media lane |
| 147-152 | LOSFlagRx / CDRLOLFlagRx / Rx 光功率门限 | media lane |
| 153 | OutputStatusChangedFlagRx | host lane |
也就是说:Tx 那一组裂成三段,Rx 那一组裂成两段,按名字里的 Tx/Rx 去分,二十个里会错五个。其中 15 个是按媒介通道索引的。
Rx LOS: 无告警,意思是「这条光纤上有信号」,而那条光纤不存在。
现在这 15 个在媒介通道不存在时显示 n/a,悬停说明指出它是按媒介通道索引的、以及模块在 00h:210 里声明没有这条通道;5 个主机侧的照常显示——模块的八条主机通道都在。Flags 表头也和 Monitoring 一样,每一列都标明自己属于哪一侧,并特别点出 Tx Fault 和 Rx Output 这两个不随名字走的例外。
一个 API 形状上的取舍。这个接口里每条通道的字典,原本「每一个为 true 的键都是一个置位的标志」。本想再加一个 media_lane_present 字段,但它会让任何按这个约定收集告警的调用方把一条健康通道读成有告警。所以没有加——null 已经携带了同样的信息,而 /api/module/monitoring 本来就直接给出这个字段。
上一版把「数据通路走哪几条媒介通道」补到了 DataPath 面板。这一版处理它的另一半:Monitoring 表自己——它的每一列都按通道索引,而 CMIS 对主机侧和媒介侧是独立编号的,表里却只写了「Lane n」。
| 列 | 寄存器 | 按哪一侧编号 |
|---|---|---|
| Tx Power / Tx Bias / Rx Power | 11h:154-201 | 媒介通道(Table 8-99 标题就是 Media Lane-Specific Monitors) |
| DataPath State | 11h:128-131 | 主机通道(DPStateHostLane) |
| Output | 11h:132 Rx / 133 Tx | 两侧各一个 |
| Config Status | 11h:202-205 | 主机通道(「for the Data Path of host lane <i>」) |
Output 那一列是最要紧的。Table 8-95 原文:「Rx 输出主机通道的信号有效性在 OutputStatusRx(11h:132)中声明」、「Tx 输出媒介通道的信号有效性在 OutputStatusTx(11h:133)中声明」。同一格里的两个点,说的是模块两侧不同的通道。现在每一列都标出了自己用的是哪一侧,Output 标的是「Rx host · Tx media」。
00h:210 说模块没有这条媒介通道时都会留空——那是之前某一轮为了不把 0.0 µW 画成告警而加的。唯独 OutputStatusTx 没被挡住。于是一块合规的模块只要在那里报 0,面板就会在根本不存在的七条通道上显示「输出被静音了,去查 Tx disable / force squelch / Rx output disable」——而同一行的光功率却是正确留空的。
演示模块此前把这件事盖住了。它对全部八条通道都声明 Tx 输出有效,包括它自己说没有的那些媒介通道——这是任何模块都做不出的声明。现在它只对真有的媒介通道置位;而超过 8 条通道的模块一条都不隐藏——8.3.7 说那类模块无法无歧义地声明自己的媒介通道。
主机选的是主机侧通道;媒介侧通道是跟着算出来的,规范 7.9.1 把这个推导定死了:
而这个结果此前没有任何地方报告过。在不支持媒介通道交换的模块上,它不是一个寄存器——规范也不需要一个,因为规则已经决定了它;而本工具从来没有把它算出来。
现在 DataPath 面板的每条数据通路会写明它占用哪几条媒介通道(例如 media 1–4),悬停说明里指明这正是 Monitoring 表里衡量它的那几行。
输入本来就在读,只是没送到该去的地方。MediaLaneAssignmentOptions(01h:176-190)一直以原始位图印在 Applications 页签上;而 DataPath 的两个端点解析描述符时把这一整块传成了空,于是那条路径上这个字段恒为「未声明」。现在两处都传了,并且按连接缓存——它是静态通告,而 DataPath 面板每次刷新都要用。
只答第一个 bank,再往后不作答。7.9.1 说「每个 bank(即 8 条主机通道一组)总是有 8 条外部媒介通道」,所以这个池子不会越过通道 8 继续往下数;而 8.3.7 更说了,超过 8 条通道的模块根本无法无歧义地声明自己的媒介通道。分配怎么跨 bank 延续,规范没有写——替它回答就是凭空造规则。同理,媒介宽度超过一个 bank 的数据通路也不给答案,而不是去编号这个 bank 根本没有的第 9-12 条。
支持媒介通道交换的模块会标注「nominal」。那类模块可以改写这个映射,它实际提交的映射在 Page 6Dh 上,那才是真相。
规范 6.2.3.2.1 把这件事写成对主机的义务:「主机必须按模块为该 Application 通告的 Lane Assignment Options 来分配通道」。这个字段是 Application 描述符的第 4 个字节:「位 0-7 构成对应主机通道 1-8 的位图。位为 1 表示该 Application 的通道组可以从对应的主机通道开始」。
工具一直在读这个字节,也一直把它以原始位图的形式印在 Applications 页签上。而真正做选择的地方是 DataPath 面板——那里的下拉框把每个 Application 都列在每条通道上,对此只字不提。操作员要等到 Apply 之后,再去把一个 4 位的状态码ConfigRejectedInvalidDataPath(4h)翻译出来才知道。
本版把规则放到了做选择的那一刻:
规则管的是「起始」,不是「哪条通道带哪个码」。一个 4 通道的 Application 从通道 1 起,会占用通道 2-4,主机要把同一个 AppSel 写进这四条——后三条是延续通道,位图对它们只字未提。若拿每条通道去对位图,一块完全合规的模块上每四条就会有三条被误标。
位图只有 8 位,对应通道 1-8。超过 8 通道的模块上,规范没有说这 8 个位怎么延伸——通道 9 是不是「bank 1 的通道 1」,还是干脆不在覆盖范围内。所以检查到通道 8 为止,再往后不作判断:替规范回答一个它没回答的问题,等于凭空造一条规则。16 通道的演示模块因此不会被误标。
工具里每一处固定等待,都是对规范第 10 章某个时间参数的无声断言。这一版把它们逐个对了一遍——而规范把「等待」分成几类,关键差别在于主机等得不够时会发生什么:
| 来源 | 类型 | 等不够的后果 |
|---|---|---|
| Table 10-4 | ACCESS hold-off | 模块拒绝访问,主机能发现 |
| Table 10-5 | 内容依赖 | 不拒绝,直接给陈旧数据 |
| Table 10-6 | 条件到标志 | 不拒绝,标志只是还没立起来 |
页切换(tBPC)本来就是对的:工具读模块自己通告的 01h:169.3-0,读不到才退回 10 ms。这也正是这三个数现在的写法——每个常量都标注了自己出自哪张表,下一个要加延时的人有地方可查。
还有一件更直接的事:服务端算出了「哪些通道被拒绝」,面板却没看。按下 Apply 之后,无论模块答了什么,界面都弹「Laser tuning applied」。而那些标志是读一次就清零的——错过这条提示,它们不会留在屏幕上等人回来看。现在被拒绝时会弹红色提示,写明是哪条通道、因为什么,并且停留 12 秒。
13h:206-213)也是,Table 8-133 用一句话写明:「本页所有屏蔽位的默认值为 1(屏蔽)」。另外两组(模块级与通道级)则根本没有规定默认值。这句错话进了工具提示、手册、skill 和发布说明,现在全部改正。
更正的同时也发现:被我说错的那一组,本身就有和上一轮完全相同的毛病。诊断标志在 14h:132-139——参考时钟丢失、各通道门控完成、图案发生器失锁、图案检测器失锁——工具把它们全都读了、还记了历史,而它们的屏蔽位在 13h:206-213,一个都没读。所以一块没人配置过的模块,跑 BER 时检测器中途失锁,主机根本不会被中断,而 PRBS 面板说不出这件事。
现在 LOL 那一列会标注:亮着的标志和历史记录里的标志若被屏蔽都会加 masked;安静的通道只在 tooltip 里说明——因为默认就是屏蔽,四张表全铺上「masked」只会没人看。参考时钟那条提示同理(它的屏蔽位是 13h:206.7,按模块而非按通道)。
顺带修正了块长度。工具此前把这一对按 18 字节配对(14h:132-149 对 13h:206-223),两张总览表确实都这么写。但明细表说了算:Table 8-138 的标志到 139 为止,Table 8-133 的屏蔽位到 213 为止、并把 214-223 标为 Reserved[10],而 Page 14h 总览自己的下一行也把 140-149 标为 Reserved[10]——也就是说那张总览表自相矛盾,而它的 Reserved 行与明细表一致。已对照渲染出的原始页面核实,不是文本抽取错位。目前还没有代码用到这个长度,这是它一直无害的唯一原因。
演示模块此前也不合规。它从不写 13h:206-213,读作「全不屏蔽」;现在按规范默认屏蔽,而且 206 只置定义了的 bit 7(6-0 是 Reserved)、207 保持 0。mock_dr8 则清掉了 212 的低两位——一个真在通道 1、2 上跑误码测试的主机会这么做——这样两种分支才会同时出现。
规范 8.2.1 用一句话定义中断线:「只要有任何一个标志置位、且它对应的屏蔽位是清零的,Interrupt 就保持有效」。CMIS 一共四组「标志 / 屏蔽」配对,本工具此前只按这句话报告了三组:
| 标志 | 屏蔽 | 此前 |
|---|---|---|
| Lower 8-13 | Lower 31-36 | 已配对 |
| 11h:134-153 | 10h:213-232 | 已配对 |
| 14h:132-149 | 13h:206-223 | 已配对 |
| 12h:231-238(激光器调谐) | 12h:239-246 | 完全没读 |
同一页上还有两件事一并补齐:
演示模块此前也是错的,而且没有任何东西能看出来。它从来没有写过 239-246,于是那八个字节读作 0(全不屏蔽),唯一那个可调谐 profile 因此是一种不可能刚上电就存在的模块。现在默认是规范的 0x3F(六个位全屏蔽),并且 mock_coherent_zr 的通道 1 清掉了两个——一个真正关心「调谐请求被拒绝了没有」的主机会这么做——这样两种分支才会同时出现在一块模块上。
规范 Table 6-5 把发送端输入均衡的控制分成两组,并说明模块在什么时候读哪一组:
| 类型 | 控制字段 | AdaptiveInputEqEnableTx |
|---|---|---|
| 自适应 | Freeze / Store / Recall | 1 |
| 非自适应 | HostControlledInputEqTargetTx | 0 |
本工具把非自适应那一列做完整了:读暂存值(10h:156-159)、读生效值(11h:217-220)、与模块通告的上限比对,并且在使能位为 1 的通道上把这一格置灰——因为规范明说那里模块会忽略它。而自适应那一列,工具只读了使能位本身。
更早一层:能力面板从加上那天起就有「Tx Input EQ Freeze」和「Tx Input EQ Recall」两行,而此前没有任何一个演示模块点亮过 01h:161.4 或 161.6-5,所以这两行只渲染过「不支持」那条分支。本版让 mock_sr8 真的通告它们——这块模块本来就没有主机控制的均衡目标,正是那种「自适应开着、面板上却只有一个使能位」的模块。16 通道的 mock_1600g_16lane 也一并通告了——这两个字段的位宽在本工具里是头一次出现的「每通道 2 位」,照着每通道 4 位那份代码抄,在 bank 0 上答案是对的、bank 1 上就读错字节,只有分 Bank 的模块能把它照出来。
规范有两处细节,照搬成一列普通的暂存值就会写错:
Store(10h:135-136)是只写寄存器,没有可读回的内容,表头会说明这一点——它的缺席是寄存器的性质,不是工具漏了。
「忽略」这条规则是双向的。6.2.5.1 说模块「忽略与当前 AdaptiveInputEqEnableTx 设置无关的控制字段值」。此前只做了一个方向,因为面板上只有非自适应那一列可做。现在两列都在,规则也就两边都走:自适应开启的通道置灰目标值,自适应关闭的通道置灰 Freeze 与 Recall,并各自说明该改哪个位才能让它生效。
颜色是有含义的。这张表里的红色专指「模块会回 ConfigRejectedInvalidSI」,所以保留值 11b(没有第三个缓冲)是红的;而「已冻结」是主机自己要的动作、模块不会拒绝,用琥珀色。另外「自适应正在跑」是正常状态,写作 Adapting 而不是 Off——通用单元格会把清零的位显示成 Off,在这里恰好会把健康状态涂成故障色。
规范 Table 8-50:「不可分离 AOC 的传播时延,以 10 ns 为单位、四舍五入到最近的 10 ns,为 0 表示未规定」。这个字段从解析器写好那天就解对了,却一处都没显示过。
原因不难理解:同一块(01h:146-150)的另外三个字段——最高/最低温度、最低工作电压——都是拿来判定实时读数的(给温度、电压上色),而传播时延没有读数可判,于是没有一个现成的位置接得住它。它属于能力面板。
lim[2] >> 8、低字节取自另一个元素 lim[3]。任何 profile 想设一个真实值,两个字节都会被写成 0,读回来就是「未规定」。因为从来没有 profile 设过它,这个错一直不可见。一个夹具承载不了的字段,下游就不会有人为它建任何东西。
而且也没有模块可以承载它:此前每一个分页 profile 的媒介都是可插拔的,唯一的线缆组件 mock_flat_dac 是平坦内存、连 Page 01h 都没有。所以本版新增了 mock_aoc——一根 20 m 的 400G 有源光缆,正是这个寄存器所定义的那种模块。它顺带给另一条此前无人可测的分支补上了真实模块:媒介类型 04h 同时涵盖有源铜缆与有源光缆,而有源光缆用「全 0」回答铜缆衰减、从而让那一行自动消失。
不要和 DataPath 页签那个时延搞混。两个都是纳秒,但不是一回事:这里是光在线缆里走的时间;DataPath 页签上的是 Page 15h 的信号穿过模块的时间。面板上这一行会写明自己是哪一个。另外,媒介可分离的模块不显示这一行——没有线缆,也就无所谓传播时延;若这种模块偏偏报了一个非零值,会被标出来。
上一版把每个具名特性的合规等级搬上了面板。规范 Table 8-73 给出的,正是这个等级应该被拿来衡量的东西:
| 地址 | 寄存器 | 完全支持要求 |
|---|---|---|
| 0Ch:192 | NaSupportDetails(综合性能监控) | 1011 1100b |
| 0Ch:194 | FwSupportDetails(固件加载管理) | 三处说法不一,见下 |
| 0Ch:195.7 | FixedFirmwareFallback | 「推荐项」,不计入合规要求 |
规范 8.12 给了两条可以直接执行的规则:
一、「模块声明完全支持某具名特性时,下列特性细节通告必须符合该特性定义的选项集」——所以一个声称「完全合规」、而细节字节对不上的模块,是自相矛盾,工具现在会指出来,并列出具体是哪几位不达标。
二、「模块通告某具名特性不支持时,主机应忽略该特性在下表中的细节」——所以不支持的特性不显示细节,而不是把一串没有含义的位摆出来。演示模块 mock_1600g_16lane 就是这种模块:有性能监控、没有固件加载管理。
| 出处 | 值 |
|---|---|
| Table 8-72 交叉引用「set to 11110000b」 | 0xF0 |
| Table 8-73 表头「1111 1000b: fully supported」 | 0xF8 |
| Table 8-73 逐位行(7-2 各写 1b) | 0xFC |
性能监控那个寄存器三处完全一致(都是 0xBC),这正是固件那个能被看出是缺陷、而不是某种约定的原因。规范其它地方没有第二处说法可以定夺,所以工具不替你选一个当答案:模块的字节只要命中其中任意一个,就算是「按规范某处写的做了」,三个都不中才算矛盾,而且会把三个值一并列出。
还有一个容易做错的细节:NaFeedsSupervision(192.6)和 NaFeedsDiagnostics(192.1)这两位,规范要求的值是 0 而不是 1。把「置位」当成「合规」的解码器,会把一个完全合规的模块报成差两位。工具是逐行按规范写明的要求值比对的,完全支持的位型也是由这些行推导出来、而非另抄一遍。
规范 Table 8-72 在 Page 0Ch 上定义了两个具名特性,结构相同,都用 Table 8-71 的 FeatureAdvertisement:
| 地址 | 特性 | 此前 |
|---|---|---|
| 0Ch:160-161 | ConsolidatedPmFeature(综合性能监控) | 已读 |
| 0Ch:162-163 | LoadManagementFeature(固件加载管理) | 从未读取 |
每个特性的第二个字节是两个 4 位的合规等级,规范给了四个名字:
| 码 | 含义 |
|---|---|
| 0 | undefined, unknown(未定义/未知) |
| 1 | noncompliant(不合规) |
| 2 | partially compliant, with exceptions(部分合规,有例外) |
| 3 | fully compliant(完全合规) |
COMPLIANCE_NAMES),内容一字不差,却没有任何地方用它——界面直接把 0-3 这两个数字打出来。问题出在 0:它的含义是「模块没有给出答案」,不是最低分。一个 0 挨着一个 3 印出来,读起来就像「两项里较差的那项」,而实际上那一项根本没被评估过。
现在两个特性都会显示,合规等级按名字给出,规范未定义的码(4-15)也如实标为未定义而不是硬套一个名字。演示模块 mock_24lane 的固件加载管理这一项故意设成「部分合规 / 未定义」,既和上面那项不同(换了位置就会露出来),也让「0 = 未给出」这条路径有真实样例。
这一条是靠一次新的扫描找到的:把模块级的每一张常量表逐个查消费者——只被测试和夹具引用、产品代码从不引用的,就是「写好了却没人用的事实」。同一次扫描还查出 PRBS_PATTERN_NAMES 是 PATTERN_NAMES 的陈旧副本(少了 14 Custom、15 User Pattern),任何地方都没引用,已删除。
CMIS 里每一个 Flag 都配有一个 Mask。Mask 置位的 Flag,模块照样报告这个状况,但不会拉起中断线。工具此前显示 Flag、也显示中断状态,却一个 Mask 字节都没读过——于是最让人困惑的那种组合无法解释:Flag 明明立着,中断却没拉起。
另一面更安静、也更要紧:某条通道上的某个告警可能已经被上一个用过这模块的人关掉了,模块从此永远不会为它中断。界面在此之前没有任何办法说出这件事——一条「安静的」通道和一条「告警被关掉的」通道长得一模一样。
| Flag | 对应的 Mask | 本版处理 |
|---|---|---|
| Lower 8-13 模块级 | Lower 31-36(Table 8-12) | 已读,中断那一栏会写明 |
| 11h:134-153 每通道 | 10h:213-232(Table 8-83) | 已读,告警表逐格标注 |
| 14h:132-149 诊断 | 13h:206-223 | 工具只读了该 Flag 块中的一位、也没有对应面板,暂无可标注处 |
FLAG_MASK_BLOCKS 里早就写好了:演示模块用它来判定中断线该不该拉起(「任一 Flag 置位且其 Mask 未置位」,规范原文的定义),测试也在核对三组偏移对不对齐。唯独 app.py 从来没引用过它。——一张已经算对了的表,没有人去用。
告警表里,被屏蔽的格子会追加一个「masked」标记,悬停说明它拦住的是什么。告警正常、但被屏蔽的通道也会标——这恰恰是没人会想到去看的时候。而「之前触发过」那个标记优先:一个曾经触发过、又被屏蔽的告警,首先仍然是一条触发过的通道。
那十二个阈值告警(Tx/Rx 功率、Tx 偏置的高低告警与警告)在表里共用一格汇总,所以它们的 Mask 没有别处可显示,会连名字一起写在那一格上——只说「其中某个被关了」没法据以行动。演示模块 mock_fewmon 模拟了一个「接手时就有告警被关掉」的模块,可以直接对照。
上一版给面板补上了 Tx CDR 那一列、并修正了 Rx 那一列的门禁——也就是让人能看见、能判断 CDR 旁路。而回答「值不值得」的那个字节就在旁边一格,一直没读:
| 地址 | 字段 | 含义 |
|---|---|---|
| 01h:152 | CDRPowerSavedPerLane | 「每个 CDR、每条通道置于旁路时,最少能省下的功耗」,单位 0.01 W,向上取整到下一个 0.01 W |
规范 Table 8-50 的 145-154 是「模块特性通告」这一整块,工具此前读了 145、146-150、151、153-154,唯独跳过了 152。注意措辞是「最少」:模块承诺的是至少这么多,不是正好这么多。
面板上这一行同时给出两个数:每 CDR 每通道的值,以及把所有可旁路的 CDR 全部旁路时的合计(按通道数 × 可旁路的侧数算)。后者才是做功耗预算时真正要看的数,但它是算出来的而不是模块报的,所以界面上写明了「全部旁路时」。模块若某一侧不让旁路,那一侧就不计入——演示模块 mock_sr8 没有 Rx CDR,合计就只按一侧算。
这一条是靠一次机械扫描找到的:把 Page 01h 的 128 个字节里工具从没读过的列出来。其余答案分别是 Reserved(170、253-254)、Custom 厂商自定义段(191-222)、页校验和(255,且其覆盖范围 130-254 已按规范正确排除 128-129),以及一处 10 字节块读造成的误报。只有 152 是真缺口。
规范 Table 8-18 有四个字段,工具此前只读了后两个(Lower 60-61 的子型与散热)。前两个都是 RO Required,一直没读:
| 地址 | 字段 | 取值 |
|---|---|---|
| Lower 56 | CmisSmSupport | 0 未声明 / 1 无状态机(如无源线缆) / 2 仅 MSM / 3 MSM + DPSM / 4 MSM + DPSM + NPSM / 5-FF 保留 |
| Lower 57 | ModuleFunctionType | 0 传输模块 / 1 ELSFP 资源模块 / 2-127 保留 / 128-255 自定义 |
取值 0 是个坑。它不是「没有状态机」,而是「没声明」——规范原话:「未定义时(CMIS 5.3 之前),模块类型是隐含的,但通常可以从 MemoryModel(00h:2)和其它通告推断出来」。把它当成「没有」,会让所有 5.3 之前的模块都失去 DataPath 页签。所以工具把它报成「模块未声明,由内存模型判断」,保留规范指定的那个回退路径。保留值 5-FF 同理,也不是「没有」。
演示模块里这一位由内存模型推导:扁平内存模块没有 Page 10h,也就没有数据通路可供状态机运行,取 1;分页模块取 3。声明一个自己没有寄存器支撑的状态机,本身就是模块缺陷。
10h:160 CDREnableTx 和 10h:161 CDREnableRx 是相邻的两个字节,编码完全相同——「1b:CDR 使能,0b:CDR 旁路」。信号完整性表只有 Rx 那一列:Tx 的暂存寄存器连声明都没有,而 11h:221(活动集里的 Tx CDR)声明了却从未读取。
还有一处是实打实的错答案。每个寄存器写明的通告是两位:10h:161 写的是「Advertisement: 01h:162.0-1」。Table 8-54 把这两位拆成 RxCDRSupported(162.0)和 RxCDRBypassControlSupported(162.1),而后者是有条件地写的——「0b:不支持 Rx CDR 旁路控制(如果有 CDR 的话,它不能被旁路)」。
工具此前只用旁路那一位把门。而 162.0 是这个字节里唯一没有被解析的那一位,它的 Tx 对应位 161.0 反倒解析了。结果:模块说自己没有 Rx CDR,面板照样给出一列可操作的 Rx CDR 开关。演示模块 mock_sr8 通告的正是这个组合(si_162 = 0x0A),可以直接对照。现在两位都要满足才算是主机能控的开关,而能力面板会如实写出「通告了旁路控制,但模块报告自己没有 Rx CDR」。
同这两个字节的其余通告也一并补进了能力面板:Tx 输入均衡的冻结与召回缓冲区数(11b 是保留值,不是缓冲区数量)、第二组暂存控制集、单向重配置、以及 CMIS-VCS。其中「第二组暂存控制集」那一行会写明本工具只写第 0 组。
另外修了一处演示模块的失真:规范 6.2.3.3 要求「模块在退出 MgmtInit 之前,就把暂存控制集 0 和活动控制集都填上模块自定的默认应用与信号完整性设置」。演示模块此前把活动控制集留空,直到主机下发一次配置为止——于是刚连上时「活动」那半边显示成所有均衡器为 0、所有 CDR 被旁路,而这恰恰是这组寄存器存在的意义所要否定的。
规范 Table 8-47 用 01h:142 的六个位说明模块有哪些可选页组,外加两位的 bank 数。这六个位工具一直都解析出来了,其中五个从未到达界面。
| 位 | 字段 | 涵盖的页 |
|---|---|---|
| .7 | NetworkPathPagesSupported | Page 16h,以及 Page 17h 中与 NP 相关的部分 |
| .6 | VDMPagesSupported | VDM 的 Page 20h-2Fh(部分);具体通告在 Page 2Fh |
| .5 | DiagnosticPagesSupported | Page 13h-14h —— 环回、码型发生与检查、SNR、BER、比特计数 |
| .4 | CoherentPagesSupported | Page 30h-4Fh(部分);细节在 C-CMIS 里 |
| .3 | CmisFfSupported | Page 05h 上的形态相关功能(CMIS-FF 补充规范) |
| .2 | Page03hSupported | Page 03h,主机可写的用户 EEPROM |
这次是靠一次机械扫描找到的:把 cmis_registers.py 里每个 parse_* 函数返回的字段名都取出来,再看这些名字有没有在 app.py / app.js / index.html 里出现过。多数「没出现」的是构造显示文本用的内部编码,属于误报;这五个不是。
演示模块 mock_dr8 现在真的带了一页 Page 03h 用户 EEPROM,在「寄存器读写」页签里读 Page 03h 就能看到内容。其余四个页组在所有演示模块上都是「不支持」——因为这些模块确实不提供那些页,通告一个自己没有的页组本身就是模块缺陷,不该在演示模块里出现。规范 8.6 另有两条与这一页有关:一次写入最多 8 字节;写入在模块内部完成之前,模块会拒绝寄存器访问。
CDB(Command Data Block)是固件升级和规范第 9 章整本命令目录所走的通道。模块在 01h:163-166(Table 8-55)里通告自己怎么做 CDB。这四个字节此前工具从未读过,界面上也完全没有提到 CDB。
现在模块能力面板会列出七行。其中两行不是标签,而是会改变操作方式的:
CDB Max Busy 是主机在判定模块已经停摆之前必须愿意等的时间。这一行带一个 ▲ 标记,原因是 OIF-CMIS-05.4 的 Table 8-55 在这里自相矛盾:
| 字段 | 规范原文怎么说 |
|---|---|
| 166.7 CdbMaxBusySpecMethod | 0 → 由 CdbMaxBusyTime(166.6-0)给出;1 → 由 CdbExtMaxBusyTime(165.4-0)给出 |
| 165.4-0 CdbExtMaxBusyTime | 「……160 ms 到 4960 ms,当 CdbMaxBusySpecMethod=0b 时」 |
| 166.6-0 CdbMaxBusyTime | 「……0 ms 到 80 ms,当 CdbMaxBusySpecMethod=1b 时」 |
选择位那一行和两个数值字段那两行正好相反,而规范其它地方没有第二处说法可以定夺。两种读法一个是 0-80 ms、一个是 160-4960 ms——差了一个数量级以上,选错就是「该等的时候判模块死了」。
工具的做法:按 166.7(也就是定义这个位含义的那一行)解读,同时把另一种读法并排写出来,并在悬停提示里说明规范为什么矛盾。只给一个数字等于替你悄悄选边。
同一张表里还有两处容易做错的地方:CdbMaxPagesEPL(163.3-0)的编码不是页数——0-4 恰好等于页数,而 5、6、7 分别表示 8、12、16 页;CdbReadWriteLengthExtension(164)一个字节对应两个上限——它以 8 字节为单位放宽访问长度,但 Page 9Fh 只有 120 字节的 LPL、EPL 页最多 2048 字节,同一个值在一边封顶 128、另一边封顶 2048。只报一个数字,就会对一个只能接受 128 字节的页承诺 2048 字节的写入。
基本 Application 描述符最多只能有 15 条。规范 6.2.1.6.2 为此引入了 Normalized Application Descriptor(NAD),一个模块最多可以通告 255 × 15 = 3825 个 Application,放在分 bank 的 Page 1Ch 上:
| 地址 | 内容 |
|---|---|
| 1Ch:128-247 | 15 个 NAD,每个 连续 8 字节(Table 8-173) |
| 1Ch:248-255 | Reserved——不是第 16 个 |
Application 编号 AN = 15 × 块号 + AppSel 码。要选中其中一个,两半都得给:AppSelCode 和 NADBlockIndex——AppSel 码在每个块里都是 1..15,单给一个没有意义。面板上每一行都同时列出这两个值。
块 0 必须是基本描述符的镜像(6.2.1.6.2)。工具会逐条核对,不一致就标出来——这意味着模块在同一个 AppSel 码下通告了两个不同的 Application。核对时不能简单地比相等:GID 非零时基本描述符里本来就应该是 BEh,把这种情况报成不一致,等于说每个做对了的模块都是坏的。
另外,NAD 的第 5 字节第 7 位是 NetworkPathIndicator:这条描述符描述的可能是 Network Path 而不是 Data Path(8.19.5.3),这一行会标上 NP。
目前的限制:工具能读全部 NAD,但还不能配置块 0 以外的 Application——那需要往 Staged Control Set 的 NADBlockIndex(18h:128-143)里写值,工具尚未写这个字段。面板上如实写明了这一点。
规范 8.18 / Table 8-141 在 Page 15h 给出每条主机通道穿过模块的总时延,单位纳秒:
| 地址 | 内容 | 说明 |
|---|---|---|
| 15h:224-239 | Rx 时延 | 8 × U16,按主机通道报,单位 ns |
| 15h:240-255 | Tx 时延 | |
| 15h:128-223 | — | Reserved |
该页是可选的,模块在 01h:145.3 宣称有没有。有,DataPath 页签就会多出一张「Data Path Latency」表;没有,这张表整张不出现——而不是显示一排 0。
mock_zr16 两个 bank 的值是不同的,正是为了让这种错误显形。
规范还有一条「shall」:同一条 Data Path 的各通道必须报相同的时延。工具会按模块自己报的 Data Path 分组核对,不一致就把涉及的通道标黄并说明——16 通道跨两个 bank 时是 32 个数字,没人会逐个去比。
两条出自规范的保留意见也一并写在表下:这些数值的精度规范未作规定;对于会动态更新这些寄存器的模块,何时保证有效目前是未定义的。
另外注意:上一节铜缆衰减那里 0 dB 表示「不可用」,这里的 0 就是 0 纳秒。规范只在前者定义了这个特殊值,把它照搬到后者会把一个真实答案说成「未知」。
规范 Table 8-35 在 00h:204-208 给出线缆在五个频点上的插入损耗,每计数 1 dB:
| 地址 | 频点 | 说明 |
|---|---|---|
| 204 | 5 GHz | 整数 dB。模块报 0 表示「该特性不可用」,不是这根线缆在该频点无损耗 |
| 205 | 7 GHz | |
| 206 | 12.9 GHz | |
| 207 | 25.8 GHz | |
| 208 | 53.125 GHz | |
| 209 | — | Reserved,不是第六个频点 |
规范 8.3.6 还限定了适用范围:「对于其它模块,204-209 字节是保留的」。光模块同样能读回这几个字节,但读回来的东西没有含义,所以这一行在光模块上不显示,而不是显示成 0。有源线缆(媒介类型 04h)既包含有源铜缆也包含有源光缆,后者会用「全 0」来回答,这一行同样不出现。
表下方还有一条注:当模块声明自己是 PCIe 应用时,同样这五个字节代表的是 2.5 / 4.0 / 8.0 / 16.0 / 32.0 GHz。仅凭这几个字节无法判断是哪一组频点,所以工具把这条说明写进了该行的悬停提示,而不是替你猜一个。
规范 Table 8-50 的 01h:151 里有两个相邻的位:
| 位 | 字段 | 含义 |
|---|---|---|
| .4 | RxPowerMeasurementType | 0=OMA,1=平均功率 |
| .3 | RxLOSType | 0=Rx LOS 对 OMA 响应,1=对 Pav 响应 |
现在 Rx LOS 表头会像功率列一样标出基准(· OMA / · Pav),悬停给出出处。
01h:151 一共七个字段,此前只有两个到达界面。其余的已补进模块能力面板:光电探测器类型、Rx 输出均衡保持的是哪个幅度、以及两个「快速模式」时序位(模块多快报出 Rx LOS、多快响应 Tx 关断)——这两个尤其不是标签,而是决定读者该对模块有什么预期。
规范 8.2.9 规定了固件主/次版本号的编码,其中两种组合不是版本号:
| 取值 | 含义 |
|---|---|
| Major = 0 且 Minor = 0 | 模块没有固件 |
| Major = FFh 且 Minor = FFh | 活动固件映像无效 |
| 其余组合 | 固件版本 |
主.次 直接打印。于是一块报告固件映像无效的模块,面板上显示的是 255.255——一个故障状态被打扮成了一个像模像样的版本号,而且恰恰是读者最不会去怀疑的那种值。
现在分别显示为「Invalid firmware load」与「No firmware」,无效映像还会被标红——那是故障,不是版本。
Table 8-44 规定非活动固件字段用同一套编码,并补充说「没有非活动固件的模块会清零这两个字段」。所以那里的 0.0 是常见情形(显示为 None),而不是「模块没有固件」——同一套解码,不同的措辞,因此判断放在解码器里、措辞放在调用处。硬件版本号规范未定义任何特殊编码,保持原样。
规范 8.3.4 说 00h:202:「CableAssemblyLinkLength 取值 1111 1111b 表示链路长度大于 6300 m」。
另外 Table 8-33 对 BaseLength 写明:「取值 0 表示链路长度未定义,例如物理介质可以与模块分离时」。这指的是低六位为 0 的任何字节,不只是 00h —— 有乘数而没有基数一样是未定义。两种情况乘出来都是 0,所以面板此前「等于 0 就当作收发模块」碰巧是对的,但说不出原因,也无法与一个真的测得 0 区分(而那种东西并不存在)。
现在这三种情况分别显示为 greater than 6300 m、— (transceiver, see Link Length)、以及普通的 3 m。0xFE 仍然是普通的 6200 m —— 只有 0xFF 特殊。
顺带修了演示模块:规范说可分离光介质的模块该把这个字节清零,而所有演示模块都报 0,包括新加的无源铜缆 DAC——一根没有长度的铜缆不成其为线缆。它现在报告 3 m。
00h:211 FarEndConfiguration(Table 8-37)此前在寄存器表里声明了,却从来没有被读过——而它就夹在 00h:210 和 00h:212 之间,这两个工具都在读。
模块能力面板新增一行,例如 2 far end modules: 1-4, 5-8,属于均匀分支时还会标出规格。编码 0 是「未定义 · 可拆卸介质的模块」,规范规定这类模块该字节清零——所以光模块上显示的 0 是正确答案而不是没读到。
这一行在平坦内存模块上同样有效(它在 Page 00h),而线缆组件正是这个字段服务的对象。新增的无源铜缆 DAC 演示模块现在会报告 4 通道均匀分支。
关于这 26 行转录:从 PDF 抄 26 行数据是最容易出静默错误的活。规范自己说了字母「取决于该组最低的通道号」,这句话让每一行都可校验:字母必须从它命名的那条通道开始、且必须连续。但这条规则不充分——把某行换成另一个同样合法的排布仍能通过,所以还加了一条:26 行必须两两不同。
01h:145(Table 8-50)一共有七个字段,每一个都是 RO / 必备,没有一位是保留位:
| 位 | 字段 | 此前 |
|---|---|---|
| 7 | CoolingImplemented | 解析了,但没有任何面板显示 |
| 6-5 | TxInputClockingCapabilities | 未解析 |
| 4 | ePPSSupported | 未解析 |
| 3 | TimingPage15hSupported | 未解析 |
| 2-0 | Aux3 / Aux2 / Aux1 观测对象 | 已显示 |
现在模块能力面板新增四行,并各自标注来源位。Page 15h 那一行当时如实写明「本工具并不读 Page 15h」,因为写成单纯的「支持」会让人去找一个并不存在的面板;自 v2.91.0 起那个面板存在了,该行改为指向 DataPath 页签,详见下一节。
规范 Table 8-102 给 DPConfigLane 的每个字节定义了三个字段,在活动控制集里全部是 RO / 必备:
| 位 | 字段 | 含义 |
|---|---|---|
| 7-4 | AppSelCode | 该通道所属数据通路跑哪个 Application |
| 3-1 | DPIDX | 该数据通路的索引,即它占用的最低通道号 |
| 0 | ExplicitControl | 0=该通道的 SI 设置由 Application 决定;1=由主机定义 |
现在:数据通路面板同时给出模块报告的分组与工具的推断;信号完整性面板改为按模块报告的 ExplicitControl 逐通道陈述,有主机定义的通道时会点名是哪几条。
演示模块也改了:此前它把主机暂存的字节原样复制进活动控制集,而本工具暂存的 DPIDX 是 0,于是跑着两个数据通路的模块会报告成一个。真实模块是根据自己配置的结果算出这个索引的,演示模块现在也这样做。另外 DPIDX 只有 3 位、按 Bank 计——16 通道模块上两个 Bank 的 DPIDX 0 是两个不同的数据通路,不能按数值合并。
BER 与误码计数面板下方的「Measurement window」一行,此前读了 13h:177 的两个位,却没读那个决定它们是否有意义的字节。
现在:模块宣称支持时照旧写「restarting automatically」;宣称不支持而该位又置着时,明确写出「寄存器要求自动重启,但本模块未实现」并标注 13h:129.2 —— 不是默默不显示,因为寄存器里确实写着,拿寄存器对照面板的人需要看到工具注意到了这件事。
另外,13h:177.7(StartStopIsGlobal)此前解析出来就丢掉了。它决定在一个 Bank 上启停测量是否等同于在所有 Bank 上启停——在多 Bank 模块上,这是「一个结果」和「三十二个结果」的区别。现在该位置 1 时会说明;而按 Table 8-129,模块只有两个全局 gate 定时器(13h:129.3 = 0)时这个位是被忽略的,那种情况下会直接说明它无效。该位为 0 是默认行为,不再赘述。更正:Table 8-129 的「被忽略」只针对门控测量;不门控时 Table 8-128 仍让这一位作用到所有 Bank。现在的判断见「13h:177.7 作用到哪里」一节。
规范 Table 6-5 按类型把 Tx 输入均衡的控制分成两组,并写明模块看哪一个:
| 类型 | 控制 | AdaptiveInputEqEnableTx |
|---|---|---|
| 自适应 | AdaptiveInputEqFreezeTx / StoreTx / RecallTx | 1 |
| 非自适应 | HostControlledInputEqTargetTx | 0 |
6.2.5.1 又对本面板显示的那个字段重申了一遍:「若该通道的 AdaptiveInputEqEnableTx 置位,HostControlledInputEqTargetTx 会被模块忽略」。
现在这种格子会置灰并标注「ignored」,悬停说明原因与出处。按通道判断,不是按模块——使能位是每通道一位,模块可以一部分通道跑自适应、另一部分由主机控制。
不是拒绝写入。主机完全可以在同一次 Apply 里既清掉自适应位、又下发目标值,那时这个目标值正是模块要用的。面板只说明它在哪些通道上生效,不替主机做决定。
规范 8.2.15 写得很明确:「当主机写入会让 PageMapping 寄存器指向一个不受支持的页地址时,模块会清零 PageSelect 字节……使得 PageMapping 最终选中 Page 00h」。
规范把答案放在了寄存器里,所以现在读回来核对:每个页在一次连接中只核一次(模块插着不动时,它支持什么不会变;若每次换页都读回,会让每次面板刷新的总线流量翻倍)。页不对就明确报错,并写清模块回了什么。
01h:142.5 DiagnosticPagesSupported(「支持 Banked Pages 13h-14h」)在连接时就解析了,却从来没有人去问它。本工具里其它每一个可选页都按各自的广告门控——0Ch、60h、61h、62h 各有一条,就写在同一个函数里相隔三行的地方——唯独诊断这一族没有。
于是在没有这两页的模块上,页选择被清零、Page 00h 一直映射着,厂商信息被解码成环回能力、图案支持情况和误码计数。现在环回、PRBS、SNR、BER、比特与错误计数这几个面板会在触碰页之前就明确拒绝,并点名 01h:142.5。
为什么一直没被发现:内置的演示模块全都实现了 13h/14h,而那条「每个演示模块、每个端点,都不许读到不存在的页」的巡检,力度只能到夹具为止。
规范:「与分页内存模块不同,平坦内存模块不支持动态换页进入上层内存」。而工具在连接时读取的全部通告——有哪些监控、多少条通道、各瞬态最长多久、标称波长是多少——统统住在 Page 01h。
内存模型本身在 Lower Memory(每个模块都有),所以现在先读它;模块说自己是平坦的,就根本不去读 Page 01h,那些通告缺席而不是被捏造。
再进一步:规范 8.2 说平坦内存模块就是静态内存模块(「只提供只读的、不可变的数据」),而 Table 8-9 与 Table 8-10 的标题写着「not for static memory modules」——也就是说模块级标志与监控值本来就不存在于这类模块。所以工具把它们记为「通告为无」,而不是「未知」:未知在下游一律等于「全都显示」。Memory Model 那一行现在会直接说明这一点,免得满屏空行看起来像读取失败。
新增演示模块 mock_flat_dac(无源铜缆 DAC,平坦内存)。此前所有演示模块都是分页的,没有任何东西能暴露这个问题。
Application Descriptor 的第 4 字节,两种模块上是两个完全不同的字段:Table 8-22(分页内存模块)把它给了 HostLaneAssignmentOptions——一张位图,说明这个 Application 可以从哪些主机侧通道开始;而 Table 8-23(平坦内存模块)把同一个字节给了 HostInterfaceGID,即定义 HostInterfaceID 的那张 SFF-8024 表的组号。
现在:平坦内存模块根本没有通道分配掩码(是「没有这个字段」,不是「掩码为 0」),该字节按本来面目显示为 GID 0x__,鼠标悬停会说明这是 Table 8-23 的 HostInterfaceGID、不是通道分配;分页模块一切照旧。容量计算也不再把它当成起始通道。
规范在这一处自己有个小矛盾:GID 那一行写的是 bit 7-0,紧接着又把同一字节的 bit 3-0 标为保留。工具原样显示整个字节,不去替规范决定该怎么移位。
规范 Table 8-22 把 Application Descriptor 第 3 字节的两个半字节写得很清楚:「0000b:通道数由接口 ID 决定,或显式给出:0001b:1 条 …… 1000b:8 条。1001b–1111b:保留」。
现在这两种情况分别显示 H=per interface ID 和 H=Reserved (Fh),都不计入通道总数——要把「由接口 ID 决定」解成具体数字,需要 SFF-8024 里接口 ID 对应的通道数,那张表本工具没有收录,所以它说明是哪一种,而不是编一个数字出来。(4H/4M 这种正常宽度显示不变;H/M 只在跟着数字时才当单位用。)
BE 时:去看 NAD同一张 Table 8-22 对两个接口 ID 字节都写了:「BEh:接口 UID 的 GID 非零,因此必须查阅对应的 NAD」。这是规范定义过的编码,不是 SFF-8024 表里缺的一项,而工具此前显示 Unknown (0xBE)——就在同一块面板上,工具其实已经在告诉你这个模块宣称了几组 Normalized Application Descriptor。现在显示 See NAD (0xBE)。
「Unknown」是在说工具,不是在说模块。它告诉你工具没认出模块给的值,你合理的反应是去找个更新的工具。所以对于规范本身已经定义过的编码,它不该出现。
现在:落在保留区间的显示 Reserved (0x__),落在自定义区间的显示 Custom (0x__),并且都带上原始编码——保留编码是关于模块的问题,自定义编码则意味着这块模块的 Application Descriptor 要按厂商自己的 ID 表去读,这件事在动手解读之前就该知道。缺的三种铜缆技术已补齐并各自区分(近端+远端 / 远端 / 近端线性有源均衡);0Fh 在 CMIS 5.4 里标了「不要用于新设计」,名称里现在也写明已弃用。
工具确实不知道的地方仍然写 Unknown:连接器类型、SFF-8024 标识符、主机接口 ID 这几张表定义在 SFF-8024 里,本工具没有收录,写 Unknown 是实话。
规范 Table 8-131 对四个环回使能字节都写了同一句话:「若『支持逐通道环回』位为 1,环回按通道控制;否则,只要有任何一个使能位置 1,该侧所有通道都进入环回」。
现在这种请求照做,并且把掩码扩成全通道再下发、在返回里说明「已应用到全部通道」。为什么要扩而不是原样写:这个寄存器会被读回到同一个面板——写 0x01 而模块实际环回了 8 条,面板就会显示「1 条在环回」,而真相是 8 条。
清零不会被扩(那是关环回,扩了就变成开);支持逐通道的模块照旧按你勾的来;模块压根没有某个方向的环回时,仍然明确拒绝——那是另一个答案。
Table 8-192 对 62h:128–191 的描述就是「每条媒体侧通道的告警和警告阈值」。工具此前把这份列表按主机侧通道数截断,于是相干模块拿到 8 套阈值,其中 7 套属于它根本没有的媒体侧通道。
规范 8.15 写得很直接:「Page 12h 的每个 Bank 对应 8 条媒体侧通道」,而 Table 8-108 里每一项——栅格间隔、通道号、微调偏移、激光器频率、目标输出功率——都是「每条媒体侧通道一个」。
现在调谐表只列真实存在的媒体侧通道,对不存在的通道下调谐会被拒绝并说明依据(00h:210 和 8.15)。并且沿用同一条规矩:一次请求里只要有一条通道不合法,一个字节都不写。
Monitoring 表里每一行是一条主机侧通道,但其中三列—— Tx Power、Tx Bias、Rx Power ——规范(Table 8-99)叫的是「媒体侧通道监控」。
00h:210(Table 8-36)就是模块自己说的哪几条媒体侧通道不存在。工具一直在读这个寄存器,只是没有任何地方用它。现在这三列在不存在的媒体侧通道上显示「no such media lane」,和「not implemented」分开写——两者是不同的答案,要查的寄存器也不同。
规范用一句话定义了中断线:「只要有任何一个标志置位、且它对应的屏蔽位是清零的,Interrupt 就保持有效」。也就是说中断状态不是另外一个要读的东西——它就是标志和屏蔽位的组合结果。
Lower 8–13 对应Lower 31–36;通道标志 11h:134–153 对应 10h:213–232;诊断标志 14h:132–149 对应 13h:206–223。
这个值工具一直都在算(接口里就有),只是界面从来没显示过,两份手册也都没提。演示模块那边则是反过来:中断位被写死成「没有请求」,于是它可以一边挂着温度告警、发送故障和失锁的检测器,一边报告自己没在找主机。现在两边都按规范那句话来。
下部内存 9–11(Table 8-9)放的是六个模块级监控各自的四个阈值标志(高/低告警、高/低警告),三个字节排法完全一样:
| 字节 | 位 3–0 | 位 7–4 |
|---|---|---|
Lower 9 | 温度 | 供电电压 |
Lower 10 | Aux1 | Aux2 |
Lower 11 | Aux3 | 自定义监控 |
0x08–0x0D,却对其中两个字节一概不知。
现在 Aux 每一行的读数后面直接跟着模块自己的判决(高告警 / 低告警 / 高警告 / 低警告),告警红、警告黄;没有标志就什么都不显示。因为标志是读后即清的,它说的是“上一次轮询以来”,不是“此刻”;历史区会把它留下。
01h:159,Table 8-53)。模块没声明的监控,其标志按“未知”处理而不是“正常”——不存在的标志读回来也是 0,和一个健康的监控一模一样。Tx 偏置寄存器数的是 2 µA 的个数,但
01h:160.4-3(Table 8-53)还给它一个
×1 / ×2 / ×4 的倍数。工具此前把刻度写死成 2 µA,
从不读这两位。
11b 是保留值,工具按 ×1 处理,不会自作主张地把读数放大四倍。
通道标志在 11h:134–153是连续的,工具一次性读 20 个字节——真实硬件上这比 20 次切页加等待快得多。但其中只解析了 19 个:0x8A(Tx 自适应均衡失败)被跳过了。
01h:157.3)工具是读了的,接口返回里明确写着模块支持它——却没有任何一条通道带着它的值。
现在 Lane Flags 表里多了一列 Tx AEQ Fail。它的含义值得单独说一句:自适应均衡没能收敛,意味着模块没能把主机发过来的信号均衡干净——问题在进模块的那段链路上(连接器、PCB、主机侧发送参数),而不是模块内部坏了。
01h:157–158(Table 8-52)声明了模块到底实现了哪些 Flag:
Tx Fault、Tx LOS、Tx CDR LOL、Tx 自适应均衡失败、Rx LOS、Rx CDR LOL。
Page 14h 是分 Bank 的(规范 8.17:「Page 14h 的每个 Bank 对应 8 条通道」)。诊断选择器 14h:128 和它选出来的结果窗口 14h:192–255 都在这一页里——也就是说,每个 Bank 有自己的选择器、自己的结果窗口。
误码计数那个接口本来就是对的,代码里还写着这条规矩的注释——只是没推广到另外两个。现在三个接口共用同一个读取函数,在哪个 Bank 读就在哪个 Bank 选。
mock_zr16、mock_1600g_16lane、mock_24lane)。
01h:142.5(DiagnosticPagesSupported)声明 Page 13h–14h 存在。
所有内置演示模块都实现并提供这两页(PRBS、环回、BER、SNR、计数器都在里面),
却一直声明“我没有这两页”。同样,它们报告温度、电压、光功率、偏置和各种 Flag,
却在 157–160 里声明“一个都没实现”。现已全部改为如实声明。
CMIS 在 01h:155–156(Table 8-51,Supported Controls Advertisement)
里逐位声明了模块到底实现了哪些通道控制。
工具此前从不读它,所以下面这七个控制在任何模块上都可勾:
| 位 | 控制 | 界面位置 |
|---|---|---|
155.5-4 | SquelchMethodTx(0b’b 为完全不支持) | Output Controls 卡片标注 |
155.3 | ForcedSquelchTxSupported | Output Controls → Force Squelch Tx |
155.2 | AutoSquelchDisableTxSupported | Output Controls → Auto Squelch Disable Tx |
155.1 | OutputDisableTxSupported | DataPath Config → Tx Enable |
155.0 | InputPolarityFlipTxSupported | DataPath Config → Tx Pol |
156.2 | AutoSquelchDisableRxSupported | Output Controls → Auto Squelch Disable Rx |
156.1 | OutputDisableRxSupported | Output Controls → Rx Output Disable |
156.0 | OutputPolarityFlipRxSupported | DataPath Config → Rx Pol |
155.5-4 区分静默时是
降低 OMA 还是 降低 Pav——这直接影响你怎么读静默期间的
Tx 光功率读数。Output Controls 卡片顶部会直接写出来。155.6(TransmitterIsTunable)声明的是 Page 04h/12h 存在,
演示模块的这一位直接由 profile 推导,不会与实际页面矛盾。
模块在 13h:128–142 里声明了自己的诊断能力:
有哪几种环回、能不能按通道分别控制、
以及每个发生器/检测器到底支持哪些图案。工具此前从不读它,
所以图案下拉框列出全部 13 种,四种环回全部可勾选。
| 寄存器 | 内容 | 表 |
|---|---|---|
13h:128 |
四种环回类型;是否支持逐通道(主机侧 / 媒体侧); 是否允许主机侧与媒体侧同时生效 | Table 8-111 |
13h:129 |
测量能力:门控精度、门控统计、周期更新、 逐通道计时器、自动重启门控 (BER / 误码计数两张卡片的「测量窗口」那行就靠它) | Table 8-112 |
13h:177 |
门控时长(000b = 不门控、计数无限累加)、 自动重启、周期更新间隔、ResetErrorInformation | Table 8-127 |
13h:176 / 13h:178 |
四个引擎各自的时钟来源:内部时钟 / 参考时钟 / 恢复时钟(决定参考时钟丢失到底影响不影响这一页) | Table 8-127 |
13h:131 |
四个图案引擎(主机/媒体 × 发生器/检测器) 模块里到底有没有,以及每个位于自己 FEC 的哪一侧 | Table 8-114 |
13h:140 |
用户自定义图案最多能放多长(L = 2(n+1),2–32 字节) | Table 8-118 |
13h:224–255 |
用户自定义图案本身(Pattern ID 15 发的就是它) | Table 8-134 |
13h:132–139 |
主机/媒体侧 发生器、主机/媒体侧 检测器 各自支持的图案 ID(每角色 2 字节,小端) | Table 8-116 / 8-117 |
现在:图案下拉框只列出该发生器或检测器声明的图案。 内置演示模块声明的是 PRBS31Q/31、PRBS13Q/13、PRBS9Q/9、PRBS7Q/7 和 SSPRQ, 所以 PRBS23/23Q/15/15Q 不会出现在列表里——这就是真实模块的常见情况。 若某通道当前就停在一个未声明的图案上,列表会保留它并标注 not advertised,而不是默默改成别的值。
13h:128 里:调谐面板以前把你填的值直接写进 Page 12h 就报“已写入”。
实际上模块会判断这个请求能不能服务,并在
12h:231–238(Table 8-109)的门锁标志里给回答。那些标志同样是
RO/COR——读一次就清。
| 位 | 标志 | 含义 |
|---|---|---|
| 5 | TargetOutputPowerOORFlagTx | 目标输出功率超出可编程范围 |
| 4 | FineTuningOutOfRangeFlagTx | 微调偏移超出声明范围 |
| 3 | TuningNotAcceptedFlagTx | 模块当前状态下无法服务这次调谐; 编程的网格或信道与激光器实际状况不符 |
| 2 | InvalidChannelNumberFlagTx | 信道号不在所选网格间隔的声明范围内 |
| 1 | WavelengthUnlockedFlagTx | 波长失锁(门锁版) |
| 0 | TuningCompleteFlagTx | 调谐完成 |
面板右侧新增 Tuning Flags 一列:当前置位的显示为红色, 曾经触发过但已被读清的保留 ●! 样式,与 Lane Flags 一致。
模块在 04h:130–165 里逐网格声明了合法的信道号范围,
但工具以前从不读它。结果是:网格下拉框列出全部 9 种间隔(包括模块根本不支持的),
信道输入框没有任何上下限,你只能猜。
现在:网格下拉框只列出模块声明的网格,并在名字后面直接写出该网格的信道范围; 信道输入框带上下限并在下方标出范围;超范围的请求在写入之前就被拒绝, 提示会直接引用它依据的那个声明寄存器,例如:
Lane 1: channel 9999 is outside the range the module advertises for the 100 GHz grid (-40 to 40, 04h:150-153)
DataPath Config 里的 AppSelect 下拉框读的是 Page 10h 的 Staged Control Set ——也就是“你要求的”。模块实际在跑的是 Page 11h 的 Active Control Set(Table 8-92,206–234)。 平时两者一致,一旦 Apply 被拒绝就会分岔。
按 CMIS 8.13.3,Apply 分四步:命令受理 → 参数校验 → 执行 → 结果反馈。 校验不过时模块直接跳过执行步骤——那条通道继续跑原来的 Application, 数据通道也不会重启。
| 代码 | 名称 | 含义 / 该改什么 |
|---|---|---|
1h | ConfigSuccess | 配置已完成 |
2h | ConfigRejected | 校验未通过,模块没有指明是哪一项 |
3h | …InvalidAppSel | 该 AppSel 码不是模块声明过的;从模块公布的列表里选 |
4h | …InvalidDataPath | 这个应用放不到这组 lane 上:宽度要是应用 Host Lane Count 的整数倍,且每一段的起始 lane 要在 Host Lane Assign 位图里 |
5h | …InvalidSI | 同时下发的信号完整性设置不合法 |
6h | …LanesInUse | 该 DataPath 还有 lane 不在 DPDeactivated;改宽度或释放 lane 之前要先把通道停下来 |
7h | …PartialDataPath | Apply 只点了这条 DataPath 的一部分 lane;要么整条一起触发,要么用支持热重配的 ApplyImmediate |
8h | …NoEmulation | 模块不支持 DataPath 仿真 |
9h–Bh | (规范保留) | 规范预留给其它校验失败,没有给名字——但它属于拒绝段 |
Ch | ConfigInProgress | 模块还在处理,这条 lane 上新的命令会被忽略 |
Dh–Fh | (厂商自定义) | 模块按自己的理由拒绝,含义查模块文档 |
AppSel = 0000b 写成强制要求:
「主机必须给每一条未使用的 host lane 赋 AppSel = 0000b」,
而且缩窄一条数据通道时「任何变为未使用的 lane 都必须这样标出来」。
可下拉框只列模块声明过的 Application,没有 0 这一项——
于是在这个页面上根本没法释放一条 lane。active && … 在 0 上短路了,偏偏 0 才是最需要提示的那个值。
这时候再按 Apply,下发的是「4 条 lane 跑 8-lane 的 App 1」,模块按 4h 拒绝:
一个界面自己造出来的死胡同。ConfigRejectedLanesInUse(6h,“有 lane 不在 DPDeactivated”)。DPInitPending(11h:235,Table 8-106)专门说明:
ApplyDPInit 的 Provision 已经把暂存区拷进 Active Control Set,
但真正把它落到硬件的那次 DPInit 还没走——
此时“Active Control Set 的内容可能与实际硬件配置不一致”。
工具以前从来没读过这个寄存器。01h:175(Table 8-59)说的是:这 15 条是不是全部。
支持 Normalized Application Descriptors(NAD) 的模块,
把其余的 Application 放在 Page 1Ch 的若干个 bank 里,
最多能到 n×15 条。18h:128–143)。
假装能用比原来的沉默更糟,所以这里只把话说清楚,
不做「支持了」的样子。
00h:222,以及
01h / 02h / 04h 的第 255 字节。
四个,一个都没读过。01h 是那个特例:
它从 130 开始,因为
「固件版本字节 128–129 被特意排除在页校验和之外,
以免固件一升级就得改内存映射」。01h / 02h
看内存模型是不是分页的,04h 看发射机是不是可调。
模块没有的页不会去核对——那种页读回来是什么全看模块,
据此报「数据损坏」是误报,比不报还糟。mock_fr4x2 的 01h 故意对不上,
好让「验不过」这条路也有东西走。
01h:138–141(Table 8-46)才是模块自己声明的
标称波长和波长容差,工具此前没读过。
规范还特意写明:波长可编程的模块,这里报的是「实际值」——
所以在可调模块上,技术编码和这个寄存器根本不是同一个说法。1310 nm ±6.5 nm;
没给(两个字段为 0)就不出现这一行。11h:240–255 那份通道-波长映射(见上文):
各通道映射到不止一个波长就说明不是。
是多波长的话,这一行会明确标出
「several wavelengths on this module」并在悬停里说明
规范没有唯一定义这个字段在这种模块上的含义——
而不是把它当成「这只模块的波长」直接摆出来。
02h:144–175(Table 8-64)给的正是这几个监测量各自的
高低告警和高低警告(三个 Aux 各四档,外加一个 Custom 监测量),
工具一个字节都没读过。01h:145 声明。
门限必须按各自监测量来解码,
否则把 TEC 电流的门限当温度读出来,
数值落在一个看着挺合理的范围里,单位却完全不对。Aux2 — Laser Temperature (°C))。
模块没有某个 Aux 监测量、
或者四档门限全是 0(等于没给)时,那一行不出现——
不拿一排 0 冒充门限。
01h:146–147(Table 8-50)说的正是
这个模块被允许工作的温度范围,
01h:150 说的是它需要的最低供电电压——
工具都没读过。01h:144 和
01h:168(Table 8-48 / 8-56,只读、必需)
逐个给出这四个瞬态状态的最长时间,
原文写得很清楚——这些字段的用途就是让主机
「判断模块在这些状态里是不是出了问题,比如固件卡死」。
这些字节工具一个都没读过,
于是某条通道可以永远停在 DPInit,而提示语还在说它没事。DPTxTurnOn / DPTxTurnOff 另有规范上限:Table 10-8 规定 Tx 输出关断最长 100 ms、开启最长 400 ms,并明确说它们是 01h:168 声明值的上限。模块声明得更长时,工具按规范上限判断是否超时,提示里会写明这一点。
0x7F)之后必须等 tBPC 才能读,
否则会读到上一页的内容——规范给的 tBPC 是 10 ms。
但那是最坏情况,不是每个模块的情况:
01h:169.3-0(MaxDurationBPC)声明这个模块
实际只需要 tBPC / 2i。
这个字节工具此前没读,于是每一次切页都按最坏情况等满 10 ms——
而界面刷新一轮要切很多次页。11h:240–255(Table 8-107)说的正是这个映射:
高半字节是媒体波长,低半字节是物理光纤
(TR1/RT1/TR2… 这套编号来自对应的硬件规范)。
这 16 个字节工具从来没读过。λ1 · TR1/RT1;悬停能看到完整的光纤名称。
两个方向波长相同时只写一次(双工光纤对本来就是这样)。mock_fr4x2(2× 400G-FR4)会如实声明:
通道 1–4 是同一对光纤上的四个 CWDM 波长,
通道 5–8 走第二对——这正是原先那一列没法表达的情况。
11h:240–255 这 16 个字节描述的是
本 bank 的 8 条媒体通道(先 Tx1–8、再 Rx1–8),
所以 16 通道模块的第 9–16 条在下一个 bank 的同一批地址上。
工具以前只读一个 bank,也只解析 8 条通道,
于是第 9 条通道起没有任何映射——
而「没有映射」在表里的画法,跟模块自己说
「未知或未定义」(0000b)是一模一样的。
波分模块明明报了波长,界面上却什么都不写。01h:251.1-0,Table 8-62,只读、必需)时才是 128。mock_fr4x2 声明不支持整页读(一次只答 8 字节),
其余 profile 支持整页读,两条路径都跑得到。
13h:224–255(Table 8-134);
能放多长则写在 13h:140.3-0
(L = 2(n+1),最短 2 字节、最长 32 字节)。
这两处工具此前都没读——也就是说就算选中了 User Pattern,
发出去的也是那段字节里本来碰巧是什么就是什么。mock_coherent 支持完整 32 字节,
mock_coherent_zr 只收 4 字节——
规范原文就写着「模块不一定支持完整的 32 字节长度」。
13h:129(Table 8-112,只读、必需)说明模块
到底会不会门控一次测量,以及测量还在跑的时候
这些数会不会更新。工具其实早就把它解码了——
从诊断面板写出来那天起——但解出来的结果没有任何地方用。13h:177(Table 8-127)则完全没读过。其中
MeasurementTime 取值 000b 的含义是
「不门控,计数无限累加」——也就是说界面上那个 BER
是「自从上次有人翻动 ResetErrorInformation 以来的总账」,
不是任何一段确定时间里的误码率。
内置演示模块全都是这一种,而表格一个字都没提。13h:129.7-6)
就说明窗口取决于你让检测器跑了多久。
模块声明测量期间不做周期更新(13h:129.4)时
还会额外点出来——否则一个会自动刷新的面板,
看着就像数字在实时变。mock_sr8 有 60 秒门控、
mock_fr4x2 既不门控、测量期间数字也不动。
14h:132.7(LossOfReferenceClockFlag),
并在 PRBS 卡片顶部写「本模块的图案发生与检测在它恢复前都不可信」。13h:176 和 13h:178
(Table 8-127)逐字段说明四个引擎各自的时钟来源——
模块内部时钟、参考时钟,还是从业务里恢复出来的时钟——
而这两个字节工具从来没读过。
跑在内部时钟上的发生器、跑在恢复时钟上的检测器,
参考时钟丢了照样是原来那个样子。176 高半字节按
媒体 lane 数参考时钟,低半字节按主机 lane 数,
而且只有低半字节有「所有 lane 用参考时钟」这个取值。mock_sr8
四个引擎全跑参考时钟,两种写法都能看到。
13h:131(Table 8-114,只读、必需)逐位声明
主机侧 / 媒体侧 的发生器与检测器各自存不存在,
以及每个位于自己 FEC 的哪一侧。
四个 Enable 字节(13h:144 / 152 / 160 / 168)
在规范里各自写着「Advertisement: 13h:131.x-y」,
指的就是这个字节——工具把它连同旁边的能力字节一起读了进来,
却直接丢掉。13h:131 的哪两位决定的;只有一个位置的,
FEC 那一列按模块实际所在的位置勾好并置灰,悬停写明原因;
Apply 也会挡下「启动一个不存在的引擎」和
「把引擎放到 FEC 的另一侧」这两种写入。0x00,
等于声明「本模块没有任何图案发生器和检测器」,
而界面把四张表全摆着——现在它们会如实声明:
mock_sr8 是无内部 FEC 的模块(发生器只在 FEC 后、
检测器只在 FEC 前),mock_fr4x2 干脆只有主机侧
的一对引擎。
13h:141–142 是两个必备寄存器,
工具本来就把它们连同旁边的能力字节一起读了进来,却直接丢掉:141 说明每个角色(主机/媒体 × 发生器/检测器)
到底有没有 DataInvert 和 SwapSymbolBits 这两个字节;
没有的话,勾了也不会有任何效果。142 说明 Enable 和 Pattern 是不是按 lane 分:
位为 0 时,勾第 3 条 lane 的 Enable 实际上启动的是整个 Bank,
而 Pattern「一律用 lane 1 的」——也就是说第 2–8 行的下拉框
只是摆设。mock_fr4x2(那个“声明得比较少”的模块)
不支持符号位交换、主机检测器也不支持按 lane 启停。
14h:136–137 的
发生器失锁:发生器没锁上,就说明它并没有在发
控制寄存器里写着的那个图案。于是界面会显示某条 lane
正在发 PRBS31,而模块其实报告了失锁——
对端测到的误码看起来像链路故障,实际上是源头就没发对。14h:132.7 是参考时钟丢失(整模块级,
丢了的话这一页上测什么都不作数),
14h:134–135 是门控测量完成标志。LOL 正在失锁、● 已锁定、
●! 现在锁着但中途丢过——这些标志是读一次即清的);
参考时钟丢失会在 PRBS Generator 卡片顶部单独标出。
MediaLaneAssignmentOptions 说明这个应用的实例
在媒体侧能落在哪几条 lane 上;它不跟前四个字节放在一起,
而是单独放在 01h:176–190。
工具以前只读前四个字节,所以每条描述符都少了五分之一——
主机侧的起始 lane 位图有,媒体侧的没有。
对分路(breakout)应用来说,这一位图正是告诉你
每个实例占用哪几条媒体 lane 的唯一依据。—,不是读失败。)
01h:223–250。
工具一直只读低页那 32 字节,于是第 9 个以后的应用完全不可见:
下拉框里没有、DataPath 分组不知道它占几条 lane,
更糟的是——它会被当成“模块从没声明过的码”,
Apply 时回 ConfigRejectedInvalidAppSel,
拒绝一个模块其实支持的应用。ExplicitControl 位置 1 时,
生效的值才来自暂存区;清 0 时,
「这些值由模块根据所选 Application 自行决定」。11h:214–234,
紧挨着工具早就在读的 Active AppSel——但这一段从来没被读过,
表格下方却写着“Apply 会把这一套一起下发”。01h:153–154 里声明了三个上限——
Tx 输入均衡最大值、Rx 输出均衡的前/后游标各自的最大值——
以及它到底有哪几个 Rx 输出幅度码。
要得比模块声明的多,就是 ConfigRejectedInvalidSI(5h)。01h:154 的两个半字节读反了也看不出来。mock_fr4x2(本来就是那个“声明得比较少”的演示模块)
声明的是:Tx 均衡最大 3、前游标最大 5、后游标最大 2、
只有 0 和 1 两个幅度码。
Signal Integrity 表里超出上限的数值会标红,
悬停写明模块声明的上限,以及这样 Apply 会得到哪个拒绝码。
mock_fr4x2 声明 App 1 只能从 lane 1 起、App 2 只能从
lane 5 起,开机默认却是八条 lane 全跑 App 1——这是它自己的
声明所禁止的配置。现在默认是 lane 1–4 跑 App 1、lane 5–8 跑 App 2。
以前只有 Monitoring 页在轮询模块:切到其它任何一页, 工具就完全停了读。你在 DataPath Config 里改一下午配置, 期间模块告警、重启、链路弹过——回到 Monitoring 时什么都不剩, 因为没人去读那些门锁位,历史自然也无从记起。
现在只要连着模块,后台每 5 秒会轻量轮询一次(只读状态和标志, 不拉整张监控表),不管你停在哪一页。门锁位的意义就在于此: 5 秒一次足够接住一个瞬时事件。发现情况时,标题栏会出现小图标:
| 图标 | 含义 | 来源 |
|---|---|---|
| ⚠ | 模块级监控(温度 / 电压 / Aux)这次刷新报了告警;只报警告时显示黄色 ▲ | Lower 0x09–0x0B(这次刷新读到的标志,不是历史) |
| ↺ | 模块重启过,或进入过新的 Module State(自上次 Clear 起),悬停说明是哪一种 | 13h:184–191 Host Scratchpad / Lower 0x08[0] ModuleStateChangedFlag |
| ↯ N | 有 N 条数据通道弹过(自上次 Clear 起) | 11h:134 DPStateChangedFlag |
| ✖ | 模块处于 ModuleFault(悬停说明原因),或报告过固件故障(自上次 Clear 起) | Lower 0x03[3:1] + 41 ModuleFaultCause / Lower 0x08[2:1] ModuleFirmwareErrorFlag / DataPathFirmwareErrorFlag |
图标可以点,点一下直接跳到 Monitoring 看具体哪几条通道。 点 Clear flag history 后图标立即消失,从当下重新开始计。
升级完成后工具会重启自己,而浏览器那个页是一直开着的。 重启后的进程并不知道你之前连过哪个模块, 所以所有请求都会返回“未连接”。
上面讲的是单条通道。模块整体有两条对应的记录,在 Module Info 里各占一行:
Lower 0x08[0])。规范 Table 6-9:进入 ModuleLowPwr、ModuleReady 或 ModuleFault 时置位——复位会点亮它,切一次低功耗再回来同样会点亮它。13h:184–191,01h:251.7-6 声明)。模块每次固件重启(包括自恢复重启)都会把它清零,规范明说主机可以用它发现模块自己重启过。工具连接后在这里留一个标记,每次刷新读回;标记没了,就是重启过。Diagnostics 里的 PRBS 表格同样适用这条规则。检测器的
LOL(Loss of Lock)位在 14h:0x8A–0x8B(Table 8-138),
同样是 RO/COR——门限、读清。
上面讲的是光功率染色。界面里还有几套颜色和符号,含义各不相同:
| 出现位置 | 显示 | 含义 |
|---|---|---|
| Config Status (Monitoring) | 绿色 ConfigSuccess | 该 lane 的配置被模块接受 |
| 琥珀 ConfigInProgress | 配置进行中,稍等再看 | |
| 红底 任何拒绝码 | 被拒绝。判据是 Table 8-101 的代码区间(2h–Bh、Dh–Fh),不是名字拼写——规范保留的 9h–Bh 和厂商自定义的 Dh–Fh 同样红底。不是灰色——灰色留给“该 lane 未使用”。鼠标悬停会写出这条码的含义和该改什么 | |
| DataPath State (Monitoring) | 绿色 Activated | 数据通道已激活(稳态) |
| 琥珀 Init / TxTurnOn / TxTurnOff / Deinit | 过渡态:通道正在上来或下去,不是故障 | |
| 白字 Initialized | 稳态,已初始化、只是 Tx 没开 | |
| 灰色 Deactivated | 该通道已停止 | |
| Lane Flags (Monitoring) | ■ ALARM(红底) | 该标志位置起:Tx Failure / LOS / CDR LOL 之一 |
| ▲ Warn(橙底) | 仅出现在最右的汇总列,表示有 Warning 级阈值越界但无 Alarm | |
| ●(绿色小点) | 正常,无标志 | |
| Module Control (DataPath) | ● / ○ | ●=该位为 1(生效),○=该位为 0 |
| 顶部摘要栏 | 绿色圆点 | 仅当全部 lane 都是 Activated 时才出现 |
| 选项 | 说明 |
|---|---|
| 1 s | 每秒刷新一次 |
| 2 s(默认) | 每 2 秒刷新一次 |
| 5 s | 每 5 秒刷新一次 |
| 10 s | 每 10 秒刷新一次 |
| Manual | 关闭自动刷新,点击 ↻ Now 手动触发 |
| 参数 | Page / Addr | High Alarm | Low Alarm | High Warn | Low Warn |
|---|---|---|---|---|---|
| Temperature (°C) | 02h/0x80–87 | 过温告警 | 欠温告警 | 过温警告 | 欠温警告 |
| Vcc (V) | 02h/0x88–8F | 过压告警 | 欠压告警 | 过压警告 | 欠压警告 |
| Tx Power (dBm) | 02h/0xB0–B7 | 光功率上下限阈值 | |||
| Tx Bias (mA) | 02h/0xB8–BF | 偏置电流上下限阈值 | |||
| Rx Power (dBm) | 02h/0xC0–C7 | 接收光功率上下限阈值 | |||
| 列 | 含义 | Page / Addr |
|---|---|---|
| Tx Failure | 发送器内部失效(规范 FailureFlagTx,原名 Tx Fault);主机关断输出不算 | 11h / 0x87 |
| Tx LOS | 发送端信号丢失 | 11h / 0x88 |
| Tx CDR-LOL | 发送 CDR 失锁 | 11h / 0x89 |
| Tx AEQ Fail | 主机侧输入自适应均衡没能收敛(AdaptiveInputEqFailFlagTx)——故障在进模块的链路上,不是模块内部 | 11h / 0x8A |
| Rx LOS | 接收端信号丢失 | 11h / 0x93 |
| Rx CDR-LOL | 接收 CDR 失锁 | 11h / 0x94 |
| Alarms/Warns | 功率 / 偏置综合告警状态 | 11h / 0x8B–0x98 |
图标:● 正常 ▲ WARN ■ ALARM
模块级控制寄存器(Lower 0x1A)。表格共四行,只有前两行带操作按钮,后两行是当前状态显示,
本工具不提供修改入口("操作"列显示 —)。
| 行 | 含义 | 操作 | Page / Addr |
|---|---|---|---|
| Software Reset | 向 0x1A[3] 写 1 触发软件复位。所有 DataPath 将重新进入 Init 状态 | Reset Module 按钮(红色) | Lower / 0x1A[3] |
| Low Power Request (SW) | 0x1A[4]。写 1 请求进入低功耗模式,清除则请求退出 | Enter LowPwr / Exit LowPwr 两个按钮 | Lower / 0x1A[4] |
| Allow LowPwrRequestHW | 模块是否响应硬件 LPMode 引脚。●=响应,○=忽略。只读显示 | — | Lower / 0x1A[6] |
| Squelch Method | Squelch 判据:Pav=按平均光功率,OMA=按调制幅度。只读显示 | — | Lower / 0x1A[5] |
读取 Lower Memory 0x56–0x75 的 Application Descriptor 表(最多 8 组),列出模块广告的 Host/Media Interface ID 组合。
| 列 | 说明 |
|---|---|
| AppSel | 应用码序号(1–8),写入 DataPath 配置表时使用 |
| Host Interface ID | SFF-8024 主机侧接口 ID(如 0x4F=200GAUI-2-S、0x4D=100GAUI-2) |
| Media Interface ID | 媒体侧接口 ID(取决于 Media Type) |
| Host Lanes / Media Lanes | 该应用需要的主机侧 / 媒体侧 lane 数 |
| Host Lane Assign | 8-bit 位图,指示该应用可以从哪些主机 lane 起始(bit 0 = lane 1) |
| 列 | 说明 | Page / Addr |
|---|---|---|
| Lane | 通道编号(8 通道模块 1–8;16 通道模块 1–16,第 9 条起在 Bank 1,地址同第 1 条) | — |
| AppSelect | 应用码选择。下拉只列出该模块实际广播的应用(通常 1–8 个),格式为
App 2 — 0x4F/0x1B 4H/4M,依次是应用码、主机/媒体接口 ID、主机与媒体 lane 数;
若某 lane 当前停在模块已不再广播的应用码上,会额外出现一条只读的
App n — not advertised 用于保留现值。
寄存器本身:DPConfigLane,每 lane 1 字节,bits[7:4]=AppSelCode(0 表示"无应用",不是 App 0),
bits[3:1]=DPIDX(CMIS 5.4 起由 DataPathID 更名,强调它是索引而非编号),bit[0]=ExplicitControl。
工具写入时按 Application 的主机通道宽度把通道分成数据通路,每条通道的 DPIDX 写成它所在数据通路的最低通道号减 1(Bank 内计);
ExplicitControl 保留模块里原有的值 | 10h / 0x91+(n−1) |
| TX Enable | 勾选 = 发送使能;取消 = 禁用(OutputDisableTx 取反)。运行中的数据通道任一路取消,整条通道退到 Initialized(Eq. 6-12) | 10h / 0x82[n−1] |
| TX Pol Flip | TX 侧输入极性翻转(InputPolarityFlipTx) | 10h / 0x81[n−1] |
| RX Pol Flip | RX 侧输出极性翻转(OutputPolarityFlipRx) | 10h / 0x89[n−1] |
| DP Deinit | DataPath 去初始化位(每 lane 1 bit),可勾选,Apply 时随其它配置一起下发。 勾上并 Apply 会把该 lane 所在的整条 DataPath 停到 DPDeactivated(规范要求同一条通道的所有 lane 取值一致); 取消勾选再 Apply,通道重新走 DPInit 上来。 注意是 10h,Page 11h 的 0x80 是只读的 DataPath State,不要混淆 | 10h / 0x80[n−1] |
ApplyDPInit = 0xFF,
模块据此重启数据通道状态机——你没有改动的 lane 一样会被重启。
Apply 没有确认对话框。若正在跑业务,请先确认可以断流。
L5, L6, L7, L8: 该 AppSel 码不在本模块声明的应用里 —— 从模块自己公布的列表里选),停留 12 秒。
规范规定同一条 DataPath 的所有 lane 报同一个结果,所以按理由分组比逐条列 lane 更贴近模块真正说的话。01h:155[6],它同时决定了
Page 04h / 12h 到底存不存在。旧版本不看这一位,
在不可调模块上依然往 Page 12h 写——写进一个
模块根本没实现的页,回读全是 0,
而界面会告诉你“已调谐”。界面上本来就
不会展示这张卡片,所以这主要影响
直接调接口的场景(写脚本、或让
Claude Code 驱动工具)。
Laser Tuning 表新增一列 Supervision。CMIS 5.4 的 7.5.3 允许把一条媒体 lane 的 Tx 功率告警阈值改成 相对于它自己的目标发射功率, 而不是用 Page 02h 那套全模块共用的绝对值。
| 显示 | 含义 | Page / Addr |
|---|---|---|
| Relative | 该 lane 已启用相对阈值: 告警窗口 = 目标功率 ± 偏移量。 重新调功率,告警线自己跟着走, 不需要主机再算一遍 | 12h / 0x80[1] |
| Absolute | 该 lane 仍用 Page 02h 全模块共用的绝对阈值 | 12h / 0x80[1] = 0 |
n/a | 模块根本没广播 这项能力 | 04h / 0xC4[6] |
12h:216-217,不分 lane——
规范认为“多大的监控窗口才有意义”
是光模块的属性,不是某一条 lane 的属性;
但启用与否是逐 lane 的。所以同一个模块里
两条 lane 可能按两套规则告警,实时监控表的
着色也会相应不同——鼠标悬停在两边都会
写明用的是哪一套。12h:128-135 这个字节里不只有 Grid,
bit 1 正是上面那个启用位。旧版本写 Grid 时
把整个字节重拼了一遍,于是“改一下栅格”
会把该 lane 静静地换回绝对阈值,告警线跟着变。
现在写入会先读回原字节,只改自己那几位。
规范 8.13.3.1 定义了两个生效触发器, 以前工具只有第一个:
| 按钮 | 写哪里 | 后果 |
|---|---|---|
| Apply | 10h:143 ApplyDPInit |
数据通道重走一遍 DPInit → TxTurnOn → Activated, 业务会断,且会留下 DP Changed 标志 |
| Apply Immediate | 10h:144 ApplyImmediate |
同样把暂存配置提交到硬件, 但数据通道不离开当前状态(一直是 Activated), 因此不会留下 DP Changed 标志 |
10h:144 的写入——不报错、也没任何反应。
所以工具先读 Lower 02h(Module Info 页的
Reconfiguration 行),不支持就把按钮置灰并在
悬停提示里说明原因。按规范,以太网
光模块普遍只支持分步重配置;可调相干
模块这类需要在线调整的场景才用得上
hot 重配置。
01h:155[5:4](Table 8-51)说的是谁来决定
Tx 输出怎么静音:00b 不支持静音;
01b 模块靠降 OMA 静音;10b 模块靠
降 Pav 静音;只有 11b 才是“主机选”。
主机用来选的位是 Lower 0x1A[5]。
0x1A[5] 直接当作“当前方法”显示,
于是在一个声明“我降 OMA”的模块上,
只要那个位被置上,面板就显示 Pav——
恰好和模块实际做的相反。现在面板显示的是
实际生效的方法,并在模块定方法时标注
“fixed by the module”;接口也不再接受这个写入,
而是告诉你模块定的是哪一种。
Lower 0x1A[7] BankBroadcastEnable(Table 8-11,广告位
01h:156[7])。置 1 之后,向任何一个
Bank 的控制寄存器写入,都会被模块
当作对所有 Bank 的同时写入执行。
mock_24lane(3 个 Bank)
广告它——单 Bank 模块根本无处可广播。
| 控制项 | 含义 | Page / Addr |
|---|---|---|
| AutoSquelchDisableTx | 勾选 = 禁用 Tx 自动 Squelch 控制器 | 10h / 0x83 |
| OutputSquelchForceTx | 勾选 = 强制 Tx 输出 Squelch | 10h / 0x84 |
| OutputDisableRx | 勾选 = 禁用 Rx 输出 | 10h / 0x8A |
| AutoSquelchDisableRx | 勾选 = 禁用 Rx 自动 Squelch 控制器 | 10h / 0x8B |
| 模式 | 说明 | Page / Addr |
|---|---|---|
| MediaSide Output | 媒体侧输出环回 | 13h / 0xB4 |
| MediaSide Input | 媒体侧输入环回 | 13h / 0xB5 |
| HostSide Output | 主机侧输出环回 | 13h / 0xB6 |
| HostSide Input | 主机侧输入环回 | 13h / 0xB7 |
媒体侧的两行环回的是媒体通道(Figure 8-2)。模块在 00h:210 里声明没有的媒体通道,对应格子置灰;模块不支持逐通道环回时则不置灰——那时任何一个格子都代表全部通道。
每个 PRBS 块为 8 字节:Enable(使能位图)/ Invert(数据反转位图)/ ByteSwap(PAM4 MSB/LSB 交换位图)/ PreFEC(FEC 编码前注入)/ Pattern×4(4 字节, 4 bits/lane)。
| 分区 | En | Invert | ByteSwap | PreFEC | Pattern | LOL 地址 |
|---|---|---|---|---|---|---|
| Host-Side Generator | 13h/0x90 | 0x91 | 0x92 | 0x93 | 0x94–0x97 | 14h/0x88 |
| Media-Side Generator | 13h/0x98 | 0x99 | 0x9A | 0x9B | 0x9C–0x9F | 14h/0x89 |
发生器表的 LOL 列是 PatternGeneratorLOLFlag(Table 8-138):发生器没能产生有效码型。 它和检测器的 LOL 是两个不同的标志,各在自己的卡片上;符号含义见 10.3 的表。
支持码型:PRBS7 / PRBS9 / PRBS13 / PRBS15 / PRBS23 / PRBS31 及其 Q 变体、SSPRQ,
以及 Custom(厂商自定义)和 User Pattern(主机自定义,见上文
13h:224–255)——下拉框里出现哪些,完全按模块自己声明的来。
每个分区标题下会写明该引擎的时钟来源(13h:176 /
13h:178):内部时钟、参考时钟,或从业务里恢复的时钟。
这决定了顶部「参考时钟丢失」那行字对这一页是不是坏消息。
PreFEC 这一列由 13h:131 决定:模块只在 FEC 的一侧有发生器时,
它会按实际位置勾好并置灰;两侧都没有,则整张表换成一行说明——
那个引擎不在这个模块里(见上文 13h:131)。
| 分区 | En | Invert | ByteSwap | PostFEC | Pattern | LOL 地址 |
|---|---|---|---|---|---|---|
| Host-Side Checker | 13h/0xA0 | 0xA1 | 0xA2 | 0xA3 | 0xA4–0xA7 | 14h/0x8A |
| Media-Side Checker | 13h/0xA8 | 0xA9 | 0xAA | 0xAB | 0xAC–0xAF | 14h/0x8B |
PostFEC 这一列同样由 13h:131 决定,
规则与 10.2 的 PreFEC 一致。
多 Bank 模块上若 13h:177.7(StartStopIsGlobal)生效,卡片顶部会提示:在一个 Bank 里启用或停用检测器,等于在每个 Bank 的同一位置都这样做(Table 8-127)。
LOL 列(发生器和检测器两张卡片都有)的每一格是下面几种之一。这些标志都是闩锁、读后清除的(Table 8-138),所以工具把读到过的记下来:
| 显示 | 含义 |
|---|---|
| ● | 引擎在运行,本次读取标志未置位 |
| LOL | 本次读取标志置位:检测器失锁 / 发生器没能产生有效码型 |
| ●! | 现在正常,但自上次清除标志历史以来出过一次——长时间跑码型时,中途短暂失锁正是要找的东西 |
| – | 该通道的引擎没有运行,没有锁定可言 |
| n/a | 模块没有这条媒体通道(00h:210),这一位不代表任何东西 |
| masked | 跟在 LOL 或 ●! 后面:Page 13h 上对应的 Mask 置位(Table 8-133,出厂默认全部置位):标志照常置位,但不会触发 Interrupt |
| gate done | 仅检测器:该通道的一次门控测量已结束(14h:134 / 14h:135),结果在 BER 和计数器表的 · last gate 行 |
媒体侧发生器和检测器按媒体通道运行。模块没有的媒体通道(00h:210),整行置灰,LOL 列显示 n/a。
13h:130(Table 8-113,只读、必需)逐位
声明哪些 DiagnosticsSelector 取值是有意义的:
| 位 | 含义 | 影响哪张卡片 |
|---|---|---|
bit 0 | 支持 Selector 01h(误码率结果) | BER Results |
bit 1 | 支持 Selector 02h–05h(误码/比特计数) | Error / Bit Counters |
bit 4 | 支持主机侧输入 SNR 测量(Selector 06h) | SNR Results 的 Host 行 |
bit 5 | 支持媒体侧输入 SNR 测量(Selector 06h) | SNR Results 的 Media 行 |
bit 6 / 7 | 主机侧 / 媒体侧 FEC(可提供 PRBS 错误信息) | — |
14h:128——规范 Table 8-136 规定不支持的值「退回 0」,而 Selector 00h 选的是全零,不读回的话会被当成 BER 0、计数 0、SNR 0 dB。没接受的 Bank,表格下方会写明,那些通道显示 — 而不是 0。mock_sr8 声明不做 SNR 测量(只有
BER 和计数),可用来看这个差别。
向 14h/0x80 写入 Selector = 0x01 选择 BER F16 诊断。Host BER 在 14h/0xC0,Media BER 在 14h/0xD0,每通道 2 字节。
F16 解码公式(CMIS 5.4 十进制浮点):BER = mantissa × 10^(exp − 24),其中 bits[15:11]=exp, bits[10:0]=mantissa。
这个 BER 是 PRBS 检测器数出来的。规范 8.17 说明这些误码与 BER 监测基于码型发生器和检测器的侵入式测量, 用于停业务测试;不是业务流量上的 FEC 估计。所以:
13h:129.5)时,另有两行 · last gate,读的是 Selector 11h——
上一个完整门控周期的结果,在下一个周期结束前不变。| 信号质量 | 典型 pre-FEC BER |
|---|---|
| 接近底噪(优良) | < 1e-9 ~ 1e-8 |
| 正常工作 | 1e-8 ~ 1e-4 |
| 边缘 | 1e-4 ~ 1e-3 |
| 劣化 | > 1e-3 |
0 的含义是"模块报告零错误计数",不是测到的 BER 下限。
上表没有 0 这一档是有意的:真实的可达下限取决于该次统计门累积了多少比特,
模块并不告诉你这个数。请不要把 0 当作实测值写进测试报告——
需要给出量化结果时,应根据码率与统计时长自行算出置信下限。
鼠标悬停在 0 上也有同样的说明。显示 — 表示该 lane 没有有效读数。13h:130.1)时,工具会对照同一窗口的计数:TotalBitsCount 为 0 的通道——还没结束过门控的 · last gate、刚启用的检测器——BER 显示 —,因为一个比特都没数过,这个 0 不是测量结果。反过来,检测器停下时数过比特、零误码的通道显示 0 held,不再显示成 off。
向 14h/0x80 写入 Selector = 0x06 选择 SNR 诊断。Host SNR 在 14h/0xD0,Media SNR 在 14h/0xF0,每通道 2 字节小端 u16,单位 1/256 dB。
典型 400G/800G 链路 SNR 范围:PAM4 DSP 输出约 15–22 dB,越高越好。低于 13 dB 通常意味着链路劣化。
使用 Page 14h Diagnostic Selectors 0x02–0x05 读取每通道累计的 Error Count 和 Total Bits Count(U64 小端序)。
| Selector | 说明 |
|---|---|
0x02 | Host 侧 Lane 1–4 Error + Total Bits 计数 |
0x03 | Host 侧 Lane 5–8 计数 |
0x04 | Media 侧 Lane 1–4 计数 |
0x05 | Media 侧 Lane 5–8 计数 |
每通道 16 字节(8 字节 ErrorCount + 8 字节 TotalBitsCount)。TotalBitsCount 最低位为 PSL(Pattern Sync Loss)指示位:0=同步正常,1=曾经失锁。
GUI 同时计算并显示 BER(calc) = ErrorCount / TotalBitsCount 方便直读。
和 10.4 一样,计数来自 PRBS 检测器:没在运行的通道显示 off,停下的显示保留的计数并标 held;
模块声明支持门控结果时,下方另有六行 · last gate(Selector 12h–15h)。
ErrorCount 为 U64 最大值是 NA 值(Table 7-8),显示 no valid sample,
基于它的 BER(calc) 显示 no valid error count。
换栅格或信道前,先在 DataPath 页用 DP Deinit 把承载该通道的 Data Path 停下(规范 7.5.2);运行中这两个输入框是锁定的。微调偏移和目标功率随时可改,只要 Data Path 不在过渡状态。模块没有声明微调能力(04h:129[7])时,微调偏移框是灰的——那是模块没有的控件。
1001b,广告位 04h:129[5],
通道范围 04h:166–169)——栅格下拉里会多出一档 300 GHz,
带自己的通道范围提示,写超范围的通道号也会被拦下。
04h:130–165),
而下拉、范围提示、写入校验全部以它为准;
于是 300 GHz 虽然列在上方的能力行里,却选不中、也不受校验。
现在模块广告了就多读那四个字节,不广告就不读——
那几个字节在 5.3 模块上不保证有意义。
04h:196[6],门限 12h:216–217)——
门限以相对标称发射功率的偏移给出,而非绝对值,且对所有通道共用一组。
高门限 = 标称 + (1+offset)×0.5 dB,低门限 = 标称 − (1+offset)×0.5 dB。
每条通道单独用 12h:128–135 的 bit1 使能;一旦某通道启用,Page 02h 的
模块级绝对功率门限对它不再适用,不要再拿 Module Thresholds 卡片的值去判断该通道。
表格的 Status 列依次判断:调谐中显示 Tuning...;数据通道处于 DPDeactivated / DPDeinit 时显示 n/a——Table 6-21 规定模块在这两个状态下不报告波长失锁,激光器也不一定开着;否则显示 Locked / Unlocked。Tuning Flags 列在没有标志时显示 —,TuningComplete 置位时显示 Tuned。在停下的数据通道上换栅格或信道,Tuned 要等数据通道重新起来才出现:TuningCompleteFlag 在 DPDeactivated、DPInit、DPDeinit 下是 N/A(Table 6-21),模块不得置位。
适用于 C-band / L-band 可调谐激光器模块(Media Interface Technology = 0x10/0x11)。
Page 04h(只读能力广告):支持的 Grid 列表、通道范围、Fine Tuning 分辨率/范围、可编程输出功率范围。
Page 12h(读写控制):
| 字段 | Access | 说明 | Page / Addr |
|---|---|---|---|
| Grid Spacing | RW | bits 7–4 Grid 选择;bit 1 相对功率门限使能;bit 0 Fine Tuning 使能 | 12h / 0x80+lane |
| Channel Number | RW | S16 通道偏移 n,频率 = 193.1 + n × step (THz) | 12h / 0x88+lane×2 |
| Fine Offset | RW | S16,单位 0.001 GHz (1 MHz) | 12h / 0x98+lane×2 |
| Current Frequency | RO | U32,单位 0.001 GHz → THz = val / 10^6 | 12h / 0xA8+lane×4 |
| Target Power | RW | S16,单位 0.01 dBm | 12h / 0xC8+lane×2 |
| Tuning Status | RO | bit 1=TuningInProgress, bit 0=WavelengthUnlocked | 12h / 0xDE+lane |
| Tuning Flags | RO/COR | bit 5 目标功率超范围、bit 4 微调超范围、bit 3 调谐未被接受、bit 2 通道号无效、bit 1 波长失锁、bit 0 TuningComplete;闩锁、读后清除 | 12h / 0xE7+lane |
Mock 后端完整模拟了 CMIS 状态机行为,方便无硬件演示:
| 操作 | 响应行为 |
|---|---|
| Software Reset | ModuleState: Ready → LowPwr (0.3s) → PwrUp (0.5s) → Ready (0.8s),所有 DataPath 经历 Deactivated → Activated;Host Scratchpad(13h:184–191)与 ModuleFaultCause(Lower 41)清零;ModuleStateChangedFlag 只在进入 ModuleReady 时置位(Table 6-9) |
| Enter LowPwr | ModuleState → LowPwr,所有 DataPath → Deactivated,TxPower = 0 |
| Exit LowPwr | ModuleState → Ready;未被 DPDeinit 按住的 DataPath → Activated,被按住的保持 Deactivated |
| TX Disable | 该通道 TxPower 降为 0;运行中的整条数据通路经 TxTurnOff 退到 Initialized(Eq. 6-12),重新使能后经 TxTurnOn 回到 Activated;不置 Tx Failure 标志 |
| Apply DataPath | Config Status 先变为 ConfigInProgress,DP State 经历 Init → TxTurnOn → Activated(约 0.5s);暂存的 DPIDX 必须指向该通道所在数据通路,否则 ConfigRejectedInvalidDataPath |
| PRBS Checker Enable | 该通道的误码计数清零并开始累积(关闭时停止并保留结果);锁定前在该通道置 LOL,闩锁到被读取为止 |
| 13h:177.7 置 1 | 检测器使能和 ResetErrorInformation 的改动带到所有 Bank(门控 + 全局定时器时不带) |
| DiagnosticsSelector | 写入 14h:128 的值若不在 13h:129–130 声明支持的范围内(含保留值、厂商自定义值),退回 00h,结果窗口全零(Table 8-136) |
| Laser Tune | 被接受的请求:Current Frequency 更新;数据通道在运行时立即置 TuningComplete,在停下的数据通道上(换栅格/信道只能在这时)等它回到 DPInitialized 才置位(Table 6-21)。超出范围或未声明的栅格:置 InvalidChannelNumber / TuningNotAccepted 等标志,频率不变 |
0x00、0x11)0x80)结果以十六进制 Dump 格式显示:
0x80: A1 B2 C3 D4 E5 F6 01 02 ........ 0x88: 03 04 05 06 07 08 09 0A ........
格式:地址: 十六进制字节 ASCII(不可打印字符显示为 .)
1E 50 00)0x80 为上页寄存器,工具自动切页;地址 < 0x80 为下页,忽略 Page 字段。
| 地址 | 写下去会发生什么 |
|---|---|
Lower 0x1A bit 3 | 软复位——模块重启,所有数据通道重新初始化,链路中断数秒 |
10h:0x8F = FF | ApplyDataPathInit——按当前暂存配置重新初始化数据通道,相应通道断流 |
10h:0x82 | 关闭对应通道的发送端,该通道立即无光 |
Lower 0x7E / 0x7F | 直接改动 Bank / Page 选择。工具会察觉并作废自己的缓存, 所以后续读取仍然正确;但如果你在中途改页,紧接着的那次读取读到的是你选的页,不是你以为的页 |
0x7F 以下一直写过 0x7F(中途会改掉页选择);以及 Page 9Fh 上超过 8 字节、包含字节 129 的写入(见下)。
只读与保留字节可以写,但模块会忽略或钳位——那时出现红色回读提示是正常的(见上一节)。
规范 5.2.2.2 规定一次 WRITE 最多 8 字节,所以更长的写入会拆成若干次、每次最多 8 字节,结果区会写明 as N WRITEs of up to 8 bytes each (5.2.2.2)。这样写入的一段寄存器不是一次整体写入的(规范 5.2.5.2)。Page 9Fh 例外:写到 9Fh:129 就会发出 CDB 命令(规范 7.2.3),所以超过 8 字节又包含 129 的写入不会替你拆,而是提示你先写其余部分、最后写含 129 的那段。
写操作返回成功只代表 I2C 传输完成,不代表模块真的接受了这个值。所以工具写完会立刻 把同样长度的字节读回来,与你写入的逐字节比较,并把读回的内容显示在下方 hex 转储区:
| 提示 | 含义 |
|---|---|
| 绿色 Written and verified …(3 秒) | 读回值与写入值完全一致 |
| 红色 Write completed but the module reports different values(8 秒) | 这不是工具故障。传输成功了,但模块把值改掉或忽略了—— 最常见的原因是写到了只读或保留字节,其次是模块把超范围的值钳位到了合法区间。 写只读寄存器时出现这条提示是正常现象 |
另有三种情况会在写出去之前就被拒绝,此时模块没有收到任何字节:
Invalid hex data0x100,提示 Write would cross end of page0x7F 之前开始、越过它继续写,会在传输中途
改掉页选择寄存器,剩余字节将落到另一页上。工具直接拒绝并要求你拆成两次写cmd)里运行 EXE,窗口就不会关闭,
最后几行会写明失败原因。
mock_coherent/dr8/sr8/fr4x2,没有 ch341/ch347/ftdiunavailable → 串口驱动(CH347SER.EXE)只让系统识别设备,但 I2C 通信需要 CH347DLL.dll,该文件可能未随驱动自动安装。从 WCH 官网下载 CH347EVT 开发资料包,找到 CH347DLL.dll,复制到 EXE 同目录,重启工具即可。详见第 3 节。0x50)、Bus 编号正确;检查模块与适配器的物理连接。ModuleReady;检查光纤连接。mock_coherent(800GBASE-LR1 数据中心 coherent lite)、mock_coherent_zr(C-band 可调谐 ZR 类)、mock_dr8、mock_sr8、mock_fr4x2、两块 1.6T 模块,mock_24lane(24 通道 / 三 Bank),mock_zr16(16 通道可调谐 / 两 Bank),mock_fewmon(只实现部分监控项),以及 mock_aoc(400G 有源光缆,媒介不可分离)。mock_dr8/sr8/fr4x2 的 Laser Tuning 卡片显示"非可调谐模块"?mock_coherent_zr(Media Interface Tech = 0x10 C-band tunable)支持 Laser Tuning 功能。真实模块的 Page 04h GridSupported 寄存器若为 0,说明不支持调谐。mock_fr4x2 的 Host/Media Lanes 为什么显示 8 而不是 4?read failed / write failed / NACKCMIS 5.4 新增的几个可选页不设单独标签页,按用途放进对应的功能标签, 卡片标题后带 5.4 徽标(与字段名后的标记同一个),5.4 新增内容一望可辨:
| 功能 | 所在标签页 | 寄存器页 |
|---|---|---|
| CMIS 5.4 Optional Pages(广告与页映射) | Module Info | 0Ch |
| Firmware Loads(各固件 Bank 的状态与版本) | Module Info | 0Dh |
| Per-Lane Output Power Thresholds | Monitoring | 62h |
| Lane Polarity Status | DataPath Config | 60h |
| Media Lane Switching | DataPath Config | 6Dh |
| Acquisition Counters | Diagnostics | 61h |
这些页是否存在由模块在
01h:173–174 / 01h:252[5] 广告决定——没有广告的页本工具不会去读:
未实现的页不保证返回有意义的内容,读了再渲染等于把总线上的残留值变成"每通道读数"。
没广告的页对应的卡片直接不出现;5.3 模块以及不实现这些页的 5.4 模块,
Module Info 里的 CMIS 5.4 Optional Pages 卡片会明确写"没有广告任何可选页",这是正常的。
60h:128–129,DataPath Config 标签页)模块当前实际生效的通道极性。它与 Module Info 里的 Default Polarity
(01h:171–172)可以合法地不一致:后者只广告上电时的极性,
而支持可编程极性的模块把实时状态放在 60h。两处不同不是故障。
61h:128–191,Diagnostics 标签页)四类饱和计数器:通道 Tx/Rx、数据通道 Tx/Rx。统计的是数据通道投入使用后 接收侧重新锁定信号的次数,模块在 DPInit 时自动清零。
填入通道号(如 1,3,9)点复位所选通道计数即可清零,写的是
60h:192–193。
62h:128–191,Monitoring 标签页)按媒体通道给出的绝对发射功率门限(S16,0.01 dBm),每通道一组四个值。 启用了相对门限(见 §10.7)的通道以这里的值为准, Page 02h 的模块级门限对它不再适用。
6Dh:136–191,DataPath Config 标签页)把内部媒体通道重定向到不同的外部通道。填入目标顺序(如 5,6,7,8,1,2,3,4
表示内部 1→外部 5、内部 5→外部 1,依此类推),先暂存,确认无误再提交。
00h:210)填 0(7.9.3)。8 条内部通道都有时,这就是一个置换(按组校验,见下方说明)。
不符合的映射本工具直接拒绝下发,因为模块校验后也会拒绝,
而那时你已经被告知"写入成功"了。内部通道只有 1 条的模块,填 5,0,0,0,0,0,0,0 就是把它放到外部通道 52,1,3,4,5,6,7,8 会被拒绝;先让它停下,或整条移动6Dh:136–143),「当前生效」是交换机实际在做的
(6Dh:184–191,只读)。勾选 Enable 本身不会提交,
两列不一致表示提交还没做或被拒绝{1, …, 8},所以目标通道永远是本组内的通道,
交换不能跨组。3
指的是本组的第 3 条,也就是第 11 条通道,
界面上却写成「3」。1Dh:128–191,DataPath Config 标签页,只读)这一页是 CMIS 5.3 引入的(由 01h:252[7] 声明),不是 5.4——放在这里是因为它和 12.4 的 Media Lane Switching 布局相同,卡片标题不带 5.4 徽标。
与 12.4 布局相同,但切换的是主机侧:每一行是一条电气主机通道,「已下发」(1Dh:136–143)是主机写入的名义通道,「当前生效」(1Dh:184–191)是交换机实际连接的名义通道。只在模块于 01h:252[7] 声明支持时读取。
0Ch:128–159,Module Info 标签页)模块用 32 字节位图声明自己实现了哪些页,比逐页试探可靠。下方另显示 Consolidated PM 特性的支持情况(按哪个 CMIS 版本定义、选项与要求的符合度)。
| 按钮 | 位置 | 功能 |
|---|---|---|
| ↻ Refresh Backends | 左侧面板 | 重新扫描可用 Backend |
| Connect | 左侧面板 | 连接模块 |
| Disconnect | 左侧面板 | 断开连接 |
| ↻ Refresh | 各标签页 | 手动刷新当前页数据 |
| ↻ Now | Monitoring | 立即手动刷新一次监控数据;监控因出错停掉后也靠它恢复轮询 |
| Read | Raw Registers | 读取指定寄存器 |
| ⚙ Display | 右上角 | 显示设置:主题、界面缩放、字号、字体(见 5.4) |
| Reset to defaults | ⚙ Display 面板内 | 把四项显示设置恢复默认。只影响外观,不碰模块 |
| ↑ Update | 右上角 | 检查并安装新版本(见 5.2)。是本工具唯一会主动联网的操作 |
以下按钮会影响模块的实际工作状态。只有 Reset Module 有确认对话框,其余点下去立即生效。
| 按钮 | 位置 | 影响范围 | 确认框 |
|---|---|---|---|
| Reset Module | DataPath / 9.1 | 软复位整个模块,所有 DataPath 重新初始化 | 有 |
| Enter LowPwr | DataPath / 9.1 | 模块进入低功耗,关闭发射,TxPower 掉到 0 | 无 |
| Exit LowPwr | DataPath / 9.1 | 请求退出低功耗,恢复到高功耗状态;被 DP Deinit 按住的数据通道保持 Deactivated | 无 |
| Write | Raw Registers / 11.2 | 任意寄存器写入,后果取决于你写了什么 | 无 |
| Apply(DataPath 配置表) | DataPath / 9.3 | 重启全部 8 条 lane 的数据通道 | 无 |
| Apply(Loopback) | Diagnostics / 10.1 | 环回会中断正常收发 | 无 |
界面上有五个 Apply 按钮,各管各的,互不下发对方的设置——唯一的例外是 PRBS。
| Apply 所在卡片 | 实际下发的内容 |
|---|---|
| DataPath 配置表 (9.3) |
影响最大:整体下发 8 条 lane 的 AppSelect / TX Enable / 两个极性掩码,
再写 ApplyDPInit = 0xFF 重启全部数据通道——未改动的 lane 也会被重启 |
| Output Controls (9.4) |
只写 Tx Squelch Disable / Tx Squelch Force / Rx Output Disable / Rx Squelch Disable 四个掩码,不触发 DataPath 重启 |
| Loopback (10.1) |
只写媒体侧/主机侧各两个环回掩码 |
| PRBS Generator (10.2) |
一次下发 Generator 和 Checker 共四个分区;Checker 卡片没有自己的 Apply |
| Laser Tuning (10.7) |
按 lane 下发栅格间隔、通道号、微调偏移与目标功率,仅可调谐模块可用 |