树莓派无法检测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>, <®_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
相关产品推荐
相关产品推荐

