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

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio