camera黑屏分析

在porting sensor 的过程,经常会遇到黑屏情况,黑屏情况分为BB 端有接收到数据和没有接收到数据两种。本文主要分析无法接收到数据的情况下有哪些可以尝试debug 方向。

在分析这类问题需要先了解相关寄存器以及如何dump 寄存器。


1、相关寄存器信息:
ISP 0x15008134 (SenInf1 receives from Sensor)
ISP 0x15008138 (SenInf1 output to TG1)
ISP 0x15004448 (TG1 receives from SenInf1)
ISP 0x15004418 (TG1 grab window width)
ISP 0x1500441C (TG1 grab window height)
ISP 0x150083B4 00000000(nCSI2 IRQ status)


2、如何dump 寄存器
(1)adb 命令 以8128 为列
echo "0x8128"> /proc/driver/isp_reg && dmesg | grep -i 8128

(2)打开ISP log,在kernel log 中查看相关寄存器信息(推荐)
改 camera_isp.c :
若有這 define /* #define ISP_DEBUG */ , 打開這 define
#define LOG_DBG(format, args...) pr_err(MyTag "[%s]" format, __func__, ##args)
#define LOG_INF(format, args...) pr_err(MyTag "[%s]" format, __func__, ##args)
#define LOG_NOTICE(format, args...) pr_err(MyTag "[%s]" format, __func__, ##args)


3、debug
在无法接收的数据的情况下,我们一般会看到如下log,
Line 41527: 01-03 18:35:10.468 331 2448 E IspDrv : {IspDrv}
[vendor/mediatek/proprietary/platform/mt6735/hardware/MTKcam/D1/core/drv/isp/isp_drv.cpp, waitIrq, line2309] ERROR: ISP_WAIT_IRQ
fail(-1). Type(0), Status(0x00000001), Timeout(503).
Line 42284: 01-03 18:35:10.954 331 2448 E IspDrv : {IspDrv}
[vendor/mediatek/proprietary/platform/mt6735/hardware/mtkcam/D1/core/drv/isp/isp_drv.cpp, waitIrq, line2309] ERROR: ISP_WAIT_IRQ
fail(-1). Type(0), Status(0x00000400), Timeout(501).
Line 42312: 01-03 18:35:10.969 331 2436 E IspDrv : {IspDrv}
[vendor/mediatek/proprietary/platform/mt6735/hardware/mtkcam/D1/core/drv/isp/isp_drv.cpp, waitIrq, line2309] ERROR: ISP_WAIT_IRQ
fail(-1). Type(0), Status(0x00000400), Timeout(1000).


一般这种log 情况都会表明mipi 信号无法被decode。当然我们有理由也应该去怀疑mipi 信号是否正常,这点可以通过测量mipi 信号来查看sensor 出的mipi信号是否符合SPEC。 如果mipi信号明显异常,请不要犹豫,直接找vendor 来调试。 好,现在我们假设mipi信号是正常的,但是BB端依然无法接收数据。


首先需要查看寄存器相关,
8134 00000000 (高低16位分别表示宽x高)
83B4 00000300 (0x1004是正常值)
如果有看到如上寄存器信息,那么请查看下面几条。


(1) 请咨询FAE 询问当前sensor driver 的raw 格式配置,8bit? 10bit? 12bit?
目前D1/D2/D3/K2 都还无法支持12bit,如果driver 输出12bit,那么是一定无法被BB 端解析的。
(建议让sensor FAE 要提供下关于mipi 格式配置的寄存器信息,以便自己double check。)

(2)请HW 查看lanes 接口是否有焊接好。

(3)在driver code中把mipi_settle_delay_mode 修改成manul mode,并分别设置mipi_data_lp2hs_settle_dc 为120 85 60 40 30 20 测试, 请务必+log确认有修改到。


修改后测试并查看log,
SeninfDrvImp: [setSeninf1NCSI2]CSI-0 calibration start,MIPIType=0,HSRXDE=1
SeninfDrvImp: [setSeninf1NCSI2]CSI-0 calibration end !
SeninfDrvImp: [setSeninf1NCSI2]TermDelay:0 SettleDelay:85 ClkTermDelay:0 Vsync:1
lane_num:3 NCSI2_en:1 HeaderOrder:1 SettleDelay(cnt):0 dpcm:0
HSRXDE 如果为1,那么说明有成功设置manual 模式。
SettleDelay 就是您当前设置的mipi_data_lp2hs_settle_dc ,
测试后请查看log是否有修改成功。


(4)在sensor init结束后让sensor 处于stream off状态。
(这点建议在拿到driver code 之后就需要检查,这点就算不影响导通,也很可能导致很多其他现象,而且跟随debug会出现很多诡异现象,完全误导debug方向)


(5)在get_info函数中查看 sensorVsyncPolarity 的值修改成相反的看下。
对于parallel sensor, 可以通过测试vsync 信号和data 信号来确认该值,和信号测量值一致。


(6)在get_info函数中查看 sensorHsyncPolarity 的值修改成相反的看下.

对于parallel sensor, 可以通过测试hsync 信号和data 信号来确认该值,请填和测量信号相关。
即高电平填low,低电平填high。

(7)对于parallel sensor,如果有遇到TG, seninf 接收数据正常,但是始终存在error,无法
preview,

请尝试修改pclk 的极性后测试。
在cfg_settting_imgsensor.cpp中下面函数中把对应的值修改成相关即可。

 

  1. getSensorPadPclkInv(EDevId const eDevId)
  2. {
  3. switch (eDevId)
  4. {
  5. case eDevId_ImgSensor0:
  6. return 0;
  7. case eDevId_ImgSensor1:
  8. return 0;
  9. case eDevId_ImgSensor2:
  10. return 0;
  11. default:
  12. break;
  13. }
  14. return -1;
  15. }

复制代码

以上每一步debug的时候都请确定到位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值