日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

FrameBuffer研究

發(fā)布時(shí)間:2023/12/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FrameBuffer研究 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一.使用基礎(chǔ) ? 1. Linux是 工作在保護(hù)模式下,所以用戶(hù)態(tài)進(jìn)程是無(wú)法象DOS那樣使用顯卡BIOS里提供的中斷調(diào)用來(lái)實(shí)現(xiàn)直接寫(xiě)屏,Linux抽象出FrameBuffer這個(gè)設(shè)備 來(lái)供用戶(hù)態(tài)進(jìn)程實(shí)現(xiàn)直接寫(xiě)屏。對(duì)于用戶(hù)而言,framebuffer和/dev下面的其他設(shè)備沒(méi)有什么區(qū)別,用戶(hù)可以把framebuffer 看成一塊內(nèi)存,既可以向這塊內(nèi)存中寫(xiě)入數(shù)據(jù),也可以從這塊內(nèi)存中讀取數(shù)據(jù)。在應(yīng)用程序中,一般通過(guò)將 FrameBuffer 設(shè)備映射到進(jìn)程地址空間的方式使用。 2.在這種機(jī)制下,盡管Framebuffer需要真正的顯卡驅(qū)動(dòng)的支持,但所有顯示任務(wù)都有CPU完成,因此CPU負(fù)擔(dān)很重. 3.PCI 設(shè) 備可以將自己的控制寄存器映射到物理內(nèi)存空間,而后,對(duì)這些控制寄存器的訪問(wèn),給變成了對(duì)物理內(nèi)存的訪問(wèn)。因此,這些寄存器又被稱(chēng)為"memio"。一旦 被映射到物理內(nèi)存,Linux 的普通進(jìn)程就可以通過(guò) mmap 將這些內(nèi)存 I/O 映射到進(jìn)程地址空間,這樣就可以直接訪問(wèn)這些寄存器了。 4.幀緩沖設(shè)備屬于字符設(shè)備,采用了文件層-驅(qū)動(dòng)層的接口方式。Linux為幀緩沖設(shè)備定義的驅(qū)動(dòng)層接口為struct fb_info結(jié)構(gòu)。在文件層次上,用戶(hù)調(diào)用struct file_operations的函數(shù)操作,其中間接調(diào)用struct fb_ops的函數(shù)來(lái)操作硬件.當(dāng)向內(nèi)核注冊(cè)FB設(shè)備的時(shí)候,也注冊(cè)了struct fb_ops的指針.當(dāng)打開(kāi)fb設(shè)備時(shí),先調(diào)用fb_drivers[]xxxfb_init()來(lái)初始化設(shè)備; 5.第一個(gè)被注冊(cè)的framebuffer的minor等于0,第二個(gè)被注冊(cè)的framebuffer的minor等于1,以此類(lèi)推。如/dev/fb0,/dev/fb1。
可以用命令: #dd if=/dev/zero of=/dev/fb 清空屏幕.
如果顯示模式是1024x768-8 位色,用命令:$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768 清空屏幕
用命令: #dd if=/dev/fb of=fbfile ?可以將fb中的內(nèi)容保存下來(lái);
可以重新寫(xiě)回屏幕: #dd if=fbfile of=/dev/fb
二.? framebuffer內(nèi)部結(jié)構(gòu)
Framebuffer對(duì)應(yīng)的源文件在linux/drivers/video/目錄下。總的抽象設(shè)備文件為fbcon.c,在這個(gè)目錄下還有與各種顯卡驅(qū)動(dòng)相關(guān)的源文件。FrameBuffer設(shè)備驅(qū)動(dòng)基于如下文件:
1) linux/include/linux/fb.h定義一些變量結(jié)構(gòu)和宏。
2) linux/drivers/video/fbmem.c實(shí)現(xiàn)設(shè)備入口和初始化。

3)xxxfb.c: 自己添加的設(shè)備驅(qū)動(dòng)文件,如struct fb_info;實(shí)現(xiàn)入口點(diǎn)函數(shù): xxxfb_init; xxxfb_setup;
??????? 1.首先是fb.hframebuffer設(shè)備很大程度上依靠了下面數(shù)據(jù)結(jié)構(gòu)。
1).Struct fb_var_screeninfo描述圖形卡的特性的。通常是被用戶(hù)設(shè)置的。
2).Struct fb_fix_screeninfo定義了圖形卡的硬件特性,是不能改變的。
3).Struct fb_cmap描述設(shè)備無(wú)關(guān)的顏色映射信息。可以通過(guò)FBIOGETCMAP和FBIOPUTCMAP 對(duì)應(yīng)的ioctl操作設(shè)定或獲取顏色映射信息.
4).Struct fb_info定義了當(dāng)前圖形卡framebuffer設(shè)備狀態(tài),一個(gè)圖形卡可能有兩個(gè)framebuffer,在這種情況下,就需要兩個(gè)fb_info結(jié)構(gòu)。這個(gè)結(jié)構(gòu)是唯一在內(nèi)核空間可見(jiàn)的。在這個(gè)結(jié)構(gòu)中有一個(gè)fb_ops指針,指向驅(qū)動(dòng)設(shè)備工作所需的函數(shù)集。
5).struct fb_ops用戶(hù)應(yīng)用可以使用ioctl()系統(tǒng)調(diào)用來(lái)操作設(shè)備,這個(gè)結(jié)構(gòu)就是用以支持ioctl()的這些操作的。(注: fb_ops結(jié)構(gòu)與file_operations 結(jié)構(gòu)不同,fb_ops是底層操作的抽象,而file_operations是提供給上層系統(tǒng)調(diào)用的接口,可以直接調(diào)用.)ioctl()系統(tǒng)調(diào)用在文件 fbmem.c中實(shí)現(xiàn),通過(guò)觀察可以發(fā)現(xiàn)ioctl()命令與fb_ops’s 中函數(shù)的關(guān)系:
FBIOGET_VSCREENINFO fb_get_var
FBIOPUT_VSCREENINFO fb_set_var
FBIOGET_FSCREENINFO fb_get_fix
FBIOPUTCMAP fb_set_cmap
FBIOGETCMAP fb_get_cmap
FBIOPAN_DISPLAY fb_pan_display

如果我們定義了fb_XXX_XXX 方法,用戶(hù)程序就可以使用FBIOXXXX宏的ioctl()操作來(lái)操作硬件。
2.其次是fbmem.cfbmem.c 處于Framebuffer設(shè)備驅(qū)動(dòng)技術(shù)的中心位置.它為上層應(yīng)用程序提供系統(tǒng)調(diào)用也為下一層的特定硬件驅(qū)動(dòng)提供接口;那些底層硬件驅(qū)動(dòng)需要用到這兒的接口來(lái)向系統(tǒng)內(nèi)核注冊(cè)它們自己. fbmem.c 為所有支持FrameBuffer的設(shè)備驅(qū)動(dòng)提供了通用的接口.
1) 全局變量
struct fb_info *registered_fb[FB_MAX];
int num_registered_fb;
這兩變量記錄了所有fb_info 結(jié)構(gòu)的實(shí)例,fb_info 結(jié)構(gòu)描述顯卡的當(dāng)前狀態(tài),所有設(shè)備對(duì)應(yīng)的fb_info 結(jié)構(gòu)都保存在這個(gè)數(shù)組中,當(dāng)一個(gè)FrameBuffer設(shè)備驅(qū)動(dòng)向系統(tǒng)注冊(cè)自己時(shí),其對(duì)應(yīng)的fb_info 結(jié)構(gòu)就會(huì)添加到這個(gè)結(jié)構(gòu)中,同時(shí)num_registered_fb 為自動(dòng)加1.
2)fbmem.c 實(shí)現(xiàn)了如下函數(shù).
register_framebuffer(struct fb_info *fb_info);
unregister_framebuffer(struct fb_info *fb_info);
這兩個(gè)是提供給下層FrameBuffer設(shè)備驅(qū)動(dòng)的接口,設(shè)備驅(qū)動(dòng)通過(guò)這兩函數(shù)向系統(tǒng)注冊(cè)或注銷(xiāo)自己。幾乎底層設(shè)備驅(qū)動(dòng)所要做的所有事情就是填充fb_info結(jié)構(gòu)然后向系統(tǒng)注冊(cè)或注銷(xiāo)它。
??????? 3.xxxfb.c自己添加的設(shè)備驅(qū)動(dòng)文件,如以下等內(nèi)容。
static struct fb_ops xxxfb_ops = {
owner: THIS_MODULE,
fb_open: xxxfb_open, /* only if you need it to do something */
fb_release: xxxfb_release, /* only if you need it to do something */
fb_get_fix: fbgen_get_fix,
fb_get_var: fbgen_get_var,
fb_set_var: fbgen_set_var,
fb_get_cmap: fbgen_get_cmap,
fb_set_cmap: fbgen_set_cmap,
fb_pan_display: fbgen_pan_display,
fb_ioctl: xxxfb_ioctl, /* optional */
};

?
三framebuffer驅(qū)動(dòng)。
1.首先需要添加下面的代碼到fbmem.c
static struct {
const char *name;
int (*init)(void);
int (*setup)(char*);
} fb_drivers[] __initdata = {
#ifdef CONFIG_FB_YOURCARD?????????????? //紅色為添加部分
{ "driver_name", xxxfb_init, xxxfb_setup },
#endif
2.其次在xxxfb.c 中根據(jù)自己的需要重新分配顯存大小。例如:
?#define VIDEOMEMSIZE (1*1024*1024) /* 1 MB */
再次根據(jù)自己的硬件設(shè)備修改相應(yīng)的var 信息。主要修改
xxxfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
????? 下面是函數(shù)fb_set_var()的執(zhí)行步驟:
1)檢測(cè)是否必須設(shè)定模式
2)設(shè)定模式

3)設(shè)定顏色映射
4) 根據(jù)以前的設(shè)定重新設(shè)置LCD控制器的各寄存器。
四.配置添加驅(qū)動(dòng)
1.make menuconfig時(shí),首先進(jìn)入Character devices,選中里面的Virtualterminal.如果希望控制臺(tái)在液晶上輸出,則選中Support for console on virtual terminal
2.退到上一層界面我們就可以看到Console device 的選項(xiàng),
進(jìn)入后將光標(biāo)落在Framebuffer Support 上,按回車(chē)鍵進(jìn)入,在里面選擇自己所需要的framebuffer設(shè)備即可。
3.Advanced low level 中可以配置bpp packed pixel support,然后選中Selectcompiled-in fonts 即可。
等操作系統(tǒng)運(yùn)行以后就會(huì)在/dev下面看到fb 這個(gè)設(shè)備。它的major應(yīng)該是29,第一個(gè)設(shè)備的minor應(yīng)該是0
.其它
編譯內(nèi)核時(shí),選擇framebuffer模式,啟動(dòng)時(shí)屏幕上有一企鵝圖片,不知這是如何造成的這個(gè)圖片可以去掉或改動(dòng)嗎?
答:可以將drivers/video/fbcon.c: fbcon_setup()if (logo) { } 代碼去掉。

轉(zhuǎn)載于:https://blog.51cto.com/paullu/169803

總結(jié)

以上是生活随笔為你收集整理的FrameBuffer研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。