Linux Component概述和高通V4l2驱动模型

1 Linux为什么要引入Component框架?

为了让subsystem按照一定顺序初始化设备才提出来的。
subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video device),这时就要用到component框架。

例如v4l2 subdev和v4l2 video device中,谁依赖谁先创建?
v4l2 video device依赖V4l2 subdev,它要等subdev创建后再创建,同时将subdev绑定到v4l2 video device上。

1.1 高通camera kmd中component的使用

入口:camera_init是入口。
submodule_table[i].component[j].init()
对submodule table中定义的每个component做init。
相关定义:

static const struct camera_submodule_component camera_base[] = {{&cam_req_mgr_init, &cam_req_mgr_exit},{&cam_sync_init, &cam_sync_exit},{&cam_smmu_init_module, &cam_smmu_exit_module},{&cam_cpas_dev_init_module, &cam_cpas_dev_exit_module},{&cam_cdm_intf_init_module, &cam_cdm_intf_exit_module},{&cam_hw_cdm_init_module, &cam_hw_cdm_exit_module},
};
static const struct camera_submodule_component camera_isp[] = {{&cam_ife_csid_init_module, &cam_ife_csid_exit_module},{&cam_ife_csid_lite_init_module, &cam_ife_csid_lite_exit_module},{&cam_vfe_init_module, &cam_vfe_exit_module},{&cam_sfe_init_module, &cam_sfe_exit_module},{&cam_isp_dev_init_module, &cam_isp_dev_exit_module},
};
...
static const struct camera_submodule submodule_table[] = {{.name = "Camera BASE",.num_component = ARRAY_SIZE(camera_base),.component = camera_base,},{.name = "Camera TFE",.num_component = ARRAY_SIZE(camera_tfe),.component = camera_tfe,},{.name = "Camera ISP",.num_component = ARRAY_SIZE(camera_isp),.component = camera_isp,},{.name = "Camera SENSOR",.num_component = ARRAY_SIZE(camera_sensor),.component = camera_sensor},...
};

1.2 重要数据结构

  • master
    表示要构建的系统
struct master {struct list_head node; //用于链接到全局masters中bool bound; //标记当前master是否bind了const struct component_master_ops *ops; //master设备的回调接口struct device *dev;struct component_match *match; //安装顺序保存了当前master的所有component匹配条件
};
  • Component
    表示系统组件
struct component {struct list_head node;//用于链接到全局的component_list中struct master *master;//保存本组件属于哪个master devicebool bound;//本component是否bind过const struct component_ops *ops;//本component的回调接口struct device *dev; //本组件属于哪个设备
};
  • component_match
    用来匹配系统需要的组件,并规定了组件的初始化顺序
struct component_match_array {void *data;//比较数据int (*compare)(struct device *, void *);//比较接口void (*release)(struct device *, void *);struct component *component;//当前比较匹配规则属于哪个componentbool duplicate;//标记是否做移除
};struct component_match {size_t alloc;//分配了多少个比较条件对象component_match_array size_t num;//保存了多少个component匹配条件struct component_match_array *compare;//匹配条件数组地址
};
  • 全局变量masters和component_list
    保存整个linux系统中所有主设备的数据结构。
    保存整个linux系统中所有添加到component框架里的component数据结构。
static LIST_HEAD(component_list);
static LIST_HEAD(masters);

1.3 CRM和其他component如何联系起来?

在高通KMD框架中,CRM属于主设备(master设备),其他cam_sync、cam_smmu、cam_cap、cam_tfe、cam_sensor等属于组件component。
他们是通过配置cam_component_platform_drivers时联系起来。

static struct platform_driver *const cam_component_platform_drivers[] = {
/* BASE */&cam_sync_driver,&cam_smmu_driver,&cam_cpas_driver,&cam_cdm_intf_driver,&cam_hw_cdm_driver,
#ifdef CONFIG_SPECTRA_TFE&cam_csid_ppi100_driver,&cam_tfe_driver,&cam_tfe_csid_driver,
#endif
#ifdef CONFIG_SPECTRA_ISP&cam_ife_csid_driver,&cam_ife_csid_lite_driver,&cam_vfe_driver,&cam_sfe_driver,&isp_driver,
#endif...
}

1.4 camera kmd中component如何bind

camera_submodule_component 的camera base数组中,会依次执行cam_req_mgr_init和cam_sync_init以及其他component的init函数实现。

1.4.1 crm init

cam_req_mgr_init就是crm的init,也是master设备的init。
它主要做了什么?

  • 向linux系统注册crm的platform_driver驱动
  • cam_req_mgr_probe

crm的platform_driver驱动中定义了probe函数,当驱动名称和设备名称匹配时,调用驱动的probe函数。

这里cam_req_mgr_probe主要做了两件事:
1)遍历cam_component_platform_drivers按顺序添加到match_list
2)添加match_list到master设备,并遍历是否所有的component都添加完成。
如果所有的component都添加完成,尝试初始化master_device。

尝试初始化master_device通过调用try_to_bring_up_aggregate_device(adev,NULL),它主要做两件事,一是查看是不是所有component_match列表里的component都已经添加到全局链表component_list中,二是如果所有component_match列表里的component都ready,就调用master设备的bind接口进行初始化。master的bind会顺序执行各component的bind()。
(通过调用component_bind_all())

1.4.2 cam_sync init

它主要做了什么?

  • 向linux系统注册cam_sync的platform_driver驱动
  • cam_sync_probe

cam_sync_probe做了什么?
为cam_sync创建一个component,并添加到component框架。
它会调用component_add()进行添加,进一步调用try_to_bring_up_masters(component),
try_to_bring_up_masters会遍历全局链表master_devices中所有的master设备,尝试bringup每一个遍历出来的aggregate device。

1.5 component_match数据结构关系图

在这里插入图片描述

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

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

相关文章

电商类直播介绍

电商直播是一种购物方式,通过直播技术向消费者展示商品,并引导其进行购买。在法律上,电商直播属于商业广告活动,主播需要根据具体行为承担“广告代言人"“广告发布者"或“广告主"的责任。 电商直播的特点在于其更…

月薪6W!美团、网易等大厂急招HarmonyOS开发!

近期,多家互联网公司发布了多个和鸿蒙系统有关的岗位。 不仅如此,还与Windows等主流老牌操作系统并列,并且排在首位介绍。 此外,今日头条招聘Android开发工程师也提及岗位需要“负责今日头条 Android、鸿蒙系统等新技术方向调研…

Http协议与Tomcat

HTTP协议 HTTP协议(HyperText Transfer Protocol)即超文本传输协议 ,是TCP/IC网络体系结构应用层的一个客户端-服务端协议,是所有客户端,服务端数据传输的基石(数据传输规则) 特点 ⭐基于TCP协…

class059 建图、链式前向星、拓扑排序【算法】

class059 建图、链式前向星、拓扑排序【算法】 code1 建图 package class059;import java.util.ArrayList; import java.util.Arrays;public class Code01_CreateGraph {// 点的最大数量public static int MAXN 11;// 边的最大数量// 只有链式前向星方式建图需要这个数量// 注…

基于AT89C51单片机的秒表设计

1.设计任务 利用单片机AT89C51设计秒表,设计计时长度为9:59:59,超过该长度,报警。创新:设置重启;暂停;清零等按钮。最后10s时播放音乐提示。 本设计是采用AT89C51单片机为中心,利用其…

zabbix的自动发现和注册、proxy代理和SNMP监控

目录 一、zabbix自动发现与自动注册机制: 1、概念 2、zabbix 自动发现与自动注册的部署 二、zabbix的proxy代理功能: 1、工作流程 2、安装部署 三、zabbix-snmp 监控 1、概念 2、安装部署 四、总结: 一、zabbix自动发现与自动注册…

细讲结构体

结构体是一些值的集合,这些值就是成员变量,这些变量可以是不同类型的。 当我们存放一个学生的信息是,包括性别,姓名,学号,年龄等内容,这些值是不同类型的,这是我们就可以使用结构体来…

二叉树的层平均值[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[3.00000,14.50000,1…

外置固态硬盘配置

1、插上usb外置硬盘盒 2、邮件我的此“电脑”选择“管理” 3、例如新增的固态硬盘如下: 4、这里我选择mrb(旧模式)而没选guid(新模式) 因为mrb兼容模式更加适合windows、ios等系统 5、右击未分区磁盘,选择新增卷区,一路下一步即可

《俏丽》正规万方收录普刊投稿发表

《俏丽》期刊是国家新闻出版总署批准的正规期刊,万方期刊网收录。安排文化、教育相关稿件,适用于评职称时的论文发表(单位有特殊要求除外),具体投稿方式请小窗我。 收稿方向、栏目参考:教育研究、课堂教学…

C语言课程设计

内容与设计思想 1、系统功能与分析&#xff08;填写你所设计的菜单及流程图&#xff09;。 菜单&#xff1a; 日历打印 日历推算 日历间隔倒计时牌 退出程序 模块设计 根据功能需要&#xff1a; 源文件&#xff1a; #include<stdio.h> #include&…

采样率越高噪声越大?

ADC采样率指的是模拟到数字转换器&#xff08;ADC&#xff09;对模拟信号进行采样的速率。在数字信号处理系统中&#xff0c;模拟信号首先通过ADC转换为数字形式&#xff0c;以便计算机或其他数字设备能够处理它们。 ADC采样率通常以每秒采样的次数来表示&#xff0c;单位为赫…

用Pandas轻松进行7项基本数据检查

大家好&#xff0c;作为一名数据工程师&#xff0c;面对糟糕的数据质量&#xff0c;可以使用Pandas执行快捷的数据质量检查。本文使用scikit-learn提供的California Housing数据集&#xff0c;进行基本数据检查。 一、California Housing数据集概述 【数据集】&#xff1a; …

智能优化算法应用:基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.广义正态分布算法4.实验参数设定5.算…

智能优化算法应用:基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定5.算…

硬件基础:差模和共模

一直以来&#xff0c;都难以理解差模和共模这两个概念&#xff0c;什么差分信号、差模信号、共模信号&#xff0c;差模干扰、共模干扰……虽然看了一些资料&#xff0c;但貌似说法还挺多的&#xff0c;理解起来仍然是一头雾水。所以&#xff0c;专门用一篇文章来好好研究下这个…

算法学习系列(六):高精度加法、减法、乘法、除法

目录 引言一、高精度加法1.题目描述2.代码实现3.测试 二、高精度减法1.题目描述2.代码实现3.测试 三、高精度乘法1.题目描述2.代码实现3.测试 四、高精度除法1.题目描述2.代码实现3.测试 引言 本文介绍了高精度加法、高精度减法、高精度乘法、高精度除法&#xff0c;这个高精度…

软件开发自动化到智能文档检索:大语言模型驱动的开源项目盘点 | 开源专题 No.46

shroominic/codeinterpreter-api Stars: 2.4k License: MIT 这是一个 ChatGPT 代码解释器的开源实现项目&#xff0c;使用了 LangChain 和 CodeBoxes 进行后端沙盒式 Python 代码执行。该项目具有以下特性和优势&#xff1a; 数据集分析、股票图表绘制、图像处理等功能支持网…

KubeSphere Marketpalce 上新!Databend Playground 助力快速启动数据分析环境

12 月 5 日&#xff0c;Databend Labs 旗下 Databend Playground&#xff08;社区尝鲜版&#xff09;成功上架青云科技旗下 KubeSphere Marketplace 云原生应用扩展市场&#xff0c;为用户提供一个快速学习和验证 Databend 解决方案的实验环境。 关于 Databend Playground Dat…

Flask之手搓bootstrap翻页

使用bootstrap框架的翻页组件时&#xff0c;记起在学习使用laravel框架的时候&#xff0c;只需要添加相应的功能代码&#xff0c;就可以直接使用翻页组件了&#xff0c;但缺少自定义&#xff0c;或者说自定义起来有点麻烦。 自己手搓翻页组件&#xff0c;不仅能加深对flask的认…