CRM的request管理笔记

news2024/11/18 16:32:22

1 request类型

request有两种,device request和link request。

  • link request
    link req是对link进行精确控制。
    link req是对每个link的请求,比如某一帧是否需要bubble recovery、某一帧是否需要长曝光等feature。
  • device request
    对一个设备进行每帧控制。设备包括:isp、flash、sensor、actuator等。
    camx node通过packet方式传递request的配置到kmd对应的驱动模块,驱动会保存好对应request配置。
    设备驱动会通知crm哪个request从umd已经加入到kmd了。(通过cam_req_mgr_cb_add_req函数通知)

link request数据原型

struct cam_req_mgr_sched_request_v2 {
	__s32 version;
	__s32 session_hdl;
	__s32 link_hdl;
	__s32 bubble_enable;
	__s32 sync_mode;
	__s32 additional_timeout;
	__s32 num_links;
	__s32 num_valid_params;
	__s64 req_id;
	__s32 link_hdls[MAX_LINKS_PER_SESSION];
};

2 link 中in_q介绍

  • 什么是in_q,它的职责?
    在link中存放的输入请求队列。

  • in_q在link中位置:
    link持有req_data, req_data中包含了in_q和req_tbl。
    在这里插入图片描述

link的结构体定义:

struct cam_req_mgr_core_link {
	int32_t                              link_hdl;
	int32_t                              num_devs;//link中有多少个device
	enum cam_pipeline_delay              max_delay;
    ...
	struct cam_req_mgr_core_workq       *workq;//自定义的workqueue,处理工作队列中work
	int32_t                              pd_mask;
	struct cam_req_mgr_connected_device *l_dev;//存放link中device
	struct cam_req_mgr_req_data          req; //req_data
	struct cam_req_mgr_timer            *watchdog;//看门狗,监控sof是否超时,sensor是否长时间没有出帧
	...
};

其中cam_req_mgr_req_data 定义中有in_q和 req_tbl。

struct cam_req_mgr_req_data {
	struct cam_req_mgr_req_queue *in_q; //保存Input request queue
	struct cam_req_mgr_req_tbl   *l_tbl;//保存request table
	int32_t                       num_tbl;//保存req table的个数
	struct cam_req_mgr_apply      apply_data[CAM_PIPELINE_DELAY_MAX];//保存apply data,就是req是setting
	struct cam_req_mgr_apply      prev_apply_data[CAM_PIPELINE_DELAY_MAX];
	struct mutex                  lock;
};
  • in_q定义
struct cam_req_mgr_req_queue {
	int32_t                     num_slots;  //当前存放slot个数
	struct cam_req_mgr_slot     slot[MAX_REQ_SLOTS]; //slot数组,用slot来存储每帧信息。MAX_REQ_SLOTS=48
	int32_t                     rd_idx;//读索引下标。每当收到SOF或EOF,要对req处理时,从rd_idx读取req
	int32_t                     wr_idx;//写索引下标。每当有req从umd通过sche req下发时,就会写入到wr_idx中
	int32_t                     last_applied_idx;//最新位置的读索引下标
};
  • in_q 图示
    input queue图示
    umd中通过session的ProcessRequest,然后调用到pipeline的openrequest,进而一步步调用,最终调用sched_req的cmd命令,
    ioctl调用到kmd中,kmd的crm中响应SCHED_REQ命令,调用cam_req_mgr_schedule_request做进一步处理。
    cam_req_mgr_schedule_request()做了什么?
    1)根据umd传入数据,填充task_data。task_data中u此时存放的sched_req数据。
    2)在cam_req_mgr_process_sched_req()中,取出sched_req数据,设置给当前link的in_q中的slot数组中,对应索引是wd_idx

3 request table介绍

  • 什么是req table,它的职责是?
    req tbl存在于link中,它是保存不同pipeline delay的link dev的req信息。判断当前link中pd值相同的dev的apply setting是否满足了。

request table定义

struct cam_req_mgr_req_tbl {
	int32_t                     id; //req tbl的id值
	int32_t                     pd; //当前req tbl对应哪个pipeline delay
	int32_t                     dev_count; //相同pd的设备有几个
	int32_t                     dev_mask; //
	int32_t                     skip_traverse;
	struct cam_req_mgr_req_tbl *next; //指向下一个pd的req tbl
	int32_t                     pd_delta; //两个req tbl他们的pd差值
	int32_t                     num_slots; //当前req tbl有多少个slot
	 //slot数组,存放当前req tbl中具体存放的slot。MAX_REQ_SLOTS=48
	struct cam_req_mgr_tbl_slot slot[MAX_REQ_SLOTS];
};

cam_req_mgr_tbl_slot 定义如下:

struct cam_req_mgr_tbl_slot {
	int32_t                                idx; //slot的索引
	uint32_t                               req_ready_map; //跟着当前pd值的req tbl中哪些设备req ready了
	enum crm_req_state                     state; //当前slot的状态
	uint32_t                               inject_delay_at_sof;
	uint32_t                               inject_delay_at_eof;
	struct  crm_tbl_slot_special_ops       ops;
};

link持有req_data, req_data中包含了in_q和req_tbl。

  • 图解req tbl
    2个req tbl会共用一个idx。
    在这里插入图片描述

4 in_q 和request table关系

in_q和req tbl会共享idx,通过idx建立联系。
在这里插入图片描述

5 add request

link 的device在add request后,dev会回调req通知crm。通过cam_req_mgr_cb_add_req(struct cam_req_mgr_add_request *add_req)回调的。
以IFENode为例,调用流程

IFENode::ExecuteProcessRequest() @camxifenode.cpp
	->CommitAndSubmitPacket();
		-> GetHwContext()->Submit(GetCSLSession(), m_hDevice, m_pIQPacket)
			->Submit() @camxhwcontext.cpp
				->CSLSubmit()@camxcsl.cpp
					-> CSLSubmitHW() @@camxcslhw.cpp
					->CSLHwInternalDefaultSubmit()@camxcslhwinternal.cpp
						->ioctlCmd.op_code         = CAM_CONFIG_DEV;
						->pDevice->deviceOp.Ioctl(pDevice, VIDIOC_CAM_CONTROL, &ioctlCmd)

上面是umd调用流程,下面走到kmd的CONFIG_DEV ioctl中。

cam_node_handle_ioctl() @cam_node.c
	->case CAM_CONFIG_DEV:
	->__cam_node_handle_config_dev()
		->cam_context_handle_config_dev(ctx, config) @cam_context.c //ctx是cam context
			->ctx->state_machine[ctx->state].ioctl_ops.config_dev(ctx, cmd)
				-> __cam_isp_ctx_config_dev_in_top_state() @cam_isp_context.c
					->ctx->ctx_crm_intf->add_req(&add_req);					

因为之前crm中配置过

static struct cam_req_mgr_crm_cb cam_req_mgr_ops = {
	.notify_trigger = cam_req_mgr_cb_notify_trigger,
	.notify_err     = cam_req_mgr_cb_notify_err,
	.add_req        = cam_req_mgr_cb_add_req,
	.notify_timer   = cam_req_mgr_cb_notify_timer,
	.notify_stop    = cam_req_mgr_cb_notify_stop,
};

所以ctx->ctx_crm_intf->add_req()会调用到cam_req_mgr_cb_add_req(struct cam_req_mgr_add_request *add_req)。
cam_req_mgr_cb_add_req()做了什么?
当link device中收到的req,会通知crm ,crm中link的对应pipeline delay的req tbl中保存了到达req的信息,
当某一帧的req tbl中slot state为ready,同时in_q中这一帧的req的slot state也为ready,表示这一帧的req已经准备好了,
可以根据crm控制策略下发apply setting。

思考问题:
上面的cam_req_mgr_cb_add_req()是link device调用的,对于非link device,会通知crm req到达吗?
答案是会的,具体看下BPSNode的调用流程,最后也会走到camxhwcontext的Submit(),后面的调用流程和上面link device的相同。
以BPSNode为例,看下调用流程:

BPSNode::ExecuteProcessRequest() @camxbpsnode.cpp
	->CommitAllCommandBuffers(pBPSCmdBuffer);
	->pIQPacket->CommitPacket();
	->pIQPacket->AddCmdBufferReference(pBPSCmdBuffer[BPSCmdBufferFrameProcess],...);
	->GetHwContext()->Submit(GetCSLSession(), m_hDevice, pIQPacket) //不同的Node,设置的packet不同,到kmd中做不同处理
		... //这里流程和上面一样

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

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

相关文章

Linux系统IO—探索输入输出操作的奥秘

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:HEART BEAT—YOASOBI 2:20━━━━━━️💟──────── 5:35 🔄 ◀️ ⏸ ▶️ ☰ …

如何通过绘制【学习曲线】来判断模型是否【过拟合】

学习曲线是一种图形化工具,用于展示模型在训练集和验证集(或测试集)上的性能随着训练样本数量的增加而如何变化。它可以帮助我们理解模型是否受益于更多的训练数据,以及模型是否可能存在过拟合或欠拟合问题。学习曲线的x轴通常是训…

Win11开始菜单怎么改成经典模式-Win11切换Win10风格开始菜单方法

Win11切换Win10风格开始菜单方法 方法一: 1. 在Win11电脑上下载一个“Startallback”软件,下载安装完成后,在“控制面板”里打开该软件。 2. 打开后,在“欢迎界面”,选择使用“Windows10主题样式”并重启电脑即可。…

CodeWave智能开发平台--03--目标:应用创建--06变量作用域和前后端服务逻辑

摘要 本文是网易数帆CodeWave智能开发平台系列的第08篇,主要介绍了基于CodeWave平台文档的新手入门进行学习,实现一个完整的应用,本文主要完成06变量作用域和前后端服务逻辑 CodeWave智能开发平台的08次接触 CodeWave参考资源 网易数帆Co…

使用C#发送邮箱验证码

使用C#发送邮箱验证码 在很多应用程序中,我们需要使用邮箱来进行用户身份验证。其中一种常见的方式是通过发送验证码到用户的邮箱,然后要求用户输入该验证码进行验证。本文将介绍如何使用 C# 发送邮箱验证码。 声明 验证码登录没有用任何的工具&#…

Linux22.04系统安装显卡驱动,cuda,cudnn流程

1. 安装显卡驱动 ubuntu-drivers deices显示所有适配显卡的驱动型号,recommended为推荐安装 安装 sudo apt install nvidia-driver-440重启 sudo reboot验证 nvidia-smi2. 安装cuda 在 CUDA Toolkit 的下载页面选择系统版本和安装方式,下载并运行…

Vue基础知识三

一 VUE脚手架 1.1 说明 Vue 脚手架是 Vue 官方提供的标准化开发工具(开发平台)。脚手架最新的版本是 4.x(脚手架版本与vue版本无关,我们这里使用脚手架的版本是4.x)。文档: https://cli.vuejs.org/zh/。 脚手架官网…

使用Spring Cache优化数据库访问

使用Spring Cache优化数据库访问 在这篇博客中,我们将学习如何使用Spring Cache来优化数据库访问,提高系统性能。我们将创建一个简单的图书管理应用作为示例,并演示如何通过缓存减少对数据库的频繁查询。 1. 项目结构 首先,我们…

【影刀RPA_如何使用影刀的企业微信指令?】

思路:先用python代码过一遍,再将必要参数填到指令里面。 第一步: 1、在企业微信后台新建应用,设置消息接收地址(需要服务器的公网ip地址),进行签名验证。然后,从浏览器中查询ip地址…

LabVIEW在指针式仪表读数中的应用

在LabVIEW环境中,为实现指针式仪表的自动读数,首先进行图像预处理,包括图像缩放、灰度化和二值化,以提高处理速度和减少噪声干扰。利用LabVIEW的图像处理功能,灰度化和二值化操作简化了图像的色彩信息,便于…

Open3d GUI 之对话框

文章目录 对话框关闭对话框文件对话框 Open3d快速上手💎 点云对象详解 对话框 open3d中的对话框用gui.Dialog来实现,但这个对话框其实只有个框,并没有对话,需要人为地进行布局规划。 如果单纯地希望演示一下对话框,…

完美版视频网站模板 – 苹果CMS v10大橙子vfed主题

源码下载: https://download.csdn.net/download/m0_66047725/88700504 这次提供的大橙子 vfed 模板 已经完美,只去除了授权验证和正版主题神秘后门,不影响任何功能体验性。主题优化:全站响应式自带主题设置面板自带联盟资源库大全…

《MySQL系列-InnoDB引擎06》MySQL锁介绍

文章目录 第六章 锁1 什么是锁2 lock与latch3 InnoDB存储引擎中的锁3.1 锁的类型3.2 一致性非锁定读3.3 一致性锁定读3.4 自增长与锁3.5 外键和锁 4 锁的算法4.1 行锁的三种算法4.2 解决Phantom Problem 5 锁问题5.1 脏读5.2 不可重复读5.3 丢失更新 6 阻塞7 死锁 第六章 锁 开…

【亚马逊云科技】使用Helm 3为Amazon EKS部署Prometheus+Grafana监控平台

文章目录 1. 创建Kubernetes命名空间2. 添加Prometheus社区helm chart3. 安装prometheus4. 检查Prometheus Pod运行状况5. 检查Prometheus Service部署情况6. 修改服务访问端口类型7. 访问Prometheus数据收集情况8. 访问Grafana9. 设置数据源10. 查看Kubernetes各类性能可视化参…

初中数学:几何题的相关解题原则总结

一、多问类型的几何题 我们做题,应该都遇到过这类几何题目,就是,三个小问,每个小问对应一个几何图像,而且,渐渐复杂。这种题目,大多数有一个变化的条件,比如,动点、角度…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第四天-Linux管道练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

冒泡排序数据结构实验报告

实验目的: 理解冒泡排序算法的原理和基本思路。熟悉冒泡排序在实际应用中的场景和优化方法。 实验内容(实验题目与说明) 编写一个双向冒泡排序算法,即在排序过程中以交替的正、反两个方向进行遍历。若第一趟把关键字最大的记录…

【Sublime Text】| 02——常用插件安装及配置

系列文章目录 【Sublime Text】| 01——下载软件安装并注册 【Sublime Text】| 02——常用插件安装及配置 失败了也挺可爱,成功了就超帅。 文章目录 1. 汉化2. 更换颜色主题3. 更改编码插件—ConvertToUTF84. 对齐插件—Alignment5. 括号高亮插件—BracketHighligh…

亲,你相信数据吗?

对于这个问题,我们首先要看一下数据的属性,数据本身是中性的,只是信息的一个载体,从这个属性定义来看,我们是不能盲目相信或者不相信数据的。相不相信数据,其实是数据可靠性的问题,而数据可靠性…

网络安全红队常用的攻击方法及路径

一、信息收集 收集的内容包括目标系统的组织架构、IT资产、敏感信息泄露、供应商信息等各个方面,通过对收集的信息进行梳理,定位到安全薄弱点,从而实施下一步的攻击行为。 域名收集 1.备案查询 天眼查爱企查官方ICP备案查询 通过以上三个…