高通Camera 驱动调试要点(二)

本文聚焦于高通Camera驱动调试中的两大问题:bus overflow和sof freeze。bus overflow涉及VFE时钟设置,解决方法包括增大总线时钟频率和调整VFE突发长度。sof freeze可能是由于ISP未收到传感器帧数据,需检查CSID/CSIPHY/CAMIF。调试步骤包括验证VFE硬件配置、对比传感器与ISP的帧大小等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  这篇文章主要介绍数据流这边Camera ISP这块所遇到的问题,主要介绍bus overflow和sof freeze;


(一)bus overflow

  摄像头传感器时钟通道(即 MIPI DDR 时钟)的工作频率与激活的数据通道数决定摄像头传感器在指定操作模式下的总数据传输速率(吞吐量)。每个通道的数据传输速率是 MIPI DDR 时钟速度的两倍。例如,工作在 200 MHz MIPI DDR 时钟频率和 4 个激活通道下的摄像头传感器的总数据传输速率为 1600 Mbps(每个通道的数据传输速率为 200 * 2 = 400 Mbps)。

  每个帧的分辨率、额外/虚拟像素/线数、水平消隐、垂直消隐、MIPI 包开销、每像素位数、数据格式、内部是否存在多个交错数据流以及每个流的数据传输速率/开销等,都会影响数据传输速率。指定工作模式下初步摄像头调通,计算:X = 帧宽 * (帧高垂直消隐) 每像素位数 * 每秒帧数 * (MIPI 协议和其他数据流的开销)在 VFE 时钟优化中为给定的 MSM 找到大于 X 的最接近的值作为 VFE 时钟的初始值。

  在标称时钟模式下,比如MSM8909的VFE最大速度为266MHz每条MIPI通道的PHY限制为1.5 Gbps (1.5 * 109 bps),由于存在MIPI/空白开销(约15-25%,各传感器的具体数值有所不同),实际帧数据吞吐量略少于预期原图拍摄接口数据传输速率与VFE时钟无关在4通道PHY接口上,每条通道的最大数据为(266 x bpp)/通道数;bpp → 每像素的传感器输出位数对于每通道10位数据传输速率 - (266*10)/4 - 665 Mbps;

  当我们VFE 时钟设置为小于传感器输出MIPI的数据传输速率时,将出现溢出bus overflow;

502:        pr_err_ratelimited("%s: image master 0 bus overflow\n",
507:        pr_err_ratelimited("%s: image master 1 bus overflow\n",
512:        pr_err_ratelimited("%s: image master 2 bus overflow\n",
517:        pr_err_ratelimited("%s: image master 3 bus overflow\n",
522:        pr_err_ratelimited("%s: image master 4 bus overflow\n",
527:        pr_err_ratelimited("%s: image master 5 bus overflow\n",
532:        pr_err_ratelimited("%s: image master 6 bus overflow\n",

  增大VFE时钟可防止溢出发生。要更改VFE时钟,需打Vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/xxxx/ xxxx_lib.c文并编辑 op_pixel_clk 参数。

  选择正确的 VFE 时钟非常重要。VFE 时钟频率应足够高以匹配传感器输出端的数据速率(即传感器输出帧 x 帧/s),否则可能会引起 ISPIF 溢出。不过也不应设置过高的频率。设置过高的 VFE 时钟频率会导致两类问题:
1. 由于可能填充内部 VFE 输出缓存(也称为统一缓存),总线溢出的几率增大。
2. 如果 VFE 时钟频率较高,会导致功耗增大。


A. 检查与 VFE 总线溢出相关的总线时钟

  当过多的 VFE 数据流量以超过可用总线带宽的速率产生时,会导致 VFE 总线溢出错误。解决该问题的一种可行方法是检查能否通过设置更高的总线时钟频率来增加总线带宽。例如在 MSM8916 芯片组中,VFE 生成处理后的输出帧到系统 NoC (SNoC) 总线。数据流随后被转发到总线集成内存控制器 (BIMC) 总线,暂时保存在 DDR 内存中。VFE 生成的数据流将在这两条总线形成的路径上运行。因此,SNoC 和 BMIC 总线都必须进行检查。adb shell 脚本每隔一秒会转储 SNoC 和 BIMC 时钟频率。

#adb shell "while true; do cat /d/clk/snoc_clk/measure; cat /d/clk/bimc_clk/measure; echo '-----'; sleep 1; done"

200001391
748805675
-----


B. 将时钟总线设为最大频率

  VFE 总线溢出分类的第一步是检查能否通过设置更高总线时钟频率来增加可用总线带宽。增加总线带宽后,查看 VFE 总线溢出问题是否得以解决。

adb root
adb shell sleep 1
adb shell mount -t debugfs none /d
adb shell echo "22 > /d/msm-bus-dbg/shell-client/mas"
adb shell echo "512 > /d/msm-bus-dbg/shell-client/slv"
adb shell echo 
06-17 07:17:54.739 0 0 I [ C1] CAM_ERR: CAM-ISP: cam_vfe_bus_ver3_err_irq_top_half: 2946: VFE:4 BUS Err IRQ 06-17 07:17:54.739 0 0 I [ C1] CAM_ERR: CAM-ISP: cam_vfe_bus_ver3_err_irq_top_half: 2950: VFE:4 BUS IRQ status_0: 0x80000000 06-17 07:17:54.739 0 0 I [ C1] CAM_ERR: CAM-ISP: cam_vfe_bus_ver3_err_irq_bottom_half: 3040: VFE:4 BUS error image size violation 1 CCIF violation 0 constraint violation 0 06-17 07:17:54.739 0 0 I [ C1] CAM_INFO: CAM-ISP: cam_vfe_bus_ver3_err_irq_bottom_half: 3044: Image Size violation status 0x1 CCIF violation status 0x0 06-17 07:17:54.739 0 0 I [ C1] CAM_INFO: CAM-ISP: cam_vfe_print_violations: 3009: Image Size Violation 06-17 07:17:54.739 0 0 I [ C1] CAM_INFO: CAM-ISP: cam_vfe_bus_ver3_print_wm_info: 2679: VFE:4 WM:0 wm_name:LITE_0 width:120 height:3864 stride:1920 x_init:0 en_cfg:1 acquired width:1280 height:3864 06-17 07:17:54.739 0 0 I [ C1] CAM_INFO: CAM-ISP: cam_vfe_bus_ver3_print_wm_info: 2687: hw:4 WM:0 last consumed address:0xff6e000 last frame addr:0x0 fifo cnt:0x1 current client address:0xff66000 06-17 07:17:54.739 0 0 I [ C1] CAM_ERR: CAM-ISP: __cam_isp_ctx_notify_error_util: 764: Notify CRM about fatal error: 2 req: 2223 frame: 2224 in ctx: 7 on link: 0x8a030d 06-17 07:17:54.770 7798 7798 I CAM_INFO: CAM-ISP: __cam_isp_ctx_flush_req_in_top_state: 5302: Last request id to flush is 2225, ctx_id:7 06-17 07:17:54.770 7798 7798 I CAM_INFO: CAM-ISP: __cam_isp_ctx_flush_req_in_top_state: 5318: Stop HW complete. Reset HW next. 06-17 07:17:54.777 7813 7813 I CAM_WARN: CAM-ISP: __cam_isp_ctx_process_evt: 7884: Get unexpect evt:1 in acquired state 06-17 07:17:54.777 7813 7813 I CAM_INFO: CAM-ISP: cam_ife_mgr_release_hw: 7485: 7:17:54.685 Release HW success ctx id: 2
06-18
<think>我们正在处理一个关于CAM-ISP模块中VFEBUS错误的问题,特别是图像大小违规(imagesizeviolation)导致的IRQ中断请求错误。VFE(VideoFrontEnd)是摄像头图像信号处理器的一部分,负责处理原始图像数据。BUS错误通常发生在数据传输过程中,而图像大小违规意味着图像数据的尺寸超过了预设的界限。根据经验,VFEBUS错误中的图像大小违规可能由以下原因引起:1.**传感器配置错误**:摄像头传感器输出图像尺寸(如宽度、高度)与VFE配置的缓冲区尺寸不匹配。2.**硬件问题**:传感器或数据传输线路(如MIPI)的物理问题导致数据包损坏或尺寸异常。3.**软件配置问题**:VFE的配置寄存器设置不正确,例如图像分片(fragment)尺寸、步幅(stride)或图像总尺寸设置错误。4.**时钟或同步问题**:数据传输的时钟不稳定或同步信号(如VSYNC、HSYNC)异常导致图像尺寸识别错误。5.**内存问题**:用于存储图像数据的缓冲区内存分配不足或地址错误。解决方案通常包括:1.**检查传感器配置**:确保传感器输出图像尺寸(包括水平消隐、垂直消隐等)与VFE配置完全一致。需要核对传感器数据手册和VFE配置寄存器。2.**验证硬件连接**:检查MIPI线路的物理连接,使用示波器检查时钟和数据信号的完整性。3.**审查VFE配置**:-检查图像宽度和高度寄存器设置。-检查图像分片设置(如果使用分片处理)。-确保步幅(stride)设置正确(每行像素在内存中占用的字节数,通常需要对齐)。-检查图像总大小是否在分配的缓冲区范围内。4.**检查时钟配置**:确保传感器和VFE的时钟频率和相位配置正确。5.**调试内存分配**:确认图像缓冲区的大小足够容纳整个图像(包括可能的对齐填充),并检查DMA配置是否正确。在实际调试中,可以采取以下步骤:1.通过调试工具(如JTAG或内核日志)检查VFE总线的错误状态寄存器,确定具体的错误类型(例如,是行溢出还是帧溢出)。2.检查发生错误时的图像尺寸(通过日志或寄存器快照)。3.对比配置的尺寸和实际传感器输出的尺寸。例如,假设配置的图像宽度为800像素,高度为600像素,而传感器实际输出为802x600(由于消隐区域设置不当),则可能导致总线错误。此时需要调整传感器配置或VFE的接收尺寸。另外,参考相关文档[^1]指出,VFEBUS错误还可能与突发传输(bursttransfer)的配置有关,需要确保突发传输长度与总线宽度匹配。如果问题仍然存在,可能需要:-更新摄像头传感器驱动或VFE固件。-检查电源管理是否导致信号不稳定(例如,低电压导致信号失真)。§§相关问题§§1.如何调试VFE总线错误的具体原因?2.在Android/Linux内核中,如何查看VFE相关的调试信息?3.如何正确配置摄像头传感器与VFE之间的图像尺寸参数?4.VFE总线错误是否与内存对齐有关?如何设置正确的内存对齐?5.常见的VFE总线错误类型有哪些?如何区分?</think>### CAM-ISP VFE BUS Err IRQ 图像大小违规解决方案 #### 问题原因分析 VFE(Video Front-End)总线错误中的**图像大小违规(image size violation)** 通常由以下原因触发: 1. **配置不匹配**:摄像头传感器输出图像分辨率(如$W \times H$)超出ISP模块预设的缓冲区尺寸$[W_{\text{max}} \times H_{\text{max}}]$,或跨步(stride)参数未对齐内存边界[^1]。 2. **时序错误**:帧同步信号(VSYNC/HSYNC)异常导致图像行/列数超限(如实际行数$H_{\text{actual}} > H_{\text{config}}$)。 3. **硬件限制**: - 输入图像尺寸超过VFE硬件处理能力(如某平台限制$W \leq 4096$)。 - MIPI CSI-2数据包大小与VFE接收配置不符。 4. **软件缺陷**:驱动层未正确处理动态分辨率切换(如预览/录像模式切换时缓冲区未重配)。 #### 解决方案步骤 1. **验证传感器配置** - 检查传感器输出尺寸是否匹配VFE配置,确保满足: $$ W_{\text{sensor}} \leq W_{\text{vfe\_max}}, \quad H_{\text{sensor}} \leq H_{\text{vfe\_max}} $$ - 通过I²C读取传感器寄存器,确认实际分辨率(如OV13855的0x3808/0x380C)。 2. **调整VFE寄存器** - 修改VFE总线控制寄存器(以Qualcomm平台为例): ```c // 设置图像最大尺寸(示例:3264x2448) vfe_write(vfe_base, VFE_BUS_IMAGE_MASTER_n_WR_IMAGE_SIZE, 0x0CC00C30); // 配置跨步(stride)对齐为128字节 vfe_write(vfe_base, VFE_BUS_IRQ_SUBSAMPLE_PATTERN, 0x00000080); ``` - 启用溢出中断调试: ```c vfe_write(vfe_base, VFE_BUS_IRQ_MASK, 0x80000000); // 开启SIZE_VIOLATION中断 ``` 3. **检查内存缓冲区** - 确保DMA缓冲区尺寸满足: $$ \text{Buffer\_Size} \geq W \times H \times \frac{\text{BPP}}{8} + \text{Stride\_Padding} $$ - 使用`dma_alloc_coherent()`分配时对齐到128/256字节边界。 4. **调试硬件信号** - 用示波器捕获MIPI CSI-2信号: - 验证数据包长度是否匹配`VFE_BUS_MISR_CTRL`配置。 - 检查VSYNC周期是否异常(如帧长$T_{\text{frame}} > \frac{1}{\text{FPS}}$)。 5. **处理动态切换** - 在分辨率切换时添加同步锁: ```c mutex_lock(&vfe->reset_lock); vfe_stop_streaming(); // 停止数据流 reconfigure_buffer(new_w, new_h); // 重配缓冲区 vfe_start_streaming(); mutex_unlock(&vfe->reset_lock); ``` #### 关键日志分析 查看内核日志定位违规位置: ``` [ 256.374] cam-isp: VFE 0 BUS SIZE_VIOLATION IRQ! [ 256.379] Line width: 3260 > max 3264? // 实际行宽超限 [ 256.384] Frame: Unpacker0 size 3260x2444 vs cfg 3264x2448 ``` 此时需检查: - 传感器消隐(blanking)区域是否压缩了有效像素 - MIPI长包(long packet)的WC(word count)是否包含CRC #### 预防措施 1. 在初始化时动态读取传感器能力表(如通过`get_framesize_limits()`)。 2. 添加尺寸安全阈值:配置$W_{\text{cfg}} = W_{\text{sensor}} + 16$应对时序抖动。 3. 启用VFE总线监控工具(如QTI的`camxhal3`调试模式)。 > 解决后需完整测试: > $$ \text{测试用例} = \left\{ \begin{array}{ll} \text{最大分辨率} \\ \text{快速模式切换} \\ \text{低光照高噪声场景} \end{array} \right. $$ [^1]: 参考Qualcomm《Camera Subsystem Programmer Guide》第8.3节总线错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值