找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

440

积分

0

好友

52

主题
发表于 前天 03:02 | 查看: 6| 回复: 0

在调试摄像头时,修改分辨率是一个基础但关键的步骤。本文将以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相机应用在获取可用分辨率列表时,将包含你新添加或设定的选项。




上一篇:渗透测试进阶指南:SRC挖掘中边缘与隐形资产的发掘实战
下一篇:Go API设计实战指南:从架构思维到工程化落地
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-11 05:26 , Processed in 0.096130 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表