0

0

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

星夢妙者

星夢妙者

发布时间:2025-04-26 13:18:26

|

1223人浏览过

|

来源于php中文网

原创

前言:

本文旨在介绍调试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地址,因此需要硬件确认使用哪个地址。

camera调试:i2c不通如何排查?camera调试: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不下电,或直接卡死在下电流程中,然后再确认时钟和电源的问题:

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

①检查MCLK是否正常,电压幅度是否正确:通常sensor使用24M或27M的clk,使用示波器确认clk的频率是否正确。如果测量不到24M的mclk,可以怀疑以下原因:

sensor的驱动上电时是否正确打开clk,参考如下:

Q.AI视频生成工具
Q.AI视频生成工具

支持一分钟生成专业级短视频,多种生成方式,AI视频脚本,在线云编辑,画面自由替换,热门配音媲美真人音色,更多强大功能尽在QAI

下载
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,因此正常工作时,这两个引脚都应该是高电平状态。

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

如果引脚状态错误,通常是驱动代码和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在这里更容易出错:

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

驱动上电函数:

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;"><code>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);

<code>return ret;</code>

}

⑤供电、CLK等正确,i2c依旧不通:有时候camera使用的是转接小板,需要主板对转接小板进行供电,这时执行上电函数后,主板给小板供电较慢,可能会导致check ID失败。这时可以在驱动的上电函数(power_on)中适当增加一些延时,保证小板成功供电,再执行check id操作。

参考:https://www.php.cn/link/3a74197713008020a939fa3566b1f543

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2863

2024.08.16

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

26

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

68

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

164

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

84

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

113

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

29

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

62

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.1万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

React 教程
React 教程

共58课时 | 5.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号