基于I2C协议的ilitek_2130触控芯片调试记录

背景介绍:需要在Sigmastar平台下适配电容触控屏,该电容触控屏集成了ilitek_2130触控芯片。采用I2C协议与主控芯片通讯。

        从官网ilitek下载源码,并将源码拷贝到内核触控屏驱动路径下。Linux触控驱动采用设备-总线-驱动模型。

(1)先将驱动编译进内核

先查看Makefile和Kconfig将触控驱动编译进内核中。如果成功编译在终端中查看如下目录下将会有驱动目录

(2)配置设备树将驱动与设备匹配起来

查看驱动的of_match_table 如下:

在设备树中配置compatible属性

驱动和设备匹配成功后,内核打印消息中将会有该驱动probe函数的打印消息。

(3)调试驱动源码

        驱动与设备匹配后,测试驱动功能是否正常。如果不正常,根据内核打印消息调试驱动源码。在本次示例中,驱动执行后,将会从设备树获取所需要中断GPIO和复位GPIO。

        在成功获取到复位GPIO和中断GPIO后,无异常报错,驱动初始化完成。

        开始测试触控,触控时驱动报错:数据校验错误。通过示波器和逻辑分析仪测数据包。下图为I2C总线抓取的波形,同时包含了逻辑分析仪分析的I2C总线数据。

        波形介绍:绿色为中断线,蓝色为时钟线,黄色为数据线。触摸屏幕后,触控IC会拉低中断线,主控芯片检测到中断线被拉低后,随后开启I2C数据通讯。如上波形INT线被拉低后,大约30us后,I2C总线开始有数据。

总线数据分析:

起始位:当SCL为高电平时,SDA由高变低表示起始信号。如图中start标识。

停止位:当SCL为低电平时,SDA由低变高表示停止信号。

数据位:I2C总线通信时每个字节为8位长度,数据传送时,先传送最高位,后传送低位,发送器发送完一个字节数据后接收器必须发送1位低电平的应答位来回应发送器,即一帧共有9位。

        图示第一字节为1000 0011。主机在发送起始信号后必须先发送一个字节的数据。该数据的高7位为从机地址,最低位表示后续字节的传送方向,‘0’表示主机发送数据给从机,‘1’表示从机发送数据给主机。根据图示前七位100 0001为41,最后一位为1。表示主机寻址地址为41的设备,并向该设备发起读取请求。

经与触控IC的数据手册对比后发现:触控IC能够正常发数据,同时I2C总线数据也是正常。但主控芯片在读取I2C数据的时候丢失了48个字节之后的数据。而触控IC的协议帧中,一帧数据为64个字节,第64位数据正是校验位。因此出现数据校验不过的问题。

查看驱动源码后发现,其使用的I2C读取函数是Linux标准I2C通信接口。

        怀疑是I2C主控制器驱动出现问题。将触控驱动代码的I2C读取逻辑抽离单独编译到镜像后,仍然是同样的问题,排除了触控驱动的问题后认定是芯片I2C主控制器驱动的问题。随后联系厂商技术支持给出解决方案后合入,I2C数据读取正常,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值