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

news2025/2/11 14:20:47

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_ops
	cam_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模式子状态切换
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1335682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java第二十一章课堂总结

计算机应用实现了多台计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据。编写网络应用程序前,首先必须明确所要使用的网络协议…

(10)Linux冯诺依曼结构操作系统的再次理解

💭 前言:本章我们首先会明确冯诺依曼体系结构的概念,旨在帮助大家理解体系结构在硬件角度去理解数据流走向的问题。理解完之后我们再去谈操作系统、更多有关操作系统的细节,着重谈谈操作系统概念与定位、操作系统是如何去做管理的…

ref组合式api声明状态

一、ref声明响应式状态(支持所有类型),因为内部维护一个refImpl对象{value:***},,如下图: ref声明的数字、字符、布尔、对象、数组类型的值都存在refImpl 对象的value属性里面 所以,如果要改变ref 声明的变…

阿里云经济型e实例2核2G3M99元1年,性价比超高的入门级云服务器

产品简介 经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,采用Intel Xeon Platinum架构处理器,支持1:1、1:2、1:4多种处理器内存配比,采用非绑定CPU…

STM32实战之深入理解I²C通信协议

目录 IC的物理层 IC的协议层 IC特点 IC 总线时序图 软件模拟IC时序分享 例程简介 例程分享 STM32的IC外设 IIC(Inter-Integrated Circuit),也称为IC或TWI(Two-Wire Interface),是一种广泛使用的串行…

《图解HTTP》第1章 了解Web及网络基础

《图解HTTP》第1章 了解Web及网络基础 1. 使用 HTTP 协议访问 Web1.1 网络基础 TCP/IP1.2 TCP/IP 协议族1.2.1 TCP/IP 的分层管理 1. 使用 HTTP 协议访问 Web Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议) 的协议作为…

弱电工程中发包、承包、分包、转包、内包、挂靠一次搞清楚

前言 工程建设中的发包、承包、分包、转包、内包、挂靠是实务中一个非常普遍的工程现象和常见的法律问题。对这几个问题的正确理解和把握是正确处理工程实务的基础。但由于每个工程项目的实际情况不同、实务操作中的形式各异,这几者的关系不好把握,容易…

AI 绘画StableDiffusionWebui图生图

介绍 stable-diffusion-webui AI绘画工具,本文介绍图生图,以一张图片做底图优化生成。 例如:上传一张真人照片,让AI把他改绘成动漫人物;上传画作线稿,让AI自动上色;上传一张黑白照&#xff0c…

k8s初学

1.k8s是什么? kubernetes:8个字母省略,就是k8s 自动部署,自动扩展和管理容器化部署的应用程序的一个开源系统。 k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具。 2.docker微服务,可以…

CSRF(Pikachu)

CSRF(get) 首先我们先登录账号 admin 密码是;123456 点击修改个人信息 用F12或者BP 抓包看看我们的url 那么构成的CSRF攻击payload为http://pikachu.shifa23.com/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sexboy&phonenum”手机…

【大厂面试】之 美团(一面经含答案)

美团 一面 tcp三次握手,四次挥手。time-wait、close-wait状态。MSL代表什么?为什么time-wait是2MSL,可不可以更长?如果不设置time-wait有什么影响 time-wait是主动关闭方的一个状态;close-wait是被动关闭方的一个状态…

中庸 原文与译文

《中庸》是中国古代论述人生修养境界的一部道德哲学专著,是儒家经典著作之一,原属《礼记》第三十一篇,相传为战国时期子思所作。 其内容肯定“中庸”是道德行为的最高标准,认为“至诚”则达到人生的最高境界,并提出“…

代码随想录第四十一天(一刷C语言)|打家劫舍打家劫舍II打家劫舍III

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、打家劫舍 思路:参考carl文档 1、确定dp数组以及下标的含义:下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。 2、确定递…

财务数据智能化:用AI工具高效制作财务分析PPT报告

Step1: 文章内容提取 WPS AI 直接打开文件,在AI对话框里输入下面指令: 假设你是财务总监,公司考虑与茅台进行业务合作、投资或收购,请整合下面茅台2021年和2022年的财务报告信息。整理有关茅台财务状况和潜在投资回报的信息&…

连锁餐饮数字化:一体化运营管控平台

内容来自演讲:刘腾飞 | 上海奥谱创网络科技有限公司 | CEO 摘要 本文介绍了企业级管理系统的需求和现状,以及如何通过数据指标为依据的改善循环来优化企业的运营。文章还提出了场景驱动、迭代上线的方法,并介绍了两个平台、三个统一的解决方…

等级保护安全的管理机构与管理制度

目录 安全管理机构的控制点 岗位设置 人员配备 授权和审批 沟通和合作 审核和检查 安全管理制度的控制点 安全管理制度 指定和发布 评审和修订 安全管理机构的控制点 岗位设置 人员配备 授权和审批 沟通和合作 审核和检查 安全管理制度的控制点 安全管理制度 指定…

电子学会C/C++编程等级考试2022年06月(七级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:有多少种二叉树 输入n(1<n<13),求n个结点的二叉树有多少种形态 时间限制:1000 内存限制:65536输入 整数n输出 答案 样例输入 3样例输出 5 答案: //参考答案 #include<bits/stdc++.h> using namespace std; …

二叉树题目:分裂二叉树的最大乘积

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;分裂二叉树的最大乘积 出处&#xff1a;1339. 分裂二叉树的最大乘积 难度 6 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root&…

吉他初学者学习网站搭建系列(7)——如何在线制作乐谱(扒歌)

文章目录 背景实现查和弦&渲染和弦编辑谱子保存谱子 成果 背景 相信很多音乐爱好者们在听到一首好听的歌或者曲子时&#xff0c;都有动手扒谱的冲动&#xff0c;但是&#xff0c;你电脑里并没有安装一些专业的扒谱软件&#xff0c;这个时候&#xff0c;你更倾向于有一个网…

cesium实现区域贴图及加载多个gif动图

1、cesium加载多个gif动图 Cesium的Billboard支持单帧纹理贴图&#xff0c;如果能够将gif动图进行解析&#xff0c;获得时间序列对应的每帧图片&#xff0c;然后按照时间序列动态更新Billboard的纹理&#xff0c;即可实现动图纹理效果。为此也找到了相对于好一点的第三方库libg…