摄像头ov13850移植笔记

大家好,我是Peter,除了内核外,后面会持续增加驱动的内容。今天推荐一篇。

0、环境

soc:rk3568
board:EVB1-DDR4-V10
软件:Android11
Linux:4.19.232
一、ov13850简介1.产品参数

品牌:Omnivision

型号:CMK-OV13850

接口:MIPI

像素:1320WOV13850彩色图像传感器是一款低电压、高性能1/3.06英寸1320万像素CMOS图像传感器,使用OmniBSI+?技术提供了单-1320万像素(4224×3136)摄像头的功能。通过串行摄像头控制总线(SCCB)接口的控制,它提供了全帧、下采样、开窗的10位MIPI图像。

OV13850拥有一个能够在10位1320万像素分辨率下以每秒24帧(fps)的速度运行的图像阵列,用户可以完全控制图像质量、格式和输出数据传输。所有需要的图像处理功能,包括曝光控制、白平衡、缺陷像素消除等,都可以通过SCCB接口进行编程。

此外,OmniBSI图像传感器使用专有的传感器技术,通过减少或消除固定图案噪声、污迹等常见的图像污染光源来提高图像质量,从而产生干净、完全稳定的彩色图像。

为了提供定制信息,OV13850包括一个单编程(OPT)存储器。OV13850拥有最多4车道的MIPI接口。

OV13850适用于低功耗相机模块。

以下是测试用的摄像头扩展板:

2.特性

●镜头尺寸:1/3.06英寸●像素大小:1.12毫米×1.12毫米●31.2°CRA为6mmz高度●可编程控制帧速率,镜像和翻转,裁剪和窗口●1320万像素AT30fps●双线串行总线控制(SCCB)●闪光灯输出控制闪光●支持输出格式:10位RAWRGB●支持图像大小:13.2MP(4224×3136)、10MP(4224×2376)、4K2K(3840×2160)、EIS1080P(2112×1188)、EIS720P(1408×792)、more3●支持2×2Binning●可达4车道MIPI串行输出接口●标准系列SCCB接口●8kbit的嵌入式一次性可编程(OTP)存储器(见侧注)●两个片上锁相环(PLLs)●可编程控制:增益、曝光、帧率、图像大水、水平反射镜、垂直翻转裁剪和平移●内置温度传感器●图像质量控制:缺陷校正,自动黑电平校准,镜头阴影校正,和高度计行HDR。●保证传感器结温:-300C到+850C●电源核心:1.14;模拟:2.6-3.0V输入/输出:1.7-3.0V●封装:PLCC40

3.ov13850引脚图4.ov13850功能模块

定时脉冲发生器输出时钟来访问成像阵列的行,预先填充电荷并且按顺序对数组的行进行采样。

在预先填充电荷和采样的时间间隔内,每个像素点的电荷曝光时减少入射光。

这是在滚动快门的体系结构的曝光时间。

曝光时间通过调整预先填充电荷和采样之间的时间间隔控制。

在每一行的像素数据采样后,通过模拟电路(AMP)进一步处理:纠正偏移量和将数据乘以相应的增益。

模拟处理后通过10位ADC的输出数组中的每个像素的数据。

ISP(imagesensorprocessor)通过图像输出接口单元,经过mipi接口(MCP/MDP)将图像数据发送出去。

5.像素数组

OV13850传感器的图像数组4256列3152行(13414912像素)

颜色过滤器是安排在Bayer模式

Binningmode2x2binning

Binningmode通常用于低分辨率

6.mirror和flip

OV13850提供图像mirror(左右翻转)和flip(上下翻转)模式

二、驱动移植

瑞芯微支持的摄像头,有个supportlist,

此次从该list中选择了ov13850

1.驱动源文件及对应脚本

默认sdk里面已经将支持的所有摄像头驱动都添加到了内核,所以不需要移植该驱动了,

但是还是要确认下移植驱动对应的一些信息

源程序

rk__sdk_220718\kernel\drivers\media\i2c\
rk__sdk_220718\kernel\include\config\video\

kernel/drivers/media/i2c/Makefile

115obj-$(CONFIG_VIDEO_OV13850)+=

kernel/drivers/media/i2c/Kconfig

1282configVIDEO_OV13850
1283tristate"OmniVisionOV13850sensorsupport"
1284depsonI2CVIDEO_V4L2VIDEO_V4L2_SUBDEV_API
1285depsonMEDIA_CAMERA_SUPPORT
1286selectV4L2_FWNODE
1287---help---
1288ThisisaVideo4Linux2sensordriverfortheOmniVision
1289OV13850camera.

驱动对应的宏开关

kernel/arch/arm64/configs/rockchip_defconfig

581CONFIG_VIDEO_OV13850=y
2.设备树1)典型ov系列摄像头链接示意图

ov系列摄像头与SOC连接的主要的引脚有:i2c、rst、pwdn、mclk、MIPIClk、MIPIDATA

这几根线是驱动工程师必须捋清楚的

2)电路图

由电路图可知,几个关键引脚关系:

reset信号:GPIO3B6

powerdown信号:GPIO4B4

I2C通道:4

clock:cif

3)设备树节点

参考sdk中其他平台的ov13850节点来填写

kernel/arch/arm64/boot/dts/rockchip/
ov13850:ov13850@10{
status="okay";
compatible="ovti,ov13850";
reg=0x10;
clocks=cruCLK_CIF_OUT;
clock-names="xvclk";
power-domains=powerRK3568_PD_VI;
pinctrl-names="default";
pinctrl-0=cif_clk;
reset-gpios=gpio3RK_PB6GPIO_ACTIVE_HIGH;
pwdn-gpios=gpio4RK_PB4GPIO_ACTIVE_HIGH;
rockchip,camera-module-index=0;
rockchip,camera-module-facing="back";
rockchip,camera-module-name="ZC-OV13850R2A-V1";
rockchip,camera-module-lens-name="Largan-50064B31";
port{
ov13850_out:point{
remote-point=mipi_in_ucam0;
data-lanes=1234;
};
};
};

114csi2_dphy0{
115status="okay";
116
117ports{
118size-cells=0;
120port@0{
121reg=0;
122size-cells=0;
124
125mipi_in_ucam0:point@1{
126reg=1;
127remote-point=ov13850_out;
128data-lanes=1234;
129};
……
152};

设备树的信息最终转换成i2c_client,并传递给ov13850驱动ov13850_probe()compatible="ovti,ov13850";与驱动的of_match_table保持一致

@rk__sdk\kernel\drivers\media\i2c\
if

staticconststructi2c_device_idov13850_match_id[]={
{"ovti,ov13850",0},
{},
};

staticstructi2c_driverov13850_i2c_driver={
.driver={
.name=OV13850_NAME,
.pm=ov13850_pm_ops,
.of_match_table=of_match_ptr(ov13850_of_match),
},
.probe=ov13850_probe,
.remove=ov13850_remove,
.id_table=ov13850_match_id,
};

关于摄像头驱动,

彭老师后面会继续更一篇文章讲解。

3.安卓配置文件

在以下两个文件增加对应摄像头信息,

hardware/rockchip/camera/etc/camera/camera3_profiles_
hardware/rockchip/camera/etc/camera/camera3_

一口君直接参考的其他文件,

然后找一个相近型号的摄像头修改的

三、查看摄像头相关信息1.开机log

移植成功后,确认下对应的驱动log

10-2617:58:54.65900Iov138504-0010:driverversion:00.01.05
10-2617:58:54.65900Wov138504-0010:Failedtogetpower-gpios,maybenouse
10-2617:58:54.65900Wov138504-0010:4-0010supplyavddnotfound,usingdummyregulator
10-2617:58:54.65900Iov138504-0010:
10-2617:58:54.65900Wov138504-0010:4-0010supplydovddnotfound,usingdummyregulator
10-2617:58:54.65900Wov138504-0010:4-0010supplydvddnotfound,usingdummyregulator
10-2617:58:54.66000Eov138504-0010:couldnotgetdefaultpinstate
10-2617:58:54.66000Eov138504-0010:couldnotgetsleeppinstate
10-2617:58:54.66500Iov138504-0010:DetectedOV00d850sensor,REVISION0xb2
10-2617:58:54.66500Irockchip-csi2-dphycsi2-dphy0:dphy0matchesm00_b_ov138504-0010:bustype4
2.查看ov13850设备

驱动加载成功后,会有以下信息

rk3568_r:/grepov13850/sys/class/video4linux/v*/name
grepov13850/sys/class/video4linux/v*/name
/sys/class/video4linux/v4l-subdev3/name:m00_b_ov138504-0010
rk3568_r:/media-ctl-d/dev/media0-p
media-ctl-d/dev/media0-p
Openingmediadevice/dev/media0
Enumeratingentities
Found13entities
Enumeratingpadsandlinks


Mediadeviceinformation
------------------------
driverrkisp-vir0
modelrkisp0
serial
businfo
hwrevision0x0


Devicetopology
-entity1:rkisp-isp-subdev(4pads,7links)
typeV4L2subdevsubtypeUnknown
devicenodename/dev/v4l-subdev0
pad0:Sink
[fmt:SBGGR10/4224x3136
:(0,0)/4096x3072
crop:(0,0)/4096x3072]
-"rkisp-csi-subdev":1[]
-"rkisp_rawrd0_m":0[]
-"rkisp_rawrd2_s":0[]
pad1:Sink
-"rkisp-input-params":0[]
pad2:Source
[fmt:YUYV2X8/4096x3072
:(0,0)/4096x3072
crop:(0,0)/4096x3072]
-"rkisp_mainpath":0[]
-"rkisp_selfpath":0[]
pad3:Source
-"rkisp-statistics":0[]

-entity6:rkisp-csi-subdev(6pads,5links)
typeV4L2subdevsubtypeUnknown
devicenodename/dev/v4l-subdev1
pad0:Sink
-"rockchip-csi2-dphy0":1[]
pad1:Source
-"rkisp-isp-subdev":0[]
pad2:Source
-"rkisp_rawwr0":0[]
pad3:Source
pad4:Source
-"rkisp_rawwr2":0[]
pad5:Source
-"rkisp_rawwr3":0[]

-entity13:rkisp_mainpath(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video0
pad0:Sink
-"rkisp-isp-subdev":2[]

-entity19:rkisp_selfpath(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video1
pad0:Sink
-"rkisp-isp-subdev":2[]

-entity25:rkisp_rawwr0(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video2
pad0:Sink
-"rkisp-csi-subdev":2[]

-entity31:rkisp_rawwr2(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video3
pad0:Sink
-"rkisp-csi-subdev":4[]

-entity37:rkisp_rawwr3(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video4
pad0:Sink
-"rkisp-csi-subdev":5[]

-entity43:rkisp_rawrd0_m(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video5
pad0:Source
-"rkisp-isp-subdev":0[]

-entity49:rkisp_rawrd2_s(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video6
pad0:Source
-"rkisp-isp-subdev":0[]

-entity55:rkisp-statistics(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video7
pad0:Sink
-"rkisp-isp-subdev":3[]

-entity61:rkisp-input-params(1pad,1link)
typeNodesubtypeV4L
devicenodename/dev/video8
pad0:Source
-"rkisp-isp-subdev":1[]

-entity67:rockchip-csi2-dphy0(2pads,2links)
typeV4L2subdevsubtypeUnknown
devicenodename/dev/v4l-subdev2
pad0:Sink
-"m00_b_ov138504-0010":0[]
pad1:Source
-"rkisp-csi-subdev":0[]

-entity70:m00_b_ov138504-0010(1pad,1link)
typeV4L2subdevsubtypeSensor
devicenodename/dev/v4l-subdev3
pad0:Source
[fmt:SBGGR10/4224x3136]
-"rockchip-csi2-dphy0":0[]

从entity70信息中可以看到:

该Entity完整的名称是:m00_b_ov138504-0010

它是一个V4L2subdev(Sub-Device)Sensor

它对应的节点是/dev/v4l-subdev3,应用程序(如v4l2-ctl)可以打开它,并进行配置

它仅有一个输出(Source)节点,记为pad0

它的输出格式是[fmt:SBGGR10/4224x3136],其中SBGGR10是一种mbus-code的简称

它的Sourcepad0链接到"rockchip-csi2-dphy0"的pad0,并且当前的状态是ENABLED。

三、拍照测试1.抓帧
rk3568_r:/v4l2-ctl-d/dev/video0-l
v4l2-ctl-d/dev/video0-l
UserControls
exposure0x00980911(int):min=4max=3324step=1default=1536value=1536
ImageSourceControls
vertical_blanking0x009e0901(int):min=192max=29631step=1default=192value=192
horizontal_blanking0x009e0902(int):min=576max=576step=1default=576value=576flags=read-only
analogue_gain0x009e0903(int):min=16max=248step=1default=16value=16
ImageProcessingControls
link_frequency0x009f0901(intmenu):min=0max=0default=0value=0flags=read-only
pixel_rate0x009f0902(int64):min=0max=120000000step=1default=120000000value=120000000flags=read-only
test_pattern0x009f0903(menu):min=0max=4default=0value=0
2.增加曝光exposure

exposure值区间为:4-3324命令实例:

v4l2-ctl-d/dev/video0--set-ctrlexposure=3324

3.增加图片亮度analogue_gain

analogue_gain用于设置显示的图像的亮度

analogue_gain值区间:16-248

命令实例:

v4l2-ctl-d/dev/video0--set-ctrlanalogue_gain=240

analogue_gain=16现象

analogue_gain=244现象【效果非常明显】

4.测试显示信息test_pattern

参数test_pattern,可以用于测试显示图像

0:摄像头

1-3测试图片命令实例:

v4l2-ctl-d/dev/video0--set-ctrltest_pattern=0

test_pattern=1test_pattern=2test_pattern=3

5.修改Entity的format、size

举例一,GC2053摄像头支持多个分辨率的输出,默认为1920x1080。现将输出分辨率改为640x480:

media-ctl-d/dev/media0--set-v4l2'"m00_b_ov138504-0010":0[fmt:SBGGR10//640x480]'

修改GC2053输出后,rkisp-isp-subdev的大小及videodevicecrop也相应要修改。因为后级的大小不能大于前级的大小。

~/$media-ctl-d/dev/media0--set-v4l2'"rkisp-isp-subdev":0[fmt:SBGGR10/640x480]'
~/$media-ctl-d/dev/media0--set-v4l2'"rkisp-isp-subdev":0[crop:(0,0)/640x480]'
~/$media-ctl-d/dev/media0--set-v4l2'"rkisp-isp-subdev":2[crop:(0,0)/640x480]'
~/$v4l2-ctl-d/dev/video0\
--set-selection=target=crop,top=0,left=0,width=640,height=480
五、遇到问题解决1.解决闪退

主要是camera3_profiles_和camera3_这两个文件中没有ov13850的信息

所以找到这两个文件,增加相对应的摄像头信息改文件位于sdk的目录如下:

hardware/rockchip/camera/etc/camera/

内容比较多,只贴出我修改那一段【我将其他摄像头都删除了】

ProfilescameraId="0"name="ov13850"moduleId="m00"
Supported_hardware
hwTypevalue="SUPPORTED_HW_RKISP1"/
/Supported_hardware

Android_metadata!--Androidstaticmetadataonly--
!--ColorCorrection--
="OFF"/
!--Control--
="OFF"/
="OFF,50HZ,60Hz,AUTO"/
="ON,OFF"/
="FALSE"/
…………
sensorTypevalue="SENSOR_TYPE_RAW"/!--SENSOR_TYPE_SOCorSENSOR_TYPE_RAW--

文件camera3_参数的说明,瑞芯微官方有相应的说明文档

2.app提示没有权限连接打开设备失败
10-2415:20:15.53516681668DCAM_Camera2OneCamMgr:GettingFirstBACKCamera
10-2415:20:15.53516681668ICameraManagerGlobal:Connectingtocameraservice
10-2415:20:15.539346346WServiceManager:Permissionfailure:_OPEN_CLOSE_LISTENERfromuid=10090pid=1668
10-2415:20:15.54216681668DCAM_Camera2OneCamMgr:GettingFirstFRONTCamera
10-2415:20:15.54316681668WCAM_Camera2OneCamMgr:Nofront-facingcamerafound,trytofindexternalfacingcamera.
10-2415:20:15.54416681668WCAM_Camera2OneCamMgr:Noexternalcamerafound.

该log位于以下文件

./packages/apps/Camera2/src/com/android/camera/one/v2/:172

修改文件

packages/apps/Camera2/

增加下面两处,会解决连接ManagerService错误问题

uses-permissionandroid:name="_OPEN_CLOSE_LISTENER"/
android:sharedUserId=""

同时将设备树文件将mipi_in_ucam0里的reg修改为1,如果有其他摄像头信息,一次往后填写或者删除。

114csi2_dphy0{
115status="okay";
116
117ports{
118size-cells=0;
120port@0{
121reg=0;
122size-cells=0;
124
125mipi_in_ucam0:point@1{
126reg=1;
127remote-point=ov13850_out;
128data-lanes=1234;
129};
……

【这个reg是什么意思,有知道的老铁可以给我留言】

3.APP打开设备失败

从log看,没有任何permission问题,摄像头也打开了,但是就是连接失败,主要是xml文件的sensorType设置不对

hardware/rockchip/camera/etc/camera/camera3_profiles_
hardware/rockchip/camera/etc/camera/camera3_

找到这两个文件下面的值

sensorTypevalue="SENSOR_TYPE_RAW"/!--SENSOR_TYPE_SOCorSENSOR_TYPE_RAW--

修改为

sensorTypevalue="SENSOR_TYPE_SOC"/!--SENSOR_TYPE_SOCorSENSOR_TYPE_RAW--
六、后续

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐