基于 NXP i.MX8QM Bumblebee 智能座舱 Varitronix 12.6 寸双屏幕 ATMEL mXT1664TD 双触摸功能调试

一. 前言

在前面的博文有介绍怎么调试 Serdes 的屏幕和触摸屏 ,这篇博文将向大家介绍怎样在 Android 平台调通双屏双触摸功能 ,并通过应用程序进行测试 ,对于单屏的调试可以参考前面的博文 《 基于 NXP i.MX8QM Bumblebee 智能座舱 Varitronix COG-PVLSZT002-01 14.8寸屏幕调试 》,单触摸屏的调试可以参考前面的博文 《基于 NXP i.MX8QM Bumblebee 智能座舱 Varitronix 14.8 寸屏幕 ATMEL mXT1665TD 触摸功能调试 》,由于只有一块 Varitronix 14.8 寸屏幕 ,我们使用两块 Varitronix 12.6 寸屏幕来做调试 ,Varitronix 14.8  和  12.6 寸屏幕分辨率一样 ,驱动可以兼容。


二. 环境搭建

2.1.  软件环境 :

使用的是 imx-automotive-10.0.0_1.1.0
lunch mek_8q-userdebug

2.2.  硬件环境 :
Bumblebee-MB_V1.0(i.MX8QM 智能座舱)Varitronix COG-PVLSZT002-01  , 1920 X 1080 , 12.6 寸的屏幕两块


                                                                         
图1 Varitronix 12.6 寸屏幕实物图


三. 双屏显示功能调试

修改 fsl-imx8qm-mek.dtsi 文件
vendor/nxp-opensource/kernel_imx/arch/arm64/boot/dts/freescale/fsl-imx8qm-mek.dtsi b/arch/arm64/boot/dts/freescale/fsl-imx8qm-mek.dtsi

@@ -1403,7 +1404,7 @@
status = "okay";

lvds-to-hdmi-bridge@4c {
- compatible = "ti,ti947";
+ compatible = "ti,ti947_1";
reg = <0x4c>;


&ldb2_phy {
@@ -1447,7 +1457,7 @@
status = "okay";

lvds-to-hdmi-bridge@4c {
- compatible = "ti,ti947";
+ compatible = "ti,ti947_2";
reg = <0x4c>;

修改 fsl-imx8qm-mek-ov5640.dts 文件
vendor/nxp-opensource/kernel_imx/arch/arm64/boot/dts/freescale/fsl-imx8qm-mek-ov5640.dts

@@ -42,11 +42,11 @@

&ldb2_phy {
- status = "disabled";
+ status = "okay";
};

&ldb2 {
- status = "disabled";
+ status = "okay";
+ fsl,dual-channel;
+ lvds-channel@0 {
+ fsl,data-mapping = "spwg";
+ fsl,data-width = <24>;

+ port@1 {
+ reg = <1>;
+ lvds1_out: endpoint {
+ remote-endpoint = <&panel_lvds1_in>;
+
};

修改 ti947.c  文件
vendor/nxp-opensource/kernel_imx/drivers/gpu/drm/bridge/ti947.c 

static const struct of_device_id ti947_dt_ids[] = {
- { .compatible = "ti,ti947", },
+ { .compatible = "ti,ti947_1", },
+ { .compatible = "ti,ti947_2", },
{ }
};


四. 双触摸功能调试

4.1 修改 Kernel 部分

修改 /drivers/input/touchscreen/atmel_mxt_ts.c 的 mxt_initialize_input_device( ) 函数
@@ -2015,7 +2025,10 @@ static int mxt_initialize_input_device(struct mxt_data *data)
  if (!input_dev)
     return -ENOMEM;

- input_dev->name = "Atmel maXTouch Touchscreen";
+ if (strcmp(data->client->name,"maxtouch")== 0)
+ input_dev->name = "Atmel maXTouch Touchscreen-01";
+ else
+ input_dev->name = "Atmel maXTouch Touchscreen-02";

input_dev->phys = data->phys; 
input_dev->id.bustype = BUS_I2C; 
input_dev->dev.parent = dev;


修改 /drivers/input/touchscreen/atmel_mxt_ts.c 的 mxt_probe( ) 函数

+#define IMX_GPIO_NR(bank, pin) (480 - (bank * 32) + (pin & 0x1f))
+#define LSIO_GPIO6_IO15 IMX_GPIO_NR(6, 15)      /* Interrupt pin */
+#define LSIO_GPIO5_IO01 IMX_GPIO_NR(5, 1)      /* Interrupt pin */
+
static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
  struct mxt_data *data;
  int error;
+ int irq_num1,irq_num2;

/*
* Ignore devices that do not have device properties attached to

   @@ -3076,6 +3105,31 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
-  snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
-     client->adapter->nr, client->addr);
+
+ irq_num1 = gpio_to_irq(LSIO_GPIO5_IO01);
+ irq_num2 = gpio_to_irq(LSIO_GPIO6_IO15);
+
+ if (strcmp( client->name,"maxtouch")== 0)
+ {
+     snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
+     client->adapter->nr, client->addr);
+
+     client->irq = irq_num1;
+     dev_err(&client->dev, " client->name :maxtouch \n");
+
+ }
+ else
+ {
+     snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input1",
+     client->adapter->nr, client->addr);
+
+     client->irq = irq_num2;
+     dev_err(&client->dev, " client->name :maxtouch_2 \n");
+ }
+
+
修改 struct of_device_id mxt_of_match[]
@@ -3193,6 +3247,7 @@ static const struct of_device_id mxt_of_match[] = {
    { .compatible = "atmel,atmel_mxt_ts", },
    { .compatible = "atmel,atmel_mxt_tp", },
    { .compatible = "atmel,mXT224", },
+  { .compatible = "atmel,maxtouch_2", },
    {},
};

4.2 修改 Frameworks 部分

上面增加的驱动部分可以让两个触摸屏都能正常工作 ,但要实现双屏异触功能就需要修改 Frameworks 部分的 EventHub.cpp。Android 现有框架中已经支持副输入设备的逻辑,只是默认将所有的外部热插拔设备统一指定为副输入设备,但如果是双 i2c 或双 usb 的搭配,系统会指定两个触摸设备都为主设备 , 我们就需要改造现有逻辑。

在 /frameworks/native/services/inputflinger/EventHub.cpp
diff --git a/services/inputflinger/EventHub.cpp b/services/inputflinger/EventHub.cpp
index ce56272..342666c 100644
--- a/services/inputflinger/EventHub.cpp
+++ b/services/inputflinger/EventHub.cpp
@@ -65,6 +65,7 @@
#define INDENT2 " "
#define INDENT3 " "

+
using android::base::StringPrintf;

namespace android {
@@ -1433,9 +1434,45 @@ status_t EventHub::openDeviceLocked(const char* devicePath) {
}

// Determine whether the device is external or internal.
+ #if 1
+ if ((device->classes & 0x04) == INPUT_DEVICE_CLASS_TOUCH)
+ {
+ int count = 0;
+ char value[PROPERTY_VALUE_MAX]={0};
+ char flag[10][PROPERTY_VALUE_MAX];
+
+ property_get("ro.input.external",value,"0");
+
+ if (isExternalDeviceLocked(device))
+ {
+ sprintf(flag[count++],"%4d:%4d",identifier.vendor,identifier.product);
+ }
+ else
+ {
+ //sprintf(flag[count++],"%s",device->identifier.name.string());
+ sprintf(flag[count++],"%s",device->identifier.name.c_str());
+ }
+
+
+ for(int i=0;i<count;i++)
+ {
+ ALOGI("=== opendevicelocked value:%s flag:%s ===",value,flag[i]);
+ if(!strcmp(flag[i],"Atmel maXTouch Touchscreen-02"))
+ {
+   device->classes |= INPUT_DEVICE_CLASS_EXTERNAL;
+   ALOGI("=== opendevicelocked flag:%s is INPUT_DEVICE_CLASS_EXTERNAL ===",flag[i]);
+ }
+ }
+ }
+ else{
+ device->classes |= INPUT_DEVICE_CLASS_EXTERNAL;
+ }
+
+ #else
   if (isExternalDeviceLocked(device)) {
      device->classes |= INPUT_DEVICE_CLASS_EXTERNAL;
}
+ #endif


调试双屏异触功能 ,现有的 Android 框架中已经支持副输入设备的逻辑,只是默认将所有的外部热插拔设备统一指定为副输入设备,但如果是双 i2c 或双 usb 的搭配,系统会指定两个触摸设备都为主设备 , 我们就需要改造现有逻辑 ,把一路触摸设备指定为主设备 ,另一路设备指定为副设备 ,通过这篇博文 ,相信大家已经了解了怎么调试双屏异触功能。


五. 使用 APP 测试双屏双触摸功能

通过 getevent 命令查看到 event2 和 event3 device 已经生成


                                     
图2  getevent 命令

通过画图 APP 可以查看到能够分别对双屏进行控制


                                                        
图3 触摸屏双屏测试结果


六. 参考资料

【1】 mXT1664TD-AT/MXT1664TD-AB 1.0   DS40002101A    2019 Microchip Technology Inc.
【2】 DS90UB947-q1.pdf  SNLS454A –NOVEMBER 2014–REVISED MARCH 2019
【3】 DS90UB948-q1.pdf  ZHCSEN7A –OCTOBER 2014–REVISED JANUARY 2016

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论