点屏常见错误分析
1. 显示问题定位前提条件 drm驱动-modetest测试 目的:确认drm驱动是否正常。如果失败,重新检查drm驱动。 测试方法:可参考OpenHarmony图形HDI基础适配及点屏文档中的"图形驱动测试"的章节,执行modetest测试。 或根据后续步骤进行操作: 1.1 为modetest新建BUILD.
重要问题跟踪
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:依赖不可见
路径: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
正常情况下会有如下显示:
注意:这里的参数 123@68:720x1080 指定的是HDMI屏幕,需要接HDMI显示,如果测试其他屏请按实际情况修改参数。
display HDI接口-hello_composer测试
目的:确认display HDI接口适配是否成功。
测试方法:参考OpenHarmony图形HDI基础适配及点屏,文档中的"Display HDI测试"的章节,执行hello_composer测试。如果失败,检查display HDI接口适配。
成功会有如下显示:
但是CPU点屏时,执行hello_composer可能会出现蓝屏现象,此时需要注意CanHandle接口,执行hello_composer需要返回true;进行CPU点屏需要返回false。
如果不能显示任何图形,请根据hello_composer的打印,检查hdi接口适配情况。
检查必起系统服务
使用命令查看一下各项服务是否已经起来。
- param get | grep ohos.boot.time 显示各服务启动时间
- param get | grep bootevent 显示bootevent相关服务,也是进入launcher条件,都为true后会进入launcher。
2. 卡logo或卡开机动画
所谓卡logo,就是在显示完开机logo之后,无法播放开机动画,停留在logo显示画面。卡开机动画则是在开机动画播放完成后,停留在openharmony的显示界面,无法进入launcher。
基本概念
目的:区分开机logo和开机动画两个概念。以免在遇到问题时,出现描述不清晰的情况。
开机logo
对于dayu200来说,开机logo分为两部分,对应两个阶段的两张图,uboot阶段和kernel阶段。
uboot阶段
在uboot启动阶段显示,也就是开机第一张图。
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启动阶段显示,也就是开机第二张图。
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图形子系统的组件。
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:
正常流程log:
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:处于强制模式,即如果不满足安全策略,就拒绝访问。
解决方案:
- 临时方案:hdc执行setforence 0,将安全策略置为宽松策略,重启之后会恢复。
- 修改config.json配置:vendor目录对应的产品config.json文件中将build_selinux置为false,关闭selinux。
- 修改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图层则会导致如下情况:
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部分代码如下:
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屏,条件受限,无法明确问题所在并给出明确解决方案)。导致切换回原显示器后,没有重新对显示器进行初始化,实际生效的参数和显示器参数不一致。
解决方案:在检测到新屏幕或者插拔事件时,重新初始化显示器。
更多推荐
所有评论(0)