一. 前言
在前面的博文有介绍怎么调试 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
修改 fsl-imx8qm-mek-ov5640.dts 文件
vendor/nxp-opensource/kernel_imx/arch/arm64/boot/dts/freescale/fsl-imx8qm-mek-ov5640.dts
修改 ti947.c 文件
vendor/nxp-opensource/kernel_imx/drivers/gpu/drm/bridge/ti947.c
四. 双触摸功能调试
4.1 修改 Kernel 部分
修改 /drivers/input/touchscreen/atmel_mxt_ts.c 的 mxt_initialize_input_device( ) 函数
修改 /drivers/input/touchscreen/atmel_mxt_ts.c 的 mxt_probe( ) 函数
在前面的博文有介绍怎么调试 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
评论