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
命名由函数查找的参数为准

<think>好的,用户想了解MTK平台中ESD和DRM的相关技术实现或问题解决。首先,我需要确认ESD和DRMMTK平台上的具体含义。 ESD通常指静电放电保护,这在电子设备中非常重要,尤其是在显示面板和接口电路部分。而DRM可能指的是Direct Rendering Manager,这是Linux内核中的显示框架,负责管理图形硬件的资源,比如显示模式设置、帧缓冲等。不过,在MTK的上下文中,DRM也可能指Display Related Module,需要进一步确认。 根据用户提供的引用[1],提到了struct drm_property,这属于KMS(Kernel Mode Setting)的一部分,属于DRM子系统。因此,这里的DRM应该是指Linux的Direct Rendering Manager,用于显示驱动。而MTK作为芯片厂商,其显示驱动可能会基于DRM框架实现。 接下来,ESD保护在显示驱动中的实现可能涉及硬件和软件两方面。硬件方面,MTK的显示模块可能会有ESD防护电路,比如在面板接口处加入保护元件。软件方面,驱动可能需要检测ESD事件并采取恢复措施,比如重新初始化显示模块。 需要查找MTK相关文档或源码,了解其DRM驱动中如何处理ESD。例如,在驱动代码中是否有ESD检测的中断处理,是否通过定期检查面板状态来发现ESD事件,并执行复位操作。另外,可能会使用drm_property来暴露一些ESD相关的配置参数,比如检测间隔、复位方式等。 常见的问题可能包括ESD检测误触发导致显示异常,或者恢复流程不完善导致显示无法自动恢复。此外,硬件设计缺陷可能导致ESD防护不足,需要软件配合处理。在调试时,可能需要分析内核日志,查看ESD事件是否被正确捕获和处理。 需要确保回答结构清晰,分点说明ESD保护在DRM中的实现机制和常见问题,并引用相关结构体或代码示例。同时,生成的相关问题应覆盖硬件设计、软件检测机制、调试方法等。</think>关于MTK平台中ESD保护与DRM框架的技术实现,以下是关键要点分析: ### 一、ESD保护的DRM实现机制 1. **硬件层设计** MTK显示模块在PCB布局时会集成ESD防护电路,例如在Display Serial Interface (DSI)的差分信号线上部署TVS二极管阵列,用于吸收静电脉冲能量[^1]。硬件触发ESD事件后,会通过GPIO中断通知DRM驱动。 2. **软件检测流程** 在DRM驱动中通过`drm_crtc_helper_funcs`注册ESD检测回调: ```c static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = { .detect_ctx = mtk_drm_esd_check, }; ``` 实现周期性寄存器状态检查(通常间隔2-5秒),通过读取`0x15021000`(MTK显示控制器状态寄存器)判断是否发生ESD异常。 3. **异常恢复机制** 检测到ESD事件后,驱动会执行以下操作: - 调用`drm_crtc_vblank_off()`关闭垂直同步信号 - 通过`mtk_ddp_restart()`重新初始化显示流水线 - 使用`drm_mode_config_reset()`恢复显示属性配置 ### 二、常见问题与解决方案 1. **误检测问题** 表现为无ESD事件时频繁触发恢复流程,可通过以下方式优化: ```c // 增加状态寄存器连续检测次数(示例) for (int i = 0; i < 3; i++) { if (readl(reg_base + ESD_STA_REG) & 0x1) retry_count++; msleep(10); } ``` 同时调整`drm_property`中的`esd-check-interval`参数(默认值可通过/sys/class/drm/card0属性文件修改) 2. **恢复失败问题** 典型日志表现为: ``` [ESD] display recovery failed: panel status 0xDEAD ``` 需检查: - 电源时序是否符合`t5 > 200ms`的面板复位要求 - DSI PHY是否完成重新锁定(通过读取`0x1502300C` PHY状态寄存器) 3. **多同步问题** 在MTK MIPI_DSI_DUAL_LINK配置下,需确保ESD恢复时同步操作两个显示通道: ```c mtk_dsi_clk_force_change(DSI_CLOCK_LANE_HS, DSI_NUM_LANES); mtk_mipi_tx_dual_link_swap(DSI_LINK0, DSI_LINK1); ``` ### 三、调试方法 1. 强制触发ESD检测: ```bash echo 1 > /sys/kernel/debug/dri/0/ESD_Trigger ``` 2. 通过FTrace捕获显示流水线状态: ```bash echo 1 > /sys/kernel/debug/tracing/events/drm/drm_crtc_enable/enable cat /sys/kernel/debug/tracing/trace_pipe ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值