Skip to content

fix(imx296): 修复快速触发帧交付与 PWM 周期恢复 - #14

Open
OKayJH wants to merge 5 commits into
rk3576from
fix/imx296-fast-trigger-n1-pwm-period
Open

fix(imx296): 修复快速触发帧交付与 PWM 周期恢复#14
OKayJH wants to merge 5 commits into
rk3576from
fix/imx296-fast-trigger-n1-pwm-period

Conversation

@OKayJH

@OKayJH OKayJH commented Jul 22, 2026

Copy link
Copy Markdown
Collaborator

提出者:@ymxc152

概要

  • 修复 IMX296 快速触发模式下切换 ROI 后可能交付上一帧的问题。
  • 将快速触发状态传递给 RKISP,并在 V39 当前帧最后一个可观测输出行完成缓冲区。
  • 延迟 vb2 缓冲区完成时机,确保尾部 DMA 已排空。
  • 在退出 ROI 时显式恢复全幅几何寄存器,并在 ROI 变化后丢弃自由运行模式下的一帧无效数据。
  • 缓存固件配置的 PWM 基准周期,使长曝光切回短曝光后触发频率能够恢复。
  • 为外部触发增加运行时总开关,在模式或 ROI 切换期间可屏蔽输入、取消排队任务并清空待处理触发。
  • 增加按 YYYYMMDDNN 编号的 DLCVCAM 内核构建版本;当前版本为 2026072202,构建主机和板端 uname -v 均可查看。

问题描述

快速触发模式下修改 ROI 后,第一次采集结果可能仍对应 N-1 帧。此外,长曝光会扩大 PWM 周期,随后恢复短曝光时,驱动会把已扩大的运行时周期继续当作基准,导致最大触发帧率维持在约 20 fps,无法恢复到约 50 fps,直至设备重启。

模式或 ROI 切换过程中,外部触发输入还可能产生不应执行的排队任务,因此增加了可控的触发门控机制。

此前发布版本号通过 KBUILD_BUILD_VERSION 手工传入,仓库记录可能与交付到设备上的内核不一致。新增的 DLCVCAM_BUILD_VERSION 文件采用 YYYYMMDDNN 格式,同时不改变 uname -r 或内核模块目录。

修复方案

  1. 在 CIF/RKISP 路径中传递 IMX296 快速触发状态,并调整 V39 帧完成与尾部 DMA 的处理时机。
  2. 快速触发模式使用正确的 VTR 基线;ROI 变化后显式恢复几何寄存器,并等待无效帧排空。
  3. 保存固件 PWM 基准周期,每次根据脉宽和安全余量重新计算触发周期。
  4. 为外部触发设备增加 enable sysfs 开关及抑制计数,关闭时屏蔽 IRQ、取消工作并清空 pending 触发。
  5. 在仓库中跟踪 DLCVCAM 日期构建版本,并保持命令行覆盖能力。

#9 的关系

#9 的修改当前未包含在本 PR 中。#9 新增 IMX296_VBLANK_MIN = 37,并把 V4L2_CID_VBLANK 的最小值从 IMX296_VBLANK_DEFAULT(1162)改为 IMX296_VBLANK_MIN;本 PR 当前仍使用 1162 作为该控制器的最小值。因此,如需恢复自由运行模式下通过降低 vertical_blanking 达到 60 fps 的能力,仍需单独合入 #9 或将其两处修改补入本分支。

验证

  • scripts/checkpatch.pl --strict:帧处理与 PWM 相关提交为 0 error、0 warning;构建版本提交仅有新文件未加入 MAINTAINERS 的通用警告。
  • IMX296、RKISP 相关目标的 ARM64 定向构建通过:imx296.ocapture.ocapture_v39.orkisp.o
  • 完整 ARM64 内核构建通过。
  • 日期版本的 ARM64 增量构建 Image dtbs modules 通过。
  • 生成的 Image 包含 6.1.99-rk3576 ... #2026072202 SMP
  • make -s dlcvcam-build-version 同时支持源码内构建和 O= 构建,且仍支持命令行覆盖。
  • 发布构建不会修改旧的 .version
  • git diff --check origin/rk3576..HEAD 通过。

OKayJH added 3 commits July 22, 2026 09:49
Track fast-trigger mode across CIF so RKISP can identify IMX296.

Finish V39 buffers at the last observable line.

Delay vb2_done until tail DMA has drained.

Restore full-frame ROI registers.

Drain the invalid ROI frame during the free-run restart.

Drop diagnostic and timing experiments from the production fix.

Signed-off-by: OKayJH <okayjhh@gmail.com>
Cache the firmware PWM period instead of mutable runtime state.

Recompute the period from the base period.

Include the current pulse width and safety margin.

Apply the disabled PWM state when trigger_pulse_us changes.

This restores trigger rate after long-to-short exposure without reboot.

Signed-off-by: OKayJH <okayjhh@gmail.com>
@OKayJH
OKayJH force-pushed the fix/imx296-fast-trigger-n1-pwm-period branch from 8f5e7c6 to 2c9b30b Compare July 22, 2026 04:12
@ymxc152 ymxc152 changed the title fix(imx296): correct fast-trigger frame delivery and PWM recovery fix(imx296): 修复快速触发帧交付与 PWM 周期恢复 Jul 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant