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 device
	bool 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;//当前比较匹配规则属于哪个component
	bool 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数据结构关系图

在这里插入图片描述

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

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

相关文章

弱网模拟工具

一、背景 一个人晚上在家通过 Wi-Fi 上网,在线电影播放基本流畅,可一旦在晚间用网高峰期打视频电话就画面糊,这时不仅可能带宽受限了,还可能有较高的丢包率。与有线网络通信相比,无线网络通信受环境影响会更大&#x…

Unity 关于Ray、RaycastHit、Raycast及其使用

Unity中,我们要进行物理模拟和碰撞检测时,有三个重要的概念Ray、RaycastHit、Raycast。 其中,Ray可以理解为射线,它是一条从起点沿着特定方向延伸的无限长线段。 它的语法是: Ray(Vector3 origin, Vector3 directio…

js/jQuery常见操作 之 jQuery操作复选框的常见问题

js/jQuery常见操作 之 jQuery操作复选框的常见问题 1. js/jQuery的其他一些常见基础操作2. 全选/全不选问题2.1 效果2.2 实现代码2.2.1 简单js实现2.2.2 jQuery实现2.2.2.1 注意语法(区别jQuery版本)2.2.2.2 完整代码实现 3. jQuery实现点击 行tr 实现ch…

SCADA软件工具有多少免费的?

随着工业自动化的飞速发展,SCADA系统已经成为工业领域智能化转型绕不开的重要工具,不少个人和公司也都加入到了学习研究SCADA系统的队伍中。数维图小编耗费大量时间整理了国内外免费(非完全免费)的SCADA软件工具,有部分…

uniapp 之 短信验证码登录

一、需求 输入手机号码&#xff0c;可以获取验证码。 二、实现效果 点击前&#xff1a; 点击后&#xff1a; 三、代码实现 <template><view class"login"><view class"infobox"><view class"item"><input type…

搜索推荐技术-爱奇艺搜索引擎技术

一、爱奇艺的搜索引擎框架示意图 即通过召回系统&#xff0c;即基于文本匹配的matching system&#xff0c;得到大量视频资源的候选集&#xff0c;经过粗排和精排&#xff0c;最后返回给用户。重点在于召回模块和排序模块。 二、召回模块 召回模块比较重要的是基础相关性&am…

vue3 + mark.js 实现文字标注功能

效果图 安装依赖 npm install mark.js --save-dev npm i nanoid代码块 <template><!-- 文档标注 --><header><el-buttontype"primary":disabled"selectedTextList.length 0 ? true : false"ghostclick"handleAllDelete"…

MySQL数据库,函数与分组

单行函数&#xff1a; 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以嵌套 参数也可以是一列或一个值 数值函数 基本函数&#xff1a; 注&#xff1a;ROUND(x,y)函数的y是负数时&#xff0c;即往高位进行四舍五入&#xff0c;如-3就是按百位…

机器学习 类别特征编码:Category Encoders 库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

优雅提效:Guava的字符串处理工具

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们要聊一聊Google Guava这个超棒的Java库&#xff0c;尤其是它的字符串处理工具。对于Java程序员来说&#xff0c;字符串处理是日常工作的一部分&#xff0c;而Guava在这方面提供了非常强大的支持。使用Gu…

12.7_黑马数据结构与算法Java

030 单向链表 get 不会提前拿到所有的索引值&#xff0c;这样维护起来非常不方便。因此&#xff0c;我们是在遍历的时候得到他的索引值 %d&#xff1a;数字的占位符就是用百分号d表示 %n&#xff1a;换行符 thinking:String.format()? String.format()的详细用法_七月J的博客-…

大数据在互联网营销中的应用:案例与策略

互联网时代的营销领域正经历着一场由大数据驱动的变革。在2023年&#xff0c;大数据的应用已成为推动市场策略和决策的关键因素。本文将探讨大数据如何影响互联网营销&#xff0c;并通过实际案例分析展示其在提升营销效果方面的作用。 首先&#xff0c;通过分析海量数据&#x…

如何配置Modbus转Profinet网关与6台232 Modbus伺服通信

Modbus转Profinet网关连接6台232 Modbus伺服同时控制的解决方案不仅简化了设备连接&#xff0c;还减少了人力投入和维护成本。通过Modbus转Profinet网关&#xff0c;操作人员只需对Profinet网关进行设置和监控&#xff0c;即可实现对6台232 Modbus伺服的集中控制。 Modbus转Pro…

中山大学李华山、王彪课题组开发 SEN 机器学习模型,高精度预测材料性能

内容一览&#xff1a;了解全局晶体对称性并分析等变信息&#xff0c;对于预测材料性能至关重要&#xff0c;但现有的、基于卷积网络的算法尚且无法完全实现这些需求。针对于此&#xff0c;中山大学的李华山、王彪课题组&#xff0c;开发了一款名为 SEN 的机器学习模型&#xff…

史上最强 Charles 抓包

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Python中如何判断List中是否包含某个元素

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;判断一个列表&#xff08;List&#xff09;是否包含某个特定元素是常见的任务之一。在本文中&#xff0c;将深入探讨多种判断List成员包含性的方法&#xff0c;并提供丰富的示例代码&…

嵌入式工程师校招经验与学习路线总结

前言&#xff1a;不知不觉2023年秋招已经结束&#xff0c;作者本人侥幸于秋招中斩获数十份大差不差的OFFER&#xff0c;包含&#xff1a;Top级的AIGC&#xff0c;工控龙头&#xff0c;国产MCU原厂&#xff0c;医疗器械&#xff0c;新能源车企等。总而言之&#xff0c;秋招总体情…

量子纠缠通讯:未来信息技术的革新者

量子纠缠通讯:未来信息技术的革新者 引言 在科技日新月异的今天,我们正逐步走进一个全新的科技时代——量子时代。量子纠缠通讯作为量子技术的重要分支,以其独特的优势和巨大的潜力,成为了当今世界研究的热点。本文将带您深入探讨量子纠缠通讯的奥秘,了解其原理、优势、…

架构师-3.用户体系

系统提供了 2 种类型的用户,分别满足对应的管理后台、用户 App 场景。 1.AdminUser 管理员用户,前端访问 s-ui-admin-vue3管理后台,后端访问 /admin-api/** RESTful API 接口。 2.MemberUser 会员用户,前端访问 s-ui-user用户 App,后端访问 /app-api/** RESTful API 接口。…

Java中lambda表达式的使用

&#x1f495;"我不要麻木的死去"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Java中lambda表达式的使用 一.背景 lambda表达式是Java SE 8中一个重要的新特性&#xff0c;允许你使用一个表达式来代替功能接口。lambda表达式可以看作一个没有返…