You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派无法检测OV5640摄像头?求故障排查方向

OV5640摄像头树莓派对接I2C检测问题排查

问题背景

尝试将OV5640摄像头与树莓派对接,核心目标是让OV5640被系统检测到并出现在I2C设备节点下。参考OV5647的DTS结构制作了OV5640的DTS文件,仅做两处修改:

  • 将ov5647替换为ov5640
  • 将寄存器地址改为3c

编译DTS文件并复制到/boot/overlays/后重启树莓派,OV5640已物理连接且编译后的DTS文件存在,但设备仍未被检测到。

附DTS文件内容

ov5640.dtsi

cam_node: ov5640@3C {
    compatible = "ovti,ov5640";
    reg = <0x36>;
    status = "disabled";

    clocks = <&cam1_clk>;

    avdd-supply = <&cam1_reg>;
    dovdd-supply = <&cam_dummy_reg>;
    dvdd-supply = <&cam_dummy_reg>;

    rotation = <0>;
    orientation = <2>;

    port {
        cam_endpoint: endpoint {
            clock-lanes = <0>;
            data-lanes = <1 2>;
            clock-noncontinuous;
            link-frequencies =
                /bits/ 64 <297000000>;
        };
    };
};

ov5640-overlay.dts

// SPDX-License-Identifier: GPL-2.0-only
// Definitions for OV5647 camera module on VC I2C bus
/dts-v1/;
/plugin/;

/{
    compatible = "brcm,bcm2835";

    i2c_frag: fragment@0 {
        target = <&i2c_csi_dsi>;
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            status = "okay";

            #include "ov5640.dtsi"

            vcm: ad5398@c {
                compatible = "adi,ad5398";
                reg = <0x0c>;
                status = "disabled";
                VANA-supply = <&cam1_reg>;
            };
        };
    };

    csi_frag: fragment@1 {
        target = <&csi1>;
        csi: __overlay__ {
            status = "okay";
            brcm,media-controller;

            port {
                csi_ep: endpoint {
                    remote-endpoint = <&cam_endpoint>;
                    data-lanes = <1 2>;
                };
            };
        };
    };

    fragment@2 {
        target = <&i2c0if>;
        __overlay__ {
            status = "okay";
        };
    };

    fragment@3 {
        target = <&i2c0mux>;
        __overlay__ {
            status = "okay";
        };
    };

    reg_frag: fragment@4 {
        target = <&cam1_reg>;
        __overlay__ {
            startup-delay-us = <20000>;
        };
    };

    clk_frag: fragment@5 {
        target = <&cam1_clk>;
        __overlay__ {
            status = "okay";
            clock-frequency = <25000000>;
        };
    };

    __overrides__ {
        rotation = <&cam_node>,"rotation:0";
        orientation = <&cam_node>,"orientation:0";
        media-controller = <&csi>,"brcm,media-controller?";
        cam0 = <&i2c_frag>, "target:0=",<&i2c_vc>,
               <&csi_frag>, "target:0=",<&csi0>,
               <&reg_frag>, "target:0=",<&cam0_reg>,
               <&clk_frag>, "target:0=",<&cam0_clk>,
               <&cam_node>, "clocks:0=",<&cam0_clk>,
               <&cam_node>, "avdd-supply:0=",<&cam0_reg>;
        vcm = <&vcm>, "status=okay",
              <&cam_node>,"lens-focus:0=", <&vcm>;
    };
};

&cam_node {
    status = "okay";
};

&cam_endpoint {
    remote-endpoint = <&csi_ep>;
};

操作步骤(补充信息)

  • 使用并编译的内核版本为5.15.70-v7l+
  • 将ov5640.dtsi和ov5640-overlay.dts添加到path/to/kernel_source/arch/arm/boot/dts/overlays/目录下
  • 在该目录的Makefile中添加ov5647.dtbo以纳入编译(注:此处疑似笔误,应为ov5640.dtbo)
  • 编译并安装模块:
    sudo make modules_install
    cp arch/arm/boot/dts/*.dtb /boot/
    cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
    cp arch/arm/boot/dts/overlays/README /boot/overlays/
    cp arch/arm/boot/zImage /boot/kernel-image.img
    
    在/boot/config.txt中添加kernel=kernel-image.img,随后关闭树莓派电源
  • 将OV5640摄像头连接到MIPI接口后开机
  • 执行命令ls /dev/i2c-*,输出为/dev/i2c-1 /dev/i2c-20 /dev/i2c-21,OV5640未被检测到;而使用OV5647时,执行该命令会多出/dev/i2c-0 /dev/i2c-10 /dev/i2c-22,且未编译OV5647的DTS文件时也无法检测到它。

动态加载驱动错误(补充信息)

执行sudo insmod ov5640.ko,报错:

insmod: ERROR: could not insert module ov5640.ko: Unknown symbol in module

dmesg日志如下:

[   65.843312] ov5640: Unknown symbol v4l2_async_unregister_subdev (err -2)
[   65.843536] ov5640: Unknown symbol v4l2_async_register_subdev_sensor (err -2)
[   65.843873] ov5640: Unknown symbol v4l2_fwnode_endpoint_parse (err -2)

移除OV5647的dtbo文件后加载OV5647驱动也会出现类似错误;但存在OV5647的dtbo文件时加载驱动可成功并能正常推流。

注:OV5647与OV5640驱动均为动态模块,推测问题出在DTS文件上,寻求排查方向。


内容的提问来源于stack exchange,提问作者Lavudijanni Subhash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:40:34