ISP 状态机轮转和bubble恢复机制学习笔记

2023-12-26 07:12

本文主要是介绍ISP 状态机轮转和bubble恢复机制学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 ISP的中断类型

ISP中断类型
SOF: 一帧图像数据开始传输
EOF: 一帧图像数据传输完成
REG_UPDATE: ISP寄存器更新完成(每个reg group都有独立的这个中断)
EPOCH: ISP某一行结尾(默认20)就会产生此中断
BUFFER DONE: 一帧图像数据ISP完全写到DDR了

2 ISP驱动状态机

通过camera context ops来实现的。
具体包含两种状态机,1、state machine 2、substate machine
当处于state machine的active状态时,substate machine才会工作起来。
除了substate machine外,还有substate_machine_irq用来接收中断处理。
一个中断如何调用到substate_machine的操作集中,流程图如下图示:
在这里插入图片描述

概述:
1)csl中调用流程1
umd的csl中调用ioctl,调用到内核中cam_node,然后调用到cam_context, cam_context会根据状态机中的ioctl_ops设置,调用对应接口处理。
2)crm中调用流程2
crm处理req时,经过crm_node_intf调用到cam_node,然后调用到cam_context, 进而调用到状态机中crm_ops的相关函数。
3)收到irq处理流程3
当顶部状态机处于actived状态时,当isp中收到SOF中断时,irq经过ife_hw_mgr调用到cam_context, 进而调用到状态机中irq_ops, irq_ops会进一步调用到子状态机中irq_ops相关函数来处理。

3 Top State Machine

  • 什么是顶部状态机?
    cam_context中定义了几种状态,完成cam context中不同状态的轮转和不同流程处理。
    umd中node调用kmd中cam context时,根据不同状态做不同处理。

  • 调用入口:
    当cam_isp_dev_component_bind时,会循环多次(如果是ife会循环8次)初始化cam_isp_context_init,
    然后设置给cam context设置顶部状态机,定义如下
    ctx_base->state_machine = cam_isp_ctx_top_state_machine;

3.1 状态机类型

/*** enum cam_ctx_state -  context top level states*/
enum cam_context_state {CAM_CTX_UNINIT               = 0,CAM_CTX_AVAILABLE            = 1,CAM_CTX_ACQUIRED             = 2,CAM_CTX_READY                = 3,CAM_CTX_FLUSHED              = 4,CAM_CTX_ACTIVATED            = 5,CAM_CTX_STATE_MAX            = 6,
};

3.2 状态机如何流转

在这里插入图片描述

4 Activated Substate Machine

  • 子状态机的用处?
    只有在cam_ctx_activated时,子状态机才有效。这是isp的子状态,由isp中断来驱动状态机切换。来了不同中断,切换不同子状态,然后处理request,并且把request move到不同的list里,直到最后buffer done中断来了之后,把request从isp上下文中彻底移除,并且通知camera sync这个request的buffer 已经填好了。

  • 入口,在哪里赋值的?
    在cam_isp_context_init时,会设置子状态机和子状态机下的中断处理。

cam_isp_context_init()ctx->substate_activated = CAM_ISP_CTX_ACTIVATED_SOF;ctx->substate_machine = cam_isp_ctx_activated_state_machine;ctx->substate_machine_irq = cam_isp_ctx_activated_state_machine_irq;

4.1 子状态机类型

/*** enum cam_isp_ctx_activated_substate - sub states for activated**/
enum cam_isp_ctx_activated_substate {CAM_ISP_CTX_ACTIVATED_SOF,CAM_ISP_CTX_ACTIVATED_APPLIED,CAM_ISP_CTX_ACTIVATED_EPOCH,CAM_ISP_CTX_ACTIVATED_BUBBLE,CAM_ISP_CTX_ACTIVATED_BUBBLE_APPLIED,CAM_ISP_CTX_ACTIVATED_HW_ERROR,CAM_ISP_CTX_ACTIVATED_HALT,CAM_ISP_CTX_ACTIVATED_MAX,
};

struct cam_isp_ctx_irq_ops 定义了中断处理函数,他是根据子状态机当前状态找到对应处理接口。

static struct cam_isp_ctx_irq_opscam_isp_ctx_activated_state_machine_irq[CAM_ISP_CTX_ACTIVATED_MAX] = {/* SOF */{.irq_ops = {__cam_isp_ctx_handle_error,__cam_isp_ctx_sof_in_activated_state,__cam_isp_ctx_reg_upd_in_sof,__cam_isp_ctx_notify_sof_in_activated_state,__cam_isp_ctx_notify_eof_in_activated_state,__cam_isp_ctx_buf_done_in_sof,__cam_isp_ctx_handle_secondary_events,},},/* APPLIED */{.irq_ops = {__cam_isp_ctx_handle_error,__cam_isp_ctx_sof_in_activated_state,__cam_isp_ctx_reg_upd_in_applied_state,__cam_isp_ctx_epoch_in_applied,__cam_isp_ctx_notify_eof_in_activated_state,__cam_isp_ctx_buf_done_in_applied,__cam_isp_ctx_handle_secondary_events,},},/* EPOCH */{.irq_ops = {__cam_isp_ctx_handle_error,__cam_isp_ctx_sof_in_epoch,__cam_isp_ctx_reg_upd_in_epoch_bubble_state,__cam_isp_ctx_notify_sof_in_activated_state,__cam_isp_ctx_notify_eof_in_activated_state,__cam_isp_ctx_buf_done_in_epoch,__cam_isp_ctx_handle_secondary_events,},},/* BUBBLE */{.irq_ops = {__cam_isp_ctx_handle_error,__cam_isp_ctx_sof_in_activated_state,__cam_isp_ctx_reg_upd_in_epoch_bubble_state,__cam_isp_ctx_notify_sof_in_activated_state,__cam_isp_ctx_notify_eof_in_activated_state,__cam_isp_ctx_buf_done_in_bubble,__cam_isp_ctx_handle_secondary_events,},},/* Bubble Applied */{.irq_ops = {__cam_isp_ctx_handle_error,__cam_isp_ctx_sof_in_activated_state,__cam_isp_ctx_reg_upd_in_applied_state,__cam_isp_ctx_epoch_in_bubble_applied,NULL,__cam_isp_ctx_buf_done_in_bubble_applied,__cam_isp_ctx_handle_secondary_events,},},/* HW ERROR */{.irq_ops = {NULL,__cam_isp_ctx_sof_in_activated_state,__cam_isp_ctx_reg_upd_in_hw_error,NULL,NULL,NULL,},},/* HALT */{},
};

4.2 子状态机如何流转

首先调用start_dev接口后,isp子状态机进入SOF状态。
在这里插入图片描述
分2种情况:

  • isp正常工作子状态切换
    在这里插入图片描述

  • isp Bubble模式子状态切换
    在这里插入图片描述

这篇关于ISP 状态机轮转和bubble恢复机制学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/538514

相关文章

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连