ARM DIY(五)摄像头调试

news2024/10/6 12:25:44

前言

今天,就着摄像头的调试,从嵌入式工程师的角度,介绍如何从无到有,一步一步地调出一款设备。
摄像头型号: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
焊接电阻电容
在这里插入图片描述
测量短路、测量电压、确认外设好坏

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
在这里插入图片描述
可是我发现我的 buildroot 中 V4L platform devices 下面并没有该选项
最终,通过在源码的 Kconfig 文件中搜索 Allwinner V3s
在这里插入图片描述再跟着关键字 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

请添加图片描述
录像测试

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

请添加图片描述

step 5.3:消除横纹

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

至此,摄像头调试,功能部分已 OK,性能调优 TO BE DONE(一般再也不 DONE。。。)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程使用HashMap,HashMap和HashTable和ConcurrentHashMap区别(面试题常考),硬盘IO,顺便回顾volatile

一、回顾&#x1f49b; 谈谈volatile关键字用法 volatile能够保证内存可见性&#xff0c;会强制从主内存中读取数据&#xff0c;此时如果其他线程修改被volatile修饰的变量&#xff0c;可以第一时间读取到最新的值。 二、&#x1f499; HashMap线程不安全没有锁,HashTable线程…

二分搜索树(Java 实例代码)

目录 二分搜索树 一、概念及其介绍 二、适用说明 三、二分查找法过程图示 四、Java 实例代码 src/runoob/binary/BinarySearch.java 文件代码&#xff1a; 二分搜索树 一、概念及其介绍 二分搜索树&#xff08;英语&#xff1a;Binary Search Tree&#xff09;&#xff…

20.液体加载特效

效果 源码 <!doctype html> <html> <head><meta charset="utf-8"><title>Milk | Liquid Loader Animation</title><link rel="stylesheet" href="style.css"> </head> <body><div cl…

【Flutter】Flutter 使用 Equatable 简化对象比较

【Flutter】Flutter 使用 Equatable 简化对象比较 文章目录 一、前言二、Equatable 简介三、为什么需要 Equatable&#xff1f;四、如何使用 Equatable五、Equatable 的其他特性六、完整的业务代码示例七、总结 一、前言 在 Flutter 开发中&#xff0c;我们经常需要比较对象的…

Python基础以及代码

Python基础以及代码 1.第一个代码如下&#xff1a; # 项目&#xff1a;第一个项目 # 作者&#xff1a;Adair # 开放时间&#xff1a; 2023/8/15 21:52print("Hello,world!!")如图所示&#xff1a; 2.数字的代码如下&#xff1a; # 项目&#xff1a;演示第一个项…

什么是Web组件(Web Components)?它们有哪些主要特点?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Web 组件&#xff08;Web Components&#xff09;⭐ Web 组件的主要特点1. 自定义元素&#xff08;Custom Elements&#xff09;2. Shadow DOM3. HTML 模板4. 封装性和重用性5. 生态系统6. 跨框架兼容性 ⭐ 写在最后 ⭐ 专栏简介 前端入门…

新能源技术是实现碳达峰碳中和的必然路径

在绿色经济发展的时代背景之下&#xff0c;光伏屋顶瓦顺势而生。集发电、环保功能于一体的光伏屋顶瓦&#xff0c;让每一栋建筑都能成为一座绿色发电站&#xff0c;实现建筑用电自给&#xff0c;有效降低建筑能耗&#xff0c;极大的推动生态建筑和生态城市的发展。 太阳能光伏瓦…

win10/11电脑中病毒后programdata文件夹不显示,其他文件夹不显示问题,文件夹存在不显示问题解决

首先出现这个问题确保是打开了显示隐藏文件夹 发现问题还是没有解决继续往下看 就是上边这个文件夹&#xff0c;我解决之前忘记截图了&#xff0c;这是解决后的图 这个文件夹是系统应用程序数据缓存文件夹&#xff0c;很重要 好多病毒就是优先隐藏此文件夹来监视系统数据&…

【洛谷算法题】B2005-字符三角形【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】B2005-字符三角形【入门1顺序结构】&#x1f30f;题目描述&#x1f30f;输入格式…

ChatGPT Prompting开发实战(三)

一、关于chaining prompts与CoT的比较 前面谈到的CoT的推理过程&#xff0c;可以比作是一次性就烹调好一顿大餐&#xff0c;那么接下来要说的“chaining prompts”&#xff0c;其背后的理念是分多次来完成这样一项复杂任务&#xff0c;每次只完成其中一步或者一个子任务。核心…

猜拳游戏小程序源码 大转盘积分游戏小程序源码 积分游戏小程序源码

简介&#xff1a; 猜拳游戏大转盘积分游戏小程序前端模板源码&#xff0c;一共五个静态页面&#xff0c;首页、任务列表、大转盘和猜拳等五个页面 图片&#xff1a;

计算数组中各元素的方差 忽略数组中所有的nan值 numpy.nanvar()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算数组中各元素的方差 忽略数组中所有的nan值 numpy.nanvar() [太阳]选择题 请问关于以下代码最后输出结果的是&#xff1f; import numpy as np a np.array([1, np.nan, 3]) print("…

QT day1登录界面设计

要设计如下图片&#xff1a; 代码如下&#xff1a; main.cpp widget.h widget.cpp 运行效果&#xff1a; 2&#xff0c;思维导图

Mac下Docker Desktop安装命令行工具、开启本地远程访问

Mac系统下&#xff0c;为了方便在terminal和idea里使用docker&#xff0c;需要安装docker命令行工具&#xff0c;和开启Docker Desktop本地远程访问。 具体方法是在设置-高级下&#xff0c; 1.将勾选的User调整为System&#xff0c;这样不用手动配置PATH即可使用docker命令 …

Windows部署ftp

Windows部署ftp 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.安装包&#xff0c;需要的可以滴滴我 2.部署 就修改下面标注的&#xff0c;别的可以不动 如果想要多个用户&#xff0c;复制这些&#xff0c;把名字&#xff0c;密码改改就行 端口 启动 cmd窗口不要关闭…

sv断言积累

基本概念&#xff1a; ​​​​​​​​​​​​​​​​​​​​​https://www.cnblogs.com/lyc-seu/p/12718412.htmlhttps://www.cnblogs.com/lyc-seu/p/12718412.html 波形查看&#xff1a; 断言波形显示_波形中看断言_风起云涌66的博客-CSDN博客文章目录一、为何要在波形…

详解 Vue 3 使用了 Proxy 对象来替代 Vue 2 中的 Object.defineProperty

在 Vue 2 中&#xff0c;响应式系统使用了 Object.defineProperty 来实现属性的劫持和监听。这种方式需要在对象上定义 getter 和 setter&#xff0c;以便在属性被访问或修改时触发相应的操作。 然而&#xff0c;Object.defineProperty 有一些限制和性能问题。它只能劫持对象的…

华为云软件精英实战营——感受软件改变世界,享受Coding乐趣

机器人已经在诸多领域显现出巨大的商业价值&#xff0c;华为云计算致力于以云助端的方式为机器人产业带来全新机会 如果您是开发爱好者&#xff0c;想了解华为云&#xff0c;想和其他自由开发者交流经验&#xff1b; 如果您是学生&#xff0c;想和正在从事软件开发行业的大佬…

5G工业网关赋能救护车远程监控,助力高效救援

智慧医疗是传统医疗业发展进步的必要趋势&#xff0c;医疗设备通过物联网技术的应用实现智能化转型。通过5G工业网关将医疗器械等设备的数据采集再经过专网传输到医疗系统中&#xff0c;实现医疗设备间的数据共享和远程监控&#xff0c;能够帮助医疗行业大大提高服务质量和管理…

如何在B站进行学习直播

诸神缄默不语-个人CSDN博文目录 会根据我使用的情况进行持续更新 文章目录 1. 电脑 - 哔哩哔哩直播姬1. 软件的基础使用2. 素材1. 摄像头2. 窗口捕捉3. 游戏进程图片文字浏览器 3. H5插件其他注意事项 2. 手机直播3. iPad直播 1. 电脑 - 哔哩哔哩直播姬 1. 软件的基础使用 电…