多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 服務器 > Linux操作系統下FrameBuffer直接寫屏

Linux操作系統下FrameBuffer直接寫屏

來源:程序員人生   發布時間:2014-04-30 19:09:27 閱讀次數:4219次

建站學院(LieHuo.Net)服務器文檔 因為Linux是工作在保護模式下,所以用戶態進程是無法象DOS那樣使用顯卡BIOS里提供的中斷調用來實現直接寫屏,故Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。

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

FrameBuffer主要是根據VESA標準的實現的,所以只能實現最簡單的功能。

由于涉及內核的問題,FrameBuffer是不允許在系統起來后修改顯示模式等一系列操作。(好象很多人都想要這樣干,這是不被允許的,當然如果你自己與驅動的話,是可以實現的)

對FrameBuffer的操作,會直接影響到本機的所有控制臺的輸出,包括XWIN的圖形界面。

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

 打開一個FrameBuffer設備

通過mmap調用把顯卡的物理內存空間映射到用戶空間

直接寫內存。

以下為引用的內容:
fbtools.h

#ifndef _FBTOOLS_H_
#define _FBTOOLS_H_

#include <linux/fb.h>

/* a framebuffer device structure */
typedef struct fbdev{
int fb;
unsigned long fb_mem_offset;
unsigned long fb_mem;
struct fb_fix_screeninfo fb_fix;
struct fb_var_screeninfo fb_var;
char dev[20];
} 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 <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/page.h>

#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)
{
pFbdev->fb = open(pFbdev->dev, O_RDWR);
if(pFbdev->fb < 0)
{
printf("Error opening %s: %m. Check kernel config", pFbdev->dev);
return FALSE;
}
if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
{
printf("ioctl FBIOGET_VSCREENINFO");
return FALSE;
}
if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
{
printf("ioctl FBIOGET_FSCREENINFO");
return FALSE;
}

/*map physics address to virtual address */
pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len +
pFbdev->fb_mem_offset,
PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
if (-1L == (long) pFbdev->fb_mem)
{
printf("mmap error! mem:%d offset:%d", pFbdev->fb_mem,
pFbdev->fb_mem_offset);
return FALSE;
}

return TRUE;
}

/* close frame buffer */
int fb_close(PFBDEV pFbdev)
{
close(pFbdev->fb);
pFbdev->fb=-1;
}

/* get display depth */
int get_display_depth(PFBDEV pFbdev);
{
if(pFbdev->fb<=0)
{
printf("fb device not open, open it first");
return FALSE;
}
return pFbdev->fb_var.bits_per_pixel;
}

/* full screen clear */
void fb_memset (void *addr, int c, size_t len)
{
memset(addr, c, len);
}

/* use by test */
#define DEBUG
#ifdef DEBUG
main()
{
FBDEV fbdev;
memset(&fbdev, 0, sizeof(FBDEV));
strcpy(fbdev.dev, "/dev/fb0");
if(fb_open(&fbdev)==FALSE)
{
printf("open frame buffer error");
return;
}

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

fb_close(&fbdev);
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲精品一区二区三区在线看 | 非洲黑人最猛性xxxx交 | 欧美成人a| 久久免费国产精品一区二区 | 欧美一区二区精品 | 激情做人爱免费视频 | 亚洲另类图片小说 | 亚洲一区二区精品推荐 | 男女啪啦猛视频免费 | 日韩在线高清视频 | 欧洲亚洲一区二区三区 | 久久精品国产精品亚洲毛片 | 中国漂亮护士一级毛片 | 国产精品系列在线 | 乌克兰性欧美精品高清bd | 日韩欧美精品一区二区三区 | 五月婷婷亚洲综合 | 日韩成人精品日本亚洲 | 欧美性一区二区三区 | 亚洲一区二区三区高清 不卡 | 2022国产福利在线观看 | 波多野结衣在线不卡 | 五月婷婷欧美 | 亚洲欧美日韩中文综合在线不卡 | 日本最猛黑人xxxx猛交 | 国产欧美日韩不卡一区二区三区 | a毛片免费 | 日本jizz在线播放 | 欧美一级aa毛片禁片 | 亚洲国产日韩欧美高清片a 亚洲国产日韩欧美一区二区三区 | 亚洲小视频| 日本一区二区三区在线 视频 | www.av视频在线观看 | 欧美一区二区日韩一区二区 | 国产精品a区 | 亚洲女人天堂a在线播放 | 亚洲黄色在线观看 | 中文字幕日本一本二本三区 | 五月激情六月丁香 | 亚洲福利视频一区二区 | 手机看片福利日韩 |