写在前面
MAX96745 是 ADI(原 Maxim)的 eDP/DisplayPort 转 GMSL2 车规显示串行器,官方 datasheet 不公开(需 NDA)。本文档基于 Rockchip Linux 内核与 U-Boot 开源驱动(GPL-2.0)逆向整理,寄存器信息为芯片接口技术事实,非 ADI 官方文档;如需商用授权或官方规格,请联系 Analog Devices 申请。
来源声明:本文基于以下开源驱动整理,遵循 GPL-2.0 许可,转载需保留本声明与来源链接:
- U-Boot:
neggles/u-boot-quartz64→drivers/i2c/muxes/max96745.c- Linux 内核(kernel-5.10-rockchip):
drivers/mfd/max96745.c、drivers/pinctrl/pinctrl-max96745.c、include/linux/mfd/max96745.h
1. 芯片是什么
MAX96745 把 SoC 的 eDP / DisplayPort 视频信号串行化成 GMSL2 链路,通过一根同轴电缆(FAKRA 连接器)或 STP 双绞线传输到远端显示器,同时通过同一条线反向隧道 I²C / UART / GPIO 控制信号,并支持 Power-over-Coax(PoC)。
| 项目 | 内容 |
|---|---|
| 厂商 | Analog Devices(原 Maxim Integrated) |
| 类型 | eDP/DP → GMSL2 串行器(Serializer) |
| 输出 | 双通道 GMSL2(链路 A / 链路 B) |
| 车规型号示例 | MAX96745GTN/V+T(AEC-Q100,TQFN) |
| 评估板 | MAX96745-AAG-EVK# |
| 同系列 | MAX96755 / MAX96755F(同类 eDP→GMSL2) |
| 寄存器寻址 | 16 位地址 / 8 位数据,最大寄存器 0x8000 |
| 设备树 compatible | maxim,max96745 / maxim,max96745-pinctrl / maxim,max96745-bridge |
典型应用:车载信息娱乐显示、仪表盘、后排娱乐屏、工业显示网关——凡是"SoC 的 eDP 输出要拉一根长线到屏幕"的场景。
2. 架构总览
3. 特性详解
3.1 eDP/DisplayPort 接收端
从寄存器布局可以确认这是一颗显示方向的串行器(对比摄像头方向的 MAX96717 是 CSI-2 输入):
| 寄存器 | 位 | 名称 | 说明 |
|---|---|---|---|
| 0x641A | 7:4 | DPRX_TRAIN_STATE | DP RX 链路训练状态(LT 阶段) |
| 0x7000 | 0 | LINK_ENABLE | DP 链路使能 |
| 0x7070 | 7:0 | MAX_LANE_COUNT | DP lane 数量 |
| 0x7074 | 7:0 | MAX_LINK_RATE | DP 链路速率档位 |
| 0x0101 | 5:0 | BPP | 输入每像素位数 |
DP RX 的 lane 数和链路速率决定了能传输的最大分辨率/刷新率组合(典型 4-lane HBR2/HBR3,具体以 ADI 官方规格为准)。
3.2 双通道 GMSL2 输出(链路 A / B)
两颗远端显示器可以各挂一条链路,或做镜像/复制输出。链路 A/B 的寄存器完全对称:
| 功能 | 链路 A | 链路 B |
|---|---|---|
| 链路使能 | 0x0028(LINK_EN) | 0x0032(LINK_EN) |
| 链路复位 | 0x0029(RESET_LINK / RESET_ONESHOT) | 0x0033(同左) |
| 链路锁定状态 | 0x002A(LINK_LOCKED) | 0x0034(同左) |
| 远程控制通道开关 | 0x0076(DIS_REM_CC) | 0x0086(DIS_REM_CC) |
| 视频发送激活 | 0x0107 bit6(VID_TX_ACTIVE_A) | 0x0107 bit7(VID_TX_ACTIVE_B) |
| 视频状态 | 0x0102(PCLKDET/DRIFT_ERR/OVERFLOW/FIFO_WARN) | 0x0108(同左) |
| 线故障状态 | 0x0026(LF_0/LF_1) | 0x0027(LF_2/LF_3) |
链路使能后必须轮询 LINK_LOCKED,U-Boot 驱动里未锁定直接返回 -ENODEV——这是最常见的"串行器不工作"排查点。
3.3 视频发送与状态监测
0x0100:VID_TX_EN(发送使能)+ VID_LINK_SEL(选择输出到哪条链路)0x0102/0x0108:实时状态——PCLKDET(像素时钟检测)、DRIFT_ERR(时钟漂移)、OVERFLOW(FIFO 溢出)、FIFO_WARN0x0107:VID_TX_ACTIVE,驱动用它在 extcon 里上报"视频输出已激活"(EXTCON_JACK_VIDEO_OUT)
3.4 FRC 帧率转换
0x0750~0x0752 是一组帧率转换寄存器(FRCEN、FRCGAIN、FRCSDEN、FRCDATAWIDTH、FRCASYNCEN、FRCHSPOL/FRCVSPOL、FRCDCMODE 等)。显示串行器常用它做帧率/时序适配(例如 60Hz 输入转 120Hz 输出给高刷屏),配置时要同步确认输入 BPP 与输出时序的匹配。
3.5 GPIO 隧道(MFP0 ~ MFP25)
这是 GMSL 串行器最有价值的功能之一:把本地 GPIO 通过链路隧道到远端,反过来远端 GPIO 也能读回来。
- 26 个多功能引脚 MFP0~MFP25
- 每引脚 4 个寄存器(间隔 8 字节):
GPIO_A_REG(gpio) = 0x0200 + gpio × 8 (方向/输出配置) GPIO_B_REG(gpio) = 0x0201 + gpio × 8 (TX 映射 ID/上下拉) GPIO_C_REG(gpio) = 0x0202 + gpio × 8 (RX 映射 ID/边沿速率) GPIO_D_REG(gpio) = 0x0203 + gpio × 8 (A/B 链路收发使能) - 每个引脚可配:GPIO_TX_A_x / GPIO_TX_B_x(发向链路 A/B 的远端引脚)、GPIO_RX_A_x / GPIO_RX_B_x(从链路 A/B 的远端引脚接收)、GPIO(本地直连)、I2C、UART(MFP3/MFP7)
- GPIO TX/RX ID 范围 0~31,用于告诉远端"这个 GPIO 对应远端第几号脚"
Linux pinctrl 驱动把这些封装成 pin function(如 GPIO_TX_A_5),设备树里直接指定 function 即可,不用手写寄存器。
3.6 I²C / UART 隧道
- 芯片本身是 I²C MUX:本地 I²C 总线通过 Remote CC 通道访问链路远端器件
- 两个通道对应两条链路:通道 0 走链路 A(0x0076 DIS_REM_CC 控制)、通道 1 走链路 B(0x0086)
- 设备树里用
i2c-mux-idle-disconnect属性控制空闲时是否断开 - UART 复用 MFP3/MFP7
3.7 线故障监测(Line Fault Monitor)
驱动实现了完整的线缆故障诊断(sysfs 接口 line_fault_monitor):
- 使能:
0x0005的 PU_LF0~PU_LF3(对应 LMN0~3 引脚) - 状态:
0x0026(LF_0/LF_1)、0x0027(LF_2/LF_3)
| 状态编码 | 含义 |
|---|---|
| 0b000 | 对电源短路 |
| 0b001 | 对地短路 |
| 0b010 | 正常 |
| 0b011 | 线路开路 |
| 0b1XX | 线间短路 |
这对车载线束排查非常实用——不用万用表就能知道哪根线断了还是短路了。
3.8 复位、电源与功耗管理
0x0010:RESET_ALL(bit7)、SLEEP(bit3)- 电源引脚:
enable-gpio(高有效,上电后需 200ms)、pwdnb-gpio(低有效,30ms) - 驱动用 regmap 缓存(REGCACHE_RBTREE)支持 suspend/resume,休眠时缓存寄存器、唤醒后一次性同步
4. 引脚定义(驱动确认)
说明:MAX96745 的物理封装引脚(TQFN 具体引脚号、电源/地/功能矩阵)属于 ADI datasheet 内容,官方不公开。以下为从开源驱动逆向确认的逻辑/功能引脚,可指导软件配置;硬件设计请向 ADI 申请官方文档。
4.1 多功能引脚 MFP0 ~ MFP25(26 个)
pinctrl 驱动确认,每个 MFP 引脚可配置为以下功能之一:
| 功能 | 方向 | 说明 |
|---|---|---|
| GPIO | 本地 | 本地普通 GPIO(输入 / 输出 / 上下拉) |
| GPIO_TX_A_x | 本地 → 链路 A | 把本地 GPIO 状态隧道发送到链路 A 远端 x 号脚 |
| GPIO_TX_B_x | 本地 → 链路 B | 同上,发往链路 B |
| GPIO_RX_A_x | 链路 A → 本地 | 读取链路 A 远端 x 号脚状态 |
| GPIO_RX_B_x | 链路 B → 本地 | 读取链路 B 远端 x 号脚状态 |
| I2C | 本地 | 复用为 I2C(仅 MFP3 / MFP7) |
| UART | 本地 | 复用为 UART(仅 MFP3 / MFP7) |
- x = 0~31(GPIO 隧道远端映射 ID,寄存器 GPIO_TX_ID / GPIO_RX_ID)
- 每个引脚 4 个配置寄存器(0x0200 + gpio×8 起),方向 / 隧道映射 / 上下拉独立可配
引脚清单(26 个多功能引脚):
| 引脚 | 可用功能 |
|---|---|
| MFP0 ~ MFP2 | GPIO / GPIO_TX_A_x / GPIO_TX_B_x / GPIO_RX_A_x / GPIO_RX_B_x |
| MFP3 | 上述功能 + I2C + UART |
| MFP4 ~ MFP6 | GPIO / GPIO_TX_A_x / GPIO_TX_B_x / GPIO_RX_A_x / GPIO_RX_B_x |
| MFP7 | 上述功能 + I2C + UART |
| MFP8 ~ MFP25 | GPIO / GPIO_TX_A_x / GPIO_TX_B_x / GPIO_RX_A_x / GPIO_RX_B_x |
4.2 线故障监测引脚 LMN0 ~ LMN3(4 个)
从 0x0005 的 PU_LF0~PU_LF3 与 0x0026 / 0x0027 的 LF_0~LF_3 推断:
| 引脚 | 使能位 | 状态位 | 监测对象 |
|---|---|---|---|
| LMN0 | PU_LF0 | LF_0 | 链路通道 0 |
| LMN1 | PU_LF1 | LF_1 | 链路通道 1 |
| LMN2 | PU_LF2 | LF_2 | 链路通道 2 |
| LMN3 | PU_LF3 | LF_3 | 链路通道 3 |
4.3 控制与电源引脚
从设备树属性确认:
| 引脚 | 设备树属性 | 极性 / 时序 | 说明 |
|---|---|---|---|
| EN(使能) | enable-gpios | 高有效,200ms | 芯片上电使能 |
| PWDNB | pwdnb-gpios | 低有效,30ms | 掉电 / 复位控制(低 = 关闭) |
4.4 接口引脚(接口级,推断)
以下为接口级引脚(具体封装引脚号需官方文档):
| 接口 | 说明 | 依据 |
|---|---|---|
| eDP / DP 输入 | 多 lane(lane 数可配)+ DP AUX | 0x7070 MAX_LANE_COUNT、0x641A 训练状态 |
| GMSL2 输出 A | SIO+/SIO-(或同轴单端) | 链路 A 寄存器组 |
| GMSL2 输出 B | SIO+/SIO-(或同轴单端) | 链路 B 寄存器组 |
| 本地 I2C | SCL / SDA(16 位寄存器配置总线) | i2c 驱动 |
| 电源 | 核心供电 + PoC(Power-over-Coax) | enable / pwdnb 时序 + PoC 支持 |
物理封装(TQFN)的完整引脚图与功能矩阵请向 ADI 申请官方 datasheet(NDA)。
5. 寄存器速查总表
4.1 系统与复位
| 地址 | 位 | 名称 | 说明 |
|---|---|---|---|
| 0x0005 | 3:0 | PU_LF3~PU_LF0 | 线故障监测使能(每 bit 对应 LMN0~3) |
| 0x0010 | 7 | RESET_ALL | 全复位 |
| 0x0010 | 3 | SLEEP | 睡眠 |
| 0x0013 | 3 | LOCKED | 链路锁定标志 |
| 0x0013 | 2 | ERROR | 链路错误标志 |
| 0x0070 | 7:0 | I2C_FAST_MODE | I2C 快速模式配置(驱动写 0x16) |
4.2 链路 A / B
| 地址 | 位 | 名称 | 说明 |
|---|---|---|---|
| 0x0026 | 2:0 / 6:4 | LF_0 / LF_1 | 链路 A 侧通道 0/1 线故障 |
| 0x0027 | 2:0 / 6:4 | LF_2 / LF_3 | 链路 B 侧通道 2/3 线故障 |
| 0x0028 / 0x0032 | 7 | LINK_EN | 链路 A / B 使能 |
| 0x0029 / 0x0033 | 0 | RESET_LINK | 链路 A / B 复位 |
| 0x0029 / 0x0033 | 1 | RESET_ONESHOT | 链路 A / B 一次性复位 |
| 0x002A / 0x0034 | 0 | LINK_LOCKED | 链路 A / B 锁定状态 |
| 0x0076 / 0x0086 | 7 | DIS_REM_CC | 禁用链路 A / B 远程控制通道 |
4.3 视频
| 地址 | 位 | 名称 | 说明 |
|---|---|---|---|
| 0x0100 | 2:1 | VID_LINK_SEL | 视频输出链路选择 |
| 0x0100 | 0 | VID_TX_EN | 视频发送使能 |
| 0x0101 | 5:0 | BPP | 每像素位数 |
| 0x0102 | 7 | PCLKDET_A | 链路 A 像素时钟检测 |
| 0x0102 | 6 | DRIFT_ERR_A | 链路 A 时钟漂移错误 |
| 0x0102 | 5 | OVERFLOW_A | 链路 A FIFO 溢出 |
| 0x0102 | 4 | FIFO_WARN_A | 链路 A FIFO 警告 |
| 0x0102 | 2 | LIM_HEART | 心跳限制 |
| 0x0107 | 7:6 | VID_TX_ACTIVE_B / _A | 链路 B / A 视频发送激活 |
| 0x0108 | 7:4 | PCLKDET_B / DRIFT_ERR_B / OVERFLOW_B / FIFO_WARN_B | 链路 B 视频状态 |
4.4 GPIO / MFP(gpio = 0~25)
| 寄存器组 | 位 | 名称 | 说明 |
|---|---|---|---|
| A(0x0200+gpio×8) | 7 | RES_CFG | 电阻配置 |
| A | 5 | TX_COM_EN | 发送公共端使能 |
| A | 4 / 3 | GPIO_OUT / GPIO_IN | 输出 / 输入 |
| A | 0 | GPIO_OUT_DIS | 输出禁用 |
| B(0x0201+gpio×8) | 7:6 | PULL_UPDN_SEL | 上下拉选择 |
| B | 5 | OUT_TYPEC | 输出类型 |
| B | 4:0 | GPIO_TX_ID | GPIO TX 映射 ID(0~31) |
| C(0x0202+gpio×8) | 7 | OVR_RES_CFG | 电阻配置覆盖 |
| C | 6:5 | IO_EDGE_RATE | IO 边沿速率 |
| C | 4:0 | GPIO_RX_ID | GPIO RX 映射 ID(0~31) |
| D(0x0203+gpio×8) | 5 | GPIO_IO_RX_EN | IO RX 使能 |
| D | 4 | GPIO_OUT_LGC | 输出逻辑 |
| D | 3 / 2 | GPIO_RX_EN_B / GPIO_TX_EN_B | 链路 B 收 / 发使能 |
| D | 1 / 0 | GPIO_RX_EN_A / GPIO_TX_EN_A | 链路 A 收 / 发使能 |
4.5 FRC 帧率转换
| 地址 | 位 | 名称 | 说明 |
|---|---|---|---|
| 0x0750 | 7:6 | FRCZEROPAD | 零填充 |
| 0x0750 | 5 | FRCZPEN | 零填充使能 |
| 0x0750 | 4 | FRCSDGAIN | 增益(简化) |
| 0x0750 | 3 | FRCSDEN | FRC 使能(简化) |
| 0x0750 | 2:1 | FRCGAIN | FRC 增益 |
| 0x0750 | 0 | FRCEN | FRC 使能 |
| 0x0751 | 3 | FRCDATAWIDTH | 数据宽度 |
| 0x0751 | 2 | FRCASYNCEN | 异步模式 |
| 0x0751 | 1 / 0 | FRCHSPOL / FRCVSPOL | HS / VS 极性 |
| 0x0752 | 1:0 | FRCDCMODE | DC 模式 |
4.6 DP 接收
| 地址 | 位 | 名称 | 说明 |
|---|---|---|---|
| 0x641A | 7:4 | DPRX_TRAIN_STATE | DP 链路训练状态 |
| 0x7000 | 0 | LINK_ENABLE | DP 链路使能 |
| 0x7070 | 7:0 | MAX_LANE_COUNT | lane 数量 |
| 0x7074 | 7:0 | MAX_LINK_RATE | 链路速率 |
6. 初始化流程(由驱动推导)
1. 上电:enable GPIO = 1 → 等待 200ms → pwdnb GPIO = 0 → 等待 30ms
2. 全复位:0x0010 写 RESET_ALL=1 → 等待 100ms
3. I2C 快速模式:0x0070 = 0x16
4. (可选)线故障监测:0x0005 置位 PU_LFx
5. 链路使能:0x0028(A)/ 0x0032(B)写 LINK_EN=1
6. 等待锁定:轮询 0x002A(A)/ 0x0034(B)LINK_LOCKED=1
→ 超时未锁定说明链路物理层有问题(线序/供电/对端未上电)
7. 视频发送:0x0100 写 VID_TX_EN=1 + VID_LINK_SEL 选择链路
8. GPIO 隧道:按需配置 MFP 的 0x0200~0x0203
(Linux 下直接用 pinctrl 的 function,如 GPIO_TX_A_5)
9. I2C 隧道:通过 0x0076/0x0086 的 DIS_REM_CC 切换通道访问远端器件
7. 设备树配置示例
以下设备树基于驱动代码推断(I2C 地址和 GPIO 编号按实际硬件调整):
&i2c4 {
max96745: max96745@48 { /* I2C 地址按硬件实际修改 */
compatible = "maxim,max96745";
reg = <0x48>;
enable-gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>; /* 上电使能 */
pwdnb-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>; /* 低有效 */
i2c-mux-idle-disconnect; /* 空闲断开 MUX */
line-fault-monitor = <0>; /* 使能 LMN0 监测 */
#address-cells = <1>;
#size-cells = <0>;
/* 链路 A 远端器件(通过 Remote CC 隧道访问) */
link_a_dev: link_a@50 {
reg = <0x50>; /* 远端器件 I2C 地址 */
};
/* 链路 B 远端器件 */
link_b_dev: link_b@51 {
reg = <0x51>;
};
};
};
注:以上 I2C 地址 0x48 为常见默认值,需以实际硬件/ADI 确认为准;GPIO 编号按你的板卡原理图修改。
8. 与同系列芯片对比
| 芯片 | 方向 | 输入 | 输出 | 用途 |
|---|---|---|---|---|
| MAX96745 | 串行器 | eDP / DisplayPort | 双 GMSL2 | 车载/工业显示长线传输 |
| MAX96755 / F | 串行器 | eDP | GMSL2 | 同类显示串行器 |
| MAX96717 | 串行器 | MIPI CSI-2 | GMSL2 | 摄像头信号上行车 |
| MAX96789 | 串行器 | 多路 | GMSL2 | 摄像头聚合(寄存器手册已另文整理) |
| MAX96724 | 解串器 | 4× GMSL2/1 | CSI-2 | 摄像头信号聚合接收 |
选型要点:显示方向选 MAX96745/96755,摄像头方向选 MAX96717/96789;需要多路输入聚合选解串器(MAX96724 等)。
9. 参考资料
驱动源码
| 来源 | 仓库 | 文件 |
|---|---|---|
| U-Boot | neggles/u-boot-quartz64 | drivers/i2c/muxes/max96745.c |
| Linux MFD | kernel-5.10-rockchip | drivers/mfd/max96745.c |
| Linux Pinctrl | 同上 | drivers/pinctrl/pinctrl-max96745.c |
| Linux 头文件 | 同上 | include/linux/mfd/max96745.h |
官方资料
- ADI 官方产品页与 datasheet 不公开(需 NDA),可通过 ADI 官网联系 FAE 申请
- ADI 官方 GMSL 开源入口:https://github.com/analogdevicesinc/gmsl
- ADI GMSL2 硬件设计与验证指南(公开 PDF):
Public GMSL2 Hardware Design and Validation Guide
本文档由开源驱动逆向整理,寄存器信息为芯片接口技术事实,仅供工程参考,不构成 ADI 官方规格承诺。