通过/dev/fbn,应用程序可进行的针对帧缓冲设备的操作主要有如下几种:
- 读写/dev/fbn:相当于读写屏幕缓冲区。例如cp /dev/fb0 tmp命令可将当前屏幕的内容复制到一个文件中,而命令cp tmp > /dev/fb0则将图形文件tmp显示在屏幕上。
- 映射操作:对于帧缓冲设备,可通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
- I/O控制:对于帧缓冲设备,对设备文件的ioctl()操作可读取/设置显示设备及屏幕的参数,如分辨率、显示颜色数、屏幕大小等。
在应用程序中,操作/dev/fbn的一般步骤如下:
- 打开/dev/fbn设备文件。
- 用ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率、每个像素点的比特数和偏移。根据屏幕参数可计算屏幕缓冲区的大小。
- 将屏幕缓冲区映射到用户空间。
- 映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。
范例代码:
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <fcntl.h> 4 #include <linux/fb.h> 5 #include <sys/mman.h> 6 #include <errno.h> 7 8 int main() { 9 int fp = 0; 10 struct fb_var_screeninfo vinfo; 11 struct fb_fix_screeninfo finfo; 12 13 int screensize = 0; 14 char *fbp = 0; 15 int x = 0, y = 0; 16 int location = 0; 17 int bytes_per_pixel; 18 19 fp = open("/dev/fb0", O_RDWR); 20 if(fp < 0) { 21 printf("open failed\n"); 22 } 23 24 if(ioctl(fp, FBIOGET_FSCREENINFO, &finfo)) { 25 perror("ioctl"); 26 } 27 28 if(ioctl(fp, FBIOGET_VSCREENINFO, &vinfo)) { 29 perror("ioctl"); 30 } 31 32 bytes_per_pixel = vinfo.bits_per_pixel/8; 33 screensize = vinfo.xres * vinfo.yres * bytes_per_pixel; 34 printf("x = %d y = %d bytes_per_pixel = %d\n", vinfo.xres, vinfo.yres, bytes_per_pixel); 35 printf("scrrensize = %d\n", screensize); 36 37 fbp = (char*) mmap(0, screensize, PROT_READ |PROT_WRITE, MAP_SHARED, fp, 0); 38 if(fbp < 0) { 39 perror("mmap"); 40 } 41 42 for(x = 100; x<200; x++) { 43 for(y=100; y<200; y++) { 44 location = x * bytes_per_pixel + y * finfo.line_length; 45 *(fbp + location) = 0; 46 *(fbp +location + 1) = 255; 47 *(fbp + location + 2) = 0; 48 *(fbp + location + 3) = 0; 49 } 50 } 51 52 munmap(fbp, screensize); 53 close(fp); 54 return 0; 55 }