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¬ifications
SEE ALL 16 APPS
选择最近应用 Camera
Storage&cache
点击
clear storage
然后退出重新打开摄像头APP即可
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"/>
Camera | 8.让rk3568支持前后置摄像头的更多相关文章
- Android切换前后置摄像头并录制视频
项目需要对微信的视频模块也看了一下,在此就对这块进行了一个开发.首先给出效果图 首先给出java代码 /** * RecordActivity.java * 版权所有(C) 2013 * 创建:cui ...
- android实现前置后置摄像头相互切换
首先自定义一个继承自SurfaceView并且实现了SurfaceHolder.Callback接口的组件: public class CameraView extends SurfaceView i ...
- Opencv打开内置摄像头
Opencv中VideoCapture是专门用来处理视频文件或者摄像头视频流的类,详细的说明和用法可以参考Opencv2.4.13的说明文档:点击打开链接 使用VideoCapture打开内置摄像头的 ...
- uwp之拍照(使用后置摄像头)
参考:wp8.1之拍照(获取焦点,使用后置摄像头) uwp开启摄像头要借助CaptureElement呈现来自捕获设备(如照相机或网络摄像机)的流.今天讲讲如何打开摄像头,获取焦点,以及拍照.废话不多 ...
- wp8.1之拍照(获取焦点,使用后置摄像头)
wp8.1 没有像wp8一样直接用启动器开启摄像头,他要开启摄像头要借助CaptureElement呈现来自捕获设备(如照相机或网络摄像机)的流.今天讲讲如何打开摄像头,获取焦点,以及拍照.废话不多说 ...
- win 10 禁用后置摄像头
2.双摄像头电脑,甄别时默认开启的是后置摄像头,识别不到人脸. (1)更换设备参加甄别: (2)自行调整:停用电脑后置摄像头,停用后甄别时会默认调取前置摄像头: 以下操作适用于Windows surf ...
- Linux笔记(固定USB摄像头硬件端口,绑定前后置摄像头)
在Android的系统会有前置摄像头和后置摄像头的定义,摄像头分为SOC类型的摄像头和USB这一类的摄像头,接下要分析就是USB摄像头这一类 . 一般在android或者linux系统中分析一个模块, ...
- RT5350的uvc驱动支持yuv格式摄像头成功
请尊重别人的劳动成果 转载请务必注明出处 今天在rt5350的板子上,成功将仅仅支持yuv格式的usb camera摄像头执行了.採用的是mjpeg streamer ,须要libjpeg库支持yuv ...
- HTML5 选择前置摄像头,选择后置摄像头
最近发现我写的都是乱七八糟的,觉得应该给大家带点福利,于是写了这篇 背景:最近想做个web应用,需要用到摄像头,但是发现默认一直是前置摄像头,拍照很麻烦,于是找了很多文章,居然没有人提到,只好FQ去找 ...
- 微信中浏览器支持input调用摄像头和只能上传图片
<input type="file" capture="camera" accept="image/*" />
随机推荐
- ARC 170_A 题解
AT_arc170_a [ARC170A] Yet Another AB Problem 题解 这道题做了我七天 (同时也是我第一到通过的 ARC 题) 太酷了 其实还是比较好理解的 原题题干 原题题 ...
- Xilinx ZYNQ-7000 平台简介
平台介绍 Zynq7000是赛灵思公司(Xilinx)推出的行业第一个可扩展处理平台Zynq系列.旨在为视频监视.汽车驾驶员辅助以及工厂自动化等高端嵌入式应用提供所需的处理与计算性能水平. 在2010 ...
- Kubernetes 存储资源 PV、PVC 和StorageClass详解
一.存储机制介绍 在 Kubernetes 中,存储资源和计算资源(CPU.Memory)同样重要,Kubernetes 为了能让管理员方便管理集群中的存储资源,同时也为了让使用者使用存储更加方便,所 ...
- C# 温故知新 第三篇 C# 编程概念 之程序集
在微软C# 官方开发指南中,介绍到在C# 开发中设计到这些 编程概念 当然包括不限于这些: 程序集:程序集构成了 .NET 应用程序的部署.版本控制.重用.激活范围和安全权限的基本单元. 程序集是为协 ...
- OpenBMB × Hugging Face × THUNLP,联袂献上经典大模型课
这个夏天,THUNLP 携手 Hugging Face 和 OpenBMB,推出 大模型公开课第二季.在大模型公开课第二季中,将有全球知名开源社区 OpenBMB X Hugging Face 梦幻联 ...
- js 获取年、月、周、当前日期第几周、这月有那几周
查看当前日期是第几周:https://wannianli.tianqi.com/today/zhou/ //获取完整的日期 var date=new Date; var y = date.getFul ...
- 解读GaussDB(for MySQL)灵活多维的二级分区表策略
本文分享自华为云社区<GaussDB(for MySQL)创新特性:灵活多维的二级分区表策略>,作者:GaussDB 数据库. 背景介绍 分区表及二级分区表的功能,可以让数据库更加有效地管 ...
- Groovy 基于Groovy实现DES加解密
groovy 3.0.7 DES加密简介 加密分为对称加密和非对称加密.非对称加密,加解密使用不同的密钥,如RSA:对称加密,加解密使用相同的密钥,如DES(Data Encryption Stand ...
- Python 按分类权重(区间)随机获取分类样本
按分类权重(区间)随机获取分类样本 By:授客 QQ:1033553122 开发环境 win 10 python 3.6.5 需求 活动抽奖,参与抽奖产品有iphone, 华为,小米,魅族,vivo, ...
- Django 自定义装饰器解决MySQL server has gone away错误
Django 自定义装饰器解决MySQL server has gone away错误 by:授客 QQ:1033553122 测试环境 Win 10 Python 3.5.4 Django- ...