全志V3S嵌入式驱动开发(USB camera驱动)

news2024/9/23 21:19:12

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        soc和mcu的一个重要区别,就是soc会涉及到大量的音视频操作,当然音视频也就包括了camera摄像头这部分。v3s本身支持csi接口和mipi csi2接口。但是两者不能同时使用,一份电路图,只能使用一种接口。另外,厂家对于两份接口的支持也是不同的,对于csi,官方soc文档中给出了主要的寄存器配置信息;而对mipi cs2则支持有限,只是一份介绍性的文档。

1、mipi csi2电路图

         这是mipi csi2的驱动电路,整个结构还是很清楚的。CK_P & CK_N是时钟差分,D0_P & D0_N、D1_P & D1_N是数据差分。另外三个信号是MCLK、PWDN和RST。AVDD是电压信号,2.8V。上面这些都是数据通讯的信号线。控制信号线则比较简单,主要就是IIC接口,即SCK和SDA。

        电路上看camera接口还是比较简单的,几乎没有什么难度。而难点正是在于软件驱动的编写,而使用频率比较高的mipi csi2又没有相关的驱动支持,这就有点尴尬。除此之外,对于h264这样的编解码支持,目前文档上面体现的也不多,这也有点遗憾。

2、usb camera

        为了弥补camera的遗憾,同时可以让大家继续学习和了解camera,另外一个方向,大家可以试试usb camera。使用usb camera有几个好处,第一,本身linux kernel就对usb camera uvc支持,不需要做额外的工作,就可以适配很多的第三方摄像头;第二;相关的摄像头也比较容易采购,选择余地较多;第三,有了驱动之后,大家也方便对/dev/video0进行操作,进行图片的后续处理,或者相关视频的开发工作。

3、设备树配置

        设备树的配置没有特别需要注意的。和usb host一样,它所要做的就是就是把usb_otg中的dr_mode修改为host,其他部分不需要则不做修改。

&usb_otg {
	dr_mode = "host";
	status = "okay";
};

        后续其他所有的usb设备,只要v3s是作为host访问,基本设备树这边的修改都是这样的。

4、uvc驱动的修改

        目前关于usb camera这部分的配置,主要位于drivers->Multimedia support这个部分,

         自从内核从4.14.y升级到5.2.y之后,关于usb camera这部分驱动,默认已经配置好。因此对于我们来说,唯一需要修改的,就是把Multimedia support下面所有的M选项,修改成y选项。这也就是说明,相关的驱动代码没有被编译成单独的ko文件,而是集成在zImage里面。这主要是对于我们测试来说比较方便。修改之后,可以通过diff查看下,相关的内容是如何修改的,

2097,2098c2096,2097
< CONFIG_VIDEO_TUNER=y
< CONFIG_V4L2_FWNODE=y
---
> CONFIG_VIDEO_TUNER=m
> CONFIG_V4L2_FWNODE=m
2115c2114
< CONFIG_USB_VIDEO_CLASS=y
---
> CONFIG_USB_VIDEO_CLASS=m
2117c2116
< CONFIG_USB_GSPCA=y
---
> CONFIG_USB_GSPCA=m
2191,2192c2190,2191
< CONFIG_VIDEO_EM28XX=y
< CONFIG_VIDEO_EM28XX_V4L2=y
---
> CONFIG_VIDEO_EM28XX=m
> CONFIG_VIDEO_EM28XX_V4L2=m
2198c2197
< CONFIG_VIDEO_MUX=y
---
> CONFIG_VIDEO_MUX=m
2200c2199
< CONFIG_VIDEO_SUN6I_CSI=y
---
> CONFIG_VIDEO_SUN6I_CSI=m
2215c2214
< CONFIG_VIDEO_TVEEPROM=y
---
> CONFIG_VIDEO_TVEEPROM=m
2217,2221c2216,2220
< CONFIG_VIDEOBUF2_CORE=y
< CONFIG_VIDEOBUF2_V4L2=y
< CONFIG_VIDEOBUF2_MEMOPS=y
< CONFIG_VIDEOBUF2_DMA_CONTIG=y
< CONFIG_VIDEOBUF2_VMALLOC=y
---
> CONFIG_VIDEOBUF2_CORE=m
> CONFIG_VIDEOBUF2_V4L2=m
> CONFIG_VIDEOBUF2_MEMOPS=m
> CONFIG_VIDEOBUF2_DMA_CONTIG=m
> CONFIG_VIDEOBUF2_VMALLOC=m
2232c2231
< CONFIG_VIDEO_MSP3400=y
---
> CONFIG_VIDEO_MSP3400=m
2241,2242c2240,2241
< CONFIG_VIDEO_SAA711X=y
< CONFIG_VIDEO_TVP5150=y
---
> CONFIG_VIDEO_SAA711X=m
> CONFIG_VIDEO_TVP5150=m
2255,2256c2254,2255
< CONFIG_VIDEO_OV2640=y
< CONFIG_VIDEO_MT9V011=y
---
> CONFIG_VIDEO_OV2640=m
> CONFIG_VIDEO_MT9V011=m
3636c3635
< CONFIG_MULTIPLEXER=y
---
> CONFIG_MULTIPLEXER=m

        箭头<表示新添加的内容,箭头>表示删除的内容,大家灵活比较一下即可。

5、编译烧入文件

        因为dts和内核代码都发生了改变,所以我们需要分别生成dtb文件、zImage文件。等到编译完成之后,烧入即可。

6、开始测试

        所有的文件都准备之后,就可以开始准备测试了。测试可以分成三个部分,第一,当usb camera插入的时候,看看有没有具体的打印信息,

# [  101.038523] usb 1-1: new high-speed USB device number 2 using ehci-platform
[  101.283232] usb 1-1: New USB device found, idVendor=0bda, idProduct=9143, bcdDevice=20.22
[  101.291460] usb 1-1: New USB device strings: Mfr=3, Product=1, SerialNumber=2
[  101.298638] usb 1-1: Product: USB Camera
[  101.302573] usb 1-1: Manufacturer: RYS
[  101.306326] usb 1-1: SerialNumber: 200901010001
[  101.320010] uvcvideo: Found UVC 1.00 device USB Camera (0bda:9143)
[  101.347812] uvcvideo 1-1:1.0: Entity type for entity Realtek Extended Controls Unit was not initialized!
[  101.357392] uvcvideo 1-1:1.0: Entity type for entity Extension 4 was not initialized!
[  101.365273] uvcvideo 1-1:1.0: Entity type for entity Processing 2 was not initialized!
[  101.373224] uvcvideo 1-1:1.0: Entity type for entity Camera 1 was not initialized!
[  101.381864] input: USB Camera: USB Camera as /devices/platform/soc/1c1a000.usb/usb1/1-1/1-1:1.0/input/input1

        第二,查看对应的video设备节点有没有生成,

# ls -l /dev/video*
crw-------    1 root     root       81,   0 Jan  1 00:01 /dev/video0
crw-------    1 root     root       81,   1 Jan  1 00:01 /dev/video1

        第三,编写程序,对/dev/video节点进行访问,查看是否可以进行截图操作。这里我们参考了网上的一份代码,地址在https://blog.csdn.net/zhangdaxia2/article/details/72763847。链接地址的最后直接给出了源代码,不妨命名为new_video.c,交叉编译之后copy到开发板,

arm-linux-gnueabihf-gcc new_video.c -g -o new_video

        等到文件准备好之后,就可以准备开始截图操作了。因为相关的摄像头是/dev/video0,所以只需要输入./new_video 0即可,

# ./new_video 0
use video 0
video 0--------------capability------------------
driver:uvcvideo    
card:USB Camera: USB Camera   
capabilities:84a00001
-------------VIDIOC_ENUM_FMT--------------
index:0   
pixelformat:MJPG  
description:Motion-JPEG
index:1   
pixelformat:YUYV  
description:YUYV 4:2:2
-----------------VIDIOC_G_FMT----------------------
width:640   
height:480   
type:1   pixelformat:YUYV
----------------mmap----------------
start:b6db2000  length:614400
start:b6d1c000  length:614400
start:b6c86000  length:614400
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------

        不出意外的话,你会看到上卖弄这些打印,除此之外,ls一下,还可以看到生成的10张bmp图像,

# ls -l
total 10312
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb0.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb1.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb2.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb3.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb4.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb5.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb6.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb7.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb8.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb9.bmp

        为了验证效果,此时可以拔掉usb摄像头,重新插入u盘,mount到/mnt目录之后,就可以把所有的bmp图像拷贝到U盘出上。重新u盘插上电脑,用一个看图软件看一下效果,就能判断出是不是camera真的是有效果。目前看下来,拍摄的前面几张图片比较暗淡,后面是正常的,这一点略微有点奇怪。

        至此,usb camera的部分算是讲完了,大家可以自己做做实验,加深一下印象和认知。

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

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

相关文章

webpack优化代码运行之Code split

一、 什么是code split Webpack的code split是一种技术&#xff0c;它能够将代码分割成多个块&#xff0c;从而优化应用程序的性能。这样做可以实现按需加载和并行加载&#xff0c;从而减少初始化时间和请求次数。Code split在Webpack中通过使用entry语法和各种Loader和插件来…

享元模式:减少内存占用的诀窍

一&#xff0c;概要 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它主要通过共享对象来降低系统中对象的数量&#xff0c;从而减少内存占用和提高程序性能。这听起来有点像单例模式&#xff0c;但它们在实现和用途上有很大的区别。享元…

JavaScript Day01 初识JavaScript

文章目录 1.初识JavaScript1.1.什么是JavaScript1.2.JavaScript的组成部分1.3.JavaScript的历史-JavaScript发展历史-系统环境-编辑器-运行环境-调试&#xff1a; 2. js组成2.1 ECMAScrpt 【js标准】&#xff08;兼容性100%&#xff09; (类似于CoreJava&#xff0c;制定了基础…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 阿里巴巴找黄金宝箱(III)

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客阿里巴巴找黄金宝箱(III) 题目描述 贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c;每个箱子上面贴有一个数字。 阿里巴巴念出一个咒…

SpringMVC 学习整理

文章目录 一、SpringMVC 简介1.1 什么是MVC1.2 什么是Spring MVC1.3 Spring MVC的特点 二、SpringMVC 快速入门三、RequestMapping注解说明四、SpringMVC获取请求参数4.1 通过ServletAPI获取请求参数4.2 通过控制器方法的形参获取请求参数4.3 通过RequestParam接收请求参数4.4 …

Elasticsearch:实用 BM25 - 第 3 部分:在 Elasticsearch 中选择 b 和 k1 的注意事项

这是系列文章的第三篇文章。之前的文章是&#xff1a; Elasticsearch&#xff1a;实用 BM25 - 第 1 部分&#xff1a;分片如何影响 Elasticsearch 中的相关性评分 Elasticsearch&#xff1a;实用 BM25 - 第 2 部分&#xff1a;BM25 算法及其变量 选择 b 和 k1 值得注意的是&…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 比赛的冠亚季军

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客比赛的冠亚季军 题目描述 有个运动员&#xff0c;他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛&#xff0c;需要决出冠亚军。比赛的规则是0号和1号比赛&#xff0c;2号和3号比赛&#xff0c;以此类推…

014、数据库管理之配置管理

配置管理 TiDB配置系统配置集群配置配置的存储位置区分TiDB的系统参数和集群参数 系统参数系统参数的作用域系统参数的修改 集群参数集群参数的修改配置参数的查看 实验一&#xff1a; 在不同作用域下对数据库的系统参数进行修改session级别global级别 实验二&#xff1a; 修改…

Redis入门(二)

3.7 Redis 默认16个库 1&#xff09;Redis默认创建16个库,每个库对应一个下标,从0开始. 通过客户端连接后默认进入到0 号库&#xff0c;推荐只使用0号库. 127.0.0.1:6379> 16个是因为配置文件中是这样的 [aahadoop102 redis]$ vim redis.conf 2&#xff09;使用命令 sele…

DataX和SQLServer的导入导出案例

DataX和SQLServer的导入导出案例 文章目录 DataX和SQLServer的导入导出案例写在前面SQLServer数据库的简单使用SQLServer数据库一些常用的Shell脚本命令创建数据库 DataX 导入导出案例创建表并插入数据读取 SQLServer 的数据导入到 HDFS读取 SQLServer 的数据导入 MySQL 总结 写…

【C++Coppeliasim】UR机械臂位置正逆解Coppeliasim集成测试

前言&#xff1a; 基于改进的 Denavit-Hartenberg 参数的UR机械臂正向运动学求解和基于几何分析的逆运动学求解。该代码在 C 和 MATLAB 中可用&#xff0c;两者都与 CoppeliaSim 集成。 该解决方案是使用 Microsoft Visual Studio 2022 和 C 20 标准构建的。 依赖&#xff1a; …

C++ 类继承

目录 类继承基类派生一个类构造函数访问权限派生类与基类之间的特殊关系 完整demo 类继承 基类 #ifndef __TEST_1_H_ #define __TEST_1_H_ #include <iostream> #include<string> using namespace std; typedef unsigned int uint;//father class class TableTen…

《编译原理》2022年期末试卷

北京信息科技大学《编译原理》2022年期末考试 试卷附录

双指针-链表相交

面试题 02.07. 链表相交 同&#xff1a;160.链表相交 力扣题目链接 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保…

用c语言查找交通肇事者。

问题&#xff1a; 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有3人目击事件&#xff0c;但都没有记住车号&#xff0c; 只记下车号的一些特征。 甲说&#xff1a;“牌照的前两位数字是相同的”。 乙说&#xff1a;“牌照的后两位…

如何高效阅读源码

最近在研究一款开源软件&#xff0c;从初步上手使用到源码分析&#xff0c;依靠看源码解决问题&#xff0c;可以说让自己在阅读源码能力上有了一点小的成长。鲁迅先生曾没说过&#xff0c;“源码是最好的文档”&#xff0c;他还没说过&#xff0c;“带着问题阅读源码最有效”。…

bat脚本添加以管理员权限执行方法

在windows上运行bat脚本的时候&#xff0c;有时候&#xff0c;会因为权限问题导致操作失败&#xff0c;这时候&#xff0c;需要在脚本中提升权限&#xff0c;以管理员权限执行脚本命令。 现在介绍两种方法可以实现管理员权限执行&#xff0c;如下所示&#xff0c;是一段以管理员…

【C++】STL的list容器介绍

目录 6、list容器 6.1list构造函数 6.2list赋值和交换 6.3list大小操作 6.4list插入 6.5list删除 6.6list数据存取 6.7list反转和排序 6、list容器 list本质是带头节点的双向循环链表&#xff0c;链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结…

学生必看!免费领取一台阿里云服务器

阿里云学生服务器优惠活动&#xff1a;高效计划&#xff0c;可以免费领取一台阿里云服务器&#xff0c;如果你是一名高校学生&#xff0c;想搭建一个linux学习环境、git代码托管服务器&#xff0c;或者创建个人博客网站记录自己的学习成长历程&#xff0c;拥有一台云服务器是很…

Redis 批处理优化

一、优化建议 1、使用Pipeline Redis 的 Pipeline 可以将多个命令打包成一个请求&#xff0c;从而减少通信次数和网络开销。在批处理时&#xff0c;可以使用 Pipeline 来提高效率。 2、使用批量插入 Redis 支持批量插入&#xff0c;可以将多个数据一次性插入数据库&#xf…