




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、 framebuffer驅(qū)動全篇在后續(xù)的幾篇里面會詳細介紹如何編寫一個顯卡的驅(qū)動程序。framebuffer device在內(nèi)核里面作為顯卡驅(qū)動模型,許多函數(shù)和數(shù)據(jù)結(jié)構(gòu)都是特定,正是這些特定的東西為我們的編程提供了方便。要開發(fā)frame buffer device驅(qū)動,你應該閱讀SourceSourceDocumentationfb下面的說明文件,三個重要文件00-INDEX,framebuffer.txt,internals.txt,其他文件都是針對具體顯卡芯片的說明了。文件00-INDEX譯文文檔/documentation/fb的索引文件。如果你對frame buffer設備有什么想法,
2、mail:Geert Uytterhoeven <>00-index這個文件framebuffer.txt- frame buffer 設備介紹internals.txt-frame buffer設備內(nèi)部快速瀏覽modedb.txt-關于視頻模式的資料aty128fb.txt-關于ATI Rage128顯卡的frame buffer設備clgenfb.txt-關于Cirrus Logic的顯卡matroxfb.txt-關于Matrox的顯卡pvr2fb.txt-關于PowerVR 2的顯卡tgafb.txt-關于TGA(DECChip 2103
3、0)顯卡vesafb.txt-關于VESA顯卡0.介紹幀緩沖設備提供了顯卡的抽象描述。他同時代表了顯卡上的顯存,應用程序通過定義好的接口可以訪問顯卡,而不需要知道底層的任何操作。 該設備使用特殊的設備節(jié)點,通常位于/dev目錄,如/dev/fb*. 1.用戶角度的/dev/fb*從用戶的角度看,幀緩沖設備和其他位于/dev下面的設備類似。他是一個字符設備,通常主設備號是29,次設備號定義幀緩沖的個數(shù)。 通常,使用如下方式(前面的數(shù)字代碼次設備號) 0 = /dev/fb0 Firstframe buffer 1 = /dev/fb1 Second frame buffer . 31 = /de
4、v/fb31 32nd frame buffer 考慮到向下兼容,你可以創(chuàng)建符號鏈接: /dev/fb0current -> fb0 /dev/fb1current -> fb1and so on. 幀緩沖設備也是一種普通的內(nèi)存設備,你可以讀寫其內(nèi)容。例如,對屏幕抓屏: cp /dev/fb0 myfile你也可以同時有多個顯示設備,例如你的主板上出了內(nèi)置的顯卡還有另一獨立的顯卡。對應的幀緩沖設備(/dev/fb0 and /dev/fb1etc.)可以獨立工作。 應用程序如 X server一般使用/dev/fb0作為默認的顯示幀緩沖區(qū)。你可以自定把某個設備作為默認的幀緩沖設備,
5、設置$FRAMEBUFFER環(huán)境變量即可。在sh/bash: export FRAMEBUFFER=/dev/fb1在csh中: setenv FRAMEBUFFER /dev/fb1 設定后,X server將使用第二個幀緩沖區(qū)設備。 2.程序員角度看/dev/fb*正如你所知,一個幀緩沖設備和內(nèi)存設備類似/dev/mem,并且有許多共性。你可以read,write,seek以及mmap()。不同僅僅是幀緩沖的內(nèi)存不是所有的內(nèi)存區(qū),而是顯卡專用的那部分內(nèi)存。 /dev/fb*也允許盡心ioctl操作,通過ioctl可以讀取或設定設備參數(shù)。顏色映射表也是通過Ioctl設定。查看 就知道有多少i
6、octl應用以及相關數(shù)據(jù)結(jié)構(gòu)。這里給出摘要: - 你可以獲取設備一些不變的信息,如設備名,屏幕的組織(平面,象素,.)對應內(nèi)存區(qū) 的長度和起始地址。 - 也可以獲取能夠發(fā)生變化的信息,例如位深,顏色格式,時序等。如果你改變這些值, 驅(qū)動程序?qū)χ颠M行優(yōu)化,以滿足設備特性(返回EINVAL,如果你的設定,設備不支持) - 你也可以獲取或設定部分顏色表。 所有這些特性讓應用程序十分容易的使用設備。X server可以使用/dev/fb*而不需知道硬件 的寄存器是如何組織的。 XF68_FBDev是一個用于位映射(單色)X server,唯一要做的就是 在應用程序在相應的位置設定是否顯示。 在新內(nèi)核
7、中,幀緩沖設備可以工作于模塊中,允許動態(tài)加載。這類驅(qū)動必須調(diào)用 register_framebuffer()在系統(tǒng)中注冊。使用模塊更方便! 3.幀緩沖分辨率設定 幀緩沖的分辨率可以用工具fbset設定。他可以改變視頻設備的顯示模式。主要就是改變當前視頻模式,如在啟動過程中,在/etc/rc.* 或 /etc/init.d/* 文件中調(diào)用,可以把視頻模式從單色顯示變成真彩. fbset使用存儲在配置文件中的視頻模式數(shù)據(jù)表,你可以在文件中增加自己需要的顯示模式。 4.X Server Xserver (XF68_FBDev)是對幀緩沖設備的最主要應用。從XFree86 3.2后,X server就
8、是XFree86的一部分了,有2個工作模式: - 在/etc/XF86Config文件中,如果Display'段關于 fbdev'的配置: Modes "default" X server 將使用前面討論的,從環(huán)境變量$FRAMEBUFFER獲取當前幀緩沖設備. 你也可以設定顏色位深,使用Depth關鍵字,使用Virtual設定虛擬分辨率。這也是 默認設置。 - 然而你也可以通過設定/etc/XF86Config,改變分辨率。這樣有很多靈活性,唯一的 不足就是你必須設定刷新頻率??梢杂胒bset -x通過fbset或xvidtune切換顯示模式。 5.視頻模
9、式頻率 CRT顯示器是用3個電子槍轟擊磷粉完成顏色的顯示的。電子槍從左到右的水平掃描,并從上至下的垂直掃描。通過改變槍的電壓,所顯示的顏色可以不同。當電子槍完成一行掃描重新回到下一行的開始,被稱作“水平折回”。當一屏幕全部掃描完畢,電子槍將回到最左上腳,被成為“垂直折回”。在折回的途中電子槍是關閉的。 電子槍打點的移動速度取決于點時鐘。如果點時鐘是28.37516 MHz,打一個點需要35242ps。 1/(28.37516E6 Hz) = 35.242E-9 s 如果屏幕分辨率是640x480,那么一行的時間是: 640*35.242E-9 s = 22.555E-6 s然而水平折回也是需要
10、時間的,通常272個打點時間,因此一行總共需要: (640+272)*35.242E-9 s = 32.141E-6 s我們就認為水平掃描的頻率是31KHz: 1/(32.141E-6 s) = 31.113E3 Hz 一屏幕含有480行,加上垂直折回時間49,一屏所需的時間: (480+49)*32.141E-6 s = 17.002E-3 s我們就認為垂直掃描的頻率是59Hz: 1/(17.002E-3 s) = 58.815 Hz這也意味著屏幕數(shù)據(jù)每秒鐘刷新59次。為了得到穩(wěn)定的圖像顯示效果,VESA垂直掃描頻率不低于72Hz。但是也因人而異,有些人50Hz感覺不到任何問題,有些至少在8
11、0Hz以上才可以。 由于顯示器不知道什么時候新行開始掃描,顯卡為每一行掃描提供水平同步信號。類似的,他也為每一幀顯示提供垂直同步信號。圖像在屏幕上點的位置取決于這些同步信號的發(fā)生時刻。 下圖給出了所有時序的概要。水平折回的時間就是左邊空白右邊空白水平同步長度。垂直折回的時間就是上空白下空白垂直同步長。 +-+-+-+-+ | | | | | | | |upper_margin | | | | | ? | | | +-#-+-+ | # # | | | # | # | | | # | # | | | # | # | | | left # | # right | hsync | | margin
12、# | xres # margin | len | |<->#<-+->#<->|<->| | # | # | | | # | # | | | # | # | | | # |yres # | | | # | # | | | # | # | | | # | # | | | # | # | | | # | # | | | # | # | | | # | # | | | # | # | | | # ? # | | +-#-+-+ | | | | | | | |lower_margin | | | | | ? | | | +-+-+-+-+ | | |
13、| | | | |vsync_len | | | | | ? | | | +-+-+-+-+6.把XFree86時序變成frame buffer device時序典型的顯示模式: "800x600" 50 800 856 976 1040 600 637 643 666 < name > DCF HR SH1 SH2 HFL VR SV1 SV2 VFL 而幀緩沖設備使用下面的參數(shù): -pixclock: 點時鐘 in ps (pico seconds) - left_margin: time from sync topicture - right_margin
14、: time from picture tosync - upper_margin: time from sync topicture - lower_margin: time from picture tosync - hsync_len: length of horizontal sync - vsync_len: length of vertical sync 1) Pixelclock: xfree: in MHz fb: in picoseconds (ps) pixclock = 1000000 / DCF2) horizontal timings: left_margin = H
15、FL - SH2 right_margin = SH1 - HR hsync_len = SH2 - SH13) vertical timings: upper_margin = VFL - SV2 lower_margin = SV1 - VR vsync_len = SV2 - SV1 "xc/programs/Xserver/hw/xfree86/doc/modeDB.txt". 7. 引用獲取更多關于幀緩沖設備以及應用的參考,請訪問:或者查閱下面的文檔: - Themanual pages for fbset: fbset(8), fb.modes(5) - The
16、 manual pages for XFree86:XF68_FBDev(1), XF86Config(4/5) - The mighty kernel sources: o linux/drivers/video/ o linux/include/linux/fb.h o linux/include/video/ 幀緩沖設備的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(internals.txt)Geert Uytterhoeven , 21 July 1998 ××××幀緩沖設備中用到的結(jié)構(gòu)體×××× 以下數(shù)據(jù)結(jié)構(gòu)在幀緩沖設備使用,定義 。
17、 1. Outside the kernel (user space) - struct fb_fix_screeninfo 幀緩沖設備中設備無關的常值數(shù)據(jù)信息。可以通過Ioctl的FBIOGET_FSCREENINFO獲取。 - struct fb_var_screeninfo 幀緩沖設備中設備無關的變量數(shù)據(jù)信息和特定的顯示模式??梢酝ㄟ^iotcl的FBIOGET_VSCREENINFO 獲取,并通過ioctl的FBIOPUT_VSCREENINFO設定。還有FBIOPAN_DISPLAY可以用。 - struct fb_cmap 設備無關的顏色表信息。你可以通過ioctl的FBIOGETC
18、MAP 和 FBIOPUTCMAP讀取或設定。 2. Inside the kernel - struct fb_info 常規(guī)信息,API以及幀緩沖設備的底層信息(主板地址.). - struct par' 唯一指定該設備的顯示模式的設備相關信息。 -struct display 幀緩沖設備和控制臺驅(qū)動之間的接口。- * 常用的幀緩沖 API *Monochrome (FB_VISUAL_MONO01 and FB_VISUAL_MONO10)-每個象素是黑或白。 Pseudo color (FB_VISUAL_PSEUDOCOLOR andFB_VISUAL_STATIC_PSEU
19、DOCOLOR)-索引顏色顯示 True color (FB_VISUAL_TRUECOLOR)-真彩顯示,分成紅綠蘭三基色 Direct color (FB_VISUAL_DIRECTCOLOR)-每個象素顏色也是有紅綠藍組成,不過每個顏色值是個索引,需要查表。 Grayscale displays-灰度顯示,紅綠藍的值都一樣 準備開始寫我們自己的驅(qū)動之前,請詳細閱讀如下文件:Documentationfb目錄 vesafb.txt,matroxfb.txt,sa1100fb.txtdriversvideo目錄 fbmem.c,fbgen.c,fbmon.c,fbcmap.c skeleto
20、nfb.c vesafb.c,sa1100fb.c,sa1100fb.hincludelinux目錄 fb.h最值得關注的是skeletonfb.c,該文件給出了一個fb device 驅(qū)動的框架準備好了,就開始寫自己的fram buffer devicedriver。framebuffer驅(qū)動全篇(二)還是要補充點,下面是/linux/fb.h的部分注釋,加粗的是常用的,紅色是關鍵的,一般不可少。旁邊沒有漢字,要么很簡單沒必要加注,要么就用不到! #ifndef _LINUX_FB_H#define _LINUX_FB_H #include #include /* Definitions o
21、f frame buffers */ #define FB_MAJOR 29 /*主設備號*/#define FB_MAX 32 /* sufficient for now */ /* ioctls 0x46is 'F' */#define FBIOGET_VSCREENINFO 0x4600#define FBIOPUT_VSCREENINFO 0x4601#define FBIOGET_FSCREENINFO 0x4602#define FBIOGETCMAP 0x4604#define FBIOPUTCMAP 0x4605#define FBIOPAN_DISPLAY 0
22、x4606/* 0x4607-0x460B are defined below */* #define FBIOGET_MONITORSPEC 0x460C*/* #define FBIOPUT_MONITORSPEC 0x460D */* #define FBIOSWITCH_MONIBIT 0x460E */#define FBIOGET_CON2FBMAP 0x460F#define FBIOPUT_CON2FBMAP 0x4610#define FBIOBLANK 0x4611 /*arg: 0 or vesa level + 1 */#define FBIOGET_VBLANK _I
23、OR('F', 0x12, struct fb_vblank)#define FBIO_ALLOC 0x4613#define FBIO_FREE 0x4614#define FBIOGET_GLYPH 0x4615#define FBIOGET_HWCINFO 0x4616#define FBIOPUT_MODEINFO 0x4617#define FBIOGET_DISPINFO 0x4618 #define FB_TYPE_PACKED_PIXELS 0 /*Packed Pixels */#define FB_TYPE_PLANES 1 /*Non interleave
24、d planes */#define FB_TYPE_INTERLEAVED_PLANES 2 /*Interleaved planes */#define FB_TYPE_TEXT 3 /*Text/attributes */#define FB_TYPE_VGA_PLANES 4 /*EGA/VGA planes */ #define FB_AUX_TEXT_MDA 0 /* Monochrome text */#define FB_AUX_TEXT_CGA 1 /* CGA/EGA/VGA Color text */#define FB_AUX_TEXT_S3_MMIO 2 /*S3 M
25、MIO fasttext */#define FB_AUX_TEXT_MGA_STEP16 3 /*MGA Millenium I: text, attr, 14 reserved bytes */#define FB_AUX_TEXT_MGA_STEP8 4 /*other MGAs: text, attr, 6 reserved bytes */ #define FB_AUX_VGA_PLANES_VGA4 0 /* 16 color planes (EGA/VGA) */#define FB_AUX_VGA_PLANES_CFB4 1 /*CFB4 in planes (VGA) */#
26、define FB_AUX_VGA_PLANES_CFB8 2 /*CFB8 in planes (VGA) */ #define FB_VISUAL_MONO01 0 /*Monochr. 1=Black 0=White */#define FB_VISUAL_MONO10 1 /*Monochr. 1=White 0=Black */#define FB_VISUAL_TRUECOLOR 2 /* True color */#define FB_VISUAL_PSEUDOCOLOR 3 /*Pseudo color (like atari) */#define FB_VISUAL_DIRE
27、CTCOLOR 4 /*Direct color */#define FB_VISUAL_STATIC_PSEUDOCOLOR 5 /*Pseudo color readonly */ #define FB_ACCEL_NONE 0 /* nohardware accelerator */#define FB_ACCEL_ATARIBLITT 1 /*Atari Blitter */#define FB_ACCEL_AMIGABLITT 2 /*Amiga Blitter */#define FB_ACCEL_S3_TRIO64 3 /*Cybervision64 (S3 Trio64) */
28、#define FB_ACCEL_NCR_77C32BLT 4 /* RetinaZ3 (NCR 77C32BLT) */#define FB_ACCEL_S3_VIRGE 5 /*Cybervision64/3D (S3 ViRGE) */#define FB_ACCEL_ATI_MACH64GX 6 /*ATI Mach 64GX family */#define FB_ACCEL_DEC_TGA 7 /*DEC 21030 TGA */#define FB_ACCEL_ATI_MACH64CT 8 /*ATI Mach 64CT family */#define FB_ACCEL_ATI
29、_MACH64VT 9 /*ATI Mach 64CT family VT class */#define FB_ACCEL_ATI_MACH64GT 10 /*ATI Mach 64CT family GT class */#define FB_ACCEL_SUN_CREATOR 11 /*Sun Creator/Creator3D */#define FB_ACCEL_SUN_CGSIX 12 /*Sun cg6 */#define FB_ACCEL_SUN_LEO 13 /*Sun leo/zx */#define FB_ACCEL_IMS_TWINTURBO 14 /*IMS Twin
30、 Turbo */#define FB_ACCEL_3DLABS_PERMEDIA2 15 /* 3Dlabs Permedia 2 */#define FB_ACCEL_MATROX_MGA2064W 16 /* Matrox MGA2064W (Millenium) */#define FB_ACCEL_MATROX_MGA1064SG 17 /* Matrox MGA1064SG (Mystique) */#define FB_ACCEL_MATROX_MGA2164W 18 /* Matrox MGA2164W (Millenium II) */#define FB_ACCEL_MAT
31、ROX_MGA2164W_AGP 19 /* Matrox MGA2164W (Millenium II) */#define FB_ACCEL_MATROX_MGAG100 20 /*Matrox G100 (Productiva G100) */#define FB_ACCEL_MATROX_MGAG200 21 /*Matrox G200 (Myst, Mill, .) */#define FB_ACCEL_SUN_CG14 22 /*Sun cgfourteen */#define FB_ACCEL_SUN_BWTWO 23 /*Sun bwtwo */#define FB_ACCEL
32、_SUN_CGTHREE 24 /*Sun cgthree */#define FB_ACCEL_SUN_TCX 25 /*Sun tcx */#define FB_ACCEL_MATROX_MGAG400 26 /*Matrox G400 */#define FB_ACCEL_NV3 27 /* nVidiaRIVA 128 */#define FB_ACCEL_NV4 28 /* nVidiaRIVA TNT */#define FB_ACCEL_NV5 29 /* nVidiaRIVA TNT2 */#define FB_ACCEL_CT_6555x 30 /*C&T 6555x
33、 */#define FB_ACCEL_3DFX_BANSHEE 31 /*3Dfx Banshee */#define FB_ACCEL_ATI_RAGE128 32 /*ATI Rage128 family */#define FB_ACCEL_IGS_CYBER2000 33 /*CyberPro 2000 */#define FB_ACCEL_IGS_CYBER2010 34 /*CyberPro 2010 */#define FB_ACCEL_IGS_CYBER5000 35 /*CyberPro 5000 */#define FB_ACCEL_SIS_GLAMOUR 36 /*Si
34、S 300/630/540 */#define FB_ACCEL_3DLABS_PERMEDIA3 37 /* 3Dlabs Permedia 3 */*上面的宏定義不用關心*/ /*不可修改的屏幕信息,用戶空間可見*/struct fb_fix_screeninfo charid16; /*identification string eg "TT Builtin" */ unsignedlong smem_start; /* Start of framebuffer mem 顯存的起始地址*/ /*(physical address) */ _u32smem_len; /
35、*Length of frame buffer mem 顯存的大小 */ _u32type; /* seeFB_TYPE_* */ _u32type_aux; /* Interleavefor interleaved Planes */ _u32visual; /* seeFB_VISUAL_* */ _u16xpanstep; /*zero if no hardware panning */ _u16ypanstep; /*zero if no hardware panning */ _u16ywrapstep; /* zero if nohardware ywrap */ _u32line
36、_length; /* length of aline in bytes 每行的字節(jié)數(shù) */ unsignedlong mmio_start; /* Start of Memory MappedI/O */ /*(physical address) */ _u32mmio_len; /*Length of Memory Mapped I/O */ _u32accel; /* Type of acceleration available */ _u16reserved3; /* Reservedfor future compatibility */; /* Interpretation of o
37、ffset for color fields:All offsets are from the right, *inside a "pixel" value, which is exactly 'bits_per_pixel' wide(means: you * canuse the offset as right argument to <<). A pixel afterwards is a bit *stream and is written to video memory as that unmodified. This implies
38、*big-endian byte order if bits_per_pixel is greater than 8. */ /*像素所占字節(jié)內(nèi),各個顏色的位分配比如RGB=888,565,555等等,*/struct fb_bitfield _u32offset; /*beginning of bitfield */ _u32length; /* lengthof bitfield */ _u32msb_right; /* != 0 : Mostsignificant bit is */ /*right */ ; /*下面的宏也不常用*/#define FB_NONSTD_HAM 1 /*Hold-And-Modify (HAM) */ #define FB_ACTIVATE_NOW 0 /* set values immediately (or vbl)*/#define FB_ACTIVATE_NXTOPEN 1 /*activate on next open */#define FB_ACTIVATE_TEST 2 /*don't set, round up impossible */#define
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 疫情后時代心理健康教育
- 食管異物急救處理
- 橋小腦角占位術后的護理
- 腰間盤突出術后護理
- 中班手工活動西瓜扇
- 設計管理案例分析
- 醫(yī)療衛(wèi)生高端發(fā)展路徑與創(chuàng)新實踐
- 傳統(tǒng)食品工業(yè)化生產(chǎn)革新:2025年技術改造與市場趨勢報告
- 計算機專業(yè)畢業(yè)設計答辯綱要
- 2025前沿技術視角下的深海礦產(chǎn)資源勘探方法研究報告
- 2025年電信工程師考試卷及答案
- 英語系學生學習總結(jié)模版
- 2025-2030年中國聚四氟乙烯(PTFE)行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2024年玉門市市屬事業(yè)單位考試真題
- 2025云南中考:語文必考知識點
- 2025小米SU7事件高速爆燃事故輿情復盤
- 玻璃體積血試題及答案
- 會議系統(tǒng)維保服務方案投標文件(技術方案)
- 遼寧點石聯(lián)考2025屆高三5月份聯(lián)合考試-政治試卷+答案
- 《護理操作規(guī)范》課件
- 軍隊文職-新聞專業(yè) (軍隊文職)真題庫-5
評論
0/150
提交評論