编辑
2025-01-22
记录知识
0
请注意,本文编写于 156 天前,最后修改于 59 天前,其中某些信息可能已经过时。

目录

一、参考文档
二、相关文件
三、主要问题
3.1 planeMaskNames与内核设置不匹配
3.2 多余的planetype
3.3 错误的枚举
四、声明vp0的plane

关于rk3568的图层设置,这边review了一下openharmony的代码,发现其仍有出入,这里文档纠正rk3568图层设置的出入。

一、参考文档

关于图层的修改可以参考在rk3568上的修改,参考:Openharmony RK3588图层设置

二、相关文件

图层的修改相关文件如下

修改: drm_crtc.cpp 修改: drm_plane.cpp 修改: drm_plane.h

三、主要问题

3.1 planeMaskNames与内核设置不匹配

我们可以知道,内核设置planemask如下:

image.png 所以对于openharmony而言,我们需要设置与内核移植,应该如下:

image.png 修改的diff如下:

diff --git a/rk3568/hardware/display/src/display_device/drm_crtc.cpp b/rk3568/hardware/display/src/display_device/drm_crtc.cpp index fd41973..73bd856 100755 --- a/rk3568/hardware/display/src/display_device/drm_crtc.cpp +++ b/rk3568/hardware/display/src/display_device/drm_crtc.cpp @@ -27,6 +27,10 @@ struct PlaneMaskName planeMaskNames[] = { { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_MASK, "Esmart1" }, { DrmPlaneType::DRM_PLANE_TYPE_SMART0_MASK, "Smart0" }, { DrmPlaneType::DRM_PLANE_TYPE_SMART1_MASK, "Smart1" }, + { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER2_MASK, "Cluster2" }, + { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER3_MASK, "Cluster3" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART2_MASK, "Esmart2" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART3_MASK, "Esmart3" }, { DrmPlaneType::DRM_PLANE_TYPE_Unknown, "unknown" }, };

3.2 多余的planetype

我们可以知道,内核设置plane的类型如下:

image.png 对于的phy_id如下

image.png 而openharmony设置了多余的没有意义的planetyle,我们应该去除无意义的type,结果如下

image.png

3.3 错误的枚举

对于openharmony来说,通过FindPlaneAndApply来找到plane来实现枚举,FindPlaneAndApply代码如下

int32_t HdiDrmComposition::FindPlaneAndApply(drmModeAtomicReqPtr pset) { int32_t ret = 0; for (uint32_t i = 0; i < mCompLayers.size(); i++) { HdiDrmLayer *layer = static_cast<HdiDrmLayer *>(mCompLayers[i]); HdiLayer *hlayer = mCompLayers[i]; for (uint32_t j = 0; j < mPlanes.size(); j++) { auto &drmPlane = mPlanes[j]; if (drmPlane->GetPipe() != 0 && drmPlane->GetPipe() != (1 << mCrtc->GetPipe())) { DISPLAY_LOGD("plane %{public}d used pipe %{public}d crtc pipe %{public}d", drmPlane->GetId(), drmPlane->GetPipe(), mCrtc->GetPipe()); continue; } /* Check whether the plane belond to the crtc */ if (!(static_cast<int>(drmPlane->GetWinType()) & mCrtc->GetPlaneMask())) { continue; } DISPLAY_LOGD("use plane %{public}d WinType %{public}x crtc %{public}d PlaneMask %{public}x", drmPlane->GetId(), drmPlane->GetWinType(), mCrtc->GetId(), mCrtc->GetPlaneMask()); if (drmPlane->GetCrtcId() == mCrtc->GetId() || drmPlane->GetCrtcId() == 0) { ret = ApplyPlane(*layer, *hlayer, *drmPlane, pset); if (ret != DISPLAY_SUCCESS) { DISPLAY_LOGE("apply plane failed"); break; } /* mark the plane is used by crtc */ drmPlane->BindToPipe(1 << mCrtc->GetPipe()); break; } } } return DISPLAY_SUCCESS; }

这时候,我们需要留意如下:

/* Check whether the plane belond to the crtc */ if (!(static_cast<int>(drmPlane->GetWinType()) & mCrtc->GetPlaneMask())) { continue; }

这里原因是此判断导致无法找到正确的plane,从而不会applyplane

所以我们正确的代码应该如下;

enum class DrmPlaneType { DRM_PLANE_TYPE_CLUSTER0_WIN0 = 1 << 10 | 0x1, DRM_PLANE_TYPE_CLUSTER0_WIN1 = 1 << 11 | 0x1, DRM_PLANE_TYPE_CLUSTER1_WIN0 = 1 << 12 | 0x2, DRM_PLANE_TYPE_CLUSTER1_WIN1 = 1 << 13 | 0x2, DRM_PLANE_TYPE_ESMART0_WIN0 = 1 << 14 | 0x4, DRM_PLANE_TYPE_ESMART1_WIN0 = 1 << 15 | 0x8, DRM_PLANE_TYPE_SMART0_WIN0 = 1 << 16 | 0x10, DRM_PLANE_TYPE_SMART1_WIN0 = 1 << 17 | 0x20, DRM_PLANE_TYPE_CLUSTER0_MASK = 0x1, DRM_PLANE_TYPE_CLUSTER1_MASK = 0x2, DRM_PLANE_TYPE_CLUSTER2_MASK = 0x40, DRM_PLANE_TYPE_CLUSTER3_MASK = 0x80, DRM_PLANE_TYPE_CLUSTER_MASK = 0xc3, DRM_PLANE_TYPE_ESMART0_MASK = 0x4, DRM_PLANE_TYPE_ESMART1_MASK = 0x8, DRM_PLANE_TYPE_ESMART2_MASK = 0x100, DRM_PLANE_TYPE_ESMART3_MASK = 0x200, DRM_PLANE_TYPE_ESMART_MASK = 0x30c, DRM_PLANE_TYPE_SMART0_MASK = 0x10, DRM_PLANE_TYPE_SMART1_MASK = 0x20, DRM_PLANE_TYPE_SMART_MASK = 0x30, DRM_PLANE_TYPE_Unknown = 0xffffffff, };

这样planetype和planemask能够正常的通过位与判断了。

修改的diff如下:

diff --git a/rk3568/hardware/display/src/display_device/drm_plane.h b/rk3568/hardware/display/src/display_device/drm_plane.h index d0bd9c9..47a7b8c 100644 --- a/rk3568/hardware/display/src/display_device/drm_plane.h +++ b/rk3568/hardware/display/src/display_device/drm_plane.h @@ -34,39 +34,36 @@ enum class DrmPropertyType { }; enum class DrmPlaneType { - DRM_PLANE_TYPE_CLUSTER0_WIN0 = 1 << 0, - DRM_PLANE_TYPE_CLUSTER0_WIN1 = 1 << 1, - - DRM_PLANE_TYPE_CLUSTER1_WIN0 = 1 << 2, - DRM_PLANE_TYPE_CLUSTER1_WIN1 = 1 << 3, - - DRM_PLANE_TYPE_ESMART0_WIN0 = 1 << 4, - DRM_PLANE_TYPE_ESMART0_WIN1 = 1 << 5, - DRM_PLANE_TYPE_ESMART0_WIN2 = 1 << 6, - DRM_PLANE_TYPE_ESMART0_WIN3 = 1 << 7, - - DRM_PLANE_TYPE_ESMART1_WIN0 = 1 << 8, - DRM_PLANE_TYPE_ESMART1_WIN1 = 1 << 9, - DRM_PLANE_TYPE_ESMART1_WIN2 = 1 << 10, - DRM_PLANE_TYPE_ESMART1_WIN3 = 1 << 11, - - DRM_PLANE_TYPE_SMART0_WIN0 = 1 << 12, - DRM_PLANE_TYPE_SMART0_WIN1 = 1 << 13, - DRM_PLANE_TYPE_SMART0_WIN2 = 1 << 14, - DRM_PLANE_TYPE_SMART0_WIN3 = 1 << 15, - - DRM_PLANE_TYPE_SMART1_WIN0 = 1 << 16, - DRM_PLANE_TYPE_SMART1_WIN1 = 1 << 17, - DRM_PLANE_TYPE_SMART1_WIN2 = 1 << 18, - DRM_PLANE_TYPE_SMART1_WIN3 = 1 << 19, - - DRM_PLANE_TYPE_CLUSTER0_MASK = 0x3, - DRM_PLANE_TYPE_CLUSTER1_MASK = 0xc, - DRM_PLANE_TYPE_CLUSTER_MASK = 0xf, - DRM_PLANE_TYPE_ESMART0_MASK = 0xf0, - DRM_PLANE_TYPE_ESMART1_MASK = 0xf00, - DRM_PLANE_TYPE_SMART0_MASK = 0xf000, - DRM_PLANE_TYPE_SMART1_MASK = 0xf0000, + DRM_PLANE_TYPE_CLUSTER0_WIN0 = 1 << 10 | 0x1, + DRM_PLANE_TYPE_CLUSTER0_WIN1 = 1 << 11 | 0x1, + + DRM_PLANE_TYPE_CLUSTER1_WIN0 = 1 << 12 | 0x2, + DRM_PLANE_TYPE_CLUSTER1_WIN1 = 1 << 13 | 0x2, + + DRM_PLANE_TYPE_ESMART0_WIN0 = 1 << 14 | 0x4, + + DRM_PLANE_TYPE_ESMART1_WIN0 = 1 << 15 | 0x8, + + DRM_PLANE_TYPE_SMART0_WIN0 = 1 << 16 | 0x10, + + DRM_PLANE_TYPE_SMART1_WIN0 = 1 << 17 | 0x20, + + DRM_PLANE_TYPE_CLUSTER0_MASK = 0x1, + DRM_PLANE_TYPE_CLUSTER1_MASK = 0x2, + DRM_PLANE_TYPE_CLUSTER2_MASK = 0x40, + DRM_PLANE_TYPE_CLUSTER3_MASK = 0x80, + DRM_PLANE_TYPE_CLUSTER_MASK = 0xc3, + + DRM_PLANE_TYPE_ESMART0_MASK = 0x4, + DRM_PLANE_TYPE_ESMART1_MASK = 0x8, + DRM_PLANE_TYPE_ESMART2_MASK = 0x100, + DRM_PLANE_TYPE_ESMART3_MASK = 0x200, + DRM_PLANE_TYPE_ESMART_MASK = 0x30c, + + DRM_PLANE_TYPE_SMART0_MASK = 0x10, + DRM_PLANE_TYPE_SMART1_MASK = 0x20, + DRM_PLANE_TYPE_SMART_MASK = 0x30, + DRM_PLANE_TYPE_Unknown = 0xffffffff, };

至此,rk3568上的display的plane设置已经完成正确了。

四、声明vp0的plane

为了vp0正常能够设置planemask和planetype,需要在设备树显式声明plane如下: image.png

代码如下:

&vp0 { rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0)>; rockchip,primary-plane = <ROCKCHIP_VOP2_ESMART0>; cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>; };