通常我們使用的PC機(jī)顯示器,不管是 CRT 還是液晶,基本上都是采用的 VGA 接口。VGA 接口中,有5根最重要的信號線,用于數(shù)據(jù)和同步信號的傳送,他們分別是:3根模擬RGB信號線,和2根行場同步信號線。
不同的顯示器,對行場同步信號的要求是不同的,如果主機(jī)所提供的同步信號達(dá)不到顯示器的要求,就有可能在顯示器上出現(xiàn)“超出顯示范圍”或者是“無法支持的顯示模式”等提示信息。
一般情況下:場同步(VSYNC)都是設(shè)置為60Hz,行同步則是根據(jù)點(diǎn)時鐘(PCLK)和行總像素點(diǎn)數(shù)來進(jìn)行計(jì)算,而通常所說的行場有效像素點(diǎn)數(shù)就是我們所熟悉的顯示分辨率了。
在嵌入式數(shù)碼產(chǎn)品中,行場同步信號都可以由CPU內(nèi)部的顯示控制器產(chǎn)生,因此只需要修改相關(guān)的代碼,設(shè)置好顯示控制器內(nèi)部的寄存器,就能夠輸出正常的行場同步信號。我正在調(diào)試的 MP2530 平臺上的 VGA 視頻信號輸出就是已經(jīng)OK了。
但是在PC機(jī)的應(yīng)用中,事情會變得比較復(fù)雜一點(diǎn),Windows下不用說了,不會有這樣的需求,就算是有,人家微軟都已經(jīng)給我們做好了,我們只需要簡單的進(jìn)行調(diào)用。在DOS下,可能會遇到設(shè)置SVGA視頻模式出錯的問題。這樣的情況下,其實(shí)在主機(jī)這邊,其實(shí)已經(jīng)正確的設(shè)置好了視頻模式,并且輸出了視頻信號,但是由于顯示器不支持該視頻信號,所以導(dǎo)致出現(xiàn)問題。
DOS平臺下,雖然說已經(jīng)很開放,可以操作硬件設(shè)備,但是許多基本的操作,還是被封裝了,這種封裝就是 PC 機(jī)的 BIOS。BIOS 的采用有歷史原因,一方面是為了提供基本的硬件訪問功能,一方面是為了保證兼容性。BIOS在本質(zhì)上也是一段程序,它封裝了對硬件的操作,向上提供一個一致的調(diào)用接口,因此上層的程序員,就無需關(guān)心下面的硬件細(xì)節(jié)。簡單的講NVIDA的顯卡和ATI的顯卡,在硬件上是絕對不一樣的,其內(nèi)部的寄存器也是不一樣的,但是通過 BIOS 這一層之后,在其上層的程序員眼中,他們似乎沒有什么區(qū)別,因?yàn)樗械牟僮鞫际峭ㄟ^ VBE 進(jìn)行了。
再回到前面討論的問題,,如何解決顯示器無法正常工作的問題。沒有辦法,顯示器不支持,就只有主機(jī)這邊改變信號的輸出,也就是改變一個顯示模式。其實(shí)這種顯示不正常,多數(shù)情況下都是由于行場同步信號不正確所造成。有些 VBE 的實(shí)現(xiàn)中,可能將 VSYNC 設(shè)置的過高,當(dāng)分辨率也很高時,導(dǎo)致點(diǎn)時鐘(PCLK)過高,許多顯示器對PCLK的頻率是有限制的,過樣就會導(dǎo)致問題。因此如果要正確支持高分辨的視頻模式,是將 VSYNC 降低,也就是將人們通常所說的刷新率降低,一般降到50左右,都是可以接受的,人眼也不會感覺閃爍。而視頻模式的刷新率的設(shè)置,在 VBE2.0 中就已經(jīng)有定義,因此在 DOS 中完全可以實(shí)現(xiàn)。這樣可以解釋為什么 Windows 下可以支持的視頻模式,DOS程序中卻不能設(shè)置,關(guān)鍵是要把 VSYNC 降下來。大家可以用示波器測一下 Windows 下高分辨率視頻模式輸出的 VSYNC 和我們在 DOS 中使用 VBE 設(shè)置的高分辨率視頻模式輸出的 VSYNC,比較一下其區(qū)別,就一切都清楚了。
在早期的DOS時代,VGA的控制器也是可以編程的,所以會出現(xiàn) Mode-X 等等類型的非標(biāo)準(zhǔn) VGA 視頻模式。目前的PC機(jī)BIOS都兼容VGA標(biāo)準(zhǔn),因此也可以直接操作VGA的控制器。但是VGA的致命弱點(diǎn)在于它所能支持的顯存太小,這也限制了其顯示分辨率的進(jìn)一步提升。VESA繼承并發(fā)展了VGA,但是VESA的顯示控制器,即 SVGA Display Controller,在硬件上沒有一個標(biāo)準(zhǔn),因此我們無法直接操作這些 SVGA 的控制器,就算是能操作,也無法保證其兼容性。VBE標(biāo)準(zhǔn)的提出的一個最近基本的目的也是為了解決兼容性和標(biāo)準(zhǔn)化的問題。
因此說,在VESA系統(tǒng)中,我們不可能采用直接對 SVGA Display Controller 進(jìn)行編程來實(shí)現(xiàn)對輸出的視頻同步信號進(jìn)行修改。能做的,就是依靠VBE來實(shí)現(xiàn)我們想要實(shí)現(xiàn)的東西,在這一點(diǎn)上,任何PC的軟件都是遵循VBE來實(shí)現(xiàn)的,即便是 MS Windows 也不例外。
不同的顯示器,對行場同步信號的要求是不同的,如果主機(jī)所提供的同步信號達(dá)不到顯示器的要求,就有可能在顯示器上出現(xiàn)“超出顯示范圍”或者是“無法支持的顯示模式”等提示信息。
一般情況下:場同步(VSYNC)都是設(shè)置為60Hz,行同步則是根據(jù)點(diǎn)時鐘(PCLK)和行總像素點(diǎn)數(shù)來進(jìn)行計(jì)算,而通常所說的行場有效像素點(diǎn)數(shù)就是我們所熟悉的顯示分辨率了。
在嵌入式數(shù)碼產(chǎn)品中,行場同步信號都可以由CPU內(nèi)部的顯示控制器產(chǎn)生,因此只需要修改相關(guān)的代碼,設(shè)置好顯示控制器內(nèi)部的寄存器,就能夠輸出正常的行場同步信號。我正在調(diào)試的 MP2530 平臺上的 VGA 視頻信號輸出就是已經(jīng)OK了。
但是在PC機(jī)的應(yīng)用中,事情會變得比較復(fù)雜一點(diǎn),Windows下不用說了,不會有這樣的需求,就算是有,人家微軟都已經(jīng)給我們做好了,我們只需要簡單的進(jìn)行調(diào)用。在DOS下,可能會遇到設(shè)置SVGA視頻模式出錯的問題。這樣的情況下,其實(shí)在主機(jī)這邊,其實(shí)已經(jīng)正確的設(shè)置好了視頻模式,并且輸出了視頻信號,但是由于顯示器不支持該視頻信號,所以導(dǎo)致出現(xiàn)問題。
DOS平臺下,雖然說已經(jīng)很開放,可以操作硬件設(shè)備,但是許多基本的操作,還是被封裝了,這種封裝就是 PC 機(jī)的 BIOS。BIOS 的采用有歷史原因,一方面是為了提供基本的硬件訪問功能,一方面是為了保證兼容性。BIOS在本質(zhì)上也是一段程序,它封裝了對硬件的操作,向上提供一個一致的調(diào)用接口,因此上層的程序員,就無需關(guān)心下面的硬件細(xì)節(jié)。簡單的講NVIDA的顯卡和ATI的顯卡,在硬件上是絕對不一樣的,其內(nèi)部的寄存器也是不一樣的,但是通過 BIOS 這一層之后,在其上層的程序員眼中,他們似乎沒有什么區(qū)別,因?yàn)樗械牟僮鞫际峭ㄟ^ VBE 進(jìn)行了。
再回到前面討論的問題,,如何解決顯示器無法正常工作的問題。沒有辦法,顯示器不支持,就只有主機(jī)這邊改變信號的輸出,也就是改變一個顯示模式。其實(shí)這種顯示不正常,多數(shù)情況下都是由于行場同步信號不正確所造成。有些 VBE 的實(shí)現(xiàn)中,可能將 VSYNC 設(shè)置的過高,當(dāng)分辨率也很高時,導(dǎo)致點(diǎn)時鐘(PCLK)過高,許多顯示器對PCLK的頻率是有限制的,過樣就會導(dǎo)致問題。因此如果要正確支持高分辨的視頻模式,是將 VSYNC 降低,也就是將人們通常所說的刷新率降低,一般降到50左右,都是可以接受的,人眼也不會感覺閃爍。而視頻模式的刷新率的設(shè)置,在 VBE2.0 中就已經(jīng)有定義,因此在 DOS 中完全可以實(shí)現(xiàn)。這樣可以解釋為什么 Windows 下可以支持的視頻模式,DOS程序中卻不能設(shè)置,關(guān)鍵是要把 VSYNC 降下來。大家可以用示波器測一下 Windows 下高分辨率視頻模式輸出的 VSYNC 和我們在 DOS 中使用 VBE 設(shè)置的高分辨率視頻模式輸出的 VSYNC,比較一下其區(qū)別,就一切都清楚了。
在早期的DOS時代,VGA的控制器也是可以編程的,所以會出現(xiàn) Mode-X 等等類型的非標(biāo)準(zhǔn) VGA 視頻模式。目前的PC機(jī)BIOS都兼容VGA標(biāo)準(zhǔn),因此也可以直接操作VGA的控制器。但是VGA的致命弱點(diǎn)在于它所能支持的顯存太小,這也限制了其顯示分辨率的進(jìn)一步提升。VESA繼承并發(fā)展了VGA,但是VESA的顯示控制器,即 SVGA Display Controller,在硬件上沒有一個標(biāo)準(zhǔn),因此我們無法直接操作這些 SVGA 的控制器,就算是能操作,也無法保證其兼容性。VBE標(biāo)準(zhǔn)的提出的一個最近基本的目的也是為了解決兼容性和標(biāo)準(zhǔn)化的問題。
因此說,在VESA系統(tǒng)中,我們不可能采用直接對 SVGA Display Controller 進(jìn)行編程來實(shí)現(xiàn)對輸出的視頻同步信號進(jìn)行修改。能做的,就是依靠VBE來實(shí)現(xiàn)我們想要實(shí)現(xiàn)的東西,在這一點(diǎn)上,任何PC的軟件都是遵循VBE來實(shí)現(xiàn)的,即便是 MS Windows 也不例外。