在OpenHarmony上适配图形显示【1】——确认drm是否正常

发布于:2025-09-08 ⋅ 阅读:(18) ⋅ 点赞:(0)

笔者最近在调试OpenHarmony图形显示部分,现将经验分享如下。在开始分享之前笔者希望读者提前阅读一下内容便于理解一下内容。

文章写作环境

  • OpenHarmony 5.0.0和5.0.3版本
  • dayu200 rk3568

1.drm驱动测试

在适配OpenHarmony的图形显示之前,需要测试设备屏幕drm内核态驱动是否正常。这里有两种方法,第一种是使用libdrm的modetest,第二种是自行编写测试代码测试。
(由于modetest命令测试设备比较受限,笔者推荐使用第二种)

1.1 使用libdrm的modetest,使用atomic方式测试drm接口成功,才能确保HDI正常使用。

详细请参考OpenHarmony图形HDI基础适配及点屏

笔者在给出5.0.0至5.0.3版本中modetest的编译方法

ohos_executable("modetest") {

  sources = [
    "//third_party/libdrm/tests/modetest/buffers.c",
    "//third_party/libdrm/tests/modetest/cursor.c",
    "//third_party/libdrm/tests/modetest/modetest.c",
    "//third_party/libdrm/tests/util/format.c",
    "//third_party/libdrm/tests/util/kms.c",
    "//third_party/libdrm/tests/util/pattern.c",
  ]

  cflags_c = [
    "-Wno-unused-variable",
  ]
  
  include_dirs = [
    "//third_party/libdrm/tests",
    "//third_party/libdrm/tests/util",
    "//third_party/libdrm/tests/modetest",
  ]

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

  install_images = [ "system" ]
  install_enable = true
  part_name = "xxxxxxx"
}

1.2 当soc提供的drm内核态驱动为非标准实现,或者modetest中找不到drm设备时,这时候需要自行编写modetest atomic方式样例去测试drm内核态驱动是不是ok的

其中rk、树莓派、amd显卡这些是可以使用modetest命令进行测试的。

image.png

1.笔者使用的是这里的开源样例
https://github.com/dvdhrm/docs/tree/master/drm-howto

image.png

2.然后把样例加入编译

ohos_executable("modeset_atomic") {

  sources = [
    "drm-howto/modeset-atomic.c",
  ]

  cflags_c = [ 
    "-Wno-error",
    "-Wno-initializer-overrides" 
  ]  
    
  deps = [
    "//third_party/libdrm:libdrm",
  ]

  install_images = [ "system" ]
  install_enable = true
  part_name = "xxxx"
}

3.编译好之后,执行测试用例,注意,不能有其他进程占用/dev/dri/card0 节点!!!

# 查看/sys/kernel/debug/dri/0/clients观察那几个服务占用了/dev/dri/card0,然后全部关掉
cat /sys/kernel/debug/dri/0/clients
             command  tgid dev master a   uid      magic
      allocator_host   577   0   n    y  3041          0
       composer_host   578   0   y    y  3036          0
       composer_host   578   0   n    n  3036          0
      render_service   624 128   n    n  1003          0
       bootanimation   623 128   n    n  1003          0
     m.ohos.systemui  1579 128   n    n 10009          0
      render_service   624   0   n    n  1003          0
     m.ohos.launcher  1755 128   n    n 20010017          0

# 关闭render service和composer_host
service_control stop render_service
service_control stop composer_host
service_control stop allocator_host

4.最后执行开源样例即可

./modeset_atomic

5.运行效果

image.png

image.png

2.总结

1.libdrm的modetest不是所有设备上都能使用它进行测试,一些非标准实现drm的设备需要自行编写测试样例进行测试

2.执行测试用例的时候注意不要有服务占用/dev/dri/card0节点

3.参考资料


网站公告

今日签到

点亮在社区的每一天
去签到