Linux中I2C常见问题一

一. 背景

调试i2c设备时经常遇到i2c不通、报错等问题,而原因主要如下:

power电压、reset复位、i2c bus、i2c 地址、硬件贴错;

二. 分析思路

2.1 抓log、看代码;

2.2 看原理图、抓Power up时序、抓I2C波形;

2.3 看模组原理图和PCB图;

三. Power上电
3.1 Power-未上电导致i2c不通:

log: msm_cci_irq:1779 MASTER_0 error 0x10000000

分析1:

绿色为scl, 蓝色为sda, 可知后8位对应的sda位:101100001=0xB0其中,

1011000(0x58) 0(w) 1(ack) 即无从设备应答响应

8 位地址 查看dtsi中slave_addr: qcom,slave-addr = <0xB0>即设备地址正确;

分析2:cat sys/kernel/debug/regulator/pm8953_l17/consumers

查看原理图知AF power为LDO_17,但是ldo17占用者为dsi-lcm没有camera的,说明驱动未配置;

原因:eeprom使用马达中的otp,需要先给马达模块上电,但实际未上电;

解决:gc13023_lib.h 中添加af上电时序

3.2 Power-dvdd电压过小导致i2c不通

现象:相机概率无法打开、预览彩色条纹

Android log:

E/mm-camera( 728): <SENSOR><ERROR> 590: sensor_write_i2c_setting: failed 01:44:11.975 E/mm-camera( 728): <SENSOR><ERROR> 742: sensor_apply_exposure: failed

Kernel log:

392.148645\] msm_cci_flush_queue:174 wait timeout \[ 392.149064\] msm_cci_transfer_end: 548 failed rc -110 \[ 392.149079\] msm_cci_data_queue: 809 failed rc -110 \[ 392.149095\] msm_camera_cci_i2c_write_table_cmd: line 219 rc = -110 即主控往sensor写入曝光值发生i2c报错; 原因: 直接:软件设置DVDD电压1.1v ,实测模组的DVDD=1.02v 不符合spec要求1.15-1.3 V; 根本:线路走线太长导致DVDD线损损耗大 解决: 软件设置DVDD电压为1.225 实际前端电压1.18v **3.3 Power-AVDD/DVDD/IOVDD没有全部拉高** 现象:相机偶现黑屏、闪退,提示"相机无法打开" Log: 05-27 10:16:14.931 E/gc5035 2-0037( 0): debug111 __gc5035_power_on 861 value_power:1 05-27 10:16:14.934 E/gc5035 2-0037( 0): gc5035 write reg(0xfc val:0x1) failed ! 05-27 10:16:14.934 E/m00_f_gc5035 2-0037( 0): could not set init registers 05-27 10:16:14.934 E/gc5035 2-0037( 0): gc5035 write reg(0xfc val:0x1) failed ! 05-27 10:16:14.934 E/m00_f_gc5035 2-0037( 0): could not set init registers 分析: ![](https://i-blog.csdnimg.cn/direct/6eefeb902bf2484c8962a565a760dd94.png) -》报错时avdd=0 未拉高; ![](https://i-blog.csdnimg.cn/direct/c624dcd6ddab4de485b4ef05713a6b6d.png) -》采用外部LDO控制AVDD/DVDD/IOVDD输出,且硬件内部做了延时如上。即从完成3路电输出需要4.58ms。 原因:驱动中拉高gpio后,未等3路电都输出后就拉高reset,导致i2c不通; 解决: 从拉高gpio到拉高reset sleep 5ms-5.1ms,保证AVDD/DVDD/IOVDD都输出后再拉高reset kernel-4.19/drivers/media/i2c/gc5035.c usleep_range(5000,5100);

相关推荐
草莓熊Lotso22 分钟前
Linux 线程同步与互斥(一):彻底搞懂线程互斥原理、互斥量底层实现与 RAII 封装
linux·运维·服务器·开发语言·数据库·c++
feng_you_ying_li24 分钟前
linux之进程概念
linux
j_xxx404_24 分钟前
深入理解Linux底层存储:从物理磁盘架构到文件系统(inode/Block)原理
linux·运维·服务器·后端
嵌入式×边缘AI:打怪升级日志31 分钟前
深度剖析Linux按键驱动四种访问方式:从查询到异步通知
linux·运维·服务器
凉、介34 分钟前
从设备树到驱动源码:揭秘嵌入式 Linux 中 MMC 子系统的统一与差异
linux·驱动开发·笔记·学习·嵌入式·sd·emmc
Full Stack Developme39 分钟前
Linux 软连接与硬连接比较
linux·运维·服务器
云边有个稻草人42 分钟前
【Linux系统】第九节—进程状态续集+进程优先级+进程切换
linux·进程状态·进程优先级·linux进程调度算法·linux进程切换·死循环进程如何运行·pri and ni
草莓熊Lotso44 分钟前
Linux 线程同步与互斥(二):线程同步从条件变量到生产者消费者模型全解,原理 + 源码彻底吃透
linux·运维·服务器·c语言·开发语言·数据库·c++
开压路机9 小时前
进程控制
linux·服务器
香蕉鼠片9 小时前
跨平台开发到底是什么
linux·windows·macos