Camera | 8.让rk3568支持前后置摄像头

一、目标

本文主要目标是,支持前置摄像头0v5648、后置摄像头ov13850,以及移植过程遇到的一些小问题的解决。

1. 摄像头连接图

参考上图,摄像头详细信息如下:

  • 2个摄像头均连接在I2C通道4
  • 2个摄像头共用同一个MIPI数据通道
  • 2个摄像头各自有独立的rst、pwdn引脚
  • rkw提供的sdk中已经提供camera时钟的设备树信息,此处选择对应时钟即可
  • ov13850用到4个lane,0v5648用到2个lane
  • 摄像头的片选通过select-gpios来选择,拉低选择0v13850,拉高选择ov5684

三、设备树

根据上述摄像头硬件信息,设备树信息如下:

  • reg:该模块输入端点序号
  • remot-endpoint :输出端点的名字,在下面设备树信息中列举出来
  • data-lanes :数据通道信息

在这里插入图片描述

四、驱动

rxw sdk中已经有这两个摄像头的驱动,但是需要增加片选的逻辑,

根据前面文章,

《Camera | 4.瑞芯微平台MIPI摄像头应用程序编写》

可知开启和关闭摄像头视频流通过以下命令:

VIDIOC_STREAMON, VIDIOC_STREAMOFF

对应的回调函数

static int ov5648_s_stream(struct v4l2_subdev *sd, int on)

除此之外,power控制的回调函数

static int ov5648_s_power(struct v4l2_subdev *sd, int on)

我们只需要在这对应的回调函数中增加select-gpio的操作即可。

所有修改代码如下:

+#include <linux/gpio.h>
+#include <linux/of_gpio.h>

+static int select_gpios;//前置摄像头使能

static int ov5648_s_stream(struct v4l2_subdev *sd, int on)
{
	……

	if (on) {
+			gpio_direction_output(select_gpios, 1);
+			usleep_range(1000, 2000);
			……
	} else {
		……
+			gpio_direction_output(select_gpios, 0);
+			usleep_range(1000, 2000);		
	}
	……
}

static int ov5648_s_power(struct v4l2_subdev *sd, int on)
{
	……
	if (on) {
+			gpio_direction_output(select_gpios, 1);
+			usleep_range(1000, 2000);
		……
	} else {
+			gpio_direction_output(select_gpios, 0);
		……
	}
	……
}

static void __ov5648_power_off(struct ov5648 *ov5648)
{
	int ret;
	struct device *dev = &ov5648->client->dev;
+		gpio_direction_output(select_gpios, 0);
	……
}

static int ov5648_probe(struct i2c_client *client,
	……
+	struct device_node *np;
+
+	np = dev->of_node;
 
	……

+	select_gpios = of_get_named_gpio(np, "select-gpios", 0);
+
+	ret = gpio_request(select_gpios, "select-gpios");
+	if (ret < 0) {
+		dev_err(dev,"Failed to request GPIO:%d, ERRNO:%d", (s32) select_gpios, ret);
+		//return ret;
+	}
+	printk("ov5648 select_gpios=%d",select_gpios);
	……

五、拓扑结构

加载成功后查看拓扑结构,会有以下entity 信息:

- entity 70: m01_f_ov5648 4-0036 (1 pad, 1 link)
             type V4L2 subdev subtype Sensor
             device node name /dev/v4l-subdev3
        pad0: Source
                [fmt:SBGGR10/2592x1944]
                -> "rockchip-csi2-dphy0":0 []

- entity 74: m00_b_ov13850 4-0010 (1 pad, 1 link)
             type V4L2 subdev subtype Sensor
             device node name /dev/v4l-subdev4
        pad0: Source
                [fmt:SBGGR10/4224x3136]
                -> "rockchip-csi2-dphy0":0 [ENABLED]

说明pipe通路ok。

六、xml配置文件

要让安卓识别前后置摄像头,还需要在以下文件增加后置摄像头ov13850、前置摄像头ov5684信息

@hardware/rockchip/camera/etc/camera/camera3_profiles.xml
@hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml

在这两个xml文件中增加这两个摄像头信息即可,

一口君是按照其他摄像头内容修改的,

ov5684因为分辨率问题,需要注意不要超过最大值。

获取xml文件,可以后台回复:rxw

七、切换后,前置摄像头打不开bug

开机后用命令抓帧,用的是前置摄像头

打开app后,界面显示的是后置摄像头信息

但是点解界面的切换按钮,获取不到前置摄像头图像,

在不重启的情况下要操作后置摄像头,执行下面操作即可。

Settings->apps&notifications
SEE ALL 16 APPS
选择最近应用  Camera
Storage&cache
    点击
    clear storage
 然后退出重新打开摄像头APP即可

1. 错误分析

  1. 首先在ov5648驱动的加上log
static int ov5648_s_stream(struct v4l2_subdev *sd, int on)
{
	……
	on = !!on;

	printk("6902 %s(%d) enter! %d\n", __func__, __LINE__,on);

	if (on == ov5648->streaming)
		goto unlock_and_return;

	if (on) {
		……
	} else {
		……
	}

	ov5648->streaming = on;

}

发现切换的时候没有执行该函数,所以定位是APP测出了问题

2. 查看catlog

03-01 02:40:30.062  1699  1749 I CAM_Profiler: [ 67.906ms] GUARD: CaptureModule.openCameraAndStartPreview() - [67.565ms] mOneCameraOpener.open()
03-01 02:40:30.062  1699  1749 I CAM_Profiler: [ 67.906ms] GUARD: CaptureModule.openCameraAndStartPreview() - STOP
03-01 02:40:30.063  1699  1741 E CAM_OneCamFtrCnfgCrtr: Unknown support level: 0
03-01 02:40:30.063  1699  1741 I CAM_OneCamCreator: Camera support level: LIMITED_JPEG
03-01 02:40:30.063  1699  1741 W CAM_Log : Tag SimpleOneCameraFactory is 3 chars longer than limit.
03-01 02:40:30.063  1699  1741 I CAM_OneCamCreator: Picture Size Configuration: PictureSizeCalculator.Configuration{native size=3264x2448, crop=Rect(0, 0 - 3264, 2448)}
03-01 02:40:30.065  1699  1741 D CAM_CaptureModule: onCameraOpened: com.android.camera.one.v2.initialization.GenericOneCameraImpl@200eae9
03-01 02:40:30.065  1699  1741 D CAM_CaptureModule: picturesize:3264x2448,previewBuffer:1280x960
03-01 02:40:30.065  1699  1741 D CAM_CaptureModule: starting preview ...
03-01 02:40:30.068  1699  1699 W CAM_IndicatorIconCtrlr: Trying to sync a pano indicator that is not initialized.
03-01 02:40:30.068   349   349 W CameraDeviceClient: createSurfaceFromGbp: Camera 1 with consumer usage flag: 256: Forcing asynchronous mode for stream
03-01 02:40:30.068   349   349 W CameraDeviceClient: createSurfaceFromGbp: Camera 1: Overriding format 0x1 to IMPLEMENTATION_DEFINED
03-01 02:40:30.069   265   265 D Camera3HAL: configure_streams: streams list ptr: 0xf6242dd0, num 2
    
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RKISP2GraphConfig: @selectSensorOutputFormat : App stream size(3264x2448) larger than Sensor full size(2592x1944), Check camera3_profiles.xml
    
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RKISP2GraphConfigManager: Couldn't get mediaCtl config
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> V4L2Subdev: queryDvTimings, ret:-1, I:0, wxh:0x0
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> V4L2Subdev: VIDIOC_SUBDEV_QUERY_DV_TIMINGS failed: Inappropriate ioctl for device
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> PlatformData: Error queryDvTimings ret:-2147483648 (/dev/v4l-subdev3)
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> PlatformData: Error closing device (/dev/v4l-subdev3)
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RKISP2GraphConfig: getMediaDevInfo info.model:rkisp0
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RKISP2GraphConfigManager: Couldn't get Imgu mediaCtl config
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RKISP2ImguUnit: Processing tasks creation failed (ret = -2147483648)
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RKISP2CameraHw: Unable to configure stream for imgunit
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RequestThread: Error configuring the streams @handleConfigureStreams:213
03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RequestThread:     error -2147483648 in handling message: 3
03-01 02:40:30.071   349   349 E Camera3-Device: Camera 1: configureStreamsLocked: Set of requested inputs/outputs not supported by HAL
03-01 02:40:30.071   349   349 E CameraDeviceClient: endConfigure: Camera 1: Unsupported set of inputs/outputs provided
03-01 02:40:30.071  1699  1741 W CameraDevice-JV-1: Stream configuration failed due to: endConfigure:505: Camera 1: Unsupported set of inputs/outputs provided
03-01 02:40:30.072  1699  1741 E CameraCaptureSession: Session 0: Failed to create capture session; configuration failed
03-01 02:40:30.072  1699  1817 E CAM_CaptureModule: Could not set up preview.
03-01 02:40:30.079  1699  1699 D CAM_LoggingImageReader: Closing: ImageReader{width=3264, height=2448, format=JPEG}
03-01 02:40:30.081   349   349 I Camera3-Device: disconnectImpl: E
03-01 02:40:30.088   349   349 I Camera3-Device: disconnectImpl: X
03-01 02:40:30.094   349   349 I CameraService: disconnect: Disconnected client for camera 1 for PID 1699

其中:

 03-01 02:40:30.070   265  1812 E RkCamera: <HAL> RKISP2GraphConfig: @selectSensorOutputFormat : App stream size(3264x2448) larger than Sensor full size(2592x1944), Check camera3_profiles.xml

提示分辨率不支持,

于是打开camera3_profiles.xml,将所有3264x2448修改为2592x1944

    <jpeg.maxSize value="5038848"/>  <!-- 3264*2448*1.5  2592x1944*1.5= 5038848   -->
	<sensor.info.activeArraySize value="0,0,2592,1944"/> 
	<sensor.info.pixelArraySize value="2592x1944"/> 
	<supportTuningSize value="2592x1944"/>

将下面几个属性所有关3264x2448的全部删除

<scaler.availableStreamConfigurations value="BLOB,3264x2448,OUTPUT,
<scaler.availableMinFrameDurations value=
<scaler.availableStallDurations value="
2592*1944*1.5= 5038848

八、其他问题

1. 前置摄像头旋转了180°

修改xml文件

  <sensor.orientation value="90"/>

2. 闪光灯

 <flash.info.available value="TRUE"/>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode:454. 四数相加 II —— 哈希表为什么叫哈希表~

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 hash是什么&#xff0c;哈希表为什么叫哈希表&#xff1f; 一、&#x1f331;454. 四数…

Java基础(八)异常处理

1. 异常概述 1.1 什么是生活的异常 男主角小明每天开车上班&#xff0c;正常车程1小时。但是&#xff0c;不出意外的话&#xff0c;可能会出现意外。 出现意外&#xff0c;即为异常情况。我们会做相应的处理。如果不处理&#xff0c;到不了公司。处理完了&#xff0c;就可以…

一文搞懂Plant Simulation中的Rotation设置

在处理3D动画或者展示时,常常需要在Plant Simulation调整数模的姿态,静态设置或动态设置Rotation是一个很重要的手段。 编辑3D属性,在Transformation选项卡中,我们可以看到Rotation的设置参数,如上图所示,只有一个角度和3个轴参数。如果对计算机图形学不了解的同学,估计…

MySQL优化——Explain分析执行计划详解

文章目录 前言一. 查看SQL执行频率二. 定位低效率执行SQL三. explain分析执行计划3.1 id3.2 select_type3.3 table3.4 type3.5 key3.6 rows3.7 extra 四. show profile分析SQL 前言 在应用的的开发过程中&#xff0c;由于初期数据量小&#xff0c;开发人员写 SQL 语句时更重视…

【技术分享】接口自动化测试中,如何做断言验证?

在服务端自动化测试过程中&#xff0c;发起请求之后还需要对响应值进行验证。验证响应信息符合预期值之后&#xff0c;这一条接口自动化测试用例才算完整的通过。所以这一章节&#xff0c;将会讲解在接口自动化测试中&#xff0c;如何对服务端返回的响应内容做断言验证。 实战…

Linux命令·traceroute

通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点&#xff08;source&#xff09;到达某一同样的目的地(destination)走的路径可能会不一样&#xff0c;但基本上来说大部分时候所走的路由是相同的。linux系统…

【微服务笔记13】微服务组件之Config配置中心基础环境搭建

这篇文章&#xff0c;主要介绍微服务组件之Config配置中心基础环境搭建。 目录 一、Config配置中心 1.1、什么是配置中心 1.2、Config配置中心特点 二、搭建Config配置中心 2.1、配置Git仓库 2.2、创建ConfigServer服务端 &#xff08;1&#xff09;引入依赖 &#xff…

【天梯赛—不想坑队友系列】L1-002 打印沙漏(java)

题目链接 PTA | 程序设计类实验辅助教学平台 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符…

企业在实施采购管理时需要注意哪些问题?

采购管理是指企业为了获得所需的物资和服务等&#xff0c;通过筛选供应商、谈判合同、执行采购计划等一系列过程来实现目标的管理活动。在实施过程中&#xff0c;采购管理需要注意以下几个问题&#xff1a; 1、采购策略的选择 采购策略的选择是采购管理中非常关键的环节。不同…

NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022

然后我们来看一下如何操作模板 首先我们准备好了一个模板,叫做CsvToJSON这样一个模板文件了 然后我们再来看左下角有个上传模板 可以选择这个模板上传上来,然后,就可以在右侧找到,菜单,找到template,点击,来查看模板了 然后添加组,就是顶部的那个两个圆圈的组件拖过来以后用来…

Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载

文章目录 一、业务背景二、实现思路二、准备工作1.准备data模板.xlsx2.引入poi相关依赖&#xff0c;用于操作excel3.针对WorkBookZIP压缩输入/输出流&#xff0c;相关方法知识点要有所了解 三、完整的项目代码四、可能遇到的问题错误场景1&#xff1a;java.io.IOException: Str…

Echarts数据可视化(下)

四、数据可视化项目实战 后台搭建 结合Vue开发图表组件 WebSocket实现数据推送 主题切换/页面合并/全屏切换 4.1 Koa2 学习介绍&#xff1a;koa2 - 简书 官网&#xff1a;Koa (koajs) -- 基于 Node.js 平台的下一代 web 开发框架 | Koajs 中文文档 4.1.1 Koa2 的介绍 基…

百度智能云对象存储BOS批量下载文件方法

百度智能云对象存储BOS支持批量打包下载吗&#xff1f;目前对象存储BOS浏览器端不支持批量下载&#xff0c;可以使用对象存储BOS桌面或BOSCMD批量下载&#xff0c;也可以使用API/SDK调用接口循环下载。新手站长网来详细说下百度云对象存储BOS批量下载的方法&#xff1a; 目录 …

Git 分布式版本控制工具

文章目录 Git 分布式版本控制工具课程内容1. 前言1.1 什么是Git1.2 使用Git能做什么 2. Git概述2.1 Git简介2.2 Git下载与安装 TODO3. Git代码托管服务3.1 常用的Git代码托管服务3.2 码云代码托管服务3.2.1 注册码云账号3.2.2 登录码云3.2.3 创建远程仓库3.2.4 邀请其他用户成为…

c++小知识

1、一般头文件&#xff1a; #include<iostream> using namespace std; 2、ios::sync_with_stdio(false); 其含义是取消cin与stdin的同步&#xff0c;cout和stdout的同步 cin.tie(0); tie是将两个stream绑定的函数&#xff0c;空参数的话返回当前的输出流指针。 3、…

为什么网络安全缺口很大,招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万&#xff0c;就业人数却只有10多万&#xff0c;缺口高达了93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&#xff1…

给想涨薪和正在学习Android的朋友们一些建议

前言 相信很多从事Android开发工作的朋友&#xff0c;在入职一年后会有申请涨薪的想法&#xff0c;但由于某些原因&#xff0c;公司拒绝了您的加薪申请&#xff0c;在我看来&#xff0c;出现这种情况主要有两种原因&#xff1a;第一个原因可能是你在工作中就只知道埋头苦干&am…

手撕Udp套接字|实现群聊通信|实现Windows Linux通信交互

​ 专栏和Git地址 操作系统https://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482UdpSockethttps://github.com/Yufccode/BitCode/tree/main/Linux/%E4%BB%A3%E7%A0%81/0215Udp%E5%A5%97%E6%8E%A5%E5%AD%97 README 本项目通过Linux套接字编程&…

如何选择CDN厂商

如果您的在线业务面临着流量和访客数量的增加&#xff0c;如果您想提高网站速度和用户体验&#xff0c;选择合适的CDN提供商是朝着正确方向迈出的一步&#xff0c;那么如何来选择最合适的CDN厂商呢&#xff0c;火伞云小编今天为您解答&#xff1a; 一、测试潜在的CDN提供商 对…

Python实现批量图片下载及去重处理

背景 在爬虫应用开发中&#xff0c;常常需要批量下载图片&#xff0c;并对图片进行去重处理。Python 是一种非常流行的编程语言&#xff0c;也是开发爬虫应用的首选&#xff0c;本文将介绍如何使用 Python 下载图片&#xff0c;并对下载的图片进行去重处理。 内容 首先&…