大家好,我是Peter,除了内核外,后面会持续增加驱动的内容。今天推荐一篇。
0、环境
soc:rk3568一、ov13850简介1.产品参数
board:EVB1-DDR4-V10
软件:Android11
Linux:4.19.232
品牌: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适用于低功耗相机模块。
以下是测试用的摄像头扩展板:
●镜头尺寸: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
定时脉冲发生器输出时钟来访问成像阵列的行,预先填充电荷并且按顺序对数组的行进行采样。
在预先填充电荷和采样的时间间隔内,每个像素点的电荷曝光时减少入射光。
这是在滚动快门的体系结构的曝光时间。
曝光时间通过调整预先填充电荷和采样之间的时间间隔控制。
在每一行的像素数据采样后,通过模拟电路(AMP)进一步处理:纠正偏移量和将数据乘以相应的增益。
模拟处理后通过10位ADC的输出数组中的每个像素的数据。
ISP(imagesensorprocessor)通过图像输出接口单元,经过mipi接口(MCP/MDP)将图像数据发送出去。
OV13850传感器的图像数组4256列3152行(13414912像素)
颜色过滤器是安排在Bayer模式
Binningmode2x2binning
Binningmode通常用于低分辨率
OV13850提供图像mirror(左右翻转)和flip(上下翻转)模式
瑞芯微支持的摄像头,有个supportlist,
此次从该list中选择了ov13850
默认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=y2.设备树1)典型ov系列摄像头链接示意图
ov系列摄像头与SOC连接的主要的引脚有:i2c、rst、pwdn、mclk、MIPIClk、MIPIDATA
这几根线是驱动工程师必须捋清楚的
由电路图可知,几个关键引脚关系:
reset信号:GPIO3B6
powerdown信号:GPIO4B4
I2C通道:4
clock:cif
参考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,
};
关于摄像头驱动,
彭老师后面会继续更一篇文章讲解。
在以下两个文件增加对应摄像头信息,
hardware/rockchip/camera/etc/camera/camera3_profiles_
hardware/rockchip/camera/etc/camera/camera3_
一口君直接参考的其他文件,
然后找一个相近型号的摄像头修改的
移植成功后,确认下对应的驱动log
10-2617:58:54.65900Iov138504-0010:driverversion:00.01.052.查看ov13850设备
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
驱动加载成功后,会有以下信息
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。
rk3568_r:/v4l2-ctl-d/dev/video0-l2.增加曝光exposure
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
exposure值区间为:4-3324命令实例:
v4l2-ctl-d/dev/video0--set-ctrlexposure=33243.增加图片亮度analogue_gain
analogue_gain用于设置显示的图像的亮度
analogue_gain值区间:16-248
命令实例:
v4l2-ctl-d/dev/video0--set-ctrlanalogue_gain=240
analogue_gain=16现象
analogue_gain=244现象【效果非常明显】
参数test_pattern,可以用于测试显示图像
0:摄像头
1-3测试图片命令实例:
v4l2-ctl-d/dev/video0--set-ctrltest_pattern=0
test_pattern=1test_pattern=2test_pattern=3
举例一,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]'五、遇到问题解决1.解决闪退
~/$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
主要是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_参数的说明,瑞芯微官方有相应的说明文档
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是什么意思,有知道的老铁可以给我留言】
从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--六、后续
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。