camera调试:i2c不通如何排查?

2023-05-16

这篇文章介绍一下在调试camera驱动的过程,最常见的一个问题,i2c不通导致驱动注册不上,应该如何排查。常见的报错log如下:

[    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控制器模块没有关系,一般都是上电时序的没满足要求。下面介绍一下常见的排查方向。

目录

(1)i2c地址问题

①确认i2c地址是否配置正确

 ②i2c总线地址是否正确

③是否配置成8位地址

 ④i2c总线是否正确引用pinctrl

(2)上电时序与MCLK时钟问题

①检查MCLK是否正常,电压幅度是否正确

②检查供电

③检查reset,powdn引脚状态

④检查上电时序

⑤供电、CLK等正确,i2c依旧不通


(1)i2c地址问题

①确认i2c地址是否配置正确

一般sensor的datasheet都会明确给出i2c的地址,需要注意的是,大多数sensor都有SID选择引脚,有两个i2c地址可以选择,这里需要硬件确认选择是哪个地址。

 ②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>;

(2)上电时序与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_warn(dev, "Failed to set xvclk rate (24MHz)\n");
	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-domian。

②检查供电

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,输出低电平
  • dta配置GPIO_ACTIVE_LOW,驱动操作设置为0,输出高电平

如果dts和驱动代码都操作正确,但是gpio始终无法改变,需要确认

  1. gpio是否被其他的模块复用
  2. 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;

	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)
			dev_err(dev, "could not set pins\n");
	}
	ret = clk_set_rate(ov13855->xvclk, OV13855_XVCLK_FREQ);
	if (ret < 0)
		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
	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");
		return ret;
	}
	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的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

camera调试:i2c不通如何排查? 的相关文章

随机推荐

  • 0.1+0.2不等于0.3 原因

    在计算机进行数字计算时会先将十进制转化为二进制进行计算 xff0c 由于二进制表示的有限数字不能超过 52 位在 JavaScript 里是不能精确存储的 xff0c 计算机进行了四舍五入这时造成了数字误差导致计算结果不为0 3 总结 xf
  • mac 终端 配置代理

    即使打开代理 xff0c mac终端默认不走 xff0c 需要配置 一 复制终端代理命令 export http proxy 61 http 127 0 0 1 1089 export https proxy 61 http 127 0 0
  • 【linux】安装Linux的交叉编译工具链

    1 linux中装软件的特点 linux中安装软件比windows中复杂 linux中安装软件一般有以下几种方法 xff1a 第一种 xff1a 在线安装 譬如ubuntu中使用apt get install vim来安装vim软件 第二种
  • 基于STM32F429 的 FreeRTOS 环境下 LCD1602驱动实现

    本文是基于STM32F429在FreeRTOS下的HAL库开发 xff0c 并验证在多任务不同优先级情况下运行情况 LCD1602介绍 xff1a 是一个只能显示字母 数字 符号的点阵型液晶模块 一行可以显示16个字符 xff0c 可以显示
  • 查询MYSQL和查询HBASE速度比较

    MySQL xff0c 关系型数据库 xff1b HBase xff0c NoSql数据库 查询Mysql和查询HBase xff0c 到底哪个速度快呢 xff1f 与一些真正的大牛讨论时 xff0c 他们说HBase写入速度 xff0c
  • Office Online Server 在线编辑Office文档,安装部署

    最近公司项目需求 xff0c 需要搭建一个office预览编辑的服务 xff0c 在网上找到了Office Online Server在线编辑office文档 xff0c 以下把自己搭建过程记录 一 Office Online Server
  • 安装vmware搭建k8s集群(亲试无坑)

    一 前言 下面这个坑我也遇到了 xff0c 同时看到别人的博客也遇到了 xff0c 害的我废了一天的时间来解决这个问题 xff0c 但是毫无卵用 xff0c 气的我快吐血 xff1a 问题 xff1a 因为k8s把版本的问题 xff0c 一
  • Kaniko构建镜像

    一 前言 最近公司重构devops相关的一系列平台 xff0c 对于流水线中用容器方式交付的产品越来越多 xff0c 为了更加安全的方式来构建容器镜像 xff0c 采用Kaniko构建 在了解如何用Kaniko构建镜像之前 xff0c 我们
  • Mysql批量插入对比(附github仓库demo)

    前言 本文记录个人使用MySQL插入大数据总结较实用的方案 xff0c 通过对常用插入大数据的4种方式进行测试 xff0c for循环单条拼接SQL批量插入saveBatch 循环 43 开启批处理模式 最近趁空闲之余 xff0c 在对My
  • docker内部如何访问宿主机上的服务或者应用

    背景 在docker启动的容器中需要访问宿主机上的服务 xff0c 所以在容器中通过localhost或者127 0 0 1 但是这样是不行的 访问url xff1a http 127 0 0 1 8088 或者http localhost
  • Kruise Rollout v0.3.0:手把手教你实战操作Deployment 分批发布和流量灰度

    helm3 安装 kubectl版本 xff1a v1 20 9 heml版本 xff1a v3 1 2 span class token punctuation span root 64 k8smaster peishunwu span
  • Spring boot 读取配置文件(application.yml)中的属性值

    1 引入依赖 span class hljs comment lt 支持 64 ConfigurationProperties 注解 gt span span class hljs tag lt span class hljs title
  • Apollo配置中心介绍

    一 背景 最近公司订单中心重构 xff0c 利用spring boot集成apollo配置中心 xff0c 因此学习一下apollo配置中心 因为如今程序功能越来越复杂 xff0c 程序的配置日益增多 xff1a 各种功能的开关 参数配置
  • 前端工程化-loader机制

    前言 xff1a loader是用来加载处理各种形式的资源 xff0c 本质上是一个函数 xff0c 接受文件作为参数 xff0c 返回转化后的结构 loader 用于对模块的源代码进行转换 loader 可以使你在 import 或 加载
  • Java中大量数据批量处理方式

    在订单中心处理订单 xff0c 总会遇到大批量订单处理的业务 xff0c 下面就将如何大批量处理数据来提高效率做一个总结 xff1b 代码设计 xff1a 在dao层写批量新增的方法 以及实现dao的实现类 xff0c 在service调用
  • java 获取视频的时长、大小、格式等信息

    1 最近有一个小的视频处理需求 xff0c 根据传入视频的url获取视频的时长 大小 格式等信息 下面将记录一下 xff1a package Void 64 Author psw 64 Description 获取视频宽高大小时间工具类 i
  • Linux下安装Anaconda3详细教程

    简介 Anaconda是一个开源的包 环境管理器 xff0c 可以用于在同一个机器上安装不同版本的软件包及其依赖 xff0c 并能够在不同的环境之间切换 Anaconda包括Conda Python以及一大堆安装好的工具包 xff0c 比如
  • keil下载出现错误Error:Flash Download failed -“Cortex-M3”问题

    在基本确认配置都正确的情况下 xff0c 可以试一下先擦除flash再下载程序 xff0c 一次不成功可以多擦除几次 本人就是这样解决的 分界线 更新博客 xff1a 前面解决方法
  • 《华为机试》刷题之HJ39 判断两个IP是否属于同一子网

    一 题目 描述 IP地址是由4个0 255之间的整数构成的 xff0c 用 34 34 符号相连 二进制的IP地址格式有32位 xff0c 例如 xff1a 10000011 xff0c 01101011 xff0c 00000011 xf
  • camera调试:i2c不通如何排查?

    这篇文章介绍一下在调试camera驱动的过程 xff0c 最常见的一个问题 xff0c i2c不通导致驱动注册不上 xff0c 应该如何排查 常见的报错log如下 xff1a 1 973566 T1 gc8034 4 0037 driver