重要问题跟踪

1.OHOS 4.1之后的版本(4.1、5.0、master),当前时间点(2024/7/17)不支持CPU点屏。

原因:arkui自己实现了flutter的框架,所以在third_party下删除了flutter库,但是CPU点屏依赖了其部分API,所以进行CPU点屏的时候会出现flutter、skia等模块编译问题。


1. 显示问题定位与测试方法

drm驱动-modetest测试

目的:确认drm驱动是否正常。如果失败,重新检查drm驱动。

测试方法:可参考OpenHarmony图形HDI基础适配及点屏文档中的"图形驱动测试"的章节,执行modetest测试。

或根据后续步骤进行操作:

1.1 为modetest新建BUILD.gn文件

路径:third_party/libdrm/tests/modetest/BUILD.gn:

import("//build/ohos.gni")
ohos_executable("modetest") {
  sources = [
    "buffers.c",
    "cursor.c",
    "modetest.c",
  ]

  cflags = [
      "-Wno-pointer-arith",
  ]

  include_dirs = [
    "../",
    ".",
  ]

  configs = [ "//third_party/libdrm:libdrm_config" ]

  public_configs = [ "//third_party/libdrm:libdrm_public_config" ]

  deps = [
    "//third_party/libdrm:libdrm",
    "//third_party/libdrm/tests/util/:util",
  ]

  public_deps = []

  install_images = [
    "system",
    "updater",
  ]
  part_name = "graphic_2d"    #注意
  subsystem_name = "graphic"
}

注意:3.2Release中配置为part_name = "graphic_standard", 而在4.0Release中,由于graphic的代码结构改变,应该配置为part_name = "graphic_2d"

1.2 添加依赖

路径:third_party\libdrm\tests\util\BUILD.gn

import("//build/ohos.gni")

ohos_static_library("util") {

  sources = [
    "format.c",
    "kms.c",
    "pattern.c",
  ]

  cflags = []

  include_dirs = [
    "../",
    ".",
  ]

  configs = [ "//third_party/libdrm:libdrm_config" ]

  public_configs = [ "//third_party/libdrm:libdrm_public_config" ]

  deps = [
    "//third_party/libdrm:libdrm",
  ]

  public_deps = []
}

1.3 加入编译框架,添加到graphic依赖项

路径:foundation/graphic/graphic_2d/bundle.json

diff --git a/bundle.json b/bundle.json
index 755e6d2..f1bb7ef 100755
--- a/bundle.json
+++ b/bundle.json
@@ -56,6 +56,8 @@
         "group_type": {
           "base_group": [
             "//third_party/libpng:libpng",

+            "//third_party/libdrm/tests/util:util",
+            "//third_party/libdrm/tests/modetest:modetest",
             "//foundation/graphic/graphic_2d/interfaces/kits/napi:napi_packages",
             "//foundation/graphic/graphic_2d/rosen/modules/composer:libcomposer",
             "//foundation/graphic/graphic_2d/rosen/modules/composer/native_vsync:libnative_vsync",

1.4 解决编译问题

问题1:依赖不可见

img


路径:third_party/libdrm/BUILD.gn
修改点:添加util的可见性。

config("libdrm_config") {
  visibility = [ ":*",
  "tests/util:*",
   "tests/modetest:*" ]
  ......
}

问题2:添加三方库依赖
路径:foundation/graphic/graphic_2d/bundle.json
修改点:third_party添加libdrm、modetest依赖。

{
  ......
"third_party": [
    "flutter",
    "libuv",
    "openssl",
    "libxml2",
    "bounds_checking_function",
    "icu",
    "libpng",
    "zlib",
    "skia",
    "cJSON",
    "jsoncpp",
    "egl",
    "opengles",
    "vulkan-headers",
    "vulkan-loader",
    "libdrm",
    "modetest"
  ]
......
}

注意:4.1Release可能还有build/bundle.json的依赖问题(4.0中没有这个文件),解决方法在此报错的bundle.json中的third_party添加libdrm和util即可。

1.5 运行测试

编译生成路径:out/rk3568/obj/third_party/libdrm/tests/modetest/modetest

  • IOCTL方式
/system/bin/modetest -M rockchip -s 123@68:720x1280
-M 指定drm驱动名称
-s 指定屏幕信息
   123:connector id
   68: crtc id
   720x1280: 屏幕分辨率
  • atomic方式(OHOS Display HDI使用的方式)
modetest -M rockchip -D 0 -a -s 123@68:720x1280 -P 54@68:720x1280
-M 指定drm驱动名称
-s 指定屏幕信息
   123:connector id
   68: crtc id
   720x1280: 屏幕分辨率
-P 指定plane信息
   54: 可用的plane id
   68: crtc id
   720x1280: plane大小
由于HDI使用的是atomic方式,我们需要使用atomic方式测试drm接口成功,才能确保HDI正常使用。
  • 直接运行modetest可以获取所有参数:
     /system/bin/modetest
    ……
Encoders:
id      crtc    type    possible crtcs  possible clones
120     0       Virtual 0x00000003      0x00000001
122     0       TMDS    0x00000001      0x00000002
135     85      DSI     0x00000002      0x00000004

Connectors:
id      encoder status          name            size (mm)       modes   encoders
123     0       disconnected    HDMI-A-1        0x0             0       122
    ……

如果遍历了所有驱动后都找不到合适的驱动名称就退出了,而无法运行,就需要使用-D来指定dri的名称。

查看dri设备信息

ls -l /dev/dri/by-path/
total 0
lrwxrwxrwx l root system 8 2017-08-07 13:34 platform-display-subsystem-card -> ../card0
lrwxrwxrwx l root system 8 2017-08-07 13:33 platform-display-subsystem-render -> ../renderD128

就可以使用“-D display-subsystem”来替换“-M rockchip”。

modetest -D display-subsystem -a -s 123@68:720x1080 -P 54@68:720x1080

正常情况下会有如下显示:

img

注意:这里的参数 123@68:720x1080 指定的是HDMI屏幕,需要接HDMI显示,如果测试其他屏请按实际情况修改参数。

display HDI接口-hello_composer测试

目的:确认display HDI接口适配是否成功。

测试方法:参考OpenHarmony图形HDI基础适配及点屏,文档中的"Display HDI测试"的章节,执行hello_composer测试。如果失败,检查display HDI接口适配。

成功会有如下显示:

img

但是CPU点屏时,执行hello_composer可能会出现蓝屏现象,此时需要注意CanHandle接口,执行hello_composer需要返回true;进行CPU点屏需要返回false。

如果不能显示任何图形,请根据hello_composer的打印,检查hdi接口适配情况。

检查必起系统服务

使用命令查看一下各项服务是否已经起来。

  • param get | grep ohos.boot.time 显示各服务启动时间

    img

  • param get | grep bootevent 显示bootevent相关服务,也是进入launcher条件,都为true后会进入launcher。

    img

2. 卡logo或卡开机动画

所谓卡logo,就是在显示完开机logo之后,无法播放开机动画,停留在logo显示画面。卡开机动画则是在开机动画播放完成后,停留在openharmony的显示界面,无法进入launcher。

基本概念

目的:区分开机logo和开机动画两个概念。以免在遇到问题时,出现描述不清晰的情况。

开机logo

对于dayu200来说,开机logo分为两部分,对应两个阶段的两张图,uboot阶段和kernel阶段。

uboot阶段

在uboot启动阶段显示,也就是开机第一张图。

img

rk3568的uboot代码,为闭源代码,无法修改。但是可以替换图片、关闭显示。

替换操作。路径:device/board/hihope/rk3568/kernel,替换logo源文件logo.bmp即可。

关闭操作。方法一,路径:out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi,参数logo,uboot项置空,然后参考文章重新编译out下的内核方法二,直接删除logo源文件。

kernel阶段

在kernel启动阶段显示,也就是开机第二张图。

img

rk3568的kernel logo显示代码路径为:out/kernel/src_tmp/linux-5.10/drivers/gpu/drm/rockchip/rockchip_drm_drv.c,可以在此处对其显示logo函数rockchip_drm_show_log做改动。

替换操作。路径:device/board/hihope/rk3568/kernel,替换logo源文件logo_kernel.bmp即可。

关闭操作。方法一,路径:out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi,参数logo_kernel,uboot项置空,然后参考重新编译out下的内核方法二,删除logo_kernel源文件。

开机动画

开机动画是OHOS图形子系统的组件。

img

OHOS开机动画由150张图片组成,这些图片组成名为bootpic.zip的资源文件。

  • 资源文件路径:foundation/graphic/graphic_2d/frameworks/bootanimation/data
  • 此路径还包含:音频文件、播放开机动画的部分配置。

开机动画可以设置视频播放或图片播放两种模式。
路径:foundation\graphic\graphic_2d\frameworks\bootanimation\include\boot_animationconfig.h
修改bootVideoEnabled_参数值。

关闭开机动画。

  • 方法一,路径:foundation\graphic\graphic_2d\graphic.cfg,删除bootanimation的服务。
  • 方法二,屏蔽WaitBootAnimationStart()接口。

bootanimation服务,代码路径:foundation\graphic\graphic_2d\frameworks\bootanimation\src\main.cpp

问题定位策略

定位logo显示问题,首先需要了解logo显示流程,如下:

显示uboot logo(启动uboot)---》显示kernel logo(启动kernel)---》播放开机动画(渲染服务、开机动画服务、媒体服务等等)---》进入launcher(launcher服务、锁屏服务)。

出现卡logo问题可以按照此流程分析定位。

bootanimation-问题较多,一步步定位

  • 卡logo的定位时,不确定是不是开机动画导致的问题,可以直接手动kill掉bootanimation,如果kill掉之后,能够进入锁屏界面,那基本就是bootanimation的问题。
    如果kill掉了仍然无法进入,那大概率与bootanimation无关,是显示出现问题。(评论区@a1448125提出的方法)

  • 将开机动画的视频模式改为图片播放模式。视频播放模式需要媒体服务支持,可排除是否媒体适配问题,媒体方面问题需要求助对应技术人员。

  • 图片播放模式依然无法解决。可关闭开机动画(参考上述"基本概念-开机动画"章节),确认是否开机动画导致卡死。

  • 在开机动画的流程中加代码调试(代码位置在"基本概念-开机动画"章节有介绍)。

案例1

问题描述:

OpenHarmony v4.1版本适配rk3568开发板,使用hdmi屏显示;上电启动后,屏幕显示开机logo后,一直卡在开机logo界面,无法进入桌面。

问题分析:

分析log,发现如下关键点,正常开机动画logo会打印"main enter"与"main exit"表示一个完整的开机动画流程,异常log中没有exit,而且有stream error的报错。

开发板上执行"bootanimation"命令,发现开机动画播放失败,但是一段时间后可以进入launcher。

通过关闭开机动画发现,可以进入launcher。

可能是媒体播放有问题,需要媒体开发人员定位。

异常流程log:

img

正常流程log:

img

bootanimation源码main函数
路径:foundation\graphic\graphic_2d\frameworks\bootanimation\src\main.cpp

int main(int argc, const char *argv[])
{
    LOGI("main enter");
    WaitRenderServiceInit();

     Rosen::RSInterfaces& interface = Rosen::RSInterfaces::GetInstance();
     Rosen::ScreenId defaultId = interface.GetDefaultScreenId();
     if (defaultId == Rosen::INVALID_SCREEN_ID) {
         LOGE("invalid default screen id, return");
         return 0;
     }
     Rosen::RSScreenModeInfo modeinfo = interface.GetScreenActiveMode(defaultId);
     int screenWidth = modeinfo.GetScreenWidth();
     int screenHeight = modeinfo.GetScreenHeight();

     BootAnimation bootAnimation;
     bootAnimation.Run(defaultId, screenWidth, screenHeight);
 
     LOGI("main exit");
     return 0;
 }

案例2

背景:4.0 release yangfan代码加入CPU点屏代码,开机一直在开机logo,无法进入系统
编译modetest和hello_composer测试
使用modetest -M rockchip -s 138@67:1920x1080可以在LCD上显示彩色条纹
使用hello_composerLCD黑屏,没显示

核心日志:

    行 16566: 01-18 17:25:09.769   525   551 W C02500/DISP: [FindPlaneAndApply:237] use plane 55 WinType ffffffff crtc 67 PlaneMask 0
    行 16567: 01-18 17:25:09.770   525   551 E C02500/DISP: [0;32;31m[Apply:305] drmModeAtomicCommit failed -22 errno 22[m
    行 16568: 01-18 17:25:09.770   525   551 E C02500/DISP: [0;32;31m[Commit:42] post composition apply failed[m
    行 16571: 01-18 17:25:09.885   525   551 E C02500/DISP: [0;32;31m[SetLayerMaskInfo:318] <private> is not supported[m
    行 16574: 01-18 17:25:09.906   525   551 E C02500/DISP: [0;32;31m[SetDisplayClientDamage:146] <private> is not supported[m

解决方案:
将hdmi 的vop 与lcd vop 调换,lcd 显示正常

3. 无法进入launcher

此问题需要结合卡logo或卡开机动画章节部分内容一起分析。

开机动画异常导致

开机动画播放失败可能会导致无法进入launcher。

  • 可以尝试关闭开机动画,看是否能够进入launcher。
  • 或者使用hdc工具在板子上执行bootanimation命令,手动开启开机动画,查看日志播放流程是否正常。

selinux安全策略

目前此问题大部分出现在进行CPU点屏时(其他情形下可以采用下面所述临时方案进行简单调试)。

修改成CPU点屏后会导致点屏相关的服务不在安全策略范围内,可以尝试添加安全策略解决或关闭selinux进行规避。

selinux问题关键log:

  ......
[   46.572457] audit: type=1400 audit(1501928527.476:334): avc:  denied  { call } for  pid=605 comm="TaskExecutor" scontext=u:r:distributeddata:s0 tcontext=u:r:netmanager:s0 tclass=binder permissive=0
[   47.084814] audit: type=1400 audit(1501928527.990:335): avc:  denied  { call } for  pid=605 comm="TaskExecutor" scontext=u:r:distributeddata:s0 tcontext=u:r:netmanager:s0 tclass=binder permissive=0
[   47.352681] audit: type=1400 audit(1501928528.256:336): avc:  denied  { getopt } for  pid=621 comm="render_service" scontext=u:r:render_service:s0 tcontext=u:r:render_service:s0 tclass=unix_dgram_socket permissive=0
[   47.352762] audit: type=1400 audit(1501928528.256:337): avc:  denied  { setopt } for  pid=621 comm="render_service" scontext=u:r:render_service:s0 tcontext=u:r:render_service:s0 tclass=unix_dgram_socket permissive=0
[   47.352806] audit: type=1400 audit(1501928528.256:338): avc:  denied  { getopt } for  pid=621 comm="render_service" scontext=u:r:render_service:s0 tcontext=u:r:render_service:s0 tclass=unix_dgram_socket permissive=0
[   47.596342] audit: type=1400 audit(1501928528.500:339): avc:  denied  { call } for  pid=605 comm="TaskExecutor" scontext=u:r:distributeddata:s0 tcontext=u:r:netmanager:s0 tclass=binder permissive=0
  .......

上述log中有两个关键点:

  • avc:denied:访问被拒绝。
  • permissive=0:处于强制模式,即如果不满足安全策略,就拒绝访问。

解决方案:

  1. 临时方案:hdc执行setforence 0,将安全策略置为宽松策略,重启之后会恢复。
  2. 修改config.json配置:vendor目录对应的产品config.json文件中将build_selinux置为false,关闭selinux。
  3. 修改gni文件:路径base/security/selinux_adapter/selinux.gni,将selinux_enforce = true置为false,关闭selinux。

参考链接
OpenHarmony中SELinux使用详解_小~Q-Laval社区 (csdn.net)
OpenHarmony SELinux的主代码仓

调试方法

手动打开应用

#查看支持的应用包
bm dump -a

#打开应用,以记事本为例
aa start -a MainAbility -b  com.ohos.note

案例1

进行cpu点屏之后,停留在openharmony界面,无法进入launcher。

执行完解锁操作,在openharmoy界面上随意点击,可以进入一些应用界面,比如:相机、图库等。

手动执行bootanimation,开机动画播放正常,手动执行应用命令正常。

分析日志,发现avc:denied相关报错,执行setenforce 0后正常进入launcher。

关闭selinux,重新编译镜像,系统正常。

4. 不显示图形

进行modetest和hello_composer测试

确保drm驱动和hdi适配正常(在第一章节1. 显示问题定位前提条件中有介绍)。

drmplanetype配置

每家芯片厂商实现drm的方式不一样,可能没有下面这些配置,请注意!

路径:device/soc/rockchip/rk3568/hardware/display/src/display_device/drm_plane.cpp
device/soc/rockchip/rk3568/hardware/display/src/display_device/drm_plane.h

struct PlaneTypeName planeTypeNames[] = {
    { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER0_WIN0, "Cluster0-win0" },
    { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER0_WIN1, "Cluster0-win1" },
    { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER1_WIN0, "Cluster1-win0" },
    { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER1_WIN1, "Cluster1-win1" },

    { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN0, "Esmart0-win0" },
    { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN1, "Esmart0-win1" },
    { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN2, "Esmart0-win2" },
    { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN3, "Esmart0-win3" },

    { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN0, "Esmart1-win0" },
    { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN1, "Esmart1-win1" },
    { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN2, "Esmart1-win2" },
    { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN3, "Esmart1-win3" },

    { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN0, "Smart0-win0" },
    { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN1, "Smart0-win1" },
    { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN2, "Smart0-win2" },
    { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN3, "Smart0-win3" },

    { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN0, "Smart1-win0" },
    { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN1, "Smart1-win1" },
    { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN2, "Smart1-win2" },
    { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN3, "Smart1-win3" },

    { DrmPlaneType::DRM_PLANE_TYPE_Unknown, "unknown" },
};

如果缺少Smart0和Smart1两个图层配置,会导致rk系列平台,在4.0版本上卡在内核logo显示界面;在4.1版本上卡在内核logo一段时间后,反复重启。

Cluster图层与鼠标相关,如果缺少Cluster图层则会导致如下情况:

img

5. 帧率低

分辨率影响

确认硬件性能是否支持。

多屏显示影响

多屏显示,主副屏幕可能做了一些重复操作,比如:显示图像需要经过渲染-》合成-》送显等过程。多屏同显时,副屏可以直接使用主屏渲染合成结果,拷贝主屏送显数据,经过变换后进行送显,可以节省图像处理时间,缩短显示间隔。

帧同步影响

使用hidumper -s 10 -a surface查看VSyncGenerator信息,其中period指的是vsync周期,对帧率有一定影响。

可以修改vblank函数的实现方式,对帧同步时间进行优化。当前从数据上看按照rk3568实现的WaitNextVBlank接口可达到大概14ms一帧,也就是大概1s 70帧。

路径:device/soc/rockchip/rk3568/hardware/display/src/display_device/drm_vsync_worker.cpp

uint64_t DrmVsyncWorker::WaitNextVBlank(unsigned int &sq)
{
    constexpr uint64_t SEC_TO_NSEC = 1000 * 1000 * 1000;
    constexpr uint64_t USEC_TO_NSEC = 1000;
    drmVBlank vblank = {
        .request =
            drmVBlankReq {
                .type = DRM_VBLANK_RELATIVE,
                .sequence = 1,
                .signal = 0,
            }
    };
    /* The drmWaitVBlank need set the crtc pipe when there are multi crtcs in the system. */
    if (mCallBack->GetPipe() == 1)
        vblank.request.type = drmVBlankSeqType((int)(vblank.request.type) | (int)DRM_VBLANK_SECONDARY);
    int ret = drmWaitVBlank(mDrmFd, &vblank);
    DISPLAY_CHK_RETURN((ret < 0), 0,
        DISPLAY_LOGE("wait vblank failed ret : %{public}d errno %{public}d", ret, errno));
    sq = vblank.reply.sequence;
    return (uint64_t)(vblank.reply.tval_sec * SEC_TO_NSEC + vblank.reply.tval_usec * USEC_TO_NSEC);
}

6. 如何改为CPU点屏模式

参考链接:
CPU点屏指导
rk3568开发板4.0 Release版本cpu点屏过程总结
Openharmony 4.0 release 版本 yangfanRK3399 CPU点屏临时补丁参考
yangfan3399-4.0cpu点屏补充
rk3399启动适配和cpu点屏 海边看雪  ·  2024-04-25 15:20:24 发布

7.分辨率问题

更换不同分辨率的屏幕之后出现显示问题,需要确认uboot、kernel、驱动等是否支持所选的分辨率,如果不支持需要添加所选的新分辨率。

8.多屏显示

在4.0、4.1版本中多屏同显和多屏异显功能并不完善,需要自主实现多屏相关功能或者进行优化。

目前的5.0 Beta1已经完成了一些优化,可以作为参考。

参考链接:OpenHarmony 4.0 Release 如何适配多屏中有详细介绍和代码实现。

9. plane相关问题 (todo:补充其他问题、案例)

新适配的屏幕报错

原始问题:Openharmony4.0 RK3588点屏,composer_host进程报错

关键日志:

07-15 15:53:14.105   556   621 E C02500/DISP: [Apply:269] plane not enough
07-15 15:53:14.105   556   621 E C02500/DISP: [Commit:42] post composition apply failed
07-15 15:53:14.105   556   621 E C02500/DISP: [SetLayerMaskInfo:344] <private> is not supported
07-15 15:53:14.105   556   621 E C02500/DISP_CMD: 823@OnSetLayerMaskInfo: check failed
07-15 15:53:14.107   556   621 E C02500/DISP: [SetDisplayClientDamage:156] <private> is not supported
07-15 15:53:14.107   556   621 E C02500/DISP_CMD: OnSetDisplayClientDamage, SetDisplayClientDamage error

原因:
路径:device/soc/rockchip/rk3588/hardware/display/src/display_device/drm_device.cpp
DrmGetPlane接口对特定的planeid进行了过滤。

解决方案:
参考rk3568的DrmGetPlane接口实现。

10. mesa3d适配

graphic_2d中SetUpGrContext失败

问题描述:【OpenHarmony4.0 mesa3d】编译thirdparty中的mesa3d22.2.4版本,使能GPU加速,graphic_2d中SetUpGrContext失败,看log发现skia库中GetString没有调用到mesa库中,获取不到GR_GL_VERSION导致,需要将GetString调用到mesa库中。

原因:libGLESV2.so.2库的软链接命名不对,导致gl相关函数找不到,解决此问题后可以进行GPU渲染、合成。

解决方案:
参考https://gitee.com/ohos-porting-communities/device_soc_opc/blob/OpenHarmony-4.0-Release/bcm2711/hardware/gpu/BUILD.gn
https://gitee.com/ohos-porting-communities/device_board_opc/blob/OpenHarmony-4.0-Release/common/patches/002-graphic_2d.diff

11.适配异形屏,显示开机log前蓝屏

uboot不匹配导致

使用新的参数的屏幕需要检查uboot是否支持,在uboot的edid.c中列举了支持的屏幕的规格参数。drm驱动会根据edid.c中的提供的参数进行初始化,如果找不到会给一个默认参数,最终会导致显示异常。
edid.c部分代码如下:

img

12.多屏、横屏显示问题

4.0和4.1版本多屏、横屏显示问题,参考https://laval.csdn.net/660a7e3a872a553575c2c259.html%E7%9A%84%E4%BB%A3%E7%A0%81%E9%80%BB%E8%BE%91%E8%BF%9B%E8%A1%8C%E4%BF%AE%E6%94%B9%E3%80%82

附件12,是针对4.1版本初步简化过的补丁,仅供参考。

13.HDMI屏分辨率切换问题

rk3568切换4k屏后无法自适应分辨率

问题描述:低分辨率屏切换为4k屏后,再切换回原来的屏幕,报显示器不支持当前时序错误。
推测原因:在使用4k屏时,drm驱动在进行插拔检测、重新初始化显示器这个流程中出现问题,可能是驱动适配不完全(目前手中无4k屏,条件受限,无法明确问题所在并给出明确解决方案)。导致切换回原显示器后,没有重新对显示器进行初始化,实际生效的参数和显示器参数不一致。
解决方案:在检测到新屏幕或者插拔事件时,重新初始化显示器。

相关文件下载
12.zip
7.92 KB
下载
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐