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中有多少个deviceenum cam_pipeline_delay              max_delay;...struct cam_req_mgr_core_workq       *workq;//自定义的workqueue,处理工作队列中workint32_t                              pd_mask;struct cam_req_mgr_connected_device *l_dev;//存放link中devicestruct cam_req_mgr_req_data          req; //req_datastruct 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 queuestruct cam_req_mgr_req_tbl   *l_tbl;//保存request tableint32_t                       num_tbl;//保存req table的个数struct cam_req_mgr_apply      apply_data[CAM_PIPELINE_DELAY_MAX];//保存apply data,就是req是settingstruct 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=48int32_t                     rd_idx;//读索引下标。每当收到SOF或EOF,要对req处理时,从rd_idx读取reqint32_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 delayint32_t                     dev_count; //相同pd的设备有几个int32_t                     dev_mask; //int32_t                     skip_traverse;struct cam_req_mgr_req_tbl *next; //指向下一个pd的req tblint32_t                     pd_delta; //两个req tbl他们的pd差值int32_t                     num_slots; //当前req tbl有多少个slot//slot数组,存放当前req tbl中具体存放的slot。MAX_REQ_SLOTS=48struct 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.mzph.cn/news/604578.shtml

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

相关文章

JDK 11:崭新特性解析

JDK 11:崭新特性解析 JDK 11:崭新特性解析1. HTTP Client(标准化)示例代码 2. 局部变量类型推断的扩展示例代码 3. 新的字符串方法示例代码 4. 动态类文件常量示例代码 5. Epsilon 垃圾收集器使用方式 结语 JDK 11:崭新…

MySQL数据库进阶-事务

事务 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的。而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚。所有受到影 响的数据将返回到…

现有网络模型的使用及修改(VGG16为例)

VGG16 修改默认路径 import os os.environ[TORCH_HOME] rD:\Pytorch\pythonProject\vgg16 # 下载位置太大了(140多G)不提供直接下载 train_set torchvision.datasets.ImageNet(root./data_image_net, splittrain, downloadTrue, transformtorchvis…

Informer:用于长序列时间序列预测的高效Transformer模型

最近在研究时间序列分析的的过程看,看到一篇精彩的文章,名为:《Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting》,特此撰写一篇博客。 文章主要研究了一种用于长序列时间序列预测的高效Trans…

Windows:笔记本电脑设置休眠教程

前言 不知道大家在使用【Windows】笔记本有没有这个习惯,我会把他的电池选项的【休眠】设置进行打开。因为作为我们开发人员电脑一般是一周关一次机,有时候一个月关一次机。这时候【休眠】功能就给我们提供了一个好处,我们选择了【休眠】后电…

PAT 乙级 1056 组合数的和

给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。 输入格式: 输入在一行…

C语言编译器(C语言编程软件)完全攻略(第二十四部分:Turbo C 2.0使用教程(使用Turbo C 2.0编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 二十四、Turbo C 2.0使用教程&#xff08;使用Turbo C 2.0编写C语言程序&#xff09; 首先&#xff0c;我们给出一段完整的C语言代码&#xff1a; #include <stdio.h> int main() { puts("hello&#xff0c;world!"…

jumpServer-02-安装与配置

jumpServer-02-安装与配置 文章目录 jumpServer-02-安装与配置一、什么是jumpServer&#xff1f;二、jumpServer安装配置①&#xff1a;初始化配置01&#xff1a;Linux服务器准备02&#xff1a;环境准备&#xff0c;关闭防火墙03: 配置yum源04&#xff1a;安装系统初始化所需的…

Linux习题2

解析&#xff1a;虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存&#xff0c;使得每个进程看到的内存空间一致。 解析&#xff1a;所谓系统调用&#xff0c;就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的&…

Qt/QML编程学习之心得:Linux下读写文件File(24)

在Linux嵌入式系统中,经常会使用Qt来读写一个文件,判断一个文件是否存在,具体如何实现呢? 首先,要使用linux系统中相关的头文件: #include <unistd.h> #include <stdio.h> #include <stdlib.h> 其次,判断路径是否存在, if(!dir.exists()){mkdir(…

leetcode12 整数转罗马数字

题目描述&#xff1a;给定一个整数&#xff0c;将其转换为罗马数字。罗马数字由七个字符表示&#xff1a;I&#xff08;1&#xff09;、V&#xff08;5&#xff09;、X&#xff08;10&#xff09;、L&#xff08;50&#xff09;、C&#xff08;100&#xff09;、D&#xff08;5…

视频剪辑技巧:添加srt字幕,提升视频品质的方法

在视频制作和剪辑过程中&#xff0c;字幕的添加是一项常见的技巧。通过添加srt字幕&#xff0c;可以提升视频的品质和观感&#xff0c;让观众更好地理解视频内容。下面一起来看云炫AI智剪如何批量添加srt字幕的方法&#xff0c;如何通过这些技巧提升视频品质。 原视频画面与添…

JAVA中小型医院信息管理系统源码 医院系统源码

开发框架&#xff1a;SpringBootJpathymeleaf 搭建环境&#xff1a;jdk1.8idea/eclipsemaven3mysql5.6 基于SpringBoot的中小型医院信息管理系统&#xff0c;做的比较粗糙&#xff0c;但也实现了部分核心功能。 就诊卡提供了手动和读卡两种方式录入&#xff0c;其中IC读卡器使用…

基于YOLOv7算法的高精度实时水上漂浮物目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时水上漂浮物目标检测系统可用于日常生活中检测与定位bottle&#xff08;塑料瓶&#xff09;, grass&#xff08;野草&#xff09;, branch&#xff08;树枝&#xff09;, milk-box&#xff08;牛奶盒&#xff09;, plastic-bag&#…

【Spring Boot 源码学习】SpringApplication 的定制化介绍

Spring Boot 源码学习系列 SpringApplication 的定制化介绍 一、引言二、往期内容三、主要内容1. 基础配置1.1 设置关闭 Banner1.2 设置自定义 Banner 打印对象1.3 设置应用程序主入口类1.4 设置用于创建应用程序上下文的工厂1.5 添加 BootstrapRegistry 初始化器实现1.6 设置或…

Java-IO流-15

文件操作 文件创建 package com.edu.file;import org.junit.jupiter.api.Test;import java.io.File; import java.io.IOException;public class Demo01 {public static void main(String[] args) {}Test//方式1public void create01(){String filePath "D:\\new1.txt&q…

算法第十三天-组合总和Ⅱ

组合总和Ⅱ 题目要求 解题思路 按顺序搜索&#xff0c;设置合理的变量&#xff0c;在搜索的过程中判断是否会出现重复集结果。重点理解对输入数组排序的作用和参考代码中 大剪枝和小剪枝 的意思 这道题域上一问的区别在于&#xff1a; 第39题&#xff1a;candidates中的数字…

华为云Sys-default、Sys-WebServer和Sys-FullAccess安全组配置规则

华为云服务器默认安全组可选Sys-default、Sys-WebServer或Sys-FullAccess。default是默认安全组规则&#xff0c;只开放了22和3389端口&#xff1b;Sys-WebServer适用于Web网站开发场景&#xff0c;开放了80和443端口&#xff1b;Sys-FullAccess开放了全部端口。阿腾云atengyun…

ReentrantLock底层原理学习二

以 ReentrantLock 作为切入点&#xff0c;来看看在这个场景中是如何使用 AQS 来实现线程的同步的 ReentrantLock 的时序图 调用 ReentrantLock 中的 lock()方法&#xff0c;源码的调用过程我使用了时序图来展现。ReentrantLock.lock() 这个是 reentrantLock 获取锁的入口 pu…

PPT模板(100套IT科技互联网风)

哈喽&#xff0c;小伙伴们&#xff0c;最近是不是都在准备年终总结、年终述职&#xff0c;一个好的PPT模板是编写报告的开端。我最近也在准备年终总结报告&#xff0c;一块整理了一些PPT模板。这些模板适用于各种IT科技互联网相关的场合&#xff0c;如产品发布会、项目提案、工…