2. 配置8K传感器输出模式", "title": "配置8K传感器输出模式

任务目标

将高通平台Camera传感器输出配置为8K分辨率(7680×4320),并调整像素时钟与帧率,使其满足HDR(高动态范围)场景下对带宽和时序的要求。本案例以Qualcomm Spectra ISP + 标准MIPI CSI-2接口为例,完成从sensor driver到ISP pipeline的8K输出链路配置。

前置依赖

  • 高通平台:SM8250/SM8350(或兼容Spectra 480/570 ISP)
  • Camera Sensor:Sony IMX577(或任意支持8K输出的RAW sensor)
  • 内核版本:msm-4.19 或更高,启用 CONFIG_MSM_CAMERA
  • 驱动路径:drivers/media/platform/msm/camera

核心实现

以下代码展示在sensor驱动中配置8K输出模式的核心逻辑,包括分辨率切换、像素时钟计算和帧率设定。关键点在于:8K@30fps HDR需要约2.4Gbps/lane的MIPI速率(4 lane配置),因此像素时钟必须与HDR使能后的额外行开销匹配。

// sensor_8k_hdr_mode.c — 8K HDR模式配置核心片段
#include <linux/kernel.h>
#include <media/msm_cam_sensor.h>

#define SENSOR_8K_WIDTH  7680
#define SENSOR_8K_HEIGHT 4320
#define HDR_EXTRA_LINES  16   // HDR合成预留行
#define MIPI_LANES       4
#define BPP              10   // RAW10

// 计算所需像素时钟(MHz)
static u32 calc_pixel_clk(u32 fps, u32 hts, u32 vts) {
    return (u32)((u64)fps * hts * vts / 1000000);
}

static int sensor_set_8k_hdr_mode(struct msm_camera_sensor *sensor) {
    struct camera_sensor_parm *parm = &sensor->parm;
    u32 hts, vts, pixel_clk;
    u32 fps = 30;  // HDR目标帧率

    // 1. 设置8K分辨率
    parm->mode.width = SENSOR_8K_WIDTH;
    parm->mode.height = SENSOR_8K_HEIGHT;

    // 2. 计算时序:HDR模式需要额外行用于长短曝光合成
    hts = SENSOR_8K_WIDTH + 1200;  // 水平消隐
    vts = SENSOR_8K_HEIGHT + HDR_EXTRA_LINES + 80; // 垂直消隐含HDR开销

    // 3. 像素时钟 = 30fps × HTS × VTS
    pixel_clk = calc_pixel_clk(fps, hts, vts);
    // 确保不超过ISP最大输入时钟(例如SM8250为600MHz)
    if (pixel_clk > 600) {
        pr_err("8K HDR pixel clock %uMHz over limit\n", pixel_clk);
        return -EINVAL;
    }

    // 4. 写入sensor寄存器(以IMX577为例)
    sensor->reg_settings = (struct msm_camera_i2c_reg_conf[]) {
        {0x0100, 0x00},  // standby
        {0x0114, 0x01},  // 8K mode select
        {0x0340, (vts >> 8) & 0xFF}, {0x0341, vts & 0xFF},
        {0x0342, (hts >> 8) & 0xFF}, {0x0343, hts & 0xFF},
        {0x0304, (pixel_clk >> 8) & 0xFF}, {0x0305, pixel_clk & 0xFF},
        {0x0100, 0x01},  // active
    };
    sensor->reg_setting_size = ARRAY_SIZE(sensor->reg_settings);

    // 5. 更新MIPI TX配置(4 lane @ 2.4Gbps)
    sensor->mipi_info->lane_cnt = MIPI_LANES;
    sensor->mipi_info->settle_cnt = 0x14;  // 根据平台PHY tuning
    sensor->mipi_info->data_rate = 2400;   // Mbps per lane

    pr_info("8K HDR mode: %ux%u@%u, pclk=%uMHz, %u lanes\n",
            SENSOR_8K_WIDTH, SENSOR_8K_HEIGHT, fps,
            pixel_clk, MIPI_LANES);
    return 0;
}

ISP Pipeline配置

在ISP侧需同步更新输出尺寸和HDR使能标志,否则sensor输出8K但ISP仍按4K处理会导致裁剪或带宽错误:

// cam_sensor_8k_hdr.c — ISP侧配置
static int cam_isp_config_8k_hdr(struct cam_isp_dev *isp_dev) {
    struct cam_isp_out_res *out = &isp_dev->out_res;

    out->width = 7680;
    out->height = 4320;
    out->format = CAM_FORMAT_RAW_MIPI_10;
    out->hdr_mode = CAM_HDR_MODE_2EXP;  // 2次曝光HDR

    // 更新ISP时钟需求
    isp_dev->clk_req->cam_clk = 480;  // MHz
    isp_dev->clk_req->axi_clk = 600;  // MHz

    // 通知sensor驱动完成模式切换
    return cam_sensor_update_mode(isp_dev->sensor_dev, 8K_HDR_MODE);
}

编译与集成

  1. 将上述代码放入 drivers/media/platform/msm/camera/cam_sensor/ 对应sensor驱动文件中
  2. 在sensor驱动probe函数中调用 sensor_set_8k_hdr_mode(),并注册为可切换模式
  3. 编译内核:make ARCH=arm64 defconfig && make -j$(nproc)
  4. 将生成的 boot.img 烧录至设备

验证方法

  • dmesg检查:启动后执行 dmesg | grep "8K HDR",应看到 8K HDR mode: 7680x4320@30, pclk=xxxMHz, 4 lanes 日志
  • 抓帧验证:使用 media-ctl -p 查看pipeline,确认sensor输出节点为 7680x4320 格式
  • HDR效果:拍摄高动态范围场景(如逆光),检查RAW图像暗部与亮部细节是否同时保留
  • 带宽监控:cat /sys/kernel/debug/camera/isp_bw 观察AXI总线占用,8K@30fps RAW10理论带宽约 7680×4320×30×10/8 ≈ 1.24GB/s,实际应低于平台上限

通过判定标准

  1. sensor成功输出8K分辨率RAW图像,无裁剪或缩放
  2. 帧率稳定在30fps(±1fps),无丢帧
  3. MIPI链路无误码(通过 cam_capture_test 工具检查CRC错误计数为0)
  4. HDR模式下长短曝光帧合成正常,动态范围较SDR模式提升至少2档