VGA(Video Graphics Array)是 1987 年 IBM 推出的模拟视频接口标准,核心是用 15 针 D-Sub 线缆传输RGB 三基色模拟电压 + 行 / 场同步脉冲(RGBHV),通过逐行扫描在 CRT/LCD 上成像。
接口与引脚定义(15 针 D-Sub)
| 引脚 | 信号 | 说明 |
|---|---|---|
| 1 | Red(红) | 红基色模拟信号(0–0.7V) |
| 2 | Green(绿) | 绿基色模拟信号(0–0.7V) |
| 3 | Blue(蓝) | 蓝基色模拟信号(0–0.7V) |
| 4 | ID2 | 显示器识别位(EDID) |
| 5 | GND | 地 |
| 6 | R-GND | 红信号地 |
| 7 | G-GND | 绿信号地 |
| 8 | B-GND | 蓝信号地 |
| 9 | NC | 保留(空) |
| 10 | Digital GND | 数字地 |
| 11 | ID0 | 显示器识别位 |
| 12 | ID1 | 显示器识别位 |
| 13 | HSYNC | 行同步脉冲(水平扫描) |
| 14 | VSYNC | 场同步脉冲(垂直扫描) |
| 15 | ID3 | 显示器识别位 |
关键信号:RGB(色彩)+ HSYNC/VSYNC(扫描时序)。
核心工作原理(数模转换 + 扫描成像)
1. 显卡端:数字→模拟(RAMDAC)
- 显存中图像是数字像素(RGB 8/10bit)。
- 显卡 RAMDAC(数模转换器)将数字 RGB 转为0–0.7V 模拟电压,电压越高亮度越强。
- 同时生成 **HSYNC(行)、VSYNC(场)** 同步脉冲,控制扫描时序。
2. 传输:模拟信号通过 15 针线缆
- RGB 为模拟电压信号,易受干扰、长距离易衰减。
- HSYNC/VSYNC 为TTL 电平脉冲,时序精准。
3. 显示设备端:模拟→成像(CRT/LCD)
- CRT 显示器(原生支持)
- 电子枪发射三束电子,分别受 R/G/B 电压调制。
- HSYNC 控制电子束从左到右逐行扫描;VSYNC 控制从上到下逐场扫描。
- 电子束轰击荧光粉发光,人眼视觉暂留形成完整图像。
- LCD 显示器(需 ADC 转换)
- 内置 ADC 将模拟 RGB 转回数字信号,驱动液晶面板。
- 两次转换(D/A→A/D)会损失细节、降低画质。
扫描时序(逐行扫描,以 1024×768@60Hz 为例)
1. 行时序(HSYNC,水平扫描)
- 每一行周期≈16μs(64kHz 行频)。
- 分为:行同步脉冲(HS)→后沿→有效图像→前沿。
- 有效图像期:RGB 电压按像素依次输出,形成一行画面。
2. 场时序(VSYNC,垂直扫描)
- 每场周期≈16.7ms(60Hz 场频)。
- 分为:场同步脉冲(VS)→后沿→有效行(768 行)→前沿。
- 有效行期:逐行扫描完整个屏幕,形成一帧图像。
3. 消隐(Blank)
- 行 / 场回扫时(电子束从行尾回行首、场尾回场首),RGB 电压置 0(黑电平),避免回扫线干扰图像。
关键特点与局限
✅ 优点
- 兼容性极强:老显卡、显示器、投影仪普遍支持。
- 电路简单:CRT 时代成本低、成熟稳定。
❌ 缺点
- 模拟信号缺陷:易受电磁干扰,长距离(>5m)画质明显下降(拖影、模糊、偏色)。
- 带宽有限:最高约1920×1080@60Hz,4K 无法支持。
- 无音频:仅传视频,需额外音频线。
- LCD 二次转换损失:模拟→数字转换导致画质劣化。
VGA 与 DVI/HDMI 的本质区别
- VGA:模拟 RGBHV,无音频,易干扰,带宽低。
- DVI:数字 TMDS,无音频,抗干扰,带宽高(支持 1080P/2K)。
- HDMI:数字 TMDS + 音频 + EDID,抗干扰,带宽最高(支持 4K/8K)。
EDID
EDID(Extended Display Identification Data)显示器通过DDC I2C 总线,向显卡上报的设备描述数据块,核心作用:
- 告诉显卡 / 系统:显示器厂商、尺寸、面板类型
- 提供原生分辨率、支持分辨率、刷新率、时序参数
- 提供色彩参数、Gamma、信号类型(模拟 VGA / 数字 DVI/HDMI)
- DRM/KMS、Xorg、Wayland、内核自动选最优显示模式
VGA 本身是纯模拟接口,无自带热插拔 (HPD),完全靠 DDC+EDID 做显示器检测。
VGA 引脚与 DDC 对应
VGA 15 针关键 DDC 引脚:
- Pin12:DDC Data(I2C SDA)
- Pin15:DDC Clock(I2C SCL)
- Pin5/6/7/8/10:信号地
协议本质
EDID 基于I2C 低速通信:
- I2C 从设备地址:
0x50(标准 EDID 只读地址) - 时钟:~100kHz 标准 I2C
- 传输:显卡 (GPU) 作为 I2C 主设备,主动读取显示器 ROM 中 EDID 数据
VGA 特有痛点
很多廉价 VGA 线材阉割 12/15 针→ DDC 断路 →读不到 EDID
表现:
- DRM 识别为
VGA-1 disconnected - 只能强制 fallback 到 1024x768 / 800x600 通用模式
- 无法识别显示器、无法自动适配分辨率
EDID 数据结构
- 基础 EDID:固定128 Byte标准块
- 扩展 EDID:每块额外 128B,最多 256/384B
核心 128 字节关键内容:
- 头部校验头(固定魔数,校验合法性)
- 厂商 ID、产品 ID、序列号
- 屏幕物理尺寸(宽 / 高 cm)
- 基础色彩配置、Gamma 值
- 标准时序列表(主流分辨率 + 刷新率)
- Detailed Timing Descriptor(DTD)显示器原生最优分辨率 + 精准时序,DRM 优先选用
- 扩展标识、校验和
DRM/KMS 选模式优先级:原生 DTD 时序 > EDID 标准时序 > 驱动内置通用 VGA 兼容模式
查看 & 导出 EDID
1. 查看原始 EDID(16 进制)
# 替换 card0-VGA-1 为你的设备 cat /sys/class/drm/card0-VGA-1/edid2. 解析可视化 EDID
# 安装工具 apt install read-edid # 读取并解析 get-edid | parse-edid3. 导出保存 EDID 文件
cp /sys/class/drm/card0-VGA-1/edid ~/vga_monitor.edid4. 强制加载自定义 EDID(VGA 无 EDID 必用)
内核参数,用于劣质 VGA 线 / 老旧显示器:
# 内核启动参数 drm.edid_firmware=VGA-1:edid/vga-custom.edid把自制 edid 放入/lib/firmware/edid/,内核强制加载,无视 DDC 读取失败。
DRM VGA
Linux DRM 里的 VGA,本质是KMS + 模拟输出编码器 + VGA 连接器的一条显示管线:DRM 把数字像素送到 GPU,由内置 DAC 转换成 RGBHV 模拟信号,从 15 针 VGA 口输出。
Linux DRM(Direct Rendering Manager)是内核里管显卡 / 显示控制器的子系统,其中KMS(Kernel Mode Setting)专门负责显示输出与模式配置。VGA 作为模拟输出,在 DRM 里的典型路径:
用户空间(Weston/Xorg) → libdrm → DRM Core → KMS → CRTC → Encoder(带DAC) → Connector(VGA) → 显示器- CRTC:扫描发生器,负责时序、分辨率、帧率
- Encoder:把 CRTC 的数字像素编码并 DAC 成模拟 RGBHV
- Connector:对应物理 VGA 接口,负责检测、EDID、DDC
KMS 核心组件(VGA 相关)
1. Connector:VGA 接口
- 类型:
DRM_MODE_CONNECTOR_VGA - 检测:VGA 无 HPD(热插拔),靠DDC/I2C 读 EDID;很多 VGA 线不接 DDC,检测不可靠。
- 设备树 /sysfs:
/sys/class/drm/card0-VGA-1/
2. Encoder:模拟编码器 + DAC
- 类型:
DRM_MODE_ENCODER_DAC - 功能:把 CRTC 的数字像素 →RGB 模拟电压(0–0.7V)+ HSYNC/VSYNC TTL 脉冲。
- 位置:集成在 GPU(如 Intel i915、AMD radeon)或桥接芯片。
3. CRTC:时序与扫描控制
- 生成 VGA 标准时序:行频(如 64kHz)、场频(60Hz)、消隐区间。
- 常见模式:
1024x768@60Hz、1280x1024@60Hz、1920x1080@60Hz(VGA 上限)。
4. Framebuffer(FB)
- 显存里的数字画布(RGB888/XRGB8888)。
- KMS 把 FB 扫描输出到 CRTC → Encoder → VGA。
驱动层实现(以 i915/amdgpu 为例)
1. 驱动注册
- 内核模块(
i915.ko/amdgpu.ko)加载时,DRM 驱动注册 KMS 组件:drm_connector_init():注册 VGA 连接器drm_encoder_init():注册 DAC 编码器drm_crtc_init():注册 CRTC
2. 模式设置(Mode Setting)
- 用户空间请求(如
xrandr、Weston)→DRM_IOCTL_MODE_SETCRTC - 驱动做:
- 校验分辨率 / 帧率是否在 VGA 范围内
- 配置 CRTC 时序(行 / 场同步、消隐)
- 配置 Encoder:DAC 使能、RGB 电压、同步极性
- 绑定 FB 到 CRTC,开始扫描输出
3. EDID 读取(DDC/I2C)
VGA 的 12/15 针是 DDC(I2C),读显示器 EDID,获取支持的分辨率 / 帧率。
无 EDID 时,驱动用默认 VGA 模式(如 1024x768@60Hz)。
EDID 读取流程:
- 显卡驱动(i915/amdgpu/nouveau)初始化 VGA Connector
- 驱动绑定内置 I2C 适配器(GPU DDC I2C)
- 内核通过
i2c_smbus_read_byte_data向0x50读取 128B EDID - drm 内核层解析 EDID:
- 解析支持的显示模式
- 标记连接器状态:
connected / disconnected - 注册到
/sys/class/drm/
- 用户态(xrandr/weston/gnome)读取 DRM 暴露的 EDID,自动适配画面
关键内核逻辑:
drm_connector → drm_edid_read() → 驱动i2c ddc读取 → edid_parse()用户空间操作
1. 查看 VGA 接口
# 查看连接器 for c in /sys/class/drm/card*/status; do echo $c: $(cat $c); done # 查看支持模式 xrandr输出示例:
VGA-1 connected 1024x768+0+0 (normal left inverted right x axis y axis) 304mm x 228mm 1024x768 60.00* 75.08 70.072. 设置 VGA 模式
# 1920x1080@60Hz(VGA 上限) xrandr --output VGA-1 --mode 1920x1080 --rate 603. 常见参数
--brightness:调整 RGB 电压(模拟亮度)--contrast:调整 DAC 增益--sync:同步极性(正 / 负)
VGA 在 DRM 中的局限与问题
1. 模拟信号天生缺陷
- 易受干扰:长距离(>5m)模糊、拖影、偏色
- 带宽上限:1920×1080@60Hz,不支持 2K/4K
- 无音频:仅视频,需额外音频线
2. DRM/KMS 特有问题
- 检测不可靠:DDC 缺失 / 接触不良时,误判为未连接
- 模式受限:老显示器 EDID 缺失,只能用 1024x768
- 无热插拔:拔线后系统不自动识别,需手动重新设置
VGA 与其他接口的 DRM 差异
| 接口 | 类型 | DRM 编码器 | 信号 |
|---|---|---|---|
| VGA | 模拟 | DAC | RGBHV(0–0.7V+TTL) |
| DVI | 数字 | TMDS | 数字 RGB |
| HDMI | 数字 | TMDS | 数字 RGB + 音频 |
总结
VGA 原理可概括为:显卡 RAMDAC 将数字图像转为 RGB 模拟电压 + 行场同步脉冲,通过 15 针线缆传输,显示器按同步时序逐行扫描成像。作为模拟时代的标准,VGA 虽逐步被 DVI/HDMI 取代,但在老旧设备兼容场景仍广泛使用。
DRM 里的 VGA 工作流程:
- 用户空间(Weston/Xorg)通过 libdrm 下发模式设置
- KMS 配置 CRTC 时序、Encoder(DAC)、Connector(VGA)
- GPU 把数字 FB → DAC → RGBHV 模拟信号
- 15 针线缆传输到显示器,逐行扫描成像
DRM/KMS 负责数字侧的控制与时序,GPU 的 DAC 负责数模转换,VGA 口负责模拟输出。
- EDID = 显示器的身份证 + 能力清单,通过 VGA 的 DDC-I2C(12/15 针)传输。
- Linux DRM 依靠驱动 I2C 读取 EDID,完成 VGA 显示器识别、模式自动配置。
- VGA 最大短板:线材常阉割 DDC,导致EDID 丢失、无法自适应分辨率。
- 无 EDID 场景:可通过自定义 EDID 固件强制注入解决。