framebuffer技术

即帧缓存技术,就是将像素点显示在显示屏上。其需显卡的硬件支持,显卡将显存中的数据转化到显示屏上,而该技术就是将用户空间与显存空间进行内存映射,用户在用户空间写入数据(RGB颜色值),显存空间也会有该数据,从而可以通过此过程实现绘制图像。

显示屏上的数据储存是从左到右再从上至下的,而用户空间与显存空间是一维空间,所以要绘制指定位置的图像,首先要将显示屏上的二维坐标转化为一维坐标,再找到坐标根据RGB码绘制即可。

流程:
打开显示设备:/dev/fb0

以读写的形式用open函数打开设备,用自带的结构体struct fb_var_screeninfo定义一个结构体a,再用ioctl函数将用户空间与显存空间绑定。

 int ioctl(int fd,int cmd,...)

fd:文件描述符

cmd:交互协议,包括struct fb_fix_screeninfo和struct fb_var_screeninfo,前者为固定信息,后者为可变信息

...:灵活的参数,一般为定义的结构体,用来接受文件的信息,要取地址。

获取显示设备相关参数:分辨率、像素深度

在通过ioctl函数后,设备的相关信息储存到了定义的结构体a中,其中,a.xres,a.yres为实际的设备屏幕大小,a.xres_virtual与a.yres_virtual为虚拟屏幕大小。a.bits_per_pixel为像素深度。

建立内存映射mmap

定义另一个结构体b来接受结构体a的信息,b要包括设备套接字符,像素深度,虚拟的像素大小,以及指针pmem,用以接收mmap返回的映射地址。

内存映射函数mmap(void *addr,size_t size,int prot,int fd,0)

addr如果为 NULL,则内核选择创建映射的地址; 如果 addr 不为 NULL,则内核把它作为放置位置的提示映射;

size 为虚拟像素大小*像素深度/8;

prot 为执行的方式:

       PROT_EXEC  执行

       PROT_READ 阅读

       PROT_WRITE 写入

       PROT_NONE  报错-----一般选择读写;

fd为设备描述符

写入颜色值,绘制出一个点,根据点绘制出图像。

步骤:1.判断设备像素深度是rgb888或者RGB565;

           2.定位到想绘制的点,赋予其RGB码(上色)----由于屏幕为一维,所以找坐标用mmap返回的映射地址b.pmem偏移虚拟屏幕的x行*y列加x;

int point(int x,int y,unsigned int col)
  {
      if(x>=fb1.x_vr||y>=fb1.y_vr)
      {
          return -1;
     }
      if(fb1.bit==32)
      {
          unsigned int *p=fb1.pmem;
        *(p+y*fb1.x_vr+x)=col;
      }
      if(fb1.bit==16)                                                                                                   
     {
          unsigned int *p=fb1.pmem;
         *(p+y*fb1.x_vr+x)=col;
      }
 }
解除映射、关闭设备

munmap(a.pmem,size_t size);

close(a.fd);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值