[RK-Linux] RK3562 I2C驱动TP芯片GSL3680

TP芯片GSL3680详解

TP芯片GSL3680

1、简介

GSL3680是一款电容屏多点触摸控制单芯片,其芯片内部框架图如下所示:

在这里插入图片描述

GSL3680采用了独特的互电容感应技术,可以在1ms内测量多达192个节点,支持广泛的传感器选择,包括单层或双层ITO,玻璃或薄膜,采用了先进的抗电磁干扰信号处理技术,使其对各种干扰,包括LCD、RF、电源以及环境完全免疫,芯片内部配备了功能强大的32bit的RISC CPU,可以准确地计算高达10个手指触摸的区域大小和触摸中心,实现零延迟的手指跟踪。

2、操作细节

2.1 芯片上电复位

GSL3680由单电源进行供电,范围是2.6V~3.3V,芯片内部具有上电复位(POR)电路,上电后,GSL3680在5毫秒内进入正常工作模式,为了使POR正常工作,VDD必须下降到1.6V以下,另外,GSL3680还具有一个RESET引脚,该引脚拉低至少100ns,芯片回到复位状态,释放RESET后,芯片在5毫秒内进入正常工作模式,RESET引脚内部具有上拉电阻,可以处于悬空状态。

GSL3680经历一个上电复位后,便通过IRQ引脚向主机发出中断信号,中断标志表明是上电复位消息,该功能可以用于检测任何意外断电突破事件,允许主机采取任何必要的措施,例如:重新配置GSL3680芯片内部寄存器。

软件复位命令可以用来通过I2C复位芯片,软件复位仅需要1毫秒,软件复位或RESET引脚复

<think>我们正在解决RK3566 Android12触摸屏驱动I2C通信错误(-6或-110)的问题。根据之前的讨论,我们知道I2C错误通常与硬件连接、电源、复位信号或时序有关。结合引用[1]中提到的电平转换问题,我们也要考虑RK3566的I2C电平是否与触摸屏芯片的电平匹配。 解决方案步骤: 1. **检查硬件连接和电平兼容性** - RK3566的I2C接口通常为1.8V电平,而触摸屏芯片可能是3.3V或更高。如果触摸屏芯片是5V电平,则需要像引用[1]中那样使用电平转换芯片(如TXS0108E)进行转换。 - 使用万用表测量I2C总线的电压,确保SCL和SDA线上的电压在预期范围内(1.8V或3.3V)。 - 检查触摸屏的电源(VDD)和复位(RESET)引脚是否正常。复位引脚通常需要在上电后延时一段时间再拉高。 2. **检查I2C总线状态** - 使用以下命令检查I2C总线是否识别到触摸屏设备的地址: ```bash adb shell cat /sys/kernel/debug/i2c/i2c-X/device-status # X为I2C总线编号 ``` 或者使用i2c-tools工具: ```bash adb shell i2cdetect -y X # X为I2C总线编号(如0,1,2...) ``` 如果设备地址没有被检测到,则可能是硬件连接问题或设备未上电。 3. **调整设备树(DTS)配置** - I2C通信错误有时是由于时钟频率(SCL)设置过高引起的。尝试降低I2C总线速度,在设备树中修改触摸屏对应的I2C节点,例如将时钟频率从400kHz降低到100kHz: ```dts &i2c3 { status = "okay"; clock-frequency = <100000>; // 修改为100kHz silead_ts: touchscreen@48 { compatible = "silead,gsl3680"; reg = <0x48>; // ... 其他配置 }; }; ``` - 确保设备树中配置的触摸屏I2C地址与实际硬件一致(通常为0x48或0x40)。 4. **检查电源管理和复位时序** - 在设备树中配置正确的电源和复位GPIO,并确保复位时序满足触摸屏芯片的要求。例如,复位信号需要在电源稳定后延迟一段时间再释放(拉高): ```dts &silead_ts { vdd-supply = <&vcc3v3_touch>; // 指向正确的电源调节器 reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; // 复位GPIO power-off-in-suspend; // 复位时序配置(如果需要) reset-delay-ms = <20>; // 复位持续时间(低电平有效) post-reset-delay-ms = <50>; // 复位释放后的延迟 }; ``` - 使用示波器检查复位信号和电源的上电时序是否符合规格书要求。 5. **驱动调试和日志分析** - 增加内核调试日志,重新编译驱动模块(如果驱动是模块化的): 在驱动代码中,找到I2C通信相关的函数(如`silead_ts_i2c_read`),在错误返回处打印更多信息: ```c if (ret != expected_len) { dev_err(&client->dev, "I2C read error: ret=%d, expected=%d\n", ret, expected_len); return -EIO; } ``` - 使用dmesg查看详细错误: ```bash adb shell dmesg | grep -i "silead\|i2c" ``` 6. **SELinux权限问题** - 虽然I2C错误通常与硬件相关,但也要确保SELinux没有阻止驱动访问I2C总线。检查avc拒绝日志: ```bash adb shell dmesg | grep avc ``` 如果有相关拒绝,添加SELinux规则。 7. **更换硬件或固件** - 如果以上步骤无效,尝试更换触摸屏模块或固件文件(silead_ts.fw),因为固件错误也可能导致I2C通信异常。 注意事项: - 错误码-6(ENXIO)通常表示设备地址无响应(检查地址和连接)。 - 错误码-110(ETIMEDOUT)表示超时(检查SCL/SDA线是否被拉低,可能是总线被占用或设备忙)。 如果问题仍然存在,可能需要硬件工程师协助用示波器检查I2C波形。 相关问题: 1. 如何修改RK3566 Android12的设备树(DTS)并重新编译内核? 2. RK3566的I2C总线编号如何确定? 3. 如何为RK3566平台的内核驱动添加调试日志? 4. Android12 SELinux策略如何修改以允许I2C设备访问? 5. 如何获取RK3566触摸屏的复位时序要求?</think>### RK3566 Android12 触摸屏驱动 I2C 通信错误(-6/-110)解决方案 #### 1. **硬件电平兼容性检查**(首要步骤) - **问题分析**:RK3566的I2C接口为**1.8V电平**,而触摸屏芯片(如Silead)可能要求**3.3V/5V电平**,电平不匹配会导致通信失败[^1]。 - **解决方案**: 1. 使用万用表测量触摸屏芯片的供电电压(VDD)和I2C信号线电压 2. 若电平不匹配,添加电平转换电路: - 推荐芯片:`TXS0108E`(双向1.8V↔3.3V)或`MAX3390E`(1.8V↔5V)[^1] - 电路连接示例: ``` RK3566_I2C_SCL → TXS0108E(A侧) → TXS0108E(B侧) → Touch_SCL RK3566_I2C_SDA → TXS0108E(A侧) → TXS0108E(B侧) → Touch_SDA ``` #### 2. **电源与复位信号调试** - **关键检查点**: - **供电稳定性**:触摸屏的VDD电压波动需<±5% - **复位时序**:复位信号(RESET)需满足芯片规格的时序要求 - **调试命令**: ```bash # 检查复位GPIO状态(需root) adb shell cat /sys/class/gpio/gpioXX/value # XX为复位引脚编号 # 测量电源纹波(示波器操作) 1. 探头连接触摸屏VDD与GND 2. 观察上电瞬间及工作时的电压波动 ``` #### 3. **I2C总线配置优化** - **设备树修改**(`kernel/arch/arm64/boot/dts/rockchip/rk3566-xxx.dts`): ```dts &i2c3 { status = "okay"; clock-frequency = <100000>; // 降频至100kHz解决干扰问题 pinctrl-names = "default"; pinctrl-0 = <&i2c3m1_xfer>; silead_ts: touch@48 { compatible = "silead,gsl3680"; reg = <0x48>; vdd-supply = <&vcc3v3_touch>; // 确保电源节点正确 reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; irq-gpios = <&gpio4 RK_PA1 GPIO_ACTIVE_HIGH>; }; }; ``` - **关键参数**: - `clock-frequency`:过高频率会导致-110超时错误,建议从400kHz降至100kHz - 检查`reset-gpios`和`irq-gpios`的引脚配置是否与硬件一致 #### 4. **驱动层调试** - **启用调试日志**: ```bash # 加载驱动时开启调试模式 adb shell insmod silead_ts.ko debug_level=1 # 查看详细错误日志 adb shell dmesg | grep -i "i2c\|silead" ``` - **常见错误处理**: - **-6 (ENXIO)**:I2C地址无响应 → 检查设备树`reg`值及硬件地址 - **-110 (ETIMEDOUT)**:时钟拉伸超时 → 降低I2C频率或检查SCL线是否被意外拉低 #### 5. **信号完整性验证** - **使用示波器检查**: - **SCL/SDA信号质量**:上升时间≤300ns,无过冲/振铃 - **总线空闲状态**:确保SCL/SDA在高电平(>0.7×VDD) - **典型问题**: - 信号振铃 → 添加22pF电容或33Ω串联电阻 - 上升沿过缓 → 减小上拉电阻(典型值4.7kΩ→2.2kΩ) #### 6. **固件与软件配置** - **固件加载验证**: ```bash # 确认固件已正确加载 adb shell ls -l /vendor/firmware/silead_ts.fw adb shell hexdump -C /vendor/firmware/silead_ts.fw | head -n 5 ``` - **SELinux策略调整**(`device/rockchip/common/sepolicy/vendor/file_contexts`): ```policy /vendor/firmware/silead_ts\.fw u:object_r:firmware_file:s0 ``` ### 调试流程图 ```mermaid graph TD A[出现-6/-110错误] --> B{硬件检查} B -->|电平匹配| C[设备树配置] B -->|电源/复位| D[示波器测量] C --> E[降频/引脚验证] D --> F[优化电源电路] E --> G[加载驱动调试] F --> G G --> H{错误解决?} H -->|是| I[正常使用] H -->|否| J[信号完整性分析] J --> K[硬件修改] ``` ### 相关问题 1. 如何准确测量RK3566的I2C总线电平兼容性? 2. 设备树中I2C时钟频率的最佳实践值是多少? 3. 如何为RK3566触摸屏驱动添加自定义调试日志? 4. Android 12 SELinux策略如何允许硬件访问? 5. 使用示波器诊断I2C信号完整性的标准方法是什么? > 提示:错误码-6通常指向硬件连接问题,-110多由时序冲突引起。建议优先检查电平转换和复位时序[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值