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中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Nginx之upstream被动式重试机制的实现

《Nginx之upstream被动式重试机制的实现》本文主要介绍了Nginx之upstream被动式重试机制的实现,可以通过proxy_next_upstream来自定义配置,具有一定的参考价值,感兴... 目录默认错误选择定义错误指令配置proxy_next_upstreamproxy_next_upst

Java深度学习库DJL实现Python的NumPy方式

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