ARM Linux DIY(五)摄像头调试

这篇具有很好参考价值的文章主要介绍了ARM Linux DIY(五)摄像头调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

今天,就着摄像头的调试,从嵌入式工程师的角度,介绍如何从无到有,一步一步地调出一款设备。
摄像头型号:OV2640

开发步骤

分为 2 个阶段 5 个步骤
阶段一:
设备树、驱动、硬件
阶段二:
应用程序、测试

Step 1:设备树

a) 摄像头用到了 I2C 和 CSI 接口,所以要在 pinctrl 节点中添加这两种接口的引脚定义,其中 I2C 使用的是 I2C1
b) 添加 CSI 节点
arch/arm/boot/dts/sun8i-v3s.dtsi

        pio: pinctrl@1c20800 {            
            i2c1_pins: i2c1-pins {
                pins = "PE21", "PE22";
                function = "i2c1";
            };

            //omit-if-no-ref
            csi1_mclk_pin: csi1-mclk-pin {
                pins = "PE1";
                function = "csi";
            };


            csi1_clk: csi1-clk@0 {
                pins = "PE0","PE2","PE3";
                bias-disable;
                function = "csi";
            };


            csi1_8bit: csi1-8bit@0 {
                pins      = "PE6","PE7","PE8","PE9","PE10","PE11","PE12","PE13","PE14","PE15";
                bias-disable;
                function = "csi";
            };
        }


    soc {
        csi1: csi@1cb4000 {
            compatible = "allwinner,sun8i-v3s-csi";
            reg = <0x01cb4000 0x3000>;
            interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
            clocks = <&ccu CLK_BUS_CSI>,
                    <&ccu CLK_CSI1_SCLK>,
                    <&ccu CLK_DRAM_CSI>;
            clock-names = "bus", "mod", "ram";
            resets = <&ccu RST_BUS_CSI>;
            status = "okay";
        };
    };

c) 使能 I2C 和 CSI 节点
arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts

&i2c1 {
    pinctrl-0 = <&i2c1_pins>;
    pinctrl-names = "default";
    clock-frequency = <400000>;
    status = "okay";
    
    ov2640: camera@30 {
        compatible = "ovti,ov2640";
        reg = <0x30>;
        pinctrl-names = "default";
        pinctrl-0 = <&csi1_mclk_pin>;
        clocks = <&ccu CLK_CSI1_MCLK>;
        clock-names = "xvclk";
        assigned-clocks = <&ccu CLK_CSI1_MCLK>;
        assigned-clock-rates = <24000000>;
        port {
            ov2640_0: endpoint {
                remote-endpoint = <&csi1_ep>;
                bus-width = <10>;
            };
        };
    };
};

&csi1 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&csi1_clk &csi1_8bit>;

    port {
        csi1_ep: endpoint {
        remote-endpoint = <&ov2640_0>;
        hsync-active = <0>;
        vsync-active = <0>;
        bus-width = <10>;
            pclk-sample = <1>;
        };
    };

};

Step 2:驱动

使能内核编译选项

> Device Drivers > Multimedia support > I2C Encoders, decoders, sensors and other helper chips
    <*> OmniVision OV2640 sensor support
注意:
要先禁用
> Device Drivers > Multimedia support
    [ ]   Autoselect ancillary drivers (tuners, sensors, i2c, spi, frontends)

不然无法显示
    I2C Encoders, decoders, sensors and other helper chips
选项

Step 3:硬件

焊接 24P FPC 翻盖下接排线连接器
焊接 2.8V LDO、1.5V LDO
焊接电阻电容
arm 摄像头开发,嵌入式,# Driver,# 硬件,arm开发
测量短路、测量电压、确认外设好坏

Step 4:应用程序

需要用到 i2c-tools、ffmped、fswebcam
在 buildroot Target Packets 中添加

Step 5:测试

step 5.1:I2C 测试

先用 I2C 工具检测摄像头的 I2C 信息

# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                         
#

没有检测到 I2C 设备,SOC 测 I2C 软件是好的,因为 /dev/i2c-1 设备已产生,并且使用 I2C 工具操作 I2C 控制器也没报错,
所以,可能出现问题的节点
a) SOC I2C 引脚没有输出 I2C 信号
b) 摄像头 I2C 引脚没有收到 I2C 信号
c) 摄像头收到 I2C 信号,但是没有做出响应
d) 摄像头 I2C 做出响应,但是 SOC 解析失败
排查
a) 使用逻辑分析仪抓 SOC I2C 引脚信号,发现 SOC 正常发出 I2C 信号,遍历地址 0~0x77 的设备,但是没有收到任何一个响应
b) 使用万用表量摄像头 I2C 引脚到 SOC I2C 引脚的通断,导通,没问题
c) 从上述两点,可知问题原因是:摄像头收到 I2C 信号,但是没有做出响应
继续排查
c1) 检查摄像头供电,使用万用表测量,电源电压正常
c2) 难道是摄像头坏了?遂将 OV2640 插在 ESP32-CAM 板子上进行测试,可以正常摄像,所以摄像头是好的
c3) dmesg 显示

[    1.158234] i2c /dev entries driver
[    1.162410] sun8i-v3s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[    1.175129] ov2640 0-0030: Product ID error fa:fa

难道是 vcc-pe 引脚没有电压?
使用万用表测量,发现电压正常
网上搜索该问题,发现可以正常检测到 I2C 的内核 log 中也有该警告,所以应该不是该问题导致
c4) 网上搜到一篇文章《camera调试:i2c不通如何排查?》,介绍了排查 I2C 地址、引脚、供电、reset 引脚、powdn 引脚、上电时序、MCLK 等步骤,我跟着流程依次检查,最后看到 MCLK 时灵光乍现,依稀记得设备树中有配置 MCLK 参数的地方

	ov2640: camera@30 {
		compatible = "ovti,ov2640";
		reg = <0x30>;
		pinctrl-names = "default";
		pinctrl-0 = <&csi1_mclk_pin>;
		clocks = <&ccu CLK_CSI1_MCLK>;
		clock-names = "xvclk";
		assigned-clocks = <&ccu CLK_CSI1_MCLK>; // 这两行
		assigned-clock-rates = <24000000>;		// 这两行
		port {
			ov2640_0: endpoint {
				remote-endpoint = <&csi1_ep>;
				bus-width = <10>;
			};
		};
	};

这份节点参数我是从网上找的,一般 V3S 的晶振使用的是 24MHz 的,而我使用的是 26MHz 的,问题应是这里,改成 26000000,重新测试

[    1.158263] i2c /dev entries driver
[    1.163342] sun8i-v3s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[    1.176419] ov2640 1-0030: ov2640 Product ID 26:42 Manufacturer ID 7f:a2
[    1.183768] i2c i2c-1: OV2640 Probed
# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

可以检测到摄像头 I2C 设备了。

step 5.2:拍照测试

fswebcam -S 20 -d /dev/video0 -p UYVY -r 800x600 --dumpframe dump.bin fswebcam.jpg

发现没有 /dev/video0 设备
在网上搜了下产生 /dev/video0 设备的内核编译选项,如下图,需要使能 Allwinner V3s Camera Sensor Interface driver
arm 摄像头开发,嵌入式,# Driver,# 硬件,arm开发
可是我发现我的 buildroot 中 V4L platform devices 下面并没有该选项
最终,通过在源码的 Kconfig 文件中搜索 Allwinner V3s
arm 摄像头开发,嵌入式,# Driver,# 硬件,arm开发再跟着关键字 VIDEO_SUN6I_CSI,在 menuconfig 中一步步搜索,将依赖的编译选项都使能后,终于该选项出现了。使能后,/dev/video0 设备就出现了

# ls /dev/video0 -lh
crw-------    1 root     root       81,   0 Jan  1 00:00 /dev/video0

拍照测试

fswebcam -S 20 -d /dev/video0 -p UYVY -r 800x600 --dumpframe dump.bin fswebcam.jpg

arm 摄像头开发,嵌入式,# Driver,# 硬件,arm开发
录像测试

ffmpeg -f video4linux2 -s 800x600 -r 30 -i /dev/video0 test.avi

arm 摄像头开发,嵌入式,# Driver,# 硬件,arm开发

step 5.3:消除横纹

可以看到,上面拍摄的照片和视频有一道道的横纹,网上搜索发现许多人都遇到了这个问题,基本明确问题原因是电源纹波导致,我尝试换了几颗电源滤波电容,还是没能消除横纹,这个硬件问题后面随缘去解吧,缩短布线是个有效的措施。

至此,摄像头调试,功能部分已 OK,性能调优 TO BE DONE(一般再也不 DONE。。。)。文章来源地址https://www.toymoban.com/news/detail-840573.html

到了这里,关于ARM Linux DIY(五)摄像头调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RV1126 Linux IPC摄像机 索尼IMX415 摄像头调试

    平台 内核版本 SDK版本 RV1126 Linux4.19 RV1126_RV1109_LINUX_SDK_V2.1.0_20210512 配置dts之前需要检查原理图,查看摄像头是接在哪个总线下的。本例中是I2C1: 此外还要注意reset引脚和原理图一一对应。本方案中power硬件配置的常供电方式,所以可以不配。 Linux4.19自带IMX415的驱动。如果使用

    2024年01月17日
    浏览(48)
  • ARM Linux DIY(三)板载串口和 LCD 调试

    今天焊接两大关键输入输出设备:串口和屏幕。 串口部分使用 CP2102N 芯片(USB 转 TTL),这样用一根数据线连接板子和 PC 就可以直接调试了。 焊接 CP2102 和 Type C 上电调试,串口可以正常输入输出。 看来,虽然是 QFN 封装,只要尺寸大一点,还是很容易焊接成功的。 重头戏在

    2024年01月18日
    浏览(36)
  • ARM DIY 硬件调试

    之前打样的几块 ARM 板,一直放着没去焊接。今天再次看到,决定把它焊起来。 为了提高焊接效率,先使用加热台焊接。不过板子为双面贴片,使用加热台只能焊接一面,那就优先焊主芯片那面,并把 Type C、SD 卡座还有一些关键电阻电容一并焊接。 (不过后来发现这个决定

    2024年02月12日
    浏览(37)
  • ARM DIY(六)音频调试

    今天,调试一下音频 硬件部分核心是 LM4871 音频功放芯片 对于 SOC 来讲很简单,就一个引脚 HPOUTL(单声道);对于扬声器来讲也很简单,就两个引脚,插上就可以了。 另外一个关键点是电容和电阻要焊到位,有没有噪音,音质好坏,全屏电容电阻打下手。 arch/arm/boot/dts/sun

    2024年02月10日
    浏览(38)
  • ARM DIY(四)WiFi 调试

    换个粗点的风枪嘴,让热风覆盖 RTL8823BS 整体模块,最终实现自动归位 焊接 SDIO 接口的上拉电阻以及复位引脚上拉电阻 硬件部分就这么多比较简单,接下来是软件部分 搜索 RTL8723BS RTL8723BS 默认关闭,不过要使能该驱动之前,需要先使能 WLAN 和 CFG80211 搜索 WLAN 使能 WLAN 搜索

    2024年02月11日
    浏览(36)
  • ARM DIY(七)麦克风调试

    上篇文章介绍了扬声器调试,今天介绍下麦克风调试。 焊接:咪头、电阻、电容 音频调试时已完成,参考上篇文章 使能 mic1 录音 10s -f 是设置录音质量, -f cd 表示录音质量为 cd 级别。-d 是指定录音时间,单位是 s,这条指令就是录制一段 cd 级别 10s 的 wav 音频,音频名字为

    2024年02月10日
    浏览(42)
  • 【正点原子FPGA连载】 第二十七章OV5640摄像头LCD显示 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html OV5640是OmniVision(豪威科技)公司生产的一颗CMOS图像传感器,该传感器功耗低、分辨率高以及采集速率快,主

    2024年02月16日
    浏览(58)
  • 【正点原子FPGA连载】 第三十章双目OV5640摄像头LCD显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html 双目摄像头是在一个模组上集成了两个摄像头,实现了双通道的图像采集。双目摄像头一般应用于安防监控、

    2024年02月13日
    浏览(53)
  • ARM DIY(三)板载串口和 LCD 调试

    今天焊接两大关键输入输出设备:串口和屏幕。 串口部分使用 CP2102N 芯片(USB 转 TTL),这样用一根数据线连接板子和 PC 就可以直接调试了。 焊接 CP2102 和 Type C 上电调试,串口可以正常输入输出。 看来,虽然是 QFN 封装,只要尺寸大一点,还是很容易焊接成功的。 重头戏在

    2024年02月11日
    浏览(112)
  • ARM DIY(一)电源、SD卡座、SOC 调试

    之前打样的几块 ARM 板,一直放着没去焊接。今天再次看到,决定把它焊起来。 为了提高焊接效率,先使用加热台焊接。不过板子为双面贴片,使用加热台只能焊接一面,那就优先焊主芯片那面,并把 Type C、SD 卡座还有一些关键电阻电容一并焊接。 (不过后来发现这个决定

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包