mtk基于drm屏兼容流程

一.兼容原理
lk阶段屏驱动通过compare_id函数来得到具体屏的drv,通过查找屏drv的顺序,将屏drv的顺序号通过fdt相关函数去操作kernel panel dts,指定kernel用识别到的那个panel

在这里插入图片描述

二.流程介绍
lk阶段屏框架依然是跟以前的一样,如下图
在这里插入图片描述

lk阶段兼容屏依然是用compare_id这个函数去读屏ID,如果读到了就ID就返回1,没读到就返回0,重点在lk阶段怎么通知kernel,因为这部分与以前不一样,kernel屏框架换成了drm框架

先来看下调用流程

流程一
disp_init -> primary_display_lcm_probe -> disp_lcm_probe

在这里插入图片描述
主要实现在图上这部分
_lcm_count(),表示填在mk里面屏的数量,填了1个就是1,填了2个就是2
在这里插入图片描述

这段if的判断,意思是当mk里面没有填屏的name时,则直接返回NULL,如果填了一个就不用走兼容部分,直接将屏列表里面的填写的那个赋值给lcm_drv,如果填了二个,就判断传进来的屏name是否为NULL,如果不为空,则遍历屏列表,找到传进来的屏name在屏列表的顺序号,并且将顺序号传递出去。

如果填了二个,并且传进来的屏name是NULL,则通compare_id函数来找到对应的屏

通过这一步,得到了实际对应屏的lcm_drv,这里也有一个disp_lcm_set_dts_panel_index,但是实际上会被后面的操作覆盖,不是以这里的为准

流程二
disp_sw_init -> primary_display_lcm_probe -> disp_lcm_probe
在流程一走完之后,马上就会走流程二,在流程一里面得到了对应屏lcm_drv,所以disp_sw_init里面会将屏name传过去
在这里插入图片描述

最终依然是调用到了下面这个地方,找到对应屏的顺序号,将其传递过去

在这里插入图片描述

主要看disp_lcm_fill_lcm_dts_phandle实现
在这里插入图片描述
在这里插入图片描述

通过fdt_path_offset得到"/soc/dsi/panel%d/port/endpoint"这组endpoint,而panel的顺序
就是通过primary_display_get_panel_index得到

在这里插入图片描述

获取ports里面endpoint,将前面panel里面endpoint写到ports里面,其实意思就是
将上面获取的panel_in1写到dsi_out这一栏里面,因为kernel指定走那个屏,取决于
dsi_out里面panel是哪一个

在这里插入图片描述

这里有个很关键的点,就是panel的顺序要跟lk里面primary_display_get_panel_index获取到的对应,那样lk才能正确的找到kernel里面对应的屏

对应方法
mt65xx_lcm_list.c
在这里插入图片描述

填在最前面的屏最先初始化,比如td4330_fhdp_dsi_cmd_auo_rt5081在最前面,dts里面
td4330这一组配置要配在panel1下面才能对应

同理nt51021_fhdp_dsi_cmd_auo对应panel2
在这里插入图片描述

三.兼容方法
比如要兼容2款屏,先确保2款屏单独点能亮

1.分别实现lk阶段屏驱动里面compare_id,读ID寄存器问屏fae

2.在LCM_DRIVER *lcm_driver_list里面按与kernel dts对应的顺序填好屏drv,方法如上面
讲述过的那种

3.kernel里面配置好兼容的款屏,dsi_out里面填常用的那块屏,不用刻意去对应,对应关系lk去做了

在这里插入图片描述
在这里插入图片描述

4.lk mk,kernel config分别添加对应屏,如下参考

mk
MTK_LCM_LIST_SUPPORT=“nt51021_fhdp_dsi_cmd_auo td4330_fhdp_dsi_cmd_auo_rt5081”

config
CONFIG_DRM_PANEL_AUO_NT51021_VDO=m
CONFIG_DRM_PANEL_TRULY_TD4330_CMD=m

四.相关文件路径
vendor/mediatek/proprietary/bootable/bootloader/lk2/platform/mediatek/mt6789/platform.c
vendor/mediatek/proprietary/bootable/bootloader/lk2/platform/mediatek/mt6789/disp/mt_disp_drv.c
vendor/mediatek/proprietary/bootable/bootloader/lk2/platform/mediatek/mt6789/disp/primary_display.c
vendor/mediatek/proprietary/bootable/bootloader/lk2/platform/mediatek/mt6789/disp/disp_lcm.c
kernel-5.10/drivers/gpu/drm/mediatek/mediatek_v2/mtk_dsi.c
kernel-5.10/drivers/gpu/drm/panel/


更新兼容屏幕记录

最近需要更新兼容两款屏触一体的屏幕,平台为mt6789
更新优化兼容流程
1、兼容屏幕首先硬件配置能直接移植的话,dts应该要有配置,然后要确定pin to pin可以,比如这次有一个tpRST引脚没有拉高导致无法点亮

            <gpio152>
                <eint_mode>false</eint_mode>
                <def_mode>0</def_mode>
                <inpull_en>true</inpull_en>
                <inpull_selhigh>false</inpull_selhigh>
                <def_dir>OUT</def_dir>
-                <out_high>false</out_high>
+                <out_high>true</out_high>
                <varName0>GPIO_CTP_RST_PIN</varName0>
                <smt>true</smt>
                <ies>true</ies>
            </gpio152>

路径:
vendor/mediatek/proprietary/tools/dct/dws/mt6789/k6789v1_64.dws
vendor/mediatek/proprietary/custom/k6789v1_64/kernel/dct/dct/codegen.dws
vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/k6789v1_64/dct/dct/codegen.dws

硬件确定对比了下 就4pin ,看原理图是tp的供电
在这里插入图片描述
在这里插入图片描述
所以需要把tp的RST拉高就能点亮了

1、kernel阶段

dts里面要先设置
kernel-5.10/arch/arm64/boot/dts/mediatek/k6789v1_64.dts

        #address-cells = <1>;
        #size-cells = <0>;
        panel1@0 {
-               compatible = "focaltech,ft8057p,vdo";
+               compatible = "inx,td4160,vdo";
                reg = <0>;
                _1v8-gpios = <&pio 34 0>;
                reset-gpios = <&pio 85 0>;
@@ -148,6 +148,22 @@
                        };
                };
        };
+
+       panel2@1 {
+               compatible = "focaltech,ft8057p,vdo";
+               reg = <1>;
+               _1v8-gpios = <&pio 34 0>;
+               reset-gpios = <&pio 85 0>;
+               /*gate-ic = <4831>;*/
+               bias-gpios = <&pio 158 0>,
+                       <&pio 159 0>;
+               pinctrl-names = "default";
+               port {
+                       panel_in2: endpoint {
+                               remote-endpoint = <&dsi_out>;
+                       };
+               };
+       };

deconfig也要加入驱动编译
kernel-5.10/arch/arm64/configs/mgk_64_k510_defconfig

 CONFIG_DRM_PANEL_FOCALTECH_FT8057P_VDO=m
+CONFIG_DRM_PANEL_INX_TD4160_VDO=m

kernel-5.10/drivers/gpu/drm/panel/Makefile

 obj-$(CONFIG_DRM_PANEL_BOE_HX8279D_VDO) += panel-hx8279d-boe-vdo.o
+obj-$(CONFIG_DRM_PANEL_INX_TD4160_VDO) += panel-inx-td4160-vdo-txd.o

kernel-5.10/drivers/gpu/drm/panel/Kconfig具体是为什么还在看

+config DRM_PANEL_INX_TD4160_VDO
+       tristate "td4160 boe vdo mode panel"
+       depends on OF
+       depends on DRM_MIPI_DSI
+       depends on BACKLIGHT_CLASS_DEVICE
+       help
+         Say Y here if you want to enable support for td4160 DPHY
+         vdo mode HD Plus 1600 panel. The panel has a 720x1612
+         resolution and uses 24-bits RGB per pixel. It provides a
+         MIPI DSI interface to host.

lk阶段

驱动的mk要加入
vendor/mediatek/proprietary/bootable/bootloader/lk2/project/k6789v1_64.mk

 MTK_LCM_COMMON_DRIVER_SUPPORT := no
-MTK_LCM_LIST_SUPPORT="ft8057p_hdplus1600_dsi_vdo_ocp2131"
+MTK_LCM_LIST_SUPPORT="td4160_hdp_dsi_vdo_inx_txd ft8057p_hdplus1600_dsi_vdo_ocp2131"
 MTK_LCM_PHYSICAL_ROTATION = 0
 MTK_RT4831A_SUPPORT = 1
 MTK_SECURITY_SW_SUPPORT := yes

vendor/mediatek/proprietary/bootable/bootloader/lk2/dev/lcm/include/lcm_drv.h 如上所说需要加入

+extern LCM_DRIVER td4160_hdp_dsi_vdo_inx_txd_lcm_drv;
 extern LCM_DRIVER ft8057p_hdplus1600_dsi_vdo_ocp2131_lcm_drv;

vendor/mediatek/proprietary/bootable/bootloader/lk2/dev/lcm/mt65xx_lcm_list.c

 // tydtech.drv 20240524 hejl add start
+#if defined(TD4160_HDP_DSI_VDO_INX_TXD)
+    &td4160_hdp_dsi_vdo_inx_txd_lcm_drv,
+#endif

vendor/mediatek/proprietary/bootable/bootloader/lk2/dev/lcm/td4160_hdp_dsi_vdo_inx_txd/rules.mk lk的mk

@@ -0,0 +1,7 @@
+LOCAL_DIR := $(GET_LOCAL_DIR)
+
+MODULE := $(LOCAL_DIR)
+
+MODULE_SRCS += $(LOCAL_DIR)/td4160_hdp_dsi_vdo_inx_txd.c
+
+include make/module.mk

然后最后就是这两款屏kernel和lk的驱动
vendor/mediatek/proprietary/bootable/bootloader/lk2/dev/lcm/td4160_hdp_dsi_vdo_inx_txd/td4160_hdp_dsi_vdo_inx_txd.c
kernel-5.10/drivers/gpu/drm/panel/panel-inx-td4160-vdo-txd.c

调试tp
兼容步骤基本是一样的

mk添加

+MTK_TOUCHPANEL_FIRMWARE = omnivision_tcm focaltech_touch_ft8057p
+MTK_TOUCH_KO = omnivision_tcm focaltech_touch_ft8057p

dts添加

-       focaltech@0 {
-               compatible = "focaltech,fts";
+       omnivision_tcm@0 {
+               compatible = "omnivision,tcm-spi";
+               tpd-max-touch-num=<10>;
+               use-tpd-button=<0>;
                reg = <0>;
+               spi-max-frequency = <3000000>;
+               interrupt-parent = <&pio>;
+               interrupts = <9 IRQ_TYPE_EDGE_FALLING 9 0>;
+               //vdd-supply = <&pm8994_lvs2>;
+               //avdd-supply = <&pm8994_l22>;
+               //pinctrl-names = "pmx_ts_active", "pmx_ts_suspend";
+               //pinctrl-0 = <&ts_active>;
+               //pinctrl-1 = <&ts_suspend>;
+               //omnivision,bus-reg-name = "vdd";
+               //omnivision,pwr-reg-name = "avdd";
+               omnivision,irq-gpio = <&pio 9 0x02>; /* IRQF_ONESHOT | IRQF_TRIGGER_LOW */
+               omnivision,irq-on-state = <0>;
+               omnivision,reset-gpio = <&pio 152 0x01>;
+               omnivision,reset-on-state = <0>;
+               omnivision,reset-active-ms = <20>;
+               omnivision,reset-delay-ms = <200>;
+               omnivision,power-delay-ms = <200>;
+               omnivision,spi-mode = <3>;
+               omnivision,byte-delay-us = <0>;
+               omnivision,block-delay-us = <0>;
+               omnivision,ubl-max-freq = <3000000>;
+               omnivision,ubl-byte-delay-us = <20>;
+               //omnivision,display-reset-gpio = <&msm_gpio 78 0>;
+               status = "okay";
+       };
+
+       focaltech@1 {
+               compatible = "focaltech,fts";
+               reg = <1>;
                spi-max-frequency = <4000000>;
                interrupt-parent = <&pio>;
                interrupts = <9 IRQ_TYPE_EDGE_FALLING 9 0>;

除了这些地方,兼容还有一处修改需要添加
在这里插入图片描述
添加后,可以兼容(原因 …)
tp会用到固件,编译路径为
vendor/mediatek/proprietary/custom/touch/omnivision_tcm/hdl_firmware.img
命名由函数查找的参数为准

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值