【Camera专题】I2C不通或地址读错总结(含闪光灯)
系列文章
【Camera专题】I2C不通或地址读错总结
【Camera专题】概率性读不到id~二
一.I2C地址不通
平台:高通 msm8909(wear2001)
最近遇到I2C地址不通问题,通信失败,导致摄像头无法点亮。
分析方法:
1.硬件层面
- 确认硬件是否有问题,我们遇到模组厂给的sensor,dvdd和avdd本身短路了,导致打不开。
- 我们有遇到一开始能用,后来就突然用不了,开机有时候读得到id,有时候读不到id,开机启动后,即使开机读id没问题,启动时偶尔也读不到id,用手折弯fpc或者按压金手指的位置,预览界面就卡死,id也读不到,需要重新插拔才行。
原因:按压时fpc短路了 - 模组受压,有些机器,我们发现松一下螺丝,重新开关机I2C通信就正常了,和硬件确认,FPS或者某个地方受压了,导致I2C读不通,这个经验很重要。
2.软件层面
-
检查软件上电时许是否符合规格书[data sheet]的要求
上电时序 - 检查i2c地址是否有冲突:比如2颗sensor的地址都为0x2c,这就有问题了。
二.(LM36010)闪光灯 I2C地址不通
平台:高通429
报错log:
658 [wcnss_service] msm_flash_init:488 Enter
c0 658 [wcnss_service] subsys-pil-tz a21b000.qcom,pronto: wcnss: Brought out of reset
c0 1031 [CAM_sensor] msm_flash_i2c_write_table:162 zcf_flash 1
c1 1031 [CAM_sensor] msm_cci_subdev_ioctl line 1848
c1 1031 [CAM_sensor] msm_cci_config line 1681 cmd 6
c1 1031 [CAM_sensor] msm_cci_i2c_write set param sid 0x32 retries 3 id_map 0
c1 1031 [CAM_sensor] msm_cci_validate_queue line 214 CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR 0 len 63 max 64
c1 1031 [CAM_sensor] msm_cci_data_queue addr type 1 data type 1 cmd_size 1
c1 1031 [CAM_sensor] msm_cci_data_queue CCI_I2C_M0_Q0_LOAD_DATA_ADDR:val 0x310:0x30321
c1 1031 [CAM_sensor] msm_cci_write_i2c_queue:272 called
c1 1031 [CAM_sensor] msm_cci_validate_queue line 214 CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR 1 len 1 max 64
c1 1031 [CAM_sensor] msm_cci_write_i2c_queue CCI_I2C_M0_Q0_LOAD_DATA_ADDR:val 0x310:0x6
c1 1031 [CAM_sensor] msm_cci_data_queue line 704 CUR_WORD_CNT_ADDR 2 len 1 max 64
c1 1031 [CAM_sensor] msm_cci_data_queue cmd_size 1 addr 0x1 data 0x22
c1 1031 [CAM_sensor] msm_cci_get_queue_free_size line 597 CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR 2 max 64
c1 1031 [CAM_sensor] msm_cci_data_queue LOAD_DATA_ADDR 0x220129, q: 0, len:1, cnt: 2
c1 1031 [CAM_sensor] msm_cci_write_i2c_queue:272 called
c1 1031 [CAM_sensor] msm_cci_validate_queue line 214 CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR 3 len 1 max 64
c1 1031 [CAM_sensor] msm_cci_write_i2c_queue CCI_I2C_M0_Q0_LOAD_DATA_ADDR:val 0x310:0x7
<3>[ 18.890167] c1 1031 [CAM_sensor] msm_cci_load_report_cmd:444 CCI_I2C_REPORT_CMD curr_w_cnt: 4
c1 1031 [CAM_sensor] msm_cci_load_report_cmd:451 CCI_I2C_M0_Q0_EXEC_WORD_CNT_ADDR 5
c0 1066 [ip6tables-wrapp] msm_cci_irq CCI_I2C_M0_STATUS_ADDR = 0x8000000
c0 1066 [ip6tables-wrapp] msm_cci_irq:1816 MASTER_0 error 0x8000000
c0 1066 [ip6tables-wrapp] msm_cci_irq CCI_I2C_M0_STATUS_ADDR = 0x2000000
c0 1066 [ip6tables-wrapp] msm_cci_irq CCI_I2C_M0_STATUS_ADDR = 0x1000000
c1 1031 [CAM_sensor] msm_cci_wait line 300 wait DONE_for_completion_timeout
c1 1031 [CAM_sensor] msm_cci_wait: 307 wait for queue: 0
c1 1031 [CAM_sensor] msm_cci_transfer_end: 559 failed rc -110
c1 1031 [CAM_sensor] msm_cci_data_queue: 817 failed rc -110
c1 1031 [CAM_sensor] msm_cci_i2c_write failed line 1110
c0 1071 [netmgrd] msm_cci_irq CCI_I2C_M0_STATUS_ADDR = 0x2000000
c1 1031 [CAM_sensor] msm_cci_config line 1708 rc -110
c1 1031 [CAM_sensor] msm_cci_subdev_ioctl line 1867 rc -110
c1 1031 [CAM_sensor] msm_camera_cci_i2c_write: line 134 rc = -110
c0 1071 [netmgrd] msm_flash_i2c_write_table:176 zcf_flash rc=-110
c0 1071 [netmgrd] msm_cci_irq CCI_I2C_M0_STATUS_ADDR = 0x1000000
可以看到msm_flash_i2c_write_table: line 134 rc=-110
-110表示的是:访问的I2C地址0x64没有应答,总之就是I2C不通。 规格书
问题解决:
-
硬件层面
首先你得和硬件工程师check已经,硬件这一块有没有问题,飞线有没有飞错!
这一步确认完成了以后,接下来在从软件层面去check! -
软件层面
I2c地址不通无非就2个原因。
1. 上电有问题
如果硬件工程师量了上电,确认没有问题的话,接下来看地址!
2. I2C地址不对。
我们这边I2C不通就是因为I2C地址给错了,配成0x64,可是规格书给的就是0x64啊!
看似没错,实际上后来发现,真正的I2C地址是0xc8(0x64左移1位),规格书给的是7位地址!!!
因此,以后I2C不通,先和厂家确认一下给的I2C地址是7位还是8位的。
把I2C地址左移或者右移一位,再去尝试一下,问题就迎刃而解了!!!
三.I2C地址读错总结
最近遇到一个比较奇葩的问题:
我们kernel层加了后摄的otp后,会出现某些机器概率性前摄ID读错问题,otp读出来的数据也全是0。
dtsi文件关于otp的修改
eeprom0: qcom,eeprom@5a {
cell-index = <0>;
reg = <0x5A>;
qcom,eeprom-name = "sunwin_s5k4h7";
compatible = "qcom,eeprom";
qcom,slave-addr = <0x5A>;
qcom,cci-master = <0>;
qcom,num-blocks = <2>;
qcom,page0 = <1 0x0A02 2 0x15 1 1>;/*set the page21 of otp*/
qcom,poll0 = <0 0x0 1 0x0 1 1>;
qcom,mem0 = <0 0x0 1 0x0 1 1>;
qcom,page1 = <1 0x0A00 2 0x0100 2 1>;/*OTP enable and read start*/
qcom,poll1 = <0 0x0 1 0x0 1 1>;
qcom,mem1 = <60 0x0A04 2 0x0000 2 1>;
cam_vio-supply = <&pm8916_l10>;
cam_vaf-supply = <&pm8916_l11>;
···
}
报错log如下:
//id读错
Line 1875: <3>[ 12.086195] msm_sensor_match_id: sensor_id_reg_addr=300b:
Line 1876: <3>[ 12.086206] msm_sensor_match_id: read id: 0x274 expected id 0x5675:
Line 1877: <3>[ 12.086214] msm_sensor_match_id chip id 274 does not match 5675
//otp读错
<3>[ 1.470158] memory_data[0] = 0x0
<3>[ 1.470179] memory_data[1] = 0x0
<3>[ 1.470188] memory_data[2] = 0x0
<3>[ 1.470197] memory_data[3] = 0x0
<3>[ 1.470206] memory_data[4] = 0x0
<3>[ 1.470215] memory_data[5] = 0x0
<3>[ 1.470223] memory_data[6] = 0x0
<3>[ 1.470233] memory_data[7] = 0x0
<3>[ 1.470242] memory_data[8] = 0x0
<3>[ 1.470251] memory_data[9] = 0x0
<3>[ 1.470260] memory_data[10] = 0x0
···
<3>[ 1.470260] memory_data[256] = 0x0
分析:
otp的读取顺序
camera的加载顺序
i2c通信时ok的,但是就是读错了,肯定是读到某个地址的值了,所以id没读对,移除dtsi后摄的otp修改,
就能读对。
可以确认的是加了后摄的otp导致的。
需要注意的是,otp是烧录在sensor里面的,也同样和camera一样要上的,上电时序和camera一致,
因此在读取前摄的时候,读错成了后摄的地址,导致读成0x274.
解决:
vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/module/sensor_init.c
- "ov5675_back",
- "s5k4h7",\
+ "s5k4h7",\
+ "ov5675_back",
把camera加载的顺序和otp加载的顺序改成一致。