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

news2024/12/26 16:51:20

一、目标

本文主要目标是,支持前置摄像头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"/>

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

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

相关文章

C++——探究引用

文章目录 概述引用的概念引用特性引用的作用**引用做参数****引用作为函数返回值** 常引用引用的底层实现总结一下引用和指针的不同点 概述 本篇博客将讲述c相对于c新增的一个重要的内容——引用&#xff0c;深入研究其语法细节以及其需要注意的一些要点。 引用的概念 竟然要学…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C++)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK中控制变焦镜头的技术背景代码案例分享第一步&#xff1a;开启相机自动调焦功能模块第二步&#xff1a;控制自动变焦镜头电机的…

Java+SSM+Mysql在线图书超市

课题背景及意义 随着现代网络技术发展&#xff0c;对于在线图书超市的设计现在正处于发展的阶段&#xff0c;所以对的要求也是比较严格的&#xff0c;要从系统的功能和用户实际需求来进行对系统制定开发的发展方式&#xff0c;依靠网络技术的的快速发展和现代通讯技术的结合为…

C++11: lambda、包装器、模板参数包和线程库

lambda C98中的一个例子 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。 int main() {int array[] { 4,1,8,5,3,7,0,9,2,6 };// 默认按照小于比较&#xff0c;排出来结果是升序std::sort(array, array sizeof(array) / s…

socket.io 解决浏览器兼容性(WebSocket)

在上一篇讲了 npm 上最流行的 WebSocket 库之一的 ws 库&#xff0c;那么本篇就来讲另外一个&#xff0c;就是 socket.io 库&#xff0c;socket.io 其实是一个兼容方案&#xff0c;当浏览器不支持 H5 的情况下就不能够使用上一篇内容讲的 WebSocket &#xff0c;只能采用其他的…

【数据统计】— 极大似然估计 MLE、最大后验估计 MAP、贝叶斯估计

【数据统计】— 极大似然估计 MLE、最大后验估计 MAP、贝叶斯估计 极大似然估计、最大后验概率估计(MAP)&#xff0c;贝叶斯估计极大似然估计(Maximum Likelihood Estimate&#xff0c;MLE)MLE目标例子: 扔硬币极大似然估计—高斯分布的参数 矩估计 vs LSE vs MLE贝叶斯公式&am…

JavaScript函数基础

●我们代码里面所说的函数和我们上学的时候学习的什么三角函数、二次函数之类的不是一个东西 函数的概念 ●对于 js 来说&#xff0c;函数就是把任意一段代码放在一个 盒子 里面 ●在我想要让这段代码执行的时候&#xff0c;直接执行这个 盒子 里面的代码就行 ●先看一段代码 …

[golang gin框架] 25.Gin 商城项目-配置清除缓存以及前台列表页面数据渲染公共数据

配置清除缓存 当进入前台首页时,会缓存对应的商品相关数据,这时,如果后台修改了商品的相关数据,缓存中的对应数据并没有随之发生改变,这时就需要需改对应的缓存数据,这里有两种方法: 方法一 在管理后台操作直接清除缓存中的所有数据,当再次访问前台首页时,就会先从数据库中获取…

巧用千寻位置GNSS软件|直线放样有技巧

日常测量作业中&#xff0c;直线放样是对设计好的直线进行放样&#xff0c;其中包括直线的里程&#xff0c;左右偏距及设计直线范围内的高程控制。本文将介绍如何运用千寻位置GNSS软件完成日常的直线放样。 点击【测量】->【直线放样】->【直线库】&#xff0c;选择一条直…

Python数组仿射变换

文章目录 仿射变换坐标变换的逻辑scipy实现 仿射变换 前面提到的平移、旋转以及缩放&#xff0c;都可以通过一个变换矩阵来实现&#xff0c;以二维空间中的变换矩阵为例&#xff0c;记点的坐标向量为 ( x , y , 1 ) (x,y,1) (x,y,1)&#xff0c;则平移矩阵可表示为 [ 1 0 T x …

数据结构和算法学习记录——二叉搜索树的插入操作、删除操作

目录 二叉搜索树的插入 思路图解 代码实现 要点 例题 二叉搜索树的删除 情况一 情况二 情况三 右子树的最小元素 左子树的最大元素 代码实现 二叉搜索树的插入 要进行二叉搜索树的插入&#xff0c; 关键点在于要找到元素应该插入到哪个位置&#xff0c;可以采…

Echarts数据可视化(下)

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

springboot+vue校园新闻网站(源码+说明文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园新闻网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

【数据结构】树及二叉树的概念

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 一次失败&#xff0c;只是证明我们成功的决心还够坚强。 ——博 维 目录 &#x1f384;树概念及结构: ✔树的概念: ✔树的相关概念 :​编辑 ✔树的…

【C++】-一文让你半只脚进入C++,还不进来看看??

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; C入门 前言一、C关键字二、namespace和using关键字2.1namespace和using的使用2.2names…

WebStorm前端启动JetLinks 物联网基础平台(2.x)

目录 一、环境准备 二、下载源码 三、安装依赖 ​四、修改配置 五、启动项目 六、访问项目 一、环境准备 1.降级node版本为12.22.0 使用node版本管理器gnvm_苍穹之跃的博客-CSDN博客以管理员身份打开cmd&#xff0c;cd到node安装目录。https://blog.csdn.net/wenxingch…

联发科 2024届 IC实习笔试分析

说明 记录一下 4月19日晚&#xff0c;发哥的一场笔试。分享给需要的 IC 人。 岗位&#xff1a;数字IC设计验证&#xff08;安徽 合肥&#xff09; 转载要经本人同意&#xff01; 我的见解不一定都是准确的&#xff0c;欢迎评论区交流指正~~ 1、&#xff08;20分&#xff0…

滚动条如何设置样式和滚动条悬浮显示与隐藏

文章目录 一、滚动条如何设置样式1&#xff1a;滚动条的默认样式&#xff08;如下图&#xff09;1&#xff1a;html代码2&#xff1a;css代码3&#xff1a;效果图 2&#xff1a;CSS设置滚动条的属性&#xff08;重点&#xff09;3&#xff1a;设置滚动条的例子1&#xff1a;css…

java面经01-基础篇-排序算法、ArrayList、Iterator、LinkedList、HashMap、单例模式

文章目录 基础篇1. 二分查找2. 冒泡排序3. 选择排序4. 插入排序5. 希尔排序6. 快速排序7. ArrayList7.1 初始化:7.2 add扩容7.3 addAll扩容 8. Iterator8.1 ArrayList 源码分析8.2 CopyOnWriteArrayList 源码分析 9. LinkedList10. HashMap1&#xff09;基本数据结构2&#xff…

C#基础学习--LINQ(2

标准查询运算符 标准查询运算符由一系列API方法组成 序列指实现了Ienumerable<>接口的类&#xff0c;包括List<>,Dictionary<>,Stack<>,Array等 标准查询运算符的签名 扩展方法是公共的静态方法&#xff0c;尽管定义在一个类中&#xff0c;但目的是为…