1. 查看相应驱动
ls -l /dev/fb0
crw-rw---- 1 root video 29, 0 jan 27 15:32 /dev/fb0
这是framebuffer的设备文件,有了这个文件就可以使用framebuffer了
cat /dev/fb0 > sreensnap
ls -l sreensnap
-rw-r--r-- 1 wsw wsw 6291456 jan 27 21:30 sreensnap
clear /*清除屏幕的输出 */
cat sreensnap > /dev/fb0
clear
文件/dev/fb0就是控制屏幕上的每一点的颜色的文件。改变这个文件的内容就相当于在屏幕上画图了。
2. 怎么改这个文件,用ioctl方法来读取framebuffer的信息。先了解两个数据结构fb_var_screeninfo(vinfo)和fb_fix_screeninfo(finfo)
finfo.smem_len:内存长度
finfo.line_length:每行长度
vinfo.xres:分辨率x轴
vinfo.yres:分辨率y轴
vinfo.bits_per_pixel:色彩深度
屏幕有1024*768个点,色彩深度32位,所以屏幕占用内存数为1024*768*32个byte,也就是3M字节保存一个屏幕的数据。
3. 对屏幕读写的流程:
A open打开---->lseek定位要读写的位置------>read/write作读写
B 把/dev/fb0映射到程序进程的内存空间中,得到一个指向这段存储空间的指针,方便读写。(需要知道能映射多少和该映射多少)
内存映射的大小:vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8字节
映射方法:fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);
如果要修改的点坐标是(x,y),方法如下:
找到点对应的偏移值:location = x * (vinfo.bits_per_pixel / 8) + y * finfo.line_length(行数y乘以每行的字节数+列数乘以颜色深度换成字节数得到了偏移的字节数)
每个location都对应4个字节的颜色深度分别为fbp+location(蓝色),fbp+location+1(绿色),fbp+location+2(红色),fbp+location+3(是否透明)
最后解除映射:munmap(fbp, screensize)