前言:
本文旨在介绍调试camera驱动过程中常见的一个问题,即i2c不通导致驱动无法注册,并提供详细的排查方法。常见的报错日志如下:
[ 1.973566][ T1] gc8034 4-0037: driver version: 00.01.09 [ 1.973648][ T1] gc8034 4-0037: Failed to get power-gpios, maybe no use [ 1.973682][ T1] gc8034 4-0037: Failed to get reset-gpios [ 1.974133][ T1] gc8034 4-0037: lane_num(2) pixel_rate(319887360) [ 1.979292][ T1] gc8034 4-0037: gc8034 read reg:0xf0 failed ! [ 1.979461][ T1] gc8034 4-0037: gc8034 read reg:0xf1 failed ! [ 1.979477][ T1] gc8034 4-0037: Unexpected sensor id(000000), ret(-6)
camera模组的i2c不通问题与主控的CIF和ISP控制器模块无关,通常是由于上电时序未满足要求所致。以下是常见的排查方向。
一、i2c地址问题:
①确认i2c地址是否正确配置:通常,sensor的datasheet会明确给出i2c地址。需要注意的是,大多数sensor都有SID选择引脚,可以选择两个i2c地址,因此需要硬件确认使用哪个地址。
②i2c总线地址是否正确:需要根据硬件原理图明确i2c挂载在哪路总线,并在DTS中正确配置。
③是否配置成8位地址:DTS中配置的i2c地址是7位地址,不包括最后的读写位。检查是否配置成8位地址,如上图展示的某sensor,其i2c地址有0x6c和0x20,这就是8位地址,在dts中需要配置为0x36或者0x10。如下:
ov16a10: ov16a10@36 { compatible = "ovti,ov16a10"; status = "okay"; reg = <0x36>; }
④i2c总线是否正确引用pinctrl:需要检查i2c引脚是否正确引用,可以先看原理图对应的gpio,再检查dts是否正确引用。如下示例引用i2c6m4_xfer。
&i2c6 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&i2c6m4_xfer>; }
二、上电时序与MCLK时钟问题:
上电时序与时钟的检查可以一起完成,以下介绍如何检查这类问题。sensor的驱动通常在使用时才会打开mclk和电源,因此出现问题时,mclk和电源通常处于关闭状态。我们可以通过让sensor不下电,或直接卡死在下电流程中,然后再确认时钟和电源的问题:
①检查MCLK是否正常,电压幅度是否正确:通常sensor使用24M或27M的clk,使用示波器确认clk的频率是否正确。如果测量不到24M的mclk,可以怀疑以下原因:
sensor的驱动上电时是否正确打开clk,参考如下:
ret = clk_set_rate(ov16a10->xvclk, OV16A10_XVCLK_FREQ); if (ret < 0) { dev_err(dev, "failed to set xvclk rate\n"); return ret; } if (clk_get_rate(ov16a10->xvclk) != OV16A10_XVCLK_FREQ) dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n"); ret = clk_prepare_enable(ov16a10->xvclk); if (ret < 0) { dev_err(dev, "failed to enable xvclk\n"); return ret; }
gpio是否被其他模块占用,可以使用io命令查询iomux复用是否正确,通常串口log也会打印相应的错误。MCLK的电压幅度不对,可能是电源域io-domain配置错误,有1.8V和3.3V,需要根据实际原理图配置io-domain。
②检查供电:sensor的供电通常是avdd,dvdd,diovdd三路电源,使用万用表确认3路电源是否正常。如果不正常,可检查驱动代码是否有打开对应的电源,或者硬件设计错误。
③检查reset,powdn引脚状态:可以查看sensor的datasheet对这些引脚的描述,确定是高电平有效还是低电平有效:例如下图的sensor说明reset和PWDN都是低电平有效,那么说明低电平时会复位或进入power down,因此正常工作时,这两个引脚都应该是高电平状态。
如果引脚状态错误,通常是驱动代码和dts配置不统一,修改其中一个配置即可。
这里说明一下容易出错的地方:dts配置的gpio的GPIO_ACTIVE_HIGH与datasheet无关,dts配置的高/低有效是给驱动代码使用的。如果是高有效,驱动代码写1则输出高,写0则输出低,反之亦然。
dts配置GPIO_ACTIVE_HIGH,驱动操作设置为1,最终输出高电平 dts配置GPIO_ACTIVE_HIGH,驱动操作设置为0,输出低电平 dts配置GPIO_ACTIVE_LOW,驱动操作设置为1,输出低电平 dts配置GPIO_ACTIVE_LOW,驱动操作设置为0,输出高电平
如果dts和驱动代码都操作正确,但gpio始终无法改变,需要确认:
gpio是否被其他模块复用 gpio是否默认上拉或下拉,需要配置成pcfg_pull_none。
④检查上电时序:sensor的datasheet会描述sensor需要的上电时序,驱动的控制需要符合上电时序要求,严格的sensor在这里更容易出错:
驱动上电函数:
static int __ov13855_power_on(struct ov13855 *ov13855) { int ret; u32 delay_us; struct device *dev = &ov13855->client->dev; <pre class="brush:php;toolbar:false">if (!IS_ERR(ov13855->power_gpio)) gpiod_set_value_cansleep(ov13855->power_gpio, 1); usleep_range(1000, 2000); if (!IS_ERR_OR_NULL(ov13855->pins_default)) { ret = pinctrl_select_state(ov13855->pinctrl, ov13855->pins_default); if (ret < 0) goto disable_clk; } ret = clk_set_rate(ov13855->xvclk, OV13855_XVCLK_FREQ); if (ret < 0) { dev_err(dev, "failed to set xvclk rate\n"); goto disable_clk; } if (clk_get_rate(ov13855->xvclk) != OV13855_XVCLK_FREQ) dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n"); ret = clk_prepare_enable(ov13855->xvclk); if (ret < 0) { dev_err(dev, "failed to enable xvclk\n"); goto disable_clk; } if (!IS_ERR(ov13855->reset_gpio)) gpiod_set_value_cansleep(ov13855->reset_gpio, 0); ret = regulator_bulk_enable(OV13855_NUM_SUPPLIES, ov13855->supplies); if (ret < 0) { dev_err(dev, "failed to enable regulators\n"); goto disable_clk; } if (!IS_ERR(ov13855->reset_gpio)) gpiod_set_value_cansleep(ov13855->reset_gpio, 1); usleep_range(5000, 6000); if (!IS_ERR(ov13855->pwdn_gpio)) gpiod_set_value_cansleep(ov13855->pwdn_gpio, 1); /* 8192 cycles prior to first SCCB transaction */ delay_us = ov13855_cal_delay(8192); usleep_range(delay_us * 2, delay_us * 3); return 0;
disable_clk: clk_disable_unprepare(ov13855->xvclk);
return ret;
}
⑤供电、CLK等正确,i2c依旧不通:有时候camera使用的是转接小板,需要主板对转接小板进行供电,这时执行上电函数后,主板给小板供电较慢,可能会导致check ID失败。这时可以在驱动的上电函数(power_on)中适当增加一些延时,保证小板成功供电,再执行check id操作。
参考:https://www.php.cn/link/3a74197713008020a939fa3566b1f543
以上就是camera调试:i2c不通如何排查?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号