310鸿蒙点屏适配指导
收藏回复举报
310鸿蒙点屏适配指导
发表于2025-06-12 16:10:00
0 查看

310基于鸿蒙4.0点屏适配指导

       本文档使用的是一款常见的开发板,kernel下载的是开发板官方提供的linux源码,OpenHarmony版本使用的是4.0 Release版本,在基础的应用和服务适配完成后,下面将详细介绍一下基于鸿蒙4.0点屏适配,通常步骤为先cpu点屏成功,再适配gpu点屏。

适配前的基础应用检查

       参照lava社区的点屏适配指导,在点屏适配前,需要进行一些基础的应用检查,如果发现有应用或者账户不正常的情况,务必解决后再进行点屏适配。

cke_134.png

应用名称

检查方式

正常标志

samgr

ps -A |grep samgr

存在samgr信息

softbus

ps -A |grep softbus

存在softbus信息

foundation

ps -A |grep foundation

存在foundation信息

账户信息

acm dump -a   

status为active

应用安装

查看系统启动日志

出现注册应用打印

系统启动日志注册应用打印

cke_135.png

a.cpu点屏

cpu点屏主要步骤:先通过modetest工具验证drm驱动验证成功,再适配display hdi,通过hello_composer验证成功,最后使用cpu点屏实现点亮屏幕。鸿蒙源码提供了modetest和hello_composer的实现,需要修改对应的BUILD.gn来生成。

1、 modetest验证drm驱动

打开drm内核配置,适配方式采取hdmi连接显示器,所以也需要将hdmi的内核配置打开。由于从开发板官方获取的内核源码中已开启了drm、hdmi,不需要额外打开,在启动脚本中添加加载drm驱动即可。

cke_136.png

       在启动脚本添加drm驱动后,系统正常加载后会在/dev/dri下生成card0节点。

      

由于官方提供的modetest中没有支持310 drm驱动测试,需要在modetest测试程序中添加310的drm驱动,这里将别的厂商的drm驱动去掉,改为310的 drm驱动。驱动名称可在dts中进行查看,也可通过命令进行查看cat /sys/kernel/debug/dri/0/name。

本文中X为替代用词,以实际开发文件为主

Ascend310X-source-opi/dtb/dts/hi1910X/hi1910XL/base/hi1910X-drm.dtsi

cke_137.png

cke_138.png

编出对应modetest后,在板子上测试,有IOCTL和ATOMIC两种方式进行测试。

IOCTL方式:传统的设备控制接口,允许用户空间应用程序通过特定的命令码向内核驱动程序发送控制命令。

/system/bin/modetest -M atlas-200a2 -s 34@32: 1920x1080

ATOMIC方式(OHOS Display HDI使用的方式):更现代的显示管理机制,允许用户空间应用程序一次性描述整个显示控制器的状态集合,并通过一个原子操作来提交这些状态。

/system/bin/modetest -M atlas-200a2 -s 34@32:1920x1080 -a -P 31@32:1920x1080

34@32: 1920x1080为屏幕参数,可通过命令获取

cat /sys/class/drm/card0-HDMI-A-1/modes

/system/bin/modetest -M atlas-200a2 | cut -f1 | grep -E ^[0-9A-Z]\|id

测试成功的标志为在显示屏上出现经典的彩色条纹:

cke_139.jpeg

2、display hdi适配,hello_composer验证hdi

display hdi适配有两种方式,官方提供了display hdi的模板,可在其基础上进行适配,也可参考类似芯片的实现进行适配,这里310参考rk3568的实现进行适配。

大致有以下几个步骤:

  1. 关闭gpu、selinux

graphic_2d_feature_ace_enable_gpu = false

foundation/graphic/graphic_2d/graphic_config.gni

productdefine/common/inherit/rich.json

2)把device/soc/rockchip/rk3568/hardware/display 整个文件夹复制到

device/soc/ascend/310X/hardware,修改BUILD.gn为310的配置。

cke_140.png

  1. vsync信号修改

cke_141.png

  1. 因为hello_composer测试需要将render_service关闭,cpu合成无法实现,为了能正常出图,需要手动实现一下硬件合成。

cke_142.png

  1. CanHandle中要返回ture来选择默认的硬件合成:

device/soc/ascend/310X/hardware/display/src/display_device/hdi_gfx_composition.cpp

bool HdiGfxComposition::CanHandle(HdiLayer &hdiLayer)

{

     DISPLAY_LOGD();

     (void)hdiLayer;

     return true;

}

  

cke_143.png

  1. 310专有修改,由于310的drm驱动和rk3568的drm驱动存在差异,需要做一些专有修改

部分专有修改如下:

       由于310的drm驱动中没有plane设置获取相关的实现,屏蔽上层相关的设置。

cke_144.png

cke_145.png

  1. hello_composer验证

begetctl stop_service render_service

hello_composer

验证成功的标志为屏幕出现以下页面

cke_146.png

3、cpu渲染、cpu合成适配

       在hello_composer测试成功后,并不能直接进行cpu点屏,做了部分适应性修改后可以进行cpu点屏。比如驱动加载延时:由于310驱动加载需要一定时间,而鸿蒙系统启动后会立即启动各项服务。如果未及时加载驱动,launcher服务会挂掉,所以需要进行一定的延时处理。

       cpu点屏成功后进入launcher的界面

cke_147.jpeg

b.gpu点屏

310 gpu点屏采用开源mesa3D实现

1、内核适配

修改gpu dtb配置

cke_148.png

打开panfrost内核配置

cke_149.png

通过网盘分享的文件:0001-add-drivers-gpu-drm-panfrost.patch 

链接: https://pan.baidu.com/s/1G95a0ex8E710XMW6R2cNGQ?pwd=qxn5 提取码: qxn5

在编译内核脚本添加内核panfrost支持,在启动脚本中添加加载panfrost驱动,驱动成功加载的标志为在/dev/dri/下生成card1、renderD128节点。

cke_150.png

      

将panfrost的功能支持patch添加至内核编译脚本device/board/orangepi/aipro/kernel/ build_kernel.sh

cke_151.png

2、mesa3d基础适配

4.0官方提供的mesa3d不能直接编出64位的mesa3d,需要修改编译脚本。

安装依赖包:

sudo apt-get install -y meson cmake llvm ninja-build pkg-config

python3 -m pip install meson==0.62.0

pip install mako atomic markupsafe

参考社区指导,部分基础修改如下:

由于部分mesa3d的函数未对外部开放,会导致render_service在调用时出现无法访问的情况,这里需要将函数打开

cke_152.png

cke_153.png

基础修改完成后,根据310 panfrost、drm实际情况,部分适配修改如下

cke_154.png

      

编译mesa3d,将编出来的so拷贝到device/soc/ascend/310X/hardware/gpu/lib64

python ohos/build_ohos64.py /home/ubuntu/code/ohos aipro

  /home/ubuntu/code/ohos/third_party/mesa3d

3、glmark验证panfrost驱动是否正常

glmark源码基础适配,添加native_window_wrapper转接glmark2模块

编译glmark,将编出来的glmark2-es2-ohos拷贝至

/home/lihan/code/ohos/device/board/orangepi/aipro/test/glmark2

python ohos/build_ohos64.py /home/ubuntu/code/ohos/ aipro

  /home/ubuntu/code/ohos/glmark2_2/

glmark验证panfrost驱动

glmark2-es2-ohos --data-path /lib/glmark2/data

glmark验证成功的标志:屏幕出现白马旋转的画面。glmark验证panfrost驱动通过以后,此时系统还是cpu渲染,cpu合成,只是画面中出现的白马属于gpu渲染,cpu合成。

4、gpu渲染适配

打开gpu:

graphic_2d_feature_ace_enable_gpu = true

foundation/graphic/graphic_2d/graphic_config.gni

productdefine/common/inherit/rich.json

完成基础修改后,根据310的drm特性,部分修改如下:

       因为我们的drm驱动没有通过pci,屏蔽相关的pci校验

cke_155.png

使用gpu渲染时,需要调用fence_get_fd获取fence的fd

cke_156.png

适配成功后,系统启动后可在屏幕中进入桌面

cke_157.jpeg

cke_158.jpeg

附件:

OpenHarmony图形HDI基础适配及点屏

https://forums.openharmony.cn/forum.php?mod=viewthread&tid=807

https://gitee.com/openharmony/drivers_peripheral/blob/master/display/README_zh.md

openharmony点屏文档汇总

https://laval.csdn.net/6670ea3ff194d31df8ad6004.html?login=from_csdn

https://laval.csdn.net/6678d6ccf194d31df8b00e32.html

https://docs.openharmony.cn/pages/v4.1/zh-cn/device-dev/driver/driver-peripherals-display-vdi-des.md

https://forums.openharmony.cn/forum.php?mod=viewthread&tid=807

https://laval.csdn.net/64c7a6439a15ac690d7c7035.html?login=from_csdn

https://gitee.com/openharmony/drivers_peripheral/tree/master/display

https://blog.csdn.net/u011505004/article/details/141860691

gpu适配

https://www.bilibili.com/video/BV1Ur421M77m?spm_id_from=333.788.player.switch&vd_source=0e297ce2bce527fcd057098b5845f5c7

https://blog.51cto.com/harmonyos/6105570 

https://ost.51cto.com/posts/21612

https://ost.51cto.com/posts/26589

https://ost.51cto.com/posts/21874

https://laval.csdn.net/65ea646fdcaa10382b96e63d.html

modetest HDMI测试

https://www.cnblogs.com/zyly/p/17832856.html#_label1_1

利用pefertto分析trace方法

https://laval.csdn.net/66a09675e4c56a4bc834b71e.html

OpenHarmony下如何打印C/C++调用堆栈

https://huaweicloud.csdn.net/64dc3ddb41632a36b55445c6.html

解析定界cppcrashappfreeze的工具

https://laval.csdn.net/64a52f644b952377a23e168b.html?login=from_csdn

我要发帖子