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深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取