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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

FRAMEBUFFER 显示原理及RGB显示

發(fā)布時間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FRAMEBUFFER 显示原理及RGB显示 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Framebuffer是把內(nèi)存中視頻數(shù)據(jù)輸出的設(shè)備驅(qū)動程序,Linux的framebuffer是獨(dú)立的硬件抽象層,它可以把顯示設(shè)備抽象為幀緩沖區(qū),并把自己當(dāng)作顯示內(nèi)存的一個映像,開發(fā)者可以通過這個映像映射到進(jìn)程地址空間,直接進(jìn)行讀寫操作。簡單的說它把硬件抽象化后,可使上層不再關(guān)心硬件是如何操作,只是完成圖像的顯示功能,該驅(qū)動的設(shè)備文件一般是/dev/fb0、/dev/fb1,framebuffer最多支持32個設(shè)備。下圖說明了Framebuffer在Linux系統(tǒng)的位置,它高于一般的驅(qū)動程序,在中間屏蔽下層驅(qū)動功能。

但是對程序員和Linux系統(tǒng)來是,framebuffer設(shè)備與其它的文件沒有區(qū)別,可以通過配置對framebuffer設(shè)備文件完成對硬件的參數(shù)設(shè)置,framebuffer映射可以通過read()和write()進(jìn)行數(shù)據(jù)的讀取,或者通過mmap()函數(shù)將內(nèi)部數(shù)據(jù)映射到應(yīng)用程序空間,通過ioctl()進(jìn)行其它操作或者設(shè)置其參數(shù),用mmap()函數(shù)把內(nèi)存中的圖像數(shù)據(jù)直接映射到framebuffer并顯示出來耗時短、效率高。內(nèi)存中圖像數(shù)據(jù)出來完后就可通過mmap()進(jìn)行映射。


Framebuffer在Linux系統(tǒng)中的位置

圖像顯示過程

屏幕顯示調(diào)用的是framebuffer,首先建立一個fb_dev結(jié)構(gòu)體,里邊有設(shè)備指針、內(nèi)存空間指針、橫豎像素數(shù)、顏色位數(shù)等信息:

struct fb_dev

{

int fb;

void *fb_mem;

int fb_width, fb_height, fb_line_len, fb_size;

int fb_bpp;

} fbdev;

?

初始化framebuffer設(shè)備,并進(jìn)行內(nèi)存地址映射,可以直接把處理后的數(shù)據(jù)映射到framebuffer的緩存中進(jìn)行顯示:

int fb;

?if ((fb = open("/dev/fb0", O_RDWR)) < 0)

{

?perror(__func__);

?return (-1);

}

fb_stat(fb);

fbdev.fb_mem = mmap (NULL, fbdev.fb_size,

PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);

fbdev.fb = fb;

?

?? 其中fb_stat(fb)函數(shù)如下定義,得到framebuffer的長、寬和位寬,成功則返回0,失敗返回-1:

int fb_stat(int fd)

{

struct fb_fix_screeninfo fb_finfo;

struct fb_var_screeninfo fb_vinfo;

?if (ioctl(fd, FBIOGET_FSCREENINFO, &fb_finfo))

{

perror(__func__);

?return (-1);

}

if (ioctl(fd, FBIOGET_VSCREENINFO, &fb_vinfo))

{

perror(__func__);

return (-1);

}

fbdev.fb_width = fb_vinfo.xres;

fbdev.fb_height = fb_vinfo.yres;

fbdev.fb_bpp = fb_vinfo.bits_per_pixel;

bdev.fb_line_len = fb_finfo.line_length;

fbdev.fb_size = fb_finfo.smem_len;

?return (0);

}

?

在屏幕上顯示數(shù)據(jù),需要直接對像素點(diǎn)上直接顯示像素顏色,因為原始解碼的數(shù)據(jù)是24位RGB數(shù)據(jù),而屏幕的顏色位數(shù)是16位,則需要將RGB888轉(zhuǎn)換為RGB565數(shù)據(jù):主要是對不用顏色位數(shù)進(jìn)行移位。


代碼如下

color=(unsigned short) (((buffer[x3s]<<8) & 0xF800)|((buffer[x3s+1]<<3) & 0x07E0)|((buffer[x3s+2] >> 3) & 0x001F));

?

因為開發(fā)板自帶的NEC 3.5寸液晶屏分辨率是240×320,而攝像頭輸出的數(shù)據(jù)為320×240,故顯示時需進(jìn)行矩陣轉(zhuǎn)置,由fbmem基址 + x * width + y確定:

?

if ((x > width) || (y > height)

return (-1);

unsigned short *dst = ((unsigned short *) fbmem + x * width + y);

*dst = color;

?

在程序最后,需要解除內(nèi)存映射和關(guān)閉設(shè)備:

???

munmap(fbdev.fb_mem,fbdev.fb_size);

close(fb);


總結(jié)

以上是生活随笔為你收集整理的FRAMEBUFFER 显示原理及RGB显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产福利小视频在线 | 色一情一区二区三区 | 久久国产精品偷 | 新亚洲天堂 | 国产又粗又猛又爽视频 | 国产图区 | 51成人网| jjzz国产 | 精产国品一二三产品蜜桃 | 中文字字幕一区二区三区四区五区 | 成人一级影视 | 爱草在线视频 | 夜色综合网 | 国产一级高清视频 | 国产毛片aaa | 国产精品夜夜爽 | 国产三级按摩推拿按摩 | 领导揉我胸亲奶揉下面 | 自拍偷拍20p| 可以直接看的无码av | 成人香蕉视频 | 毛片黄片免费看 | 秋霞午夜| 国产码视频 | 精品一区免费 | 911亚洲精品 | 青青国产在线观看 | 五月婷婷在线播放 | 麻豆一区二区99久久久久 | 亚洲一区欧美 | 一级视频毛片 | 国产小视频一区 | 美女破处视频 | 日韩视频免费在线播放 | 亚洲码中文 | 中文字幕欧美人妻精品一区蜜臀 | 三级福利| 精品国自产拍在线观看 | 日本不卡视频一区二区三区 | 五月婷婷丁香久久 | 丁香婷婷视频 | jizz日本视频| 琪琪色影音先锋 | 偷偷操网站| 亚洲一区二区伦理 | 成人合集 | 欧美日韩在线视频免费观看 | 青青草手机在线 | 午夜精品999 | av av在线| 亚洲精品乱码久久久久久按摩观 | 1024手机在线看片 | 丁香婷婷六月天 | 日韩国产在线观看 | 青青草激情 | 乱码av| 欧美精品福利 | av一二三四区 | 91精品综合久久久久久 | 午夜免费av| 女人高潮特级毛片 | 亚洲女人在线 | 午夜国产福利在线观看 | 特黄特色大片免费 | 青草青草久热 | 奇米影视一区二区 | 日韩久久影视 | 粗喘呻吟撞击猛烈疯狂 | 色就色综合| 中国老太婆性视频 | 精品视频在线观看 | 国产精品入口麻豆九色 | 福利在线免费视频 | 秋霞免费av| 一级黄色大片免费看 | 男女视频久久 | 疯狂做爰的爽文多肉小说王爷 | 一级黄在线观看 | 国产女人在线观看 | 91精品久久香蕉国产线看观看 | 日本精品免费在线观看 | 三级在线免费 | 婷婷中文字幕在线 | 精品少妇theporn | 福利视频精品 | 欧美国产乱视频 | 国产精品视频网站 | av色成人 | 污网站免费在线观看 | 久久久久二区 | 国产精品视频a | 波多野结衣av一区二区全免费观看 | 天堂精品一区二区三区 | 国产夫妇交换聚会群4p | 欧美日韩国 | 欧美男女啪啪 | 麻豆一二三区 | 久久99精品久久久久久噜噜 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 |