调试camera修改分辨率是无法绕开的一个知识点,本文以oc13850为例,讲解如何修改摄像头的分辨率。
c
soc:rk3568
sdk版本:rk_android11.0_sdk
1. 查看datasheet

ov13850支持3种分辨率:
c
4224 x 3136
2112x1568
4224x2376
这几种分辨率要如何设置寄存器,
datasheet并没有说明。
2. 查看驱动
linux内核自带的驱动,有厂家优化好的2种分辨率寄存器配置信息。
驱动文件:
c
drivers\media\i2c\ov13850.c
支持的分辨率:


数组supported_modes中列举了所有支持的分辨率:
c
653 static const struct ov13850_mode supported_modes[] = {
654 {
655 .width = 2112,
656 .height = 1568,
657 .max_fps = {
658 .numerator = 10000,
659 .denominator = 300000,
660 },
661 .exp_def = 0x0600,
662 .hts_def = 0x12c0,
663 .vts_def = 0x0680,
664 .reg_list = ov13850_2112x1568_regs,
665 }
666
667 ,{
668 .width = 4224,
669 .height = 3136,
670 .max_fps = {
671 .numerator = 20000,
672 .denominator = 150000,
673 },
674 .exp_def = 0x0600,
675 .hts_def = 0x12c0,
676 .vts_def = 0x0d00,
677 .reg_list = ov13850_4224x3136_regs,
678 },
679 };
在驱动的回调函数ov13850_pad_ops-enum_frame_size ,会根据fse->index显示指定的分辨率
c
875 static int ov13850_enum_frame_sizes(struct v4l2_subdev *sd,
876 struct v4l2_subdev_pad_config *cfg,
877 struct v4l2_subdev_frame_size_enum *fse)
878 {
879 if (fse->index >= ARRAY_SIZE(supported_modes))
880 return -EINVAL;
881
882 if (fse->code != MEDIA_BUS_FMT_SBGGR10_1X10)
883 return -EINVAL;
884
885 fse->min_width = supported_modes[fse->index].width;
886 fse->max_width = supported_modes[fse->index].width;
887 fse->max_height = supported_modes[fse->index].height;
888 fse->min_height = supported_modes[fse->index].height;
889
890 return 0;
891 }
1310 static const struct v4l2_subdev_pad_ops ov13850_pad_ops = {
1311 .enum_mbus_code = ov13850_enum_mbus_code,
1312 .enum_frame_size = ov13850_enum_frame_sizes,
1313 .enum_frame_interval = ov13850_enum_frame_interval,
1314 .get_fmt = ov13850_get_fmt,
1315 .set_fmt = ov13850_set_fmt,
1316 };
但是我们实际用sdk自带的app打开摄像头时,分辨率始终是4224 x 3136
如果想将默认分辨率设置为2112*1568
可以简单粗暴点,把不用的分辨率注释掉

3. 修改xml
除了修改驱动,我们还要修改安卓部分的配置文件,
sdk中该xml文件并不支持2112x1568分辨率
所以需要添加对应的分辨率配置:
hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml
bash
diff --git a/etc/camera/camera3_profiles.xml b/etc/camera/camera3_profiles.xml
index c716305..b3ad66b 100644
--- a/etc/camera/camera3_profiles.xml
+++ b/etc/camera/camera3_profiles.xml
@@ -40,7 +40,7 @@
<control.availableVideoStabilizationModes value="OFF"/>
<control.maxRegions value="1,0,1"/>
<!-- JPEG -->
- <jpeg.maxSize value="11985408"/> <!-- 3264*2448*1.5 -->
+ <jpeg.maxSize value="4967424"/> <!-- 3264*2448*1.5=11985408 2112x1568*1.5= 4967424-->
<jpeg.availableThumbnailSizes value="0,0,160,120,320,180,320,240"/> <!-- INCREASING ORDER -->
<!-- Lens Info-->
<!-- TODO: availableApertures now is fake for we do not get the real apertures -->
@@ -151,6 +151,7 @@
<scaler.availableInputOutputFormatsMap value="IMPLEMENTATION_DEFINED,2,YCbCr_420_888,BLOB,YCbCr_420_888,2,YCbCr_420_888,BLOB"/>
<scaler.availableStreamConfigurations value="BLOB,3264x2448,OUTPUT,
BLOB,2592x1944,OUTPUT,
+ BLOB,2112x1568,OUTPUT,
BLOB,1920x1080,OUTPUT,
BLOB,1280x960,OUTPUT,
BLOB,1280x720,OUTPUT,
@@ -160,6 +161,7 @@
YCbCr_420_888,3264x2448,OUTPUT,
YCbCr_420_888,2592x1944,OUTPUT,
YCbCr_420_888,1920x1080,OUTPUT,
+ YCbCr_420_888,2112x1568,OUTPUT,
YCbCr_420_888,1280x960,OUTPUT,
YCbCr_420_888,1280x720,OUTPUT,
YCbCr_420_888,640x480,OUTPUT,
@@ -167,6 +169,7 @@
YCbCr_420_888,176x144,OUTPUT,
IMPLEMENTATION_DEFINED,3264x2448,OUTPUT,
IMPLEMENTATION_DEFINED,2592x1944,OUTPUT,
+ IMPLEMENTATION_DEFINED,2112x1568,OUTPUT,
IMPLEMENTATION_DEFINED,1920x1080,OUTPUT,
IMPLEMENTATION_DEFINED,1280x960,OUTPUT,
IMPLEMENTATION_DEFINED,1280x720,OUTPUT,
@@ -175,6 +178,7 @@
IMPLEMENTATION_DEFINED,176x144,OUTPUT"/>
<scaler.availableMinFrameDurations value="BLOB,3264x2448,33333333,
BLOB,2592x1944,33333333,
+ BLOB,2112x1568,33333333,
BLOB,1920x1080,33333333,
BLOB,1280x960,33333333,
BLOB,1280x720,33333333,
@@ -183,6 +187,7 @@
BLOB,176x144,33333333,
YCbCr_420_888,3264x2448,33333333,
YCbCr_420_888,2592x1944,33333333,
+ YCbCr_420_888,2112x1568,33333333,
YCbCr_420_888,1920x1080,33333333,
YCbCr_420_888,1280x960,33333333,
YCbCr_420_888,1280x720,33333333,
@@ -191,6 +196,7 @@
YCbCr_420_888,176x144,33333333,
IMPLEMENTATION_DEFINED,3264x2448,33333333,
IMPLEMENTATION_DEFINED,2592x1944,33333333,
+ IMPLEMENTATION_DEFINED,2112x1568,33333333,
IMPLEMENTATION_DEFINED,1920x1080,33333333,
IMPLEMENTATION_DEFINED,1280x960,33333333,
IMPLEMENTATION_DEFINED,1280x720,33333333,
@@ -199,6 +205,7 @@
IMPLEMENTATION_DEFINED,176x144,33333333" />
<scaler.availableStallDurations value="BLOB,3264x2448,33333333,
BLOB,2592x1944,33333333,
+ BLOB,2112x1568,33333333,
BLOB,1920x1080,33333333,
BLOB,1280x960,33333333,
BLOB,1280x720,33333333,
@@ -207,13 +214,13 @@
BLOB,176x144,33333333" />
<scaler.croppingType value="CENTER_ONLY"/>
<!-- Sensor Info -->
- <sensor.info.activeArraySize value="0,0,3264,2448"/>
+ <sensor.info.activeArraySize value="0,0,2112,1568"/>
<sensor.info.sensitivityRange value="32,2400"/>
<sensor.info.colorFilterArrangement value="BGGR"/> <!-- HAL may override this value from CMC for RAW sensors -->
<sensor.info.exposureTimeRange value="100000,333333330"/>
<sensor.info.maxFrameDuration value="66666666"/>
<sensor.info.physicalSize value="5.5,4.5"/> <!-- 4224x1.12um 3136x1.12um -->
- <sensor.info.pixelArraySize value="3264x2448"/>
+ <sensor.info.pixelArraySize value="2112x1568"/>
<sensor.info.whiteLevel value="0"/> <!-- HAL may override this value from CMC for RAW sensors -->
<sensor.info.timestampSource value="UNKNOWN"/>
<!-- Sensor -->
@@ -255,7 +262,7 @@
<Hal_tuning_RKISP1> <!-- Parameters to tune the HAL and hacks for the HAL that are camera dependent -->
<flipping value="" value_v=""/> <!-- value: SENSOR_FLIP_H or "", value_v: SENSOR_FLIP_V or "" -->
<supportIsoMap value="false"/>
- <supportTuningSize value="3264x2448"/>
+ <supportTuningSize value="2112x1568"/>
</Hal_tuning_RKISP1>
<Sensor_info_RKISP1> <!-- Information that parametrizes the behavior or qualities of the physical sensor -->
diff --git a/etc/camera/camera3_profiles_rk356x.xml b/etc/camera/camera3_profiles_rk356x.xml
index cddeba3..972994a 100644
--- a/etc/camera/camera3_profiles_rk356x.xml
+++ b/etc/camera/camera3_profiles_rk356x.xml
@@ -40,7 +40,7 @@
<control.availableVideoStabilizationModes value="OFF"/>
<control.maxRegions value="1,0,1"/>
<!-- JPEG -->
- <jpeg.maxSize value="11985408"/> <!-- 3264*2448*1.5 -->
+ <jpeg.maxSize value="4967424"/> <!-- 3264*2448*1.5=11985408 2112x1568*1.5 = 4,967,424 -->
<jpeg.availableThumbnailSizes value="0,0,160,120,320,180,320,240"/> <!-- INCREASING ORDER -->
<!-- Lens Info-->
<!-- TODO: availableApertures now is fake for we do not get the real apertures -->
@@ -149,7 +149,7 @@
<!-- Scaler -->
<scaler.availableMaxDigitalZoom value="4.0"/>
<scaler.availableInputOutputFormatsMap value="IMPLEMENTATION_DEFINED,2,YCbCr_420_888,BLOB,YCbCr_420_888,2,YCbCr_420_888,BLOB"/>
- <scaler.availableStreamConfigurations value="BLOB,3264x2448,OUTPUT,
+ <scaler.availableStreamConfigurations value="BLOB,2112x1568,OUTPUT,
BLOB,2592x1944,OUTPUT,
BLOB,1920x1080,OUTPUT,
BLOB,1280x960,OUTPUT,
@@ -173,7 +173,7 @@
IMPLEMENTATION_DEFINED,640x480,OUTPUT,
IMPLEMENTATION_DEFINED,320x240,OUTPUT,
IMPLEMENTATION_DEFINED,176x144,OUTPUT"/>
- <scaler.availableMinFrameDurations value="BLOB,3264x2448,33333333,
+ <scaler.availableMinFrameDurations value="BLOB,2112x1568,33333333,
BLOB,2592x1944,33333333,
BLOB,1920x1080,33333333,
BLOB,1280x960,33333333,
@@ -197,7 +197,7 @@
IMPLEMENTATION_DEFINED,640x480,33333333,
IMPLEMENTATION_DEFINED,320x240,33333333,
IMPLEMENTATION_DEFINED,176x144,33333333" />
- <scaler.availableStallDurations value="BLOB,3264x2448,33333333,
+ <scaler.availableStallDurations value="BLOB,2112x1568,33333333,
BLOB,2592x1944,33333333,
BLOB,1920x1080,33333333,
BLOB,1280x960,33333333,
@@ -207,13 +207,13 @@
BLOB,176x144,33333333" />
<scaler.croppingType value="CENTER_ONLY"/>
<!-- Sensor Info -->
- <sensor.info.activeArraySize value="0,0,3264,2448"/>
+ <sensor.info.activeArraySize value="0,0,2112,1568"/>
<sensor.info.sensitivityRange value="32,2400"/>
<sensor.info.colorFilterArrangement value="BGGR"/> <!-- HAL may override this value from CMC for RAW sensors -->
<sensor.info.exposureTimeRange value="100000,333333330"/>
<sensor.info.maxFrameDuration value="66666666"/>
<sensor.info.physicalSize value="5.5,4.5"/> <!-- 4224x1.12um 3136x1.12um -->
- <sensor.info.pixelArraySize value="3264x2448"/>
+ <sensor.info.pixelArraySize value="2112x1568"/>
<sensor.info.whiteLevel value="0"/> <!-- HAL may override this value from CMC for RAW sensors -->
<sensor.info.timestampSource value="UNKNOWN"/>
<!-- Sensor -->
@@ -255,7 +255,7 @@
<Hal_tuning_RKISP1> <!-- Parameters to tune the HAL and hacks for the HAL that are camera dependent -->
<flipping value="" value_v=""/> <!-- value: SENSOR_FLIP_H or "", value_v: SENSOR_FLIP_V or "" -->
<supportIsoMap value="false"/>
- <supportTuningSize value="3264x2448"/>
+ <supportTuningSize value="2112x1568"/>
</Hal_tuning_RKISP1>
<Sensor_info_RKISP1> <!-- Information that parametrizes the behavior or qualities of the physical sensor -->
4. 查看
编译重新启动,通过命令**media-ctl **查看信息
# media-ctl -d /dev/media0 -p
......
- 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/2112x1568]
-> "rockchip-csi2-dphy0":0 []
可以看到分辨率修改了。
好了更多瑞芯微相关资料,请转发回复:rxw