在调试摄像头时,修改分辨率是一个基础但关键的步骤。本文将以OV13850摄像头模块为例,详细讲解在RK3568平台(Android 11 SDK)上修改摄像头分辨率的具体方法。
1. 查看传感器数据手册
首先,需要确认摄像头传感器本身支持的分辨率。根据OV13850的数据手册,其支持以下几种分辨率模式:
- 4224 x 3136
- 2112 x 1568
- 4224 x 2376
然而,数据手册通常不会详细说明如何通过寄存器配置来切换这些模式,这部分信息需要从驱动代码中获取。
2. 分析并修改Linux内核驱动
在Linux内核中,摄像头驱动通常会预置优化好的分辨率配置。以ov13850.c驱动文件为例(路径:drivers/media/i2c/ov13850.c)。
该驱动在数组 supported_modes[] 中定义了当前支持的分辨率模式:
static const struct ov13850_mode supported_modes[] = {
{
.width = 2112,
.height = 1568,
.max_fps = {
.numerator = 10000,
.denominator = 300000,
},
.exp_def = 0x0600,
.hts_def = 0x12c0,
.vts_def = 0x0680,
.reg_list = ov13850_2112x1568_regs,
},
{
.width = 4224,
.height = 3136,
.max_fps = {
.numerator = 20000,
.denominator = 150000,
},
.exp_def = 0x0600,
.hts_def = 0x12c0,
.vts_def = 0x0d00,
.reg_list = ov13850_4224x3136_regs,
},
};
驱动通过 ov13850_enum_frame_sizes 回调函数,根据索引 (fse->index) 向上层应用报告支持的分辨率。
在默认情况下,系统可能会选择第一个或最高分辨率作为默认输出。如果你希望将默认分辨率设置为 2112x1568,一个直接的方法是注释掉驱动中不想要的分辨率配置,只保留所需模式。但更常见的做法是调整枚举顺序或通过设备树(Device Tree)传递配置参数。
3. 修改Android Hal层配置文件
仅修改内核驱动还不够,Android系统的相机Hal层也需要知道传感器支持哪些分辨率。这通常在XML配置文件中定义。
对于RK3568平台,需要修改文件:hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml。
在该文件中,你需要添加对 2112x1568 分辨率的支持,主要修改以下几个部分:
<jpeg.maxSize>:计算并更新JPEG最大尺寸(分辨率长宽1.5)。
<scaler.availableStreamConfigurations>:在BLOB、YCbCr_420_888、IMPLEMENTATION_DEFINED等多种格式下,添加 2112x1568 的输出配置。
<scaler.availableMinFrameDurations> 和 <scaler.availableStallDurations>:为新增分辨率设置对应的帧持续时间。
<sensor.info.activeArraySize> 和 <sensor.info.pixelArraySize>:将传感器有效像素区域和像素阵列大小更新为新分辨率。
<supportTuningSize>:更新支持调优的图像尺寸。
具体修改内容如下所示(以diff格式展示关键变更):
- <jpeg.maxSize value="11985408"/> <!-- 3264*2448*1.5 -->
+ <jpeg.maxSize value="4967424"/> <!-- 2112x1568*1.5 = 4,967,424 -->
- <scaler.availableStreamConfigurations value="BLOB,3264x2448,OUTPUT,
+ <scaler.availableStreamConfigurations value="BLOB,2112x1568,OUTPUT,
BLOB,2592x1944,OUTPUT,
..."/>
- <sensor.info.activeArraySize value="0,0,3264,2448"/>
+ <sensor.info.activeArraySize value="0,0,2112,1568"/>
- <sensor.info.pixelArraySize value="3264x2448"/>
+ <sensor.info.pixelArraySize value="2112x1568"/>
4. 验证修改结果
完成内核驱动和Android配置文件的修改后,重新编译系统并烧录启动。
在设备启动后,可以通过 media-ctl 这个强大的Linux多媒体调试工具来验证摄像头的当前配置状态。执行以下命令:
media-ctl -d /dev/media0 -p
在输出信息中,找到对应OV13850传感器的实体(entity),查看其pad0的格式(fmt)信息。如果修改成功,你将看到类似以下的输出,表明当前格式已设置为 2112x1568:
- 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 []
至此,摄像头分辨率的修改工作已完成,上层Android相机应用在获取可用分辨率列表时,将包含你新添加或设定的选项。