framebuffer的理解

来源:互联网 发布:宝安西乡网络推广公司 编辑:程序博客网 时间:2024/06/10 08:30

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)

 

原创粉丝点击