Linux下FrameBuffer直接寫屏

2021-04-12 21:46:18 字數 2452 閱讀 9521

為linux是工作在保護模式下,所以使用者態程序是無法象dos那樣使用顯示卡bios裡

提供的中斷呼叫來實現直接寫屏,故linux抽象出framebuffer這個裝置來供使用者態

程序實現直接寫屏。

在繼續下面的之前,先說明幾個背景知識:

1、framebuffer主要是根據vesa標準的實現的,所以只能實現最簡單的功能。

2、由於涉及核心的問題,framebuffer是不允許在系統起來後修改顯示模式等一系

列操作。(好象很多人都想要這樣幹,這是不被允許的,當然如果你自己與驅動

的話,是可以實現的)

3、對framebuffer的操作,會直接影響到本機的所有控制台的輸出,包括xwin的圖

形介面。

好,現在可以讓我們開始實現直接寫屏:

1、開啟乙個framebuffer裝置

2、通過mmap呼叫把顯示卡的物理記憶體空間對映到使用者空間

3、直接寫記憶體。

好象很簡單哦~

fbtools.h

**:#ifndef _fbtools_h_

#define _fbtools_h_

#include

//a framebuffer device structure;

typedef struct fbdev fbdev, *pfbdev;

//open & init a frame buffer

//to use this function,

//you must set fbdev.dev="/dev/fb0"

//or "/dev/fbx"

//it's your frame buffer.

int fb_open(pfbdev pfbdev);

//close a frame buffer

int fb_close(pfbdev pfbdev);

//get display depth

int get_display_depth(pfbdev pfbdev);

//full screen clear

void fb_memset(void *addr, int c, size_t len);

#endif

fbtools.c

**:#include

#include

#include

#include

#include

#include

#include

#include

#include "fbtools.h"

#define true 1

#define false 0

#define max(x,y) ((x)>(y)?(x):(y))

#define min(x,y) ((x)<(y)?(x):(y))

//open & init a frame buffer

int fb_open(pfbdev pfbdev)

if (-1 == ioctl(pfbdev->fb,fbioget_vscreeninfo,&(pfbdev->fb_var)))

if (-1 == ioctl(pfbdev->fb,fbioget_fscreeninfo,&(pfbdev->fb_fix)))

//map physics address to virtual address

pfbdev->fb_mem_offset = (unsigned long)(pfbdev->fb_fix.**em_start) & (~page_mask);

pfbdev->fb_mem = (unsigned long int)mmap(null, pfbdev->fb_fix.**em_len +

pfbdev->fb_mem_offset,

prot_read | prot_write, map_shared, pfbdev->fb, 0);

if (-1l == (long) pfbdev->fb_mem)

return true;

}//close frame buffer

int fb_close(pfbdev pfbdev)

//get display depth

int get_display_depth(pfbdev pfbdev);

return pfbdev->fb_var.bits_per_pixel;

}//full screen clear

void fb_memset (void *addr, int c, size_t len)

//use by test

#define debug

#ifdef debug

main()

fb_memset(fbdev.fb_mem + fbdev.fb_mem_offset, 0, fbdev.fb_fix.**em_len);

fb_close(&fbdev);

}

Linux下Redis下安裝

redis安裝 檢查是否安裝redis ps ef grep redis2.檢查gcc服務是否安裝成功 rpm qa grep gcc注 安裝成功則顯示 mkdir redis5.解壓redis安裝包 tar zxvf redis 2.8.17 tar.gz c usr local redis 解壓...

Linux下程式設計

windows下我的環境為 windows10 vs2015 opencv3.4.0 opencv3.4.0 contrib python linux下我的環境為 ubuntu16004 也有ubuntu1804 opencv3.4.0 opencv3.4.0 contrib python gnu ...

linux下萬用字元

萬用字元是一類鍵盤字元,有星號 和問號 當查詢檔案呀資料夾時,可以使用它來代替乙個或多個真正字元 當不知道真正字元或者不想建入完整名字時,常常使用萬用字元代替乙個或多個真正字元。星號 可以使用星號代替0個或多個字元。如果正在查詢以aew開頭的乙個檔案,但不記得檔名其餘部分,可以輸入aew,查詢以ae...