一.兼容原理
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
命名由函数查找的参数为准