最早的树莓派型号具备复合视频输出功能,而所有配备40针接口的型号均支持显示并行接口(DPI)。通过外部适配组件,DPI信号可转换为VGA或RGB/SCART信号,这些模拟接口至今仍受到复古媒体爱好者和游戏玩家的青睐。
树莓派5在整体性能上实现了显著提升,然而其DPI模块不再原生支持隔行扫描视频(这原本就不属于DPI标准规范),导致无法通过CRT电视输出全分辨率的RGB信号。如今,这一技术障碍已被成功攻克。
隔行扫描视频技术原理剖析
早期的电视系统采用从左至右、从上到下逐行扫描图像的方式。然而,在帧率、分辨率和无线电带宽之间寻求平衡的过程中,隔行扫描技术应运而生。该技术将每帧画面拆分为奇数行和偶数行两部分,先扫描奇数行(构成上半场),随后扫描偶数行(构成下半场)。这一机制在不增加带宽需求的前提下,有效降低了画面闪烁感并提升了动态流畅度。这两个半场分别被称为"场"(Field)。
逐行扫描与隔行扫描示意图对比
模拟电视能够无需额外处理即可区分场序。只需确保水平扫描速率是垂直扫描速率的半奇数倍,扫描线即可精准定位在屏幕上。隔行视频的核心特征在于垂直同步脉冲(VSync)相对于水平同步脉冲(HSync)的相位存在两种可能的状态。
技术难点与创新解决方案
实现隔行视频输出需攻克三个关键问题:
使DPI能够逐场(即帧缓冲区的偶数行或奇数行)输出而非逐帧输出
精确控制信号时序以确保场间正确交错
生成符合规范的同步脉冲
第一个问题的解决相对直接。通过调整内存地址并加倍行间步幅,我们可以配置DPI仅读取并显示帧缓冲区的偶数行或奇数行。利用中断机制在奇偶场之间以每秒50或60次的频率切换,即可实现这一目标。
第二个问题通过深度定制DPI外设得以解决。通过精密的时间调度,动态调整DPI配置,使得每一场(更准确地说,是每一秒的场)结束时额外插入一行空白。这一空白行应恰当地插入在前一场结束与下一场开始之间。
第三个问题则更具挑战性。RP1芯片的DPI模块无法实现在一行中间启动垂直同步脉冲。
PIO模块在信号生成中的关键作用
类似于Raspberry Pi的RP2040和RP2350微控制器,RP1芯片同样集成了可编程输入输出(PIO)模块。该模块能够生成多种实时波形。近期,Linux内核版本已增加对PIO的支持,并将其功能开放给设备驱动及用户程序调用。
在此场景中,PIO模块通过监听DPI的水平同步(HSync)和数据使能(DE)引脚来生成垂直同步(VSync)信号。PIO的四个状态机(SMs)中有两个被启用:一个状态机充当定时器,在每行的起始点和中点产生"中断"事件;另一个状态机负责定位垂直消隐间隔的起点(即首个无DE信号的行),随后计算半行周期以精确判定VSync脉冲的起始与终止时刻。最后,该状态机重新采样DE信号以检测额外空白行,确保下一场相位准确无误。
https://github.com/raspberrypi/linux/blob/rpi-6.12.y/drivers/gpu/drm/rp1/rp1-dpi/rp1_dpi_pio.c
PIO监听HSync与DE信号生成VSync;图中奇数场以较暗波形示意
同时需注意以下限制:无论实际使用状态如何,DE信号必须强制输出至GPIO1引脚。由于PIO与DPI时钟不同步,其输出的VSync信号可能存在最高5纳秒的抖动。这在标清电视信号速率下影响甚微,但在高分辨率场景中可能引发问题。此外,同步修复功能占用了RP1的大部分PIO指令内存空间,因此在生成隔行扫描DPI信号期间,PIO无法并行执行其他任务。
针对拥有树莓派5、VGA666 HAT以及支持50Hz电视刷新率的VGA显示器的用户,可通过在config.txt文件中添加以下配置进行测试:
dtoverlay=vc4-kms-dpi-generic
dtparam=clock-frequency=13500000
dtparam=hactive=720,hfp=12,hsync=64,hbp=68
dtparam=vactive=576,vfp=5,vsync=5,vbp=39
dtparam=vsync-invert,hsync-invert
dtparam=interlaced
务必确保系统已升级至最新的Raspberry Pi操作系统。需注意,此配置将在GPIO0输出DPICLK(实际未使用),在GPIO1输出DE(供PIO监听),因此需避免在这些引脚上启用I2C/DDC功能。其他类型的HAT可能需要自定义覆盖层以激活GPIO1的DE输出(此操作安全可靠)。
复合同步信号的生成与应用
VGA标准采用独立的水平同步与垂直同步信号线,而电视信号通常将所有同步信息合并为一个复合视频信号。SCART接口采用的折中方案是"复合同步",它将两个同步信号复用为一个信号,同时保持其与RGB信号的分离。
多数现有SCART HAT通过硬件电路生成复合同步信号,但PIO同样具备此能力!为精简内核驱动代码量,此功能未内置其中。相关PIO示例代码可在此处获取。测试时需进行硬件修改,并确保引脚控制不将DE输出至GPIO1。启用隔行扫描视频模式后,使用sudo权限运行附带参数的示例PIO程序即可。
https://github.com/raspberrypi/utils/blob/master/piolib/examples/dpi_csync.c
关键点在于:RP1的DPI在隔行模式下无法生成VSync信号。因此,我们将其配置为输出一种在单行与双行脉冲间交替的"辅助信号"。PIO通过监控HSync与该辅助信号来合成复合同步(CSync)。
PIO利用HSync及"辅助信号"(经改进的VSync)实现隔行扫描复合同步
技术实现深度解析
读者可能好奇为何不直接使用PIO完全替代DPI模块。这主要受限于带宽与时钟因素。DPI模块具备更大的FIFO缓冲区,能更高效地通过PCIe链路传输数据。同时,DPI受益于专用时钟发生器,可灵活生成任意像素时钟速率。此外,PIO在处理某些像素格式转换时面临挑战。
值得庆幸的是,DPI能够高效处理像素数据输出,而PIO则专注于同步信号的生成,二者协同工作。
PIO辅助DPI的两种方式:(a)修复隔行扫描垂直同步;(b)生成复合同步
这两个模块仅通过GPIO引脚(通常为GPIO1、2和3)进行通信。
我们期待这一技术突破能助力用户在真正的CRT电视上重温经典电视节目与游戏,享受原汁原味的复古体验!