我是靠谱客的博主 舒心雨,这篇文章主要介绍rk3288 单Buffer的缺点与改进方法参考资料单Buffer的缺点使用多Buffer来改进内核驱动程序分析App编写方法,现在分享给大家,希望可以做个参考。

参考资料

imx6ull驱动源码: linux-4.9.88/drivers/video/fbdev/mxsfb.c

单Buffer的缺点

  • 如果App速度很慢,可以看到它在LCD上缓慢绘制图案
  • 计时App速度很高,LCD控制器不断从Framebuffer中读取数据来显示,而App不断把数据写入Framebuffer
    • 假设App想把LCD显示为整屏幕的蓝色、红色
    • 很大概率不限这种情况:
      • LCD控制器速度Framebuffer数据,读到一半时,在LCD上显示了半屏幕的蓝色
      • 这是App非常高效地把整个Framebuffer地数据都改成了红色
      • LCD控制器继续读取数据,于是LCD上就会显示半屏幕蓝色、半屏幕红色
      • 人眼就会感觉到屏幕闪烁、撕裂

使用多Buffer来改进

上述两个缺点地根源是一致地:Framebuffer中地数据还没准备好整帧数据,就被LCD控制器使用了。
使用双buffer甚至多buffer可以解决这个问题:

  • 假设有2个Framebuffer: FB0、FB1
  • LCD控制器正在读取FB0
  • APP写FB1
  • 写好FB1后,让LCD控制器切换到FB1
  • App写FB0
  • 写好FB0后,让LCD控制器切换到FB0
    ![流程](https://img-blog.csdnimg.cn/981cc896c07c45b6af61b23fbc6a8cba.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoMTIyNjMz,size_16,color_FFFFFF,t_70, pix_size=400x500)

内核驱动程序分析

  • 驱动:分配多个buffer
复制代码
1
2
3
4
5
6
7
8
fb_info->fix.smem_len = SZ_32M; //设置smem_len的大小 fbi->screen_base = dma_alloc_writecombine(fbi->device, //分配设置的大小 fbi->fix.smem_len, (dma_addr_t *)&fbi->fix.smem_start, GFP_DMA | GFP_KERNEL);
  • 驱动:保存buffer信息
复制代码
1
2
3
4
5
6
fb_info->fix.smem_len // 含有总buffer大小 fb_info->var // 含有单个buffer信息
  • APP:读取buffer信息
复制代码
1
2
3
4
5
6
7
ioctl(fd_fb, FBIOGET_FSCREENINFO, &fix); ioctl(fd_fb, FBIOGET_VSCREENINFO, &var); // 计算是否支持多buffer,有多少个buffer screen_size = var.xres * var.yres * var.bits_per_pixel / 8; nBuffers = fix.smem_len / screen_size;
  • APP:使能多buffer
复制代码
1
2
3
4
var.yres_virtual = nBuffers * var.yres; ioctl(fd_fb, FBIOPUT_VSCREENINFO, &var);
  • APP:写buffer
复制代码
1
2
3
4
5
6
7
8
fb_base = (unsigned char *)mmap(NULL , fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0); /* get buffer */ pNextBuffer = fb_base + nNextBuffer * screen_size; /* set buffer */ lcd_draw_screen(pNextBuffer, colors[i]);
  • APP:开始切换buffer
复制代码
1
2
3
4
5
/* switch buffer */ var.yoffset = nNextBuffer * var.yres; ioctl(fd_fb, FBIOPAN_DISPLAY, &var);
  • 驱动:切换buffer
复制代码
1
2
3
4
5
6
7
8
// fbmem.c fb_ioctl do_fb_ioctl fb_pan_display(info, &var); err = info->fbops->fb_pan_display(var, info) // 调用硬件相关的函数
  • APP:等待切换完成(在驱动程序中已经等待切换完成了,所以这个调用并无必要)
复制代码
1
2
3
4
ret = 0; ioctl(fd_fb, FBIO_WAITFORVSYNC, &ret);

App编写方法

最后

以上就是舒心雨最近收集整理的关于rk3288 单Buffer的缺点与改进方法参考资料单Buffer的缺点使用多Buffer来改进内核驱动程序分析App编写方法的全部内容,更多相关rk3288内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(85)

评论列表共有 0 条评论

立即
投稿
返回
顶部