NotePublic/Hardware/Bus/FPD-Link_III/FPD-Link_III.md

308 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FPD-Link III
FPD-Link III 串行总线方案支持通过单个差分链路实现高速视频数据传输和双向控制通信的全双工控制。 通过单个差分对整合视频数据和控制可减少互连线尺寸和重量,同时还消除了偏差问题并简化了系统设计。
最初 FPD-LINK 应用在笔记本电脑上用于视频显示TI 公司结合汽车娱乐信息系统应用环境,开发出 FPD-Link III 编串器Serializer/解串器Deserializer在信息娱乐系统显示屏和 ADAS 摄像头应用中通过一条 STP 或同轴电缆传输视频、音频、控制数据和电力。
FPD-Link III 除了可以加载各种类型的视频信号外,还可以加载 I2C、SPI、GPIO 透传信号等。
## 1.DS90Ux94x
DS90Ux94x 系列芯片为 FPD-Link III bridge 芯片,分为 Serializer 和 Deserializer。其中 DS90Ux949 和 DS90Ux947 为 SerializerDS90Ux948 为 Deserializer。
* DS90Ux947 是 OpenLDI包括 LVDS 到 FPD-Link III 编串器
* DS90Ux949 是 HDMI 到 FPD-Link III 编串器
* DS90Ux948 是 FPD-Link III 解串器,可与 DS90Ux947 和 DS90Ux949 搭配使用。
## 2.DS90Ux947
### 2.1.连接方式
DS90Ux947 与 DS90Ux948 的连接方式如下:
![DS90Ux947 与 DS90Ux948 的连接](img/FPD-Link_III/001.png)
### 2.2.Input
DS90Ux947 支持 24-bit 色彩模式 (8-bit RGB) 以及两种 mapping 机制OpenLDI Mapping 和 SPWG Mapping。同时 DS90Ux947 可以使用 D0~D3 的单路输入,也可以使用 D0~D7 双路输入。
D0~D7 双路 OpenLDI Mapping 输入时序如下:
![24-Bit Color Dual Pixel Mapping: MSBs on D3/D7 (OpenLDI Mapping)](img/FPD-Link_III/002.png)
D0~D7 双路 SPWG Mapping 输入时序如下:
![24-Bit Color Dual Pixel Mapping: LSBs on D3/D7 (SPWG Mapping)](img/FPD-Link_III/003.png)
D0~D3 单路 OpenLDI Mapping 输入时序如下:
![24-Bit Color Single Pixel Mapping: MSBs on D3 (OpenLDI Mapping)](img/FPD-Link_III/004.png)
D0~D3 单路 SPWG Mapping 输入时序如下:
![24-Bit Color Single Pixel Mapping: LSBs on D3 (SPWG Mapping)](img/FPD-Link_III/005.png)
以上 4 种模式可以通过 MODE_SEL[1:0] 电阻来设置,也可以通过 0x4F[7:6] 来设置:
| Reg | Bits | Description |
|------|------|-------------------------------------------|
| 0x4F | 7 | 0: SPWG mapping; 1: OpenLDI mapping. |
| 0x4F | 6 | 0: Dual-pixel mode; 1: Single-pixel mode. |
### 2.3.Output
DS90Ux947 的输出可以为双绞线或同轴电缆。可以使用 DOUT0/DOUT1 这样的 Single FPD-Link III Transmitter mode也可以同时使用 DOUT0 和 DOUT1 这样的 Dual FPD-Link III Transmitter mode。
可通过 MODE_SEL[1:0] 或 0x5B[7]0x5B[1:0] 寄存器来进行设置:
| Reg | Bits | Description |
|------|------|---------------------------------------------------------------------------------------------|
| 0x5B | 7 | 0 : Twisted Pair; 1 : Coax. |
| 0x5B | 1 | 0: Force Single FPD-Link III Transmitter mode; 1: Force Dual FPD-Link III Transmitter mode. |
| 0x5B | 0 | 0 : Auto-Detect FPD-Link III mode; 1 : Forced Single or Dual FPD-Link III mode. |
### 2.4.Remote Slave
通过设置 DS90Ux947 的 Remote Slave 可以访问挂接在 Deserializer I2C 总线上的设备,最多支持 8 个 Remote Slave 设备。
Remote Slave 主要有两组寄存器Slave ID 和 Slave Alias其地址分别为
* Slave ID: 0x07, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76
* Slave Alias: 0x08, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D
## 3.DS90Ux948
### 3.1.连接方式
DS90Ux948 可以与 DS90Ux947 和 DS90Ux949 搭配使用。以 DS90Ux948 与 DS90Ux949 的连接方式为参考,示例如下:
![DS90Ux948 与 DS90Ux949 的连接](img/FPD-Link_III/006.png)
### 3.2.Input
可由 MODE_SEL[1:0] 或 0x23[3] 选择 DS90Ux948 的输入为双绞线还是同轴电缆:
| Reg | Bits | Description |
|------|------|-------------------------------------------|
| 0x23 | 3 | 0 : Shielded Twisted pair (STP); 1 : Coax |
DS90Ux948 可通过总线自动探测或通过 0x34[4:3] 寄存器设置 Single FPD-Link III Transmitter mode 还是 Dual FPD-Link III Transmitter mode。
| Reg | Bits | Description |
|------|------|-------------------------------------------|
| 0x34 | 4-3 | 00: Auto-detect based on received data; 01: Forced Mode: Dual link; 10: Forced Mode: Single link, primary input; 11: Forced Mode: Single link, secondary input. |
### 3.3.Output
通过 MODE_SEL[1:0] 或 0x49[1:0] 可以选择输出模式。
| Reg | Bits | Description |
|------|------|-------------------------------------------|
| 0x49 | 1-0 | 00 : Dual FPD/OLDI output; 01 : Dual SWAP FPD/OLDI output; 10 : Single FPD/OLDI output; 11 : Replicate FPD/OLDI output. |
根据不同的输入输出配置DS90Ux948 可以有以下 5 种配置方式:
![DS90Ux948 的 5 种输入输出配置](img/FPD-Link_III/007.png)
### 3.4.Remote Slave
通过设置 DS90Ux948 的 Remote Slave 可以访问挂接在 Serializer I2C 总线上的设备,最多支持 8 个 Remote Slave 设备。
Remote Slave 主要有两组寄存器Slave ID 和 Slave Alias其地址分别为
* Slave ID: 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
* Slave Alias: 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
## 4.DS90Ux949
### 4.1.连接方式
DS90Ux949 与 DS90Ux948 的连接方式如下:
![DS90Ux949 与 DS90Ux948 的连接](img/FPD-Link_III/008.png)
### 4.2.Input
DS90Ux949 的输入为标准 HDMI 总线。
### 4.3.Output
DS90Ux949 的输出可以为双绞线或同轴电缆。可以使用 DOUT0/DOUT1 这样的 Single FPD-Link III Transmitter mode也可以同时使用 DOUT0 和 DOUT1 这样的 Dual FPD-Link III Transmitter mode。
可通过 MODE_SEL[1:0] 或 0x5B[7]0x5B[1:0] 寄存器来进行设置:
| Reg | Bits | Description |
|------|------|---------------------------------------------------------------------------------------------|
| 0x5B | 7 | 0 : Twisted Pair; 1 : Coax. |
| 0x5B | 1 | 0: Force Single FPD-Link III Transmitter mode; 1: Force Dual FPD-Link III Transmitter mode. |
| 0x5B | 0 | 0 : Auto-Detect FPD-Link III mode; 1 : Forced Single or Dual FPD-Link III mode. |
### 4.4.Remote Slave
通过设置 DS90Ux949 的 Remote Slave 可以访问挂接在 Deserializer I2C 总线上的设备,最多支持 8 个 Remote Slave 设备。
Remote Slave 主要有两组寄存器Slave ID 和 Slave Alias其地址分别为
* Slave ID: 0x07, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76
* Slave Alias: 0x08, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D
### 4.5.EDID
DS90Ux949 支持通过以下方式对 EDID 进行配置:
* External local EDID (EEPROM)
* Internal EDID loaded into device memory
* Remote EDID connected to I2C bus at deserializer side
* Internal pre-programmed EDID
可通过 HDMI 的 DDC 接口读取 EDID。如果没有支持 DDC 接口或没有配置 EDID可以在内核加载时通过参数指定 EDID 固件。EDID 固件的具体使用方法可参见仓库中的《Kernel_EDID_配置》和《EDID_修改和参数说明》。
## 5.Test Pattern Generation Feature
DS90Ux94x 系列芯片支持一些测试模式如生成纯色Fixed Pattern或彩条Color Bars可参考官方的《Exploring the Int Test Pattern Generation Feature of FPD-Link III IVI Devices》进行操作。
测试模式的原理是通过 DS90Ux947 或 DS90Ux949 输出视频信号给 DS90Ux948。特别的 DS90Ux947 和 DS90Ux949 可以使用内部时钟来进行测试,避免了外部时钟的干扰,并且该时钟可以进行分频。
总体而言,需要通过直接访问寄存器和间接访问寄存器来配置 DS90Ux947 和 DS90Ux949。直接访问寄存器就是正常的 I2C 寄存器,根据 I2C 设备地址和寄存器地址进行访问即可;间接访问寄存器需要通过 0x66 和 0x67 两个 I2C 寄存器来实现,向 0x66 写入要访问的间接访问寄存器地址后,可通过 0x67 读写间接访问寄存器的值。通过间接访问寄存器可以设置显示屏的相关参数Total Frame Size0x04、0x05、0x06、Active Frame Size0x07、0x08、0x09等。
### 5.1.Fixed Pattern
用 i2cset 工具,以 1920x720 分辨率以及 I2C 总线号为 3 设置 Fixed Pattern 循环显示的方法如下(使用内部时钟 2 分频=100MHz
```bash
# Disable Pattern Generator
i2cset -f -y 3 0x0c 0x64 0x50
# 设置时钟
i2cset -f -y 3 0x0c 0x66 0x03
i2cset -f -y 3 0x0c 0x67 0x02
# 设置 Total Horizontal/Vertical Width
i2cset -f -y 3 0x0c 0x66 0x04
i2cset -f -y 3 0x0c 0x67 0x20
i2cset -f -y 3 0x0c 0x66 0x05
i2cset -f -y 3 0x0c 0x67 0x28
i2cset -f -y 3 0x0c 0x66 0x06
i2cset -f -y 3 0x0c 0x67 0xE3
# 设置 Active Horizontal/Vertical Width
i2cset -f -y 3 0x0c 0x66 0x07
i2cset -f -y 3 0x0c 0x67 0x80
i2cset -f -y 3 0x0c 0x66 0x08
i2cset -f -y 3 0x0c 0x67 0x27
i2cset -f -y 3 0x0c 0x66 0x09
i2cset -f -y 3 0x0c 0x67 0xD0
# 内部时钟使能Enable Auto-Scroll
i2cset -f -y 3 0x0c 0x65 0x05
# Enable Pattern Generator
i2cset -f -y 3 0x0c 0x64 0x53
```
用 i2cset 工具,以 1920x720 分辨率以及 I2C 总线号为 3 设置 Fixed Pattern 静态显示的方法如下(使用内部时钟 2 分频=100MHz
```bash
# Disable Pattern Generator
i2cset -f -y 3 0x0c 0x64 0x50
# 设置时钟
i2cset -f -y 3 0x0c 0x66 0x03
i2cset -f -y 3 0x0c 0x67 0x02
# 设置 Total Horizontal/Vertical Width
i2cset -f -y 3 0x0c 0x66 0x04
i2cset -f -y 3 0x0c 0x67 0x20
i2cset -f -y 3 0x0c 0x66 0x05
i2cset -f -y 3 0x0c 0x67 0x28
i2cset -f -y 3 0x0c 0x66 0x06
i2cset -f -y 3 0x0c 0x67 0xE3
# 设置 Active Horizontal/Vertical Width
i2cset -f -y 3 0x0c 0x66 0x07
i2cset -f -y 3 0x0c 0x67 0x80
i2cset -f -y 3 0x0c 0x66 0x08
i2cset -f -y 3 0x0c 0x67 0x27
i2cset -f -y 3 0x0c 0x66 0x09
i2cset -f -y 3 0x0c 0x67 0xD0
# 内部时钟使能Disable Auto-Scroll
i2cset -f -y 3 0x0c 0x65 0x04
# Enable Pattern Generator
i2cset -f -y 3 0x0c 0x64 0x53
```
### 5.2.Color Bars
用 i2cset 工具,以 1920x720 分辨率以及 I2C 总线号为 3 设置 Color Bars 的方法如下(使用内部时钟 2 分频=100MHz
```bash
# Disable Pattern Generator
i2cset -f -y 3 0x0c 0x64 0x50
# 设置时钟
i2cset -f -y 3 0x0c 0x66 0x03
i2cset -f -y 3 0x0c 0x67 0x02
# 设置 Total Horizontal/Vertical Width
i2cset -f -y 3 0x0c 0x66 0x04
i2cset -f -y 3 0x0c 0x67 0x20
i2cset -f -y 3 0x0c 0x66 0x05
i2cset -f -y 3 0x0c 0x67 0x28
i2cset -f -y 3 0x0c 0x66 0x06
i2cset -f -y 3 0x0c 0x67 0xE3
# 设置 Active Horizontal/Vertical Width
i2cset -f -y 3 0x0c 0x66 0x07
i2cset -f -y 3 0x0c 0x67 0x80
i2cset -f -y 3 0x0c 0x66 0x08
i2cset -f -y 3 0x0c 0x67 0x27
i2cset -f -y 3 0x0c 0x66 0x09
i2cset -f -y 3 0x0c 0x67 0xD0
# 内部时钟使能Enable Auto-Scroll
i2cset -f -y 3 0x0c 0x65 0x05
# Enable Pattern Generator
i2cset -f -y 3 0x0c 0x64 0x57
```
用 i2cset 工具,以 1280x720 分辨率以及 I2C 总线号为 5 设置 Color Bars 的方法如下(使用内部时钟 2 分频=100MHz
```bash
# Disable Pattern Generator
i2cset -f -y 5 0x0c 0x64 0x50
# 设置时钟
i2cset -f -y 5 0x0c 0x66 0x03
i2cset -f -y 5 0x0c 0x67 0x02
# 设置 Total Horizontal/Vertical Width
i2cset -f -y 5 0x0c 0x66 0x04
i2cset -f -y 5 0x0c 0x67 0x3C
i2cset -f -y 5 0x0c 0x66 0x05
i2cset -f -y 5 0x0c 0x67 0x35
i2cset -f -y 5 0x0c 0x66 0x06
i2cset -f -y 5 0x0c 0x67 0x18
# 设置 Active Horizontal/Vertical Width
i2cset -f -y 5 0x0c 0x66 0x07
i2cset -f -y 5 0x0c 0x67 0x00
i2cset -f -y 5 0x0c 0x66 0x08
i2cset -f -y 5 0x0c 0x67 0x25
i2cset -f -y 5 0x0c 0x66 0x09
i2cset -f -y 5 0x0c 0x67 0xD0
# 内部时钟使能Enable Auto-Scroll
i2cset -f -y 5 0x0c 0x65 0x05
# Enable Pattern Generator
i2cset -f -y 5 0x0c 0x64 0x57
```
## 6.经验总结
硬件拉的 MODE_SEL[1:0] 可能存在问题或与预期设计不移植,或因硬件修改发生了变更却没有跟踪,因此调试不通时应先确认与 MODE_SEL[1:0] 有关的寄存器,或者直接通过相关寄存器对其模式进行强制设置。
## 7.内部参考关键字
1. EDID
## 8.外部参考资料
1. [AN-2198 Exploring Int Test Patt Gen Feat of 720p FPD-Link III Devices](http://www.ti.com/lit/pdf/SNLA132)