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);
}
编译与集成
- 将上述代码放入
drivers/media/platform/msm/camera/cam_sensor/对应sensor驱动文件中 - 在sensor驱动probe函数中调用
sensor_set_8k_hdr_mode(),并注册为可切换模式 - 编译内核:
make ARCH=arm64 defconfig && make -j$(nproc) - 将生成的
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,实际应低于平台上限
通过判定标准
- sensor成功输出8K分辨率RAW图像,无裁剪或缩放
- 帧率稳定在30fps(±1fps),无丢帧
- MIPI链路无误码(通过
cam_capture_test工具检查CRC错误计数为0) - HDR模式下长短曝光帧合成正常,动态范围较SDR模式提升至少2档