通過 framebuffer 擷取螢幕資訊 作者: liuuupen 日期: 2008-09-15
簡介
本文介紹了一個簡單的操作 framebuffer 的程式,它打開 /dev/fb 檔案,讀取 并列印螢幕分辨率等資訊。
程式主要流程
應用程式中,操作/dev/fb 的一般步驟總結如下:
- 打開/dev/fb 裝置檔案。
- 用 ioctrl 操作取得目前顯示螢幕的參數,如螢幕分辨率,每個像素點的比特數。根據螢幕參數可計算螢幕緩沖區的大小。
- 将螢幕緩沖區映射到使用者空間。
- 映射後就可以直接讀寫螢幕緩沖區,進行繪圖和圖檔顯示了。
資料結構
- Struct fb_fix_screeninfo:記錄了幀緩沖裝置和指定顯示模式的不可修改資訊。它包含了螢幕緩沖區的實體位址和長度。
- Struct fb_var_screeninfo:記錄了幀緩沖裝置和指定顯示模式的可修改資訊。它包括顯示螢幕的分辨率、每個像素的比特數和一些時序變量。其中變量 xres定義了螢幕一行所占的像素數,yres定義了螢幕一列所占的像素數,bits_per_pixel定義了每個像素用多少個位來表示。
- Struct fb_info:Linux為幀緩沖裝置定義的驅動層接口。它不僅包含了底層函數,而且還有記錄裝置狀态的資料。每個幀緩沖裝置都與一個fb_info結 構相對應。其中成員變量modename為裝置名稱,fontname為顯示字型,fbops為指向底層操作的函數的指針。
代碼及其解釋
該程式在 fedora 7 上編譯通過
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
int main () {
int fbfd = 0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize = 0;
char *fbp = 0;
int x = 0, y = 0,i;
long int location = 0;
/* Open the file for reading and writing */
fbfd = open("/dev/fb0", O_RDWR);
if (fbfd < 0) {
printf("Error: cannot open framebuffer device./n");
return -1;
}
printf("The framebuffer device was opened successfully./n");
/* Get fixed screen information */
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {
printf("Error reading fixed information./n");
return -1;
}
/* Get variable screen information */
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
printf("Error reading variable information./n");
return -1;
}
printf ("The mem is %d/n", finfo.smem_len);
printf("The line_length is :%d/n",finfo.line_length);
printf("The xres is :%d/n",vinfo.xres);
printf("The yres is :%d/n",vinfo.yres);
printf("bits_per_pixel is :%d/n",vinfo.bits_per_pixel);
close(fbfd);
return 0;
}