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

一. 前言

在前面的博文 《 基于 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

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論