| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6711 人关注过本帖, 1 人收藏
标题:[讨论]讲一下DOS下SVGA视频模式的设置问题
只看楼主 加入收藏
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
结帖率:95.65%
收藏(1)
 问题点数:0 回复次数:29 
[讨论]讲一下DOS下SVGA视频模式的设置问题

最近都在做视频相关的驱动,因此对某些问题的认识又更加深刻了一些。

通常我们使用的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编辑过]

搜索更多相关主题的帖子: SVGA 视频 DOS 液晶 模式 
2007-06-25 12:39
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
收藏
得分:0 
顶~~~

RockCarry兄分析的很有道理,很长一段时间我和董凯都在讨论看能怎样解决DOS下某图形模式有可能无法正常工作,(因为现在他在的工作的需要)可后来才逐渐意识到这个是硬件支持的问题,这个是是依靠个人很难做到全兼容的模式。

呵呵,所以他现在在打歪注意,换平台。

叫他也上来顶一顶~!

个人网站 -  http://.h001.
2007-06-25 14:01
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
恩,是的,我也是这个观点,不过陈凯已经分析的更明确。在主机这边设置分辨率的代码哪怕一点都没错,也会出现和显示器端信号不匹配的情况,比如说垂直刷新率,设置分辨率的时候可能过低或过高,显示器不支持(就如LZ所说的“时钟(PCLK)过高”),所以出现黑屏或超出范围等问题。

另,不知道楼主对VBE的扩展标准VBE DDC是否有研究?
2007-06-26 08:47
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
VBE现在已经到了3.0,各个版本的文档我都看过,但是没有写过代码,所以只是理论上的认识而已。
2007-06-26 09:29
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
VBE3.0中貌似提供了修改点时钟和刷新率的办法,再setmode时就不能单纯的只设置模式号,还要设置刷新率。
不能 Use current default refresh rate,而是需要 Use user specified CRTC value for refresh rate
也就是说,在调用 4702h 功能时,需要传入一个 CRTCInfoBlock。
CRTCInfoBlock提供给了我们丰富的设置,足以满足需求,包括水平总像素点数,垂直总行数,行场同步信号的开始与结束位置,点时钟,刷新率,双扫描模式,隔行扫描模式,同步信号的极性等。只要正确设置这些,应该是可以正常显示的。
其实VBE3.0早就为我们提供了方法,只是我们没有意识到,不知道如何利用而已。

[此贴子已经被作者于2007-6-26 10:09:04编辑过]

2007-06-26 10:06
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
仔细阅读VBE3.0文档中的那一段,就会发现很多。VSYNC一般都是60Hz,也就是说刷新率为60。如果是1024*768的模式,可以设置 HTotal = 1100, VTotal = 800, 那么点时钟为 PCLK = 60 * 1100 * 800 = 52.8 MHz.
HSyncStart, HSyncEnd 和 VSyncStart, VSyncEnd,不知道具体是什么含义,因为文档上没有给出时序图。
至于同步信号的极性,一般的显示器要求都是高电平有效,其他的双扫描和各行扫描模式都需要关闭,使用逐行扫描就可以了。

[此贴子已经被作者于2007-6-26 10:48:36编辑过]

2007-06-26 10:38
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
DDC不太了解,似乎就是我前面讲的信号线的标准,3个模拟RGB,加上2个同步信号。不过似乎在软件上也有DDC的说法,貌似可以用来查询显示器的Capbility.
2007-06-26 10:58
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 

又看了下VESA的一些标准,真没想到一些显示器是有支持IIC接口的,在VBE的扩展标准中,也定义了对IIC接口的操作,但是时好像不是很好用,需要自己控制电平的高低来产生IIC的时序。不过这个标准似乎对我们用处不大。

2007-06-26 11:31
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
算CRTC的代码可以看看Allegro有源码,不难
2007-06-27 13:09
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
收藏
得分:0 

我是shepherd,呵呵
最近心血来潮,重新钻研CRTC,有点收获,发出来和大家共同讨论。
经过XP的DOS测试,我的redon9550竟然是vbe2.0,郁闷ing
只好请出了sdd,在我的机器上测试通过,成功设置了刷新率


2007-07-12 13:08
快速回复:[讨论]讲一下DOS下SVGA视频模式的设置问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028816 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved