最近都在做视频相关的驱动,因此对某些问题的认识又更加深刻了一些。
通常我们使用的PC机显示器,不管是 CRT 还是液晶,基本上都是采用的 VGA 接口。VGA 接口中,有5根最重要的信号线,用于数据和同步信号的传送,他们分别是:3根模拟RGB信号线,和2根行场同步信号线。
不同的显示器,对行场同步信号的要求是不同的,如果主机所提供的同步信号达不到显示器的要求,就有可能在显示器上出现“超出显示范围”或者是“无法支持的显示模式”等提示信息。
一般情况下:场同步(VSYNC)都是设置为60Hz,行同步则是根据点时钟(PCLK)和行总像素点数来进行计算,而通常所说的行场有效像素点数就是我们所熟悉的显示分辨率了。
在嵌入式数码产品中,行场同步信号都可以由CPU内部的显示控制器产生,因此只需要修改相关的代码,设置好显示控制器内部的寄存器,就能够输出正常的行场同步信号。我正在调试的 MP2530 平台上的 VGA 视频信号输出就是已经OK了。
但是在PC机的应用中,事情会变得比较复杂一点,Windows下不用说了,不会有这样的需求,就算是有,人家微软都已经给我们做好了,我们只需要简单的进行调用。在DOS下,可能会遇到设置SVGA视频模式出错的问题。这样的情况下,其实在主机这边,其实已经正确的设置好了视频模式,并且输出了视频信号,但是由于显示器不支持该视频信号,所以导致出现问题。
DOS平台下,虽然说已经很开放,可以操作硬件设备,但是许多基本的操作,还是被封装了,这种封装就是 PC 机的 BIOS。BIOS 的采用有历史原因,一方面是为了提供基本的硬件访问功能,一方面是为了保证兼容性。BIOS在本质上也是一段程序,它封装了对硬件的操作,向上提供一个一致的调用接口,因此上层的程序员,就无需关心下面的硬件细节。简单的讲NVIDA的显卡和ATI的显卡,在硬件上是绝对不一样的,其内部的寄存器也是不一样的,但是通过 BIOS 这一层之后,在其上层的程序员眼中,他们似乎没有什么区别,因为所有的操作都是通过 VBE 进行了。
再回到前面讨论的问题,,如何解决显示器无法正常工作的问题。没有办法,显示器不支持,就只有主机这边改变信号的输出,也就是改变一个显示模式。其实这种显示不正常,多数情况下都是由于行场同步信号不正确所造成。有些 VBE 的实现中,可能将 VSYNC 设置的过高,当分辨率也很高时,导致点时钟(PCLK)过高,许多显示器对PCLK的频率是有限制的,过样就会导致问题。因此如果要正确支持高分辨的视频模式,最好是将 VSYNC 降低,也就是将人们通常所说的刷新率降低,一般降到50左右,都是可以接受的,人眼也不会感觉闪烁。而视频模式的刷新率的设置,在 VBE2.0 中就已经有定义,因此在 DOS 中完全可以实现。这样可以解释为什么 Windows 下可以支持的视频模式,DOS程序中却不能设置,关键是要把 VSYNC 降下来。大家可以用示波器测一下 Windows 下高分辨率视频模式输出的 VSYNC 和我们在 DOS 中使用 VBE 设置的高分辨率视频模式输出的 VSYNC,比较一下其区别,就一切都清楚了。
在早期的DOS时代,VGA的控制器也是可以编程的,所以会出现 Mode-X 等等类型的非标准 VGA 视频模式。目前的PC机BIOS都兼容VGA标准,因此也可以直接操作VGA的控制器。但是VGA的致命弱点在于它所能支持的显存太小,这也限制了其显示分辨率的进一步提升。VESA继承并发展了VGA,但是VESA的显示控制器,即 SVGA Display Controller,在硬件上没有一个标准,因此我们无法直接操作这些 SVGA 的控制器,就算是能操作,也无法保证其兼容性。VBE标准的提出的一个最近基本的目的也是为了解决兼容性和标准化的问题。
因此说,在VESA系统中,我们不可能采用直接对 SVGA Display Controller 进行编程来实现对输出的视频同步信号进行修改。唯一能做的,就是依靠VBE来实现我们想要实现的东西,在这一点上,任何PC的软件都是遵循VBE来实现的,即便是 MS Windows 也不例外。
以上是我的分析,供大家参考,也希望大家参与讨论。
RockCarry
2007-6-25
[此贴子已经被作者于2007-6-25 12:44:31编辑过]