Linux Component概述和高通component的使用

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.pswp.cn/news/212817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212817.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212817.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kubebuilder開發operator

安裝kubebuilder前 需要有kubernetes環境和golang環境 官網:https://go.kubebuilder.io/ 安裝kubebuilder #下載 wget https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) #改名kubebuilder后加權限 chmod x kubebuilder #放到環境變量里 mv k…

【C語言程序設計】編寫簡單的C程序

目錄 前言 一、程序設計 二、程序改錯 三、程序完善 總結 🌈嗨!我是Filotimo__🌈。很高興與大家相識,希望我的博客能對你有所幫助。 💡本文由Filotimo__??原創,首發于CSDN📚。 📣如…

unity 2d 入門 飛翔小鳥 死亡 顯示GameOver(十四)

1、添加Img create->ui->img 把圖片拖進去 2、和分數一樣、調整位置 3、修改角色腳本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//獲取小鳥(剛體)private Rigidbod…

【Apipost】批量刪除我的51CTO文章

文章目錄 一、序二、API分析三、Apipost測試四、腳本五、Apipost中完成 一、序 去年開始再51CTO同步更新文章,一年多過去了,只漲了3個粉絲。看了下這個平臺就是賣課、搞培訓的,退出了。決定把文章也刪除了(有人私信我說專門注冊了…

ToolkenGPT:用大量工具增強LLM

深度學習自然語言處理 原創作者:cola 用外部工具增強大型語言模型(LLM)已經成為解決復雜問題的一種方法。然而,用樣例數據對LLM進行微調的傳統方法,可能既昂貴又局限于一組預定義的工具。最近的上下文學習范式緩解了這一問題,但有…

Shell 常用命令詳解-上

Shell 常用命令詳解-上 1.目錄查閱相關命令2.文件操作相關命令 1.目錄查閱相關命令 ll 命令 命令描述:ll命令用于顯示指定工作目錄下的內容。 命令格式:ll [參數] [目錄名]。 參數說明: 參數說明-a顯示所有文件及目錄(包括隱藏文…

【機器學習】041_模型開發迭代過程

一、模型開發的一般步驟 1. 明確研究問題 確定問題的組成和結果,明晰問題是分類問題還是回歸問題 2. 決定系統總體架構 ①理解數據:采集(爬取)數據,生成(導入)數據,進行數據清洗…

代碼隨想錄二刷 |二叉樹 |101. 對稱二叉樹

代碼隨想錄二刷 |二叉樹 |101. 對稱二叉樹 題目描述解題思路 & 代碼實現遞歸法迭代法使用隊列使用棧 題目描述 101.對稱二叉樹 給你一個二叉樹的根節點 root , 檢查它是否軸對稱。 示例 1: 輸入:root [1,2,2,…

zcms企業官網建站系統源碼搭建-支持頁面自定義

1.支持mysql,sqlite,access三種數據庫。 2.模板和標簽與asp版的zzzcms通用。 3.asp版的zzzcms的access數據庫可直接使用。 4.支持手機站。 (增刪改查不做描述): 網站信息 名稱,logo,微信&…

基于OpenCV的流水線包裝箱檢測計數應用(附源碼)

導 讀 本文主要介紹基于OpenCV的流水線包裝箱檢測計數應用,并給出源碼。 資源下載 完整代碼和視頻下載地址: https://github.com/freedomwebtech/rpi4-conveyor-belt-boxces-counter 核心代碼如下(cboxtest.py): import cv2import numpy as npfrom tracker import*cap=c…

【MYSQL】單表查詢

查詢語法: select 字段(*表示全字段) from 數據表 【where 條件表達式】 【group by 分組字段【having 分組條件表達式】】 【order by 排序字段【asc | desc】】 例子: 教職工表Teacher(Tno, TName, age, sal, mgr, DNo)&#…

C# 圖解教程 第5版 —— 第17章 轉換

文章目錄 17.1 什么是轉換17.2 隱式轉換17.3 顯示轉換和強制轉換17.4 轉換的類型17.5 數字的轉換17.5.1 隱式數字轉換17.5.2 溢出檢測上下文17.5.3 顯示數字轉換 17.6 引用轉換17.6.1 隱式引用轉換17.6.2 顯式引用轉換17.6.3 有效顯式引用轉換 17.7 裝箱轉換17.7.1 裝箱是創建副…

前端發起更改數據請求后再獲取后端數據發現數據并未更改的一個解決辦法

前端發起更改數據請求后再獲取后端數據發現數據并未更改的一個解決辦法 問題再現 async function refuseRefund(id,type){if(confirm(確定拒絕?)){await fetch(http://127.0.0.1:3000/api/refuseRefund, {method: POST,headers: {Content-type: application/json}…

vue項目搭建---1.搭建基礎的框架

目錄 1. pnpm下載1.1 安裝1.2 差異1.3 鏡像源設置 2. 項目2.1 vite創建項目2.2 項目配置2.3 piniavue-routermain.jsstore/index.jsrouter/index.jsvue文件里使用示例 2.4 eslint prettier.eslintrc.js.eslintignore.prettierrc 2.5 樣式2.6 commitizenpackage.json.cz-config…

MySQL - 聚簇索引和非聚簇索引,回表查詢,索引覆蓋,索引下推,最左匹配原則

聚簇索引和非聚簇索引 聚簇索引和非聚簇索引是 InnoDB 里面的叫法 一張表它一定有聚簇索引,一張表只有一個聚簇索引在物理上也是連續存儲的 它產生的過程如下: 表中有無有主鍵索引,如果有,則使用主鍵索引作為聚簇索引;…

【Scala】Scala中的一些基本數據類型的特性 列表、元組、構造器、單例對象、伴生類、伴生對象、抽象類與特質

列表 使用List(“”,“”,“”)去聲明 sliding 和 groued表示迭代器 val iter List("Hadoop", "Spark", "Scala") sliding 2// sliding 和 groued 是有區別的while (iter.hasNext){println(iter.next())}for (elem <- iter){println(elem)}…

極速學習SSM之SpringMVC筆記

文章目錄 一、SpringMVC簡介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特點 二、HelloWorld1、開發環境2、創建maven工程a>添加web模塊b>打包方式&#xff1a;warc>引入依賴 3、配置web.xmla>默認配置方式b>擴展配置方式 4、創建請求控制器5、創建springMVC…

Kafka 最佳實踐:構建可靠、高性能的分布式消息系統

Apache Kafka 是一個強大的分布式消息系統&#xff0c;被廣泛應用于實時數據流處理和事件驅動架構。為了充分發揮 Kafka 的優勢&#xff0c;需要遵循一些最佳實踐&#xff0c;確保系統在高負載下穩定運行&#xff0c;數據可靠傳遞。本文將深入探討 Kafka 的一些最佳實踐&#x…

四. 基于環視Camera的BEV感知算法-環視背景介紹

目錄 前言0. 簡述1. 環視背景介紹2. 環視思路3. 主流基于環視Camera的算法詳解總結下載鏈接參考 前言 自動駕駛之心推出的《國內首個BVE感知全棧系列學習教程》&#xff0c;鏈接。記錄下個人學習筆記&#xff0c;僅供自己參考 本次課程我們來學習下課程第四章——基于環視Camer…

基于Spring+Spring boot的SpringBoot在線電子商城管理系統

SSM畢設分享 基于SpringSpring boot的SpringBoot在線電子商城管理系統 1 項目簡介 Hi&#xff0c;各位同學好&#xff0c;這里是鄭師兄&#xff01; 今天向大家分享一個畢業設計項目作品【基于SpringSpring boot的SpringBoot在線電子商城管理系統】 師兄根據實現的難度和等級…