加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长资讯 > 评论 > 正文

inux驱动开发

发布时间:2021-04-08 11:48:03 所属栏目:评论 来源:互联网
导读:和 yres 是真实的 LCD 分辨率的宽和长; xres_virtual 和 yres_virtual 是显存区域的宽和长; xoffset 和 yoffset 用于指定当前使用哪一个 Buffer 进行绘制。使用 Buffer0 时 ,xoffset = 0,yoffset=0; 使用 Buffer1 时,xoffset = 0, yoffset = yres * 1; 3.

 和 yres 是真实的 LCD 分辨率的宽和长;

xres_virtual 和 yres_virtual 是显存区域的宽和长;

xoffset 和 yoffset 用于指定当前使用哪一个 Buffer 进行绘制。使用 Buffer0 时 ,xoffset = 0,yoffset=0; 使用 Buffer1 时,xoffset = 0, yoffset = yres * 1;

3. 支持切换 buffer,具体的就是实现 ioctl:FBIOPAN_DISPLAY。

pan 的本意是平移,可以想象成显存上方有一个取景框,平移取景框可以看到不同的显示内容。

实例分析:goldfishfb.c

goldfishfb.c 是虚拟硬件 goldfish 的 fbdev 驱动,我们可以参考这个文件,学习如何实现 double buffer。

1. 分配 2 x buffer:

LCD controller 将一帧图像完整地显示在 LCD 上后,就会产生一个中断,在中断里就会执行唤醒睡眠在 fb_pan_display 里的进程。

如果你想多了解一些,可以阅读 DRM 框架里的 fbdev 兼容代码,此代码也是支持 double buffer的:

  • linux/drivers/gpu/drm/*/*_drm_fbdev.c
  • linux/drivers/gpu/drm/drm_fb_helper.c

三、编写支持 double buffer 的 fbdev 应用

驱动支持 double buffer 后,还得在应用程序里将其使用起来。

先梳理一下思路:

  1. 检查是否支持 double buffer;
  2. 使能 double buffer:FBIOPUT_VSCREENINFO;
  3. 更新 buffer 里数据;
  4. 通知驱动切换 buffer:FBIOPAN_DISPLAY;
  5. 等待切换完成:FBIO_WAITFORVSYNC;

实例分析:show_color.c

该程序会在屏幕上循环的显示不同的颜色。

当传入 "single" 参数时,使用单 buffer,可见撕裂。

当传入 "double" 参数时,使用双 buffer,不再撕裂。

代码不是很复杂,我就不再详细分析了。

如果你想多了解一些,可以阅读开源软件 SDL-1.2 里的 sdl_fbvideo.c,此代码也支持了 double buffer。

另外,现在越来越多的显示设备走的是 DRM 框架,该框架自然是支持多 buffer的。感兴趣的小伙伴,自行查看下面的代码:

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读