zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
阅读:1789回复:10

求助VGA/SVGA编程高手、显示器/显示卡硬件专家,快来帮帮忙!

楼主#
更多 发布于:2004-10-31 21:29
由于工作需要,我需要开发一个直接控制显示卡(符合VESA标准)绘图的图形库,
万事具备就只差一个控制显示器刷新频率的功能未能实现,致使图形画面闪烁严重,
虽然从VESA的官方网站上下载了一个VBE3.0标准,但是E文水平有限不能完全理解其
精髓致使该功能一直无法实现,真是头疼!如果有那位仁兄有这方面的编程经验或
能提供一些中文资料本人将不胜感激,若能实现本功能,本人将会把所有的可用分
顷囊相增!拜托!拜托!
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-05 09:50
DOS / WINDOWS?
做过DOS下用VESA编程,也涉足过一点点Windows下用DirectX拿到显存地址后直接刷屏。
也许可以和你讨论一下。请发email给我:galiu@21cn.com
助人乃快乐之本 有人给分就更快乐了 :-)
s_6666_s_qd
驱动巨牛
驱动巨牛
  • 注册日期2004-08-14
  • 最后登录2006-07-11
  • 粉丝0
  • 关注0
  • 积分199分
  • 威望22点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-05 15:44
使用双缓存页面翻转就不会闪烁啦。这种技术在一些专业的vc网站都有例子找找吧
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-12 14:46
使用双缓存页面翻转就不会闪烁啦。这种技术在一些专业的vc网站都有例子找找吧

VC... 仔细看一下楼主的问题吧。显然是DOS下用C直接对VESA进行操作。
助人乃快乐之本 有人给分就更快乐了 :-)
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-12 14:53
楼主还是要努力加强E文啊。
这个东东,不啃原文是一定搞不定的。

[编辑 -  11/12/04 by  grant]
助人乃快乐之本 有人给分就更快乐了 :-)
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-12 14:53
搞定了。还真有点难,花了俺大概5个Hour...好久没编程了(现在都是让手下编),忽然自己编,有点累哦。  :D
加分吧。你说倾囊... 可是你总共发了这么点帖子,囊里会有多少东西呢?  :D

问题的关键是,VBE上有些事没有说清楚。建议先去搞清楚屏幕上几种显示的关系(HTotal / HSyncStart / HSyncEnd / VTotal / VSyncStart / VSyncEnd),
http://www.hut.fi/Misc/Electronics/faq/vga2rgb/timings.html
然后再去这里算一下你相应的分辩率与更新率下的相应数字,
http://www.hut.fi/Misc/Electronics/faq/vga2rgb/calc.html
就可以开工了。

例子程序中的关键代码及注释:
// SuperVGA CRTCInfoBlock structure
struct
{
	short HTotal;
	short HSyncStart;
	short HSyncEnd;
	short VTotal;
	short VSyncStart;
	short VSyncEnd;
	char Flags;
	long PixelClock;
	short RefreshRate;
	char Reserved[40];
} CRTCInfoBlock;

很简单,就是按VBE中所说的做了个结构。
void setVBEMode(int mode)
{
	union REGS in,out;
	struct SREGS segs;
	char far *CRTCInfo;

	in.x.ax = 0x4F02;
	//in.x.bx = mode;
	in.x.bx = 0x905;	// --------------------- Note 1

	// 1024*768 @ 70Hz
	CRTCInfoBlock.HTotal=1328;
	CRTCInfoBlock.HSyncStart=1048;
	CRTCInfoBlock.HSyncEnd=1184;
	CRTCInfoBlock.VTotal=806;
	CRTCInfoBlock.VSyncStart=771;
	CRTCInfoBlock.VSyncEnd=777;
	CRTCInfoBlock.Flags=0xa;   // -------------- Note 2
	CRTCInfoBlock.PixelClock=75000000;
	CRTCInfoBlock.RefreshRate=70.07;
	CRTCInfo = (char far *)&CRTCInfoBlock;
	// ----------------------------------------- Note 3
	in.x.di = FP_OFF(CRTCInfo);
	segs.es = FP_SEG(CRTCInfo);
	int86x(0x10, &in, &out, &segs);
	//int86(0x10,&in,&out);
}


Note 1: 我跟踪调试,如果不自己设置Refresh rate,这里imode=0x105 ==> 0000 0001 0000 0101
简单地将D11置1,变成: 0000 1001 0000 0101 ==> 0x905。实际上可以支持1024*768*16bit色的(0x917),但是这个例程中的显示会不正常。要直接改imode,懒得改了。你自己试吧。
Note 2: 网页版的计算工具无法设置Sync Polarity的+/-,一律用-的。 1100 ==> 0xa
Note 3: 以上数据用网页版计算工具算得。

测试:
HW: Pentium M 1.6G, 512MB RAM, Build-in display
SW:DOS 6.22, Borland C++ 3.1
结果:
在我的测试机上,可以用到1024*768@60Hz, 1024*768@70Hz,
当设到1024*768@75Hz时,显示器报错:超出同步范围。

[编辑 -  11/12/04 by  grant]
助人乃快乐之本 有人给分就更快乐了 :-)
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-12 15:09
将例子程序传上来。
实际上就是VBE中附的例子,我改了初始化图形的部分。
附件名称/大小 下载次数 最后更新
2004-11-12_VESASAMP.CPP (15KB)  4
助人乃快乐之本 有人给分就更快乐了 :-)
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-12 15:31
再发一个计算GTF参数的C源程序。
原来是Linux下的,我改了一下,在DOS下也可以用。
已测试过它算的数据,是可以用的。
附件名称/大小 下载次数 最后更新
2004-11-12_calrefresh.c (22KB)  7
助人乃快乐之本 有人给分就更快乐了 :-)
wupaul2001
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2009-09-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-11-25 13:04
请问用VESA能否访问大于64M的显存。
zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-11-29 20:09
能!但要使用VESA提供的保护模式接口功能,具体的去研究VESA标准吧!
wupaul2001
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2009-09-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-11-30 01:03
那么是否要分页访问呢?
游客

返回顶部