CRM的request管理笔记

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中做不同处理
		... //这里流程和上面一样

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JaveWeb教程】(8)Web前端基础:Vue组件库Element之Table表格组件和Pagination分页组件 详细示例介绍

目录 1 Table表格组件1.1 组件演示1.2 组件属性详解 2 Pagination分页2.1 组件演示2.2 组件属性详解2.3 组件事件详解 接下来我们来学习一下ElementUI的常用组件,对于组件的学习比较简单,我们只需要参考官方提供的代码,然后复制粘贴即可。本节…

学习笔记——C++中数据的输入 cin

作用:用于从键盘中获取数据 关键字:cin 语法:cin>>变量 类型:C中数据的输入主要包含:整形(int)浮点型(float,double float),字符型&…

秋招复习之堆

目录 前言 堆 堆的常用操作 堆的实现(大根堆) 1. 堆的存储与表示 2. 访问堆顶元素 3. 元素入堆 4. 堆顶元素出堆 Top-k 问题 方法一:遍历选择 方法二:排序 方法三:堆 总结 前言 秋招复习之堆。 堆 「堆 heap…

定时器@Scheduled使用

四种调度方法 Scheduled 是 Spring Boot 中用于创建定时任务的注解。使用此注解可以很方便地实现定时任务的自动调度。以下是常见四种参数的作用: 固定延迟(Fixed Delay): Scheduled(fixedDelay 1000):在上一个任务完成后&#…

UG装配-动画制作

制作装配动画用到的命令是序列 制作动画前,先将所有约束取消 当我们在装配导航器中装配好产品后,可以在序列中编辑生产动态装配或爆炸动画; 需要注意的是,如果是希望创建装配或爆炸动画,需要先将所有约束取消&#…

关于整形提升

个人主页:Lei宝啊 愿所有美好如期而遇 什么是整型提升? 在C语言的整型算数运算总是至少以int类型来进行的,当表达式中有char,byte,short类型的操作数时,他们在被使用前需要被转换成int类型,…

Presto CLI学习

1. 序言 作为Presto的客户端之一,Presto CLI是一个基于终端的交互式shell,对应presto源码中的presto-cli模块 Presto CLI的本质是一个self-executing jar —— presto-cli-version-executable.jar,就像一个普通的UNIX可执行文件 因此&#…

力扣383.赎金信 -- 哈希表

思路&#xff1a;记录magazine每个字符个数&#xff0c;然后记录ransomNote每个字符&#xff08;每有一个减1&#xff09;&#xff0c;假如出现<0的情况说明ransomnode有字符的个数超过了magazine则无法构成&#xff0c;否则可以构成 代码&#xff1a; class Solution { pu…

HCIA-Datacom题库(自己整理分类的)_11_其他网络协议单选【9道题】

1.DNS协议的主要作用是&#xff1f; 文件传输 远程接入 域名解析 邮件传输 2.下列属于链路状态协议的是? Direct static FTP OSPF 解析&#xff1a; FTP&#xff1a;文件传输协议 OSPF&#xff1a;链路状态路由协议 3.如下图所示的网络主机A通过Telnet登录到路由…

1_工程设计模式-简单工厂设计

工程设计模式 一.简单工程设计模式 1.概念 简单工厂模式( Simple Factory Pattern )是指由一个工厂对象决定创建出哪一种产品类的实例。 但它不属于 GOF 23 种设计模式。简单工厂适用于工厂类负责创建的对象较少的场景&#xff0c;且客户端只需要传入工厂类的参数&#xff…

2023年度总结:技术沉淀、持续学习

2023年度总结&#xff1a;技术沉淀、持续学习 一、引言 今年是我毕业的第二个年头&#xff0c;也是完整的一年&#xff0c;到了做年终总结的时候了 这一年谈了女朋友&#xff0c;学习了不少技术&#xff0c;是充实且美好的一年&#xff01; 首先先看年初定的小目标&#xf…

ARTrack 阅读记录

目录 环境配置与脚本编写 前向传播过程 网络结构 环境配置与脚本编写 按照官网执行并没有顺利完成&#xff0c;将yaml文件中的 pip 项 手动安装的 conda create -n artrack python3.9 # 启动该环境&#xff0c;并跳转到项目主目录路径下 astor0.8.1 configparser5.2.0 data…

ssm基于HTML5的交流论坛的设计与实现+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

一文掌握文本语义分割:从朴素切分、Cross-Segment到阿里SeqModel

前言 之所以写本文&#xff0c;源于以下两点 在此文《基于LangChainLLM的本地知识库问答&#xff1a;从企业单文档问答到批量文档问答》的3.5节中&#xff0c;我们曾分析过langchain-chatchat项目中文本分割相关的代码&#xff0c;当时曾提到该项目中的文档语义分割模型为达摩…

56K star!一键拥有跨平台 ChatGPT 应用:ChatGPT-Next-Web

前言 现在围绕 openai 的客户端层出不穷&#xff0c;各路开发大神可以说是各出绝招&#xff0c;我也试用过几个国内外的不同客户端。 今天我们推荐的开源项目是目前我用过最好的ChatGPT应用&#xff0c;在GitHub超过56K Star的开源项目&#xff1a;ChatGPT-Next-Web。 ChatGP…

【计算机组成原理】通过带符号整数的减法运算中加法器的溢出标志 OF 和符号标志 SF 对两个带符号整数的大小进行比较

对于带符号整数的减法运算&#xff0c;能否直接根据 CF 的值对两个带符号整数的大小进行比较&#xff1f; 对于带符号整数的减法运算&#xff0c;不能直接根据CF&#xff08;进/借位标志&#xff09;的值对两个带符号整数的大小进行比较。 CF标志位在带符号整数运算中主要用于…

Java最大优先队列设计与实现

Java 学习面试指南&#xff1a;https://javaxiaobear.cn 1、API设计 类名MaxPriorityQueue构造方法MaxPriorityQueue(int capacity)&#xff1a;创建容量为capacity的MaxPriorityQueue对象成员方法private boolean less(int i,int j)&#xff1a;判断堆中索引i处的元素是否小…

二叉树算法题(一)

根据二叉树创建字符串 根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&#xff0c;转化后需要省…

基于JSP+Servlet+Mysql的学生信息管理系统

基于JSPServletMysql的学生信息管理系统 一、系统介绍二、功能展示1.目录2.数据库3.登陆4.注册5.主页 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于JSPServletMysql的学生信息管理系统 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语…

软件装一送三了!还附带弹窗资讯,你确定不试一下?

前言 前几天一个朋友向我吐槽&#xff0c;说电脑太卡了。自己好像都没安装什么软件&#xff0c;怎么就那么多弹窗广告。 我看了一下他的电脑&#xff0c;笑了一下说&#xff1a;你的电脑真好&#xff0c;都会只能给你推荐美女看&#xff0c;这资讯来之不易啊&#xff0c;好好享…