Openharmony在显示drm panel上的实现仅仅实现了dsi接口的显示屏,这就导致了如果客户使用了非dsi的显示,例如edp,hdmi,则没有办法在openharmony上显示。目前来看openharmony基本没有新的补丁合入,所以这一块的工作量得自行完成。本文通过移植simple_panel来实现非dsi的其他驱动的panel实现。
https://gitlab2.kylin.com/sh-product-Embedded/openharmony/drivers_hdf_core
这里面有两笔提交,一笔是simple_panel的c代码提交如下:
https://gitlab2.kylin.com/sh-product-Embedded/openharmony/drivers_hdf_core/-/commit/951647792a9ca86897b3f23f5edd6bf9f82d7aa5
一笔是Makefile和Kconfig使能的提交如下:
https://gitlab2.kylin.com/sh-product-Embedded/openharmony/drivers_hdf_core/-/commit/235164e43ced1c6c8afedcb660b3b52be51b267e
我们知道,内核提供了标准的panel_simple.c的驱动,其文件如下:
drivers/gpu/drm/panel/panel-simple.c
这里我们关注非dsi的实现,如下:
static struct platform_driver panel_simple_platform_driver = { .driver = { .name = "panel-simple", .of_match_table = platform_of_match, }, .probe = panel_simple_platform_probe, .remove = panel_simple_platform_remove, .shutdown = panel_simple_platform_shutdown, };
所以根据内核标准代码,需要实现其基本功能,这里拆分成了panel_simple_common.c和hdf_drm_panel_simple.c
代码写的比较丑陋,但是我对照了基本逻辑,应该是没有大问题的。
这里panel_simple_common.c主要是panel硬件的信息设置,需要对接dts的内容,并提供了panel_simple_loader_protect函数,如下
而hdf_drm_panel_simple.c主要是对drm负责的panel注册,主要是drm_panel_init和drm_panel_add,这里也需要填充drm_panel_init所需要的回调drm_panel_funcs。如下
综上,我们可以知道,这里的只是通过hdf实现了simple_panel的驱动而已。
对于Makefile,这里如下设置
ifeq ($(CONFIG_DRIVERS_HDF_SIMPLE_PANEL), y) obj-$(CONFIG_DRIVERS_HDF_SIMPLE_PANEL) += \ $(DISPLAY_ROOT_DIR)/panel/panel_simple_common.o else obj-$(CONFIG_ARCH_ROCKCHIP) += \ $(DISPLAY_ROOT_DIR)/panel/ili9881_st_5p5.o endif
这里因为实现了两次panel_simple_loader_protect,所以代码是互斥的,所以通过内核配置CONFIG_DRIVERS_HDF_SIMPLE_PANEL将其隔开
根据上面的讲述,我们可以完成hcs的驱动移植,这里通过修改hcs来使得hcs生效,如下:
diff --git a/rk3568/hdf_config/khdf/device_info/device_info.hcs b/rk3568/hdf_config/khdf/device_info/device_info.hcs index 16b6abf..267aa13 100644 --- a/rk3568/hdf_config/khdf/device_info/device_info.hcs +++ b/rk3568/hdf_config/khdf/device_info/device_info.hcs @@ -241,7 +241,7 @@ policy = 0; priority = 197; preload = 0; - moduleName = "HDF_DRMPANEL"; + moduleName = "HDF_DRM_PANEL_SIMPLE"; } } device_hdf_disp :: device { @@ -253,7 +253,7 @@ serviceName = "hdf_disp"; } } - device_hi35xx_disp :: device { + device_hi35xx_disp :: device { device0 :: deviceNode { policy = 0; priority = 195; @@ -284,7 +284,7 @@ policy = 0; priority = 100; preload = 0; - moduleName = "LCD_ILI9881_ST_5P5"; + moduleName = "PANEL_SIMPLE_COMMON"; } } device_pwm_bl :: device {
为什么这样改,因为hcs的设定中,host是唯一的,所以display只能选择"HDF_DRM_PANEL_SIMPLE"或者"HDF_DRMPANEL"
同样的驱动LCD_ILI9881_ST_5P5和PANEL_SIMPLE_COMMON也互斥,所以只能二选一
如果对hcs生效有疑问的,可以查看文章Openharmony hcs文件编译不生效的问题