VOP驱动解读

代码位置:

drivers/gpu/drm/rockchip/rockchip_drm_vop.c
drivers/gpu/drm/rockchip/rockchip_vop_reg.c

结构介绍:

struct vop;
// vop 驱动根结构, 一个vop对应一个struct vop结构

struct vop_win;
// 描述图层信息, 一个硬件图层对应一个struct vop_win结构

寄存器读写:

为了兼容各种不同版本的vop, vop驱动里面使用了寄存器级的抽象, 由一个结构体来保
存抽象关系, 这样主体逻辑只需要操作抽象后的功能定义, 由抽象的读写接口根据抽象
关系写到真实的vop硬件中.

示例:
  static const struct vop_win_phy rk3288_win23_data = {
       .enable = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 4),
  }
  static const struct vop_win_phy rk3368_win23_data = {
       .enable = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 4),
  }
rk3368和rk3288图层的地址分布不同, 但在结构定义的时候, 可以将不同的硬件图层bit
映射到同一个enable功能上, 这样vop驱动主体调用VOP_WIN_SET(vop, win, enable, 1);
时就能操作到真实的vop寄存器了.

图层接口:

static const struct drm_plane_helper_funcs plane_helper_funcs = {
    // 预先对图层进行处理
    .prepare_fb = vop_plane_prepare_fb,
    // 图层显示完成后的处理
    .cleanup_fb = vop_plane_cleanup_fb,
    // 在显示前进行参数检查
    .atomic_check = vop_plane_atomic_check,
    // 更新图层参数
    .atomic_update = vop_plane_atomic_update,
    // 关闭图层
    .atomic_disable = vop_plane_atomic_disable,
};

vop接口:

static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
    // 使能vop, 在这里面会将timing配好
    .enable = vop_crtc_enable,
    // 关闭vop
    .disable = vop_crtc_disable,
    // 对timing进行检查修正
    .mode_fixup = vop_crtc_mode_fixup,
    // 在一帧显示开始前做的处理
    .atomic_begin = vop_crtc_atomic_begin,
    // 检查显示的参数
    .atomic_check = vop_crtc_atomic_check,
    // 提交硬件显示
    .atomic_flush = vop_crtc_atomic_flush,
};

results matching ""

    No results matching ""