Linux图形子系统之vblank事件
引言
显示器显示图像数据的过程,一般从左上角,按从左至右、从上至下的方式扫描像素数据。一般每扫描一行,会切换到下一行的左侧,行与行之间的返回过程称为水平消隐;一帧图像扫描完成,要从图像的右下角返回到图像的左上角,开始新一帧图像的扫描,这一时间间隔,叫做垂直消隐,也称场消隐(vblank)。从右下角返回左上角的时间间隔内,可以通知驱动进行下一帧图像的送显,一般硬件进入vblank后(也就是扫描完一帧图像)会通过中断机制触发硬件的vblank事件,然后再由驱动提交软件的vblank事件。
1 使能vblank
1.1 初始化
在struct drm_device的模式设置初始化后需要调用drm_vblank_init初始化crtc的drm_vblank_crtc结构
1.2 使能vblank
- 软件使能
在drm_crtc_helper_funcs的atomic_enable/atomic_disable回调内调用drm_crtc_vblank_on/drm_crtc_vblank_off方法
- 硬件使能
在drm_crtc_funcs的enable_vblank/disable_vblank回调内实现开启/关闭硬件vblank中断相关操作
2 传递vblank
2.1缓存vblank
在drm_crtc_helper_funcs的atomic_flush回调内调用drm_crtc_arm_vblank_event方法,将state的even添加到struct drm_device的vblank_event_list中
2.2 发送vblank
在vblank的硬件中断函数中,通过drm_crtc_handle_vblank或drm_handle_vblank发送struct drm_device的vblank_event_list中事件