简介
Video BIOS可以被认为是一个具有独立硬件抽象层的操作系统。它不会阻止或监视操作系统、应用程序或设备驱动程序对硬件的直接访问。虽然不推荐,但一些DOS应用程序确实可以改变基本的硬件设置,而根本不需要通过视频BIOS。大多数现代应用程序和操作系统都避免直接使用硬件。他们可以使用传统的VGA入口点来实现基本功能,这是最低标准的,或者他们可以使用VESA入口点来访问扩展功能,而不需要设备特定驱动程序的支持。它们可以利用设备特定驱动程序的功能来访问硬件的所有特性。反过来,设备特定的驱动程序可以直接访问硬件,也可以访问视频BIOS提供的任何入口点。
一般来说,视频BIOS是作为英特尔图形控制器抽象层的软件,VBIOS的主要目标如下:
1)初始化硬件-Intel Graphics Accelerator。
2)设置支持的硬件状态并返回硬件状态信息。
3)公开VESA/VGA功能接口和Intel专有函数调用功能接口,使其他应用程序能够访问Graphics hardware。
4)修复硬件/软件接口问题。
Video BIOS可以看作是一个独立于操作系统的硬件抽象层。传统上,**视频BIOS位于物理内存位置C0000h。VBIOS通过响应Int 10h调用与外部组件(如OS、System BIOS和DOS应用程序)进行交互。**它不阻止或监视操作系统、应用程序或设备驱动程序对硬件的直接访问。大多数现代应用程序和操作系统避免直接连接硬件,而是使用视频BIOS来实现VGA, VESA或英特尔特定功能。然后,设备特定的驱动程序直接访问视频BIOS入口点或硬件。
DDC协议和EDID
DDC传输协议以及显示器EDID结构介绍_vga输出ddc功能-CSDN博客
DDC
Display Data Channel (显示数据通道)是显示器与电脑主机进行通信的一个总线标准。它的基本功能就是将显示器的电子档案资料信息,诸如可接收行场频范围、生产厂商、生产日期、产品序列号、产品型号、标准显示模式及其参数、所支持的DDC标准类别、EDID的版本信息等等,高版本的DDC标准总线还可以允许电脑主机直接调节显示器的基本参数,诸如亮度、对比度、行场幅度的大 小、行场中心位置、色温参数等等。
基于End-user 的即插即用功能的需求,VESA 定义了DDC 标准。包含
DDC1/DDC2B/DDC2B+ 等方式DDC1是主机与显示设备单向通讯,以V-Sync为Clock。显示器不停的向主机发送EDID资料。
DDC2B是主机与显示设备准双向通讯,基于I2C 通讯协议。只有主机向显示器发出需求信号,并得到显示器的响应后,显示器才送出EDID 资料。
目前DDC1 基本上已经不再使用,主要是采用DDC2B 方式。PC2001 规定不能再使用DDC1。
EDID
EDID是由VESA——视频电子标准协会定义的,并在1994年和DDC标准1.0版一起推出了1.0版本。在EDID开发之前,VGA接口的针脚4、11、12和15有时被用于定义显示器的性能。这些ID针脚带有高的或低的值用于定义不同的屏幕分辨率。VESA通过重新定义VGA接口的针脚9、12和15,以DDC——显示数据通道的形式作为一个系列母线,扩展了这一体系。这使更多的信息得以交换,因此显示器和信号源之间能够以EDID或其他的形式进行交流。原始的DDC协议定义了从显示器发送到视频信号源的128个字节的EDID格式的数据。 由于显示类型和功能的不断增加,128个字节变得捉襟见肘起来,EDID和DDC都进行了扩展,因此多重128字节的数据块可以进行交换。这就是在众多消费品上所用到的E-EDID。实际上,CEA——美国消费电子产品协会以及国内定义了自己的EDID扩展包来包含额外的视频格式并支持先进的多声道音频功能。 在2007年12月,VESA发布了DisplayID,作为第二代EDID。其目的是取代所有旧版本。DisplayID是一个长度可变的数据结构,最高可达256字节,向信号源传输显示器的相关信息。这意味着包括PC显示设备、消费级电视机以及像笔记本电脑上的液晶屏这样的嵌入式显示器已近不需要多重扩展模块。
EDID数据标准:EDID(Extended Display Identification Data Standard) 就是显示器通过DDC传输给电脑主机的标准数据信息,至今已发布到第三版本,即EDID Version 3,前面分别有EDID Version 1.0,Revision 0,EDID Version 1,Revision 1,EDID Version 2,Revision 0,EDID Version 2,Revision 1等版本。就数据信息量而分,EDID分为128 BYTE和256 BYTE。这种通讯是为了使显示器可以发送自身的性能特征——比如原始分辨率——到信号源设备,使这个设备生成适合于显示器要求的视频特性。用户不需要手动调节,就能最大限度地提升设备之间的兼容性,从而减少了因为不正确的设置和调整对显示图像和系统的整体可靠性所造成的影响。 一般来说,信号源设备可能是一台桌面计算机或笔记本电脑的显卡,但是现在又多了许多不同的设备,包括高清电视接收机和数字录像机、DVD和蓝光播放器,甚至还有游戏机,这就需要读取EDID并输出相应的视频。EDID最初是为了计算机模拟视频设备上的VGA接口而开发的,现在能够用于DVI、HDMI和DisplayPort。
EDID版本定义的结构
供应商/产品标识块——起始的18字节表明了显示器的制造商和产品信息,包括序列号和生产日期。
EDID结构版本以及修订号——随后的2字节用于识别EDID数据结构的版本号和修订号。显示器的基本参数/特性——接下来的5字节用于特性,比如显示器接收的是模拟还是数字信号、同步的类型、水平和垂直的最大尺寸、伽玛传输特性、电源管理功能、色彩空间、默认的视频定时。
色彩特性——随后的10字节定义了显示器所使用的RGB色彩空间转换技术。
确定的频率——随后的3字节定义了显示器支持的VESA确定的视频分辨率/刷新率。每比特代表一个确定的频率,就像640×480/60。如果有的话,那么这3个字节的最后部分定义了厂商的保留频率。
确定的标准频率——随后的16字节定义了显示器支持的8个额外的视频分辨率。这些分辨率必须遵循VESA定义的标准频率。
详细的频率描述——之后的72字节被分为4个18字节块,用于详细描述额外的视频分辨率,以支持自定义的视频刷新率/分辨率。第1块用于描述显示器的首选频率。频率数据的结构既可以是VESA的GTF——一般程序时间也可以是CVT——协同视频时间标准。
EDID的问题
显示设备可以有不同程度的EDID执行,在某些情况下,它们可能完全没有EDID信息。这些不一致可能导致运行问题,包括过扫描和分辨率问题,甚至可能使显示设备完全不能显示信号源的内容。
以下是EDID通讯中一些潜在问题的实例,以及可能会导致的后果:
1、问题:显示器上没有图像。
可能的原因:信号源设备,比如PC的显卡或是笔记本电脑无法读取显示器的EDID信息。因此,在某些情况下,PC就不会输出任何的视频信号。
2、问题:在选择一个新的信号源后显示器丢失了这个图像。
可能的原因:这通常发生在VGA接口的设备上,因为不支持热插拔。
如果是支持热插拔的DVI、HDMI或DisplayPort,EDID通讯问题是由于不同厂商设备之间的HPD信号问题。这经常成为一个需要专业知识的综合问题,因为转换数字视频信号的能力是必须的。
3、问题:显示了图像,但信号源和显示器的分辨率不匹配。
可能的原因:电脑无法读取EDID信息,所以它默认显示为640×480的标准分辨率。如果用户试图手动设置分辨率以便和显示器匹配,某些显卡驱动可能会强制执行较低的默认分辨率,造成桌面滚动/抖动,实际上视频分辨率并没有变化。电脑能够读取EDID信息,但是显卡把输出分辨率限制到XGA的1024×768,这是绝大多数显示器都能够支持的分辨率,确保能够有一个可用的图像并减少无图像显示的可能性。如果这和显示器的当前分辨率不匹配的话,字体就可能不规则地变大、变小或者模糊。
电脑连接到多个具有不同分辨率的显示器。因为它只能从一台显示器上读取EDID,因此输出与其他显示器就不匹配了,这就导致了得不到最佳图像质量,或者根本没有图像显示。在专业系统中,当需要把数字视频信号分配或路由到多个显示器时,这个问题是很常见的。
EDID/DDC协议
DDC使用了I2C总线的标准串行信号计划。因为I2C简单、针脚少、具有双向功能,所以它被广泛地应用于需要交换信息的电子设备和元件中。<font style="color:rgb(51, 51, 51);">EDID/DDC协议中有3条线:SDA——数据、SCL——时钟以及一条逻辑上的“高”直流电压。对于DDC来说,这个逻辑“高”电压被定义为+5伏。</font>EDID信息通常在视频设备启动的时候就进行了交换。DDC规范定义了一个+5伏的电源连接,以提供电源给显示器的EDID电路,**这样就算不打开显示器的电源也可以进行通讯。在启动时,视频源设备会通过DDC发送一个EDID请求。EDID/DDC规范支持热插拔,因此显示器和视频源设备重新连接的时候EDID信息也可以进行交换。热插拔检测不支持VGA,但支持包括DVI、HDMI以及DisplayPort在内的数字接口。**对于这些接口,显示设备可以通过HPD——热插拔检测针脚提供电压,同步到它所连接的视频源设备上去。如果这个针脚上没有电压那么就会显示为断开。视频源设备监控这个HPD针脚上的电压,一旦检测到电压那么它就会启动EDID请求。
DEBUG32基本命令
r
简单的输入-r时就是查看当前各项寄存器的值,并由当前的地址,存储的指令等等。
并且,我们可以用-r命令来对寄存器的值进行修改,如:-r cs 1000, r ip 0000。
a
a指令可以让我们依次对内存单元直接写入汇编语言,如:
a 1000:0
mov ax,0
mov ax,1
d
我们可以用-d命令来查看内存中的内容,和-r类似,我们可以简单地-d来查看当前地址下往下16x8个内存单元存储的内容,同时,我们还可以通过如-d 1000:0来查看指定地址(1000:0)下的内存单元的内容,或者是用如-d 1000:0 f来查看这个地址下指定长度( f )的内容。
u
和其它指令,类似,-u分为两种用法,-u可以查看当前地址(cs:ip)下16个内存单元所存储的汇编语言,而-u 1000:0可以查看指定地址下16个内存单元存储的汇编语言。
p
一般是调试程序的时候用到,可以让计算机直接执行循环到结束(可类比-g)用法是遇到循环的时候直接-p
t
让cpu执行当前地址(cs:ip)所存储的命令
g
一般是调试程序的时候用到,可以让计算机执行到指定地点,如-g 0012(0012是目的ip)
e
简单的-e 1000:00 01 02 03 04命令是可以依次从这个地址开始写入数据进内存单元(本行要一次完成,写完再摁enter之类的),或者是一个一个来,此时就是-e 1000:0之后直接摁空格,这时debug会显示当前内存的值如12.,其中12是内存单元的值,而.后的内容是你准备写入的,此时我们就写一个摁一次空格,而当我们不想输入这个单元时则可以空摁一次空格,需要退出-e时只需要摁一次enter。
q
退出debug。
Video BIOS读取EDIE
查看连接设备
Video BIOS一次只能访问一条管道。5F1Ch用于设置或获取管道访问权限。以下是视频BIOS中双显示支持的使用模型:
LFP:专门用于设备内置显示屏,使用LVDS或eDP内部接口。
EFP: 适用于外部平板显示器,比如笔记本电脑外接显示器,通常支持多种数字接口 。
TV: 适用于电视机连接,通常是通过S-Video、复合视频或分量视频接口。
CRT:传统阴极射线管显示器,适用VGA接口连接。
首先我们需要确定函数调用成功,反回状态AX查看是否执行成功,不同的EDID/DDC协议对应的返回值不同,需要查看具体的CPU spec,也就是AX的值为5F,再根据SPEC,只需要调用5F64函数以及配置指定参数即可根据查看连接的显示设备,根据下图中CX=487C知道CH的值为48,对应的显示设备为EFP和LFP。选择哪个连接,还需要结合硬件原理图看是否对接口做了转换.
读取EDID值
要想知道设备的EDID的值,根据spec中的函数4f15传入相关参数,ES为4f15函数执行存储EDID信息的地址,可以指定,也可以不指定,这里我们指定为4000,读取连接LFP的显示器EDID信息,执行结果中AX为函数执行状态,根据芯片手册,知道4F即函数执行成功,只需要映射对应内存地址中的信息即可得到EDID信息。
debug32使用d ES:DI即可映射对应128Byte字节的信息,得到EDID值。
WIN/Ubunt下获取EDID方法
sudo get-edid | hexdump -C
下载链接 Download M