T113-S3-ov5640摄像头调试

news2025/7/5 19:00:12

目录

前言

一、ov5640模组介绍

1. 图像传感器特性

2. 接口和控制

3. 图像处理能力

4. 应用领域

二、原理图连接 

三、设备树配置

四、驱动配置

五、ov5640使用

六、异常记录

总结


前言

        摄像头模块是嵌入式系统中常见的外设,用于捕获图像和视频。在本篇文章中,我们将介绍如何在T113-S3平台上调试OV5640摄像头,以捕获图像或视频流。


一、ov5640模组介绍

OV5640是OmniVision Technologies生产的一款1/4英寸CMOS数字图像传感器,通常用于嵌入式系统和移动设备中的摄像头模组。以下是对OV5640摄像头模组的详细介绍:

1. 图像传感器特性

  • 分辨率:OV5640支持最高500万像素的图像分辨率,通常用于拍摄高质量的照片和视频。
  • 图像尺寸:常见的图像尺寸包括2592x1944、2048x1536、1600x1200、1280x960和其他。
  • 像素尺寸:传感器像素尺寸为1.4微米 x 1.4微米,有助于捕获细节丰富的图像。
  • 帧率:OV5640支持不同的帧率设置,允许在不同应用中进行视频捕获。

2. 接口和控制

  • 数字接口:OV5640通常使用MIPI CSI-2(移动产业处理器接口 - 2)或其他数字接口连接到主机设备,如嵌入式系统或手机。
  • I2C控制:传感器参数可以通过I2C接口进行配置和控制,以满足不同应用的需求。通过I2C,你可以调整曝光、对焦、白平衡等设置。

3. 图像处理能力

  • 自动曝光:OV5640支持自动曝光控制,可根据环境光线调整曝光时间,以确保图像质量。
  • 自动对焦:一些OV5640模组配备了自动对焦功能,可实现清晰的图像捕获。
  • 图像增强:支持一系列图像增强功能,如去噪、色彩增强和锐化,以提高图像质量。
  • HDR(高动态范围):一些模组支持HDR,有助于在不同光照条件下捕获具有更大动态范围的图像。

4. 应用领域

OV5640摄像头模组广泛应用于各种领域,包括但不限于:

  • 智能手机和平板电脑:用于前置或后置摄像头,支持高分辨率的照片和视频捕获。
  • 嵌入式系统:用于工业视觉、机器人、监控摄像头、医疗设备和物联网(IoT)应用。
  • 消费电子:包括数字相机、智能眼镜、智能家居设备等。
  • 汽车应用:用于车载摄像头、驾驶辅助系统和车内监控。

二、原理图连接 

        OV5640摄像头模块通过mipi-csi并口连接到到T113-S3 CPU上,通过i2c接口完成摄像头模块的配置        

  1. 连接OV5640的电源引脚(通常为3.3V或5V)到T113-S3的相应电源引脚。
  2. 连接OV5640的地引脚到T113-S3的地引脚。
  3. 连接OV5640的I2C数据线(SDA)到T113-S3的I2C数据引脚。
  4. 连接OV5640的I2C时钟线(SCL)到T113-S3的I2C时钟引脚。
  5. 连接OV5640的数据引脚(D0-D7)到T113-S3的相应数据引脚。

        确保连接稳固且没有接触到其他不应接触的引脚。同时,确保摄像头模块的供电电压和电流需求得到满足。具体连接如下图所示:

三、设备树配置

        在device/config/chips/t113/configs/evb1_auto/board.dts设备树文件中完成ov5640模块驱动配置

        i2c接口配置如下所示,其中i2c clock可在100k~400k之间可调:

&twi2_pins_a{
        pins = "PE12", "PE13";
        function = "twi2";
        drive-strength = <10>;
};

&twi2_pins_b{
        pins = "PE12", "PE13";
        function = "gpio_in";
};

/* used for vind0 */
&twi2 {
        clock-frequency = <100000>;
        pinctrl-0 = <&twi2_pins_a>;
        pinctrl-1 = <&twi2_pins_b>;
        pinctrl-names = "default", "sleep";
        twi_drv_used = <0>;
        dmas = <&dma 45>, <&dma 45>;
        dma-names = "tx", "rx";
        status = "okay";
};

ov5640模组设备树配置:

&vind0{
    status = "okay";

        csi0: csi@5801000{
                compatible = "allwinner,sunxi-csi";
                reg = <0x0 0x05801000 0x0 0x1000>;
                interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
                //pinctrl-names = "default","sleep";
                pinctrl-names = "default";
                pinctrl-0 = <&csi0_pins_a>;
                pinctrl-1 = <&csi0_pins_b>;
                device_id = <0>;
                iommus = <&mmu_aw 1 1>;
                status = "okay";
        };

        isp0: isp@5809410 {
                        compatible = "allwinner,sunxi-isp";
                        reg = <0x0 0x05809410 0x0 0x10>;
                        device_id = <0xfe>;

                        status = "okay";
        };
        isp1: isp@5809420 {
                        compatible = "allwinner,sunxi-isp";
                        reg = <0x0 0x05809420 0x0 0x10>;
                        device_id = <0xff>;
                        status = "okay";
        };
        scaler0: scaler@5809430 {
                        compatible = "allwinner,sunxi-scaler";
                        reg = <0x0 0x05809430 0x0 0x10>;
                        device_id = <0xfe>;
                        status = "okay";
        };
        scaler1: scaler@5809440 {
                        compatible = "allwinner,sunxi-scaler";
                        reg = <0x0 0x05809440 0x0 0x10>;
                        device_id = <0xff>;
                        status = "okay";
        };
        actuator0: actuator@5809450 {
                        compatible = "allwinner,sunxi-actuator";
                        device_type = "actuator0";
                        reg = <0x0 0x05809450 0x0 0x10>;
                        actuator0_name = "ad5820_act";
                        actuator0_slave = <0x18>;
                        actuator0_af_pwdn = <>;
                        actuator0_afvdd = "afvcc-csi";
                        actuator0_afvdd_vol = <2800000>;
                        status = "okay";
        };
        flash0: flash@5809460 {
                        device_type = "flash0";
                        compatible = "allwinner,sunxi-flash";
                        reg = <0x0 0x05809460 0x0 0x10>;
                        flash0_type = <2>;
                        flash0_en = <>;
                        flash0_mode = <>;
                        flash0_flvdd = "";
                        flash0_flvdd_vol = <>;
                        device_id = <0>;
                        status = "okay";
        };

        //NCSI
        sensor0: sensor@5809470 {
                reg = <0x0 0x05809470 0x0 0x10>;
                device_type = "sensor0";
                compatible = "allwinner,sunxi-sensor";
                sensor0_mname = "ov5640";
                sensor0_twi_cci_id = <2>;
                sensor0_twi_addr = <0x78>;
                sensor0_mclk_id = <0>;
                sensor0_pos = "rear";
                sensor0_isp_used = <0>;
                sensor0_fmt = <0>;
                sensor0_stby_mode = <0>;
                sensor0_vflip = <0>;
                sensor0_hflip = <0>;
                sensor0_iovdd-supply = <>;
                sensor0_iovdd_vol = <>;
                sensor0_avdd-supply = <>;
                sensor0_avdd_vol = <>;
                sensor0_dvdd-supply = <>;
                sensor0_dvdd_vol = <>;
                sensor0_power_en = <>;
                /* sensor0_reset = <&pio PE 9 GPIO_ACTIVE_LOW>; */
                /* sensor0_pwdn = <&pio PE 8 GPIO_ACTIVE_LOW>; */
                sensor0_sm_vs = <>;
                flash_handle = <&flash0>;
                act_handle = <&actuator0>;
                device_id = <0>;
                status  = "okay";
        };

        vinc0:vinc@5809000 {
                vinc0_csi_sel = <0>;
                vinc0_mipi_sel = <0xff>;
                vinc0_isp_sel = <0>;
                vinc0_isp_tx_ch = <0>;
                vinc0_tdm_rx_sel = <0xff>;
                vinc0_rear_sensor_sel = <0>;
                vinc0_front_sensor_sel = <0>;
                vinc0_sensor_list = <0>;
                status = "okay";
        };
        vinc1:vinc@5809200 {
                vinc1_csi_sel = <0>;
                vinc1_mipi_sel = <0xff>;
                vinc1_isp_sel = <0>;
                vinc1_isp_tx_ch = <1>;
                vinc1_tdm_rx_sel = <0xff>;
                vinc1_rear_sensor_sel = <0>;
                vinc1_front_sensor_sel = <0>;
                vinc1_sensor_list = <0>;
                status = "okay";
        };
};

        其中sensor0_reset为模组复位io管脚,硬件电路需要预留出来,不然一旦模组异常就无法恢复,ov5640驱动程序也有reset和power控制管脚,当ov5640模组异常时可以对其恢复。

四、驱动配置

        由于全志官方SDK暂时还没有对ov5640驱动程序进行验证,所有驱动程序暂时不能通过menuconfig图形界面区配置,只能通过手动修改Makefile的方式进行驱动添加,驱动程序路径如下所示

kernel/linux-5.4/drivers/media/platform/sunxi-vin/modules/sensor/ov5640.c

修改Makefile使驱动程序编译进内核

obj-y                   += ov5640.o
#obj-m                  += ov2775_mipi.o
#obj-m                  += gc2145.o
obj-m                   += gc0310_mipi.o
#obj-m                  += gc2355_mipi.o
obj-m                   += gc030a_mipi.o
obj-m                   += gc2385_mipi.o
#obj-m                  += gc5024_mipi.o
obj-m                   += gc5025_mipi.o
obj-m                   += c2590_mipi.o
obj-m                   += sp5409_mipi.o
#obj-m                  += imx214.o
#obj-m                  += imx219.o
#obj-m                  += imx274_slvds.o
#obj-m                  += imx291_dvp.o
#obj-m                  += imx291_mipi.o
#obj-m                  += imx317_mipi.o
#obj-m                  += imx335_mipi.o
#obj-m                  += imx326_mipi.o
#obj-m                  += imx477_mipi.o
#obj-m                  += ov2710_mipi.o
#obj-m                  += ov2718_mipi.o
#obj-m                  += ar0238.o
obj-m                   += ov8858_r2a_4lane.o
obj-m                   += ov2680_mipi.o
obj-m                   += imx278_mipi.o
obj-m                   += imx278_2lane_mipi.o
obj-m                   += imx386_2lane_mipi.o
obj-m                   += imx386_mipi.o
#obj-m                  += s5k3h5xa.o
#obj-m                  += ar0238_hispi.o
#obj-m                  += nvp6134/
#obj-m                  += nvp6324/
obj-m                   += nvp6158/
#obj-m                  += rn6854m_mipi.o
#obj-m                  += tp9950.o
#obj-m                  += sc2232_mipi.o
obj-m                   += n5_dvp.o

五、ov5640使用

        ov5640驱动正常加载如下图所示:

        正常识别摄像头会有[ov5640]V4L2 IDENT SENSOR = 5640信息打印,上述clk fail等信息无影响,此时在/dev下有video0、video1、video4三个节点,操作video0即可获取到图像数据

抓取摄像头视频流数据:

        由于该驱动不支持v4l2-ctl工具进行视频流抓取操作,通过咨询FAE,使用全志官方提供的sdktest进行视频流抓取。

1、修改sdktest测试工具配置文件dvrconfig.ini配置文件,修改视频像素大小为1280*720

2、修改视频保存位置目录:

3、执行sdktest 1 0命令启动视频流数据保存,保存打印如下所示:

图像以mp4格式保存在frontVideo0目录下

视频效果截图如下:

六、异常记录

        1、oi2c通信异常:sunxi-i2c sunxi-i2c2: SLA+W has been transmitted; ACK not received

在确认i2c硬件连接正常以及i2c有上拉电阻的情况下,一般是由于csi时钟异常引起,特别注意,当csi时钟异常无输出时,ov5640 i2c不会响应。

我这边是由于没有使能csi clk输出导致,csi时钟正确配置如下图:

2、显示[VIN ERR]media entity find link null

由于vinc0、vinc1节点没有配置导致,正确开启则不会报link错误:


总结

        通过正确连接硬件、配置摄像头接口和使用适当的软件工具,你可以在T113-S3平台上成功调试OV5640摄像头,捕获图像或视频流。这只是一个简单的示例,你可以根据自己的需求进一步扩展功能,例如实时视频处理或与其他传感器集成。。

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

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

相关文章

一不留神就掉坑

乘除顺序问题 在据卡特兰数[1]公式,解决leetcode-96 不同的二叉搜索树[2]时,遇到一个非常诡异的问题, package mainimport "fmt"func main() { for i : 0; i < 40; i { fmt.Printf("第%d个卡特兰数为:%d\n", i, numTrees(i)) }}func numTrees(n int) i…

【超详细~KVM】KVM概述、安装及简单操作-------从小白到大神之路之学习运维第91天

第四阶段提升 时 间&#xff1a;2023年8月30日 参加人&#xff1a;全班人员 内 容&#xff1a; KVM概述、安装及简单操作 目录 一、KVM 概述 二、KVM工作原理 三、KVM应用场景 四、centos7 下安装部署 五、新建虚拟机步骤 1、创建存储池并创建存储卷 2、点击号创建…

MPI之通信模式(标准,缓存,同步,就绪)

MPI缓冲区 由MPI自行维护的一块内存区域&#xff0c;也可由用户(MPI_Bsend)自行维护&#xff1b;发送方 维护一块发送缓冲区&#xff1b; 接收方 维护一块接收缓冲区。 数据收发过程&#xff1a; 当发送端将数据拷贝到自身的数据缓冲区后(注意这里是拷贝&#xff0c;即数据到…

Redis——认识Redis

简单介绍 Redis诞生于2009年&#xff0c;全称是Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 特征 键值&#xff08;Key-value&#xff09;型&#xff0c;value支持多种不同数据结构&#xff0c;功能丰富单线程&…

多线程专栏------多线程的实现方式(三)

目录 1、使用线程池1.1、什么是线程池1.2、使用线程池的优点1.3、线程池的核心工作流程1.3、线程池的五种状态生命周期1.3.1、RUNNING1.3.2、SHUTDOWN1.3.3、STOP1.3.4、TIDYING1.3.5、TERMINATED 1.4、创建线程池的方式1.4.1、通过 ThreadPoolExecutor 创建1.4.1.1、线程池的核…

类的静态成员变量 static member

C自学精简教程 目录(必读) 类的静态成员 static member 变量全局只有一份副本&#xff0c;不会随着类对象的创建而产生副本。 static 静态成员 在类的成员变量前面增加static关键字&#xff0c;表示这个成员变量是类的静态成员变量。 #include <iostream> using name…

kaggle赛后总结

1. 宽表 2.缺失值的处理方法 最简单粗暴的就是删除&#xff0c;这种情况是凡是有缺失值行数很少。均值替代。缺失值的行数比较多一点儿的时候&#xff0c;直接删除会影响样本数量&#xff0c;那就均值替代&#xff0c;或者中位数替代等方法。还有复杂的方法&#xff0c;把有缺…

NMS(非极大值抑制)的 Python 实现

文章目录 1. NMS的步骤2. Python代码 非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;NMS&#xff09;是一种在目标检测中常用的技术。 NMS的目的是消除重叠区域中冗余的边界框&#xff0c;并选择最具代表性的目标作为最终结果。通过调整重叠阈值&#xff0c;可…

400电话号码怎么开通

开通400电话是企业提供客户服务的重要步骤。下面是一些步骤和注意事项&#xff0c;帮助您顺利开通400电话。 第一步&#xff1a;选择400电话服务提供商 选择一家可靠的400电话服务提供商非常重要。您可以通过搜索引擎、咨询行业内人士或者参考其他企业的经验来选择合适的服务提…

FLASH读写数据

目录 嵌入式 Flash大概了解 数据手册2.3.2章节 结构图f407 等待周期 Flash 控制寄存器解锁 编程/擦除并行位数 擦除 编程&#xff08;写入&#xff09; 工程程序 嵌入式 Flash大概了解 可以从flash区域启动程序&#xff1b;大概是程序区可以在flash&#xff0c;所以是可以…

python调用git出错:ImportError: Failed to initialize: Bad git executable.

报错信息 #报错信息 Traceback (most recent call last): File “”, line 1, in File “C:\Python27\lib\site-packages\git_init_.py”, line 85, in raise ImportError(‘Failed to initialize: {0}’.format(exc)) ImportError: Failed to initialize: Bad git executab…

春秋云镜 CVE-2018-16283

春秋云镜 CVE-2018-16283 WordPress Plugin Wechat Broadcast LFI 靶标介绍 WordPress Plugin Wechat Broadcast LFI 启动场景 漏洞利用 exp # Exploit Title: WordPress Plugin Wechat Broadcast 1.2.0 - Local File Inclusion # Author: Manuel Garcia Cardenas # Date:…

图论-01-图的基本表示-邻接矩阵和邻接表-Java

文章目录 邻接矩阵邻接表邻接表的问题和改进总结 邻接矩阵 import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;public class AdjMatrix {private int V;private int E;private int[][] adj;// 构造函数&#xff0c;从文…

利用网络流通过拆点判断图的路径存在性问题:abc318_g

https://atcoder.jp/contests/abc318/tasks/abc318_g 对于图上一类路径是否存在问题&#xff0c;可以考虑网络流。 Trick1 路径存在转网络流 题目转化为&#xff1a; 找出两条不交路径 B->A, B->C 对于已经找到的路径&#xff0c;我们不能再走。对于当前我们找到的某条…

Matlab图像处理-幂次变换

幂次变换 如下图所示的幂次变换函数曲线图&#xff1a; 当γ <1时&#xff0c;效果和对数变换相似&#xff0c;放大暗处细节&#xff0c;压缩亮处细节&#xff0c;随着数值减少&#xff0c;效果越强。 当γ >1时&#xff0c;放大亮处细节&#xff0c;压缩暗处细节&…

云备份——配置信息及获取配置信息类模块

一&#xff0c;配置信息 使用文件配置加载一些程序的运行关键信息&#xff0c;如ip&#xff0c;端口等&#xff0c;可以让程序的运行更加灵活 我们需要的配置信息如下 IP地址端口号热点判断时间&#xff0c;也就是非热点文件的时间要求文件下载的URL前缀路径&#xff0c;用于表…

Matlab图像处理-

对数变换 对数变换的一项主要应用是压缩动态范围。一些特别的图像在实际显示中&#xff0c;高灰度值部分较占优势&#xff0c;而低灰度值的可见细节部分丢失。通过计算对数&#xff0c;如10的动态范围会降至14左右[即 ln1013.8]&#xff0c;这样就更易于处理。 对数变换就是压…

Pygame中Trivia游戏解析6-4

3.3.3 显示题目选项 在显示题目选项时&#xff0c;有三种情况&#xff1a;分别是用户还未选择答案时&#xff1b;用户的答案是正确时&#xff1b;用户的答案是错误时。 &#xff08;1&#xff09;用户还未选择答案时 此时&#xff0c;用白色显示四个备选答案&#xff0c;如图…

数据工厂-生成接口通用用例

章节目录&#xff1a; 一、背景介绍二、前置准备三、设计思路四、代码具体实现五、执行效果六、其他说明七、结束语 一、背景介绍 有哪些用例是可以通用且固定的&#xff1f; 针对之前提到的接口用例设计思路&#xff0c;拆分为三个切入点&#xff1a; 举个例子&#xff1a; {…

【原创】H3C三层交换机VLAN路由

网络拓扑图 VLAN 配置 VLAN 100 VLAN 200 [H3C]int vlan 100 ip address 1.1.1.1 255.255.255.0[H3C-Vlan-interface100]int vlan 200 ip address 2.2.2.1 255.255.255.0[H3C]int GigabitEthernet 1/0/1port access vlan 100[H3C]int GigabitEthernet 1/0/2port access vlan 2…