一. 前言
在前面的博文 《 基于 NXP i.MX8QM Bumblebee 智能座舱 Varitronix COG-PVLSZT002-01 14.8寸屏幕调试 》 有介绍调试 Varitronix LVDS 1920X1080 14.8 寸屏幕的过程 ,
这篇博文是向大家介绍如果通过 Serdes 的方式来调试触摸屏
二. 触摸屏幕软硬件环境
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 , 14.8 寸的屏幕
图1 Varitronix 14.8 寸屏幕实物图
三. 触摸屏数据流程介绍
图2 触摸屏流程图
Touch Panel 把触摸数据传递给 Atmel mXT1665 芯片 ,mXT1665 芯片在接收到数据后把 CHG PIN 拉低 ,DS90UB948 接收到 CHG PIN 的状态 ,
并把 CHG PIN 的状态映射到 DS90UB947 ,DS90UB947 通过 IO 口连接到 i.MX8QM , i.MX8QM 在接收到有数据信息后通过 I2C 总线开始读取
mXT1665 的数据 ,并把数据上报给系统进行处理
四. Serdes 参数配置
4.1 DS90UB948 参数配置
图3 触摸屏连接图
从上图我们可以了解到 mXT1665 CHG PIN 连接到了 DS90UB948 的 D_GPIO0 ,需要把 D_GPIO0 设置为输入
图4 0x1D 寄存器设置
图5 0x34 寄存器设置
通过上面的参数说明 ,要设置 0x1D ,首先需要 Enable PORT1_SEL ,PORT1_SEL 对应的寄存器为 0X34 ,DS90UB948 对应的参数设置如下 :
4.2 DS90UB947 参数配置
接下来我们开始设置 DS90UB947 GPIO0 ,把 DS90UB948 D_GPIO0 的状态映射到 DS90UB947 GPIO0 ,DS90UB947 GPIO0 作为输出脚 ,把当前状态输出给 i.MX8QM
图6 0x13寄存器设置
图7 0x30 寄存器设置
在前面的博文 《 基于 NXP i.MX8QM Bumblebee 智能座舱 Varitronix COG-PVLSZT002-01 14.8寸屏幕调试 》 有介绍调试 Varitronix LVDS 1920X1080 14.8 寸屏幕的过程 ,
这篇博文是向大家介绍如果通过 Serdes 的方式来调试触摸屏
二. 触摸屏幕软硬件环境
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 , 14.8 寸的屏幕
图1 Varitronix 14.8 寸屏幕实物图
三. 触摸屏数据流程介绍
图2 触摸屏流程图
Touch Panel 把触摸数据传递给 Atmel mXT1665 芯片 ,mXT1665 芯片在接收到数据后把 CHG PIN 拉低 ,DS90UB948 接收到 CHG PIN 的状态 ,
并把 CHG PIN 的状态映射到 DS90UB947 ,DS90UB947 通过 IO 口连接到 i.MX8QM , i.MX8QM 在接收到有数据信息后通过 I2C 总线开始读取
mXT1665 的数据 ,并把数据上报给系统进行处理
四. Serdes 参数配置
4.1 DS90UB948 参数配置
图3 触摸屏连接图
从上图我们可以了解到 mXT1665 CHG PIN 连接到了 DS90UB948 的 D_GPIO0 ,需要把 D_GPIO0 设置为输入
图4 0x1D 寄存器设置
图5 0x34 寄存器设置
通过上面的参数说明 ,要设置 0x1D ,首先需要 Enable PORT1_SEL ,PORT1_SEL 对应的寄存器为 0X34 ,DS90UB948 对应的参数设置如下 :
struct ti948_config ti948_para[] = { {0x03, 0x78}, {0x05, 0x1e}, {0x34, 0x03}, {0x1d, 0x03}, {0x1e, 0x99}, {0x1f, 0x09}, {0x20, 0x59}, {0x21, 0x55}, {0x23, 0x30}, {0x26, 0x15}, {0x27, 0x15}, {0x43, 0x03}, {0x64, 0x70}, {0x65, 0x04}, {0x66, 0x03}, {0x67, 0x02}, }; |
4.2 DS90UB947 参数配置
接下来我们开始设置 DS90UB947 GPIO0 ,把 DS90UB948 D_GPIO0 的状态映射到 DS90UB947 GPIO0 ,DS90UB947 GPIO0 作为输出脚 ,把当前状态输出给 i.MX8QM
图6 0x13寄存器设置
图7 0x30 寄存器设置
通过上图我们了解到 GPIO0 对应的设置寄存器为 0x0D ,要操作 GPIO0 需要先 Enable PORT1_SEL ,PORT1_SEL 对应的寄存器为 0x1E,在 Enable PORT1_SEL 后发现初始化 0x1E 值为 0x01 ,读出来 0x1E 得值却一直为 0x01 ,通过测试发现 0x1E 写入失败跟 0x5B 的 DUAL MODE 有关系
图8 0x5B 寄存器设置
0x5B 设置为 0x23 ,就可以成功写入 0x1E 的值 ,但是会出现 DS90UB948 ID 无法读取 ,导致后面初始化 DS90UB948 失败
0x5B 设置为 0x21 ,可以读到 DS90UB948 ID ,但是会导致 0x1E 的值写入失败 ,如何解决这个矛盾 ?
通过测试发现先初始化 0x5B 设置为 0x21 ,把前面的初始化完成后,接着写入 0x5B 设置为 0x23 就可以解决上面的矛盾
DS90UB947 对应的参数设置如下 :
struct STi947_config ti947_para[] = { {0x03, 0x9a}, {0x05, 0x04}, {0x1e, 0x02}, {0x07, 0x32}, {0x08, 0x32}, {0x0d, 0x05}, {0x0e, 0x73}, {0x0f, 0x07}, {0x10, 0x33}, {0x11, 0x33}, {0x12, 0x00}, {0x14, 0x04}, {0x17, 0x1e}, {0x30, 0x00}, {0x4f, 0x8c}, {0x54, 0x00}, {0x56, 0x00}, {0x5b, 0x21}, {0x5c, 0x67}, {0x64, 0x70}, {0x65, 0x04}, {0x66, 0x03}, {0x67, 0x02}, {0x6e, 0x20}, {0x70, 0x30}, {0x77, 0x30}, {0x71, 0x94}, {0x78, 0x94}, {0x72, 0x96}, {0x79, 0x96}, {0x73, 0x90}, {0x7a, 0x90}, {0x5b, 0x23}, {0x1e, 0x02}, }; |
五. mXT1665 驱动加载
5.1 加载驱动程序
在 vendor\nxp-opensource\kernel_imx\drivers\input\touchscreen 目录下已经带有 mXT665 的驱动 :atmel_mxt_ts.c
通过查看 Makefile 文件 ,需要打卡定义 CONFIG_TOUCHSCREEN_ATMEL_MXT
5.2 设置触摸屏中断脚
mXT1665 的中断脚 CHG 接到 TI948 的 D-GPIO0 ,TI948 映射到 TI947 的 GPIO0 输出到 i.MX8 的 GPIO5_IO01 脚 ,接下来对中断脚进行设置 :
static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mxt_data *data; int error; + int irq_num; /* * Ignore devices that do not have device properties attached to @@ -3076,7 +3105,30 @@ 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_num = gpio_to_irq(LSIO_GPIO5_IO01); + + client->irq = irq_num ; + dev_err(&client->dev, " client->name :maxtouch \n"); data->client = client; |
六. 触摸功能测试
输入 getevent 命令 ,触摸屏幕查看测试结果
图9 getevent 命令
这个触摸屏是通过 Serdes 进行控制的 ,首先要了解触摸屏的数据控制流程 ,打通 TI947 ,TI948 和 mXT1665 之间的通信及中断口的映射 ,接着是加载驱动程序 ,mXT1665 的驱动程序在 SDK 里面已经默认就有了 ,我们只需对中断信号进行设置 ,测试部分 ,我们通过 getevent ,命令查看上报的位置数据 ,通过这篇博文 ,相信大家已经了解了怎么通过 Serdes 的方式调试 mXT1665 触摸屏。
七. 参考资料
【1】MXT1665TD-AT/MXT1665TD-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
評論