主頁 > 軟體設計 > 高通Camera驅動(1)--Camx架構介紹

高通Camera驅動(1)--Camx架構介紹

2021-01-14 12:21:42 軟體設計

之前主要做的是MTK平臺camera驅動,高通平臺這塊只是簡單了解架構,為了做成一個系列,簡單梳理下高通camx架構

一、Android分層架構

圖片內容來自:https://source.android.google.cn/setup

Android分層架構:

APP:每一個應用程式由一個或多個活動組成,都是java寫的

Framework:用java撰寫一些規范化的模塊封裝框架,用Java Native Interface(JNI java呼叫native語言的一種特性,通過JNI可以使java可以呼叫C/C++的代碼)

Libraries系統庫:核心庫,主要包含基本的C庫等,和我們相關主要是Bionic系統C

Android運行時庫:提供Java編程語言核心庫的大多數功能,每一個Android應用程式都在它自己的行程中運行,都有一個獨立的Dalvik虛擬機實體,

HAL:硬體抽象層,Android frameworksJNI呼叫hardware.c中定義hw_get_module函式來獲取硬體模塊,然后呼叫硬體模塊中的方法,硬體模塊中的方法直接呼叫內核介面完成相應功能,

Linux核心層Android的核心系統服務依賴于Linux內核,如安全性、記憶體管理、行程管理、網路協議堆疊、和驅動模型,

SELinux:是Linux內核模塊,也是Linux的一個安全子系統,主要作用最大限度地減少系統中服務行程可訪問的的資源(最小權限原則)

1.1、Camera分層架構

圖片來源:me

高通平臺《80-pc212-1_a_chi_api_specifications_for_qualcomm_spectra_2xx_camera.pdf》所示,對高通平臺對Camxhal3有個初步的認識,

1.2 高通平臺camera架構

二、準備作業

camera驅動開發需要在source insight 中需要加入的檔案

system倉下: camera_metadata_tags.h、camera_metadata_tag.c、camera_metadata.c、camera_metadata.h

kernel倉下: arch/arm/boot/dts

hardware倉下:camera3.h、CameraDevice.cpp、CameraDeviceSession.cpp

framework/av倉下:framework層camera檔案, camerametadata.cpp、camerametadata.h、CameraService.cpp

vendor倉下:vendor/qcom/proprietary/camx

vendor\qcom\proprietary\chi-cdk\vendor\

驅動檔案:actuator eeprom fd flash ois sensor

usecase:topology

//TODO,完善細節

三、名詞解釋

Usecase :攝像機管道的特定配置,實作了已經定義良好的功能,例如,20萬像素的ZSL快照和2k顯示的預覽是單一的用途的情況,Chi API被設計為在一定范圍內指定任何可想象的用戶定義用例底層硬體,不需要修改驅動程式,

Session:單個會話是攝像機管道配置完成,從隨時準備處理影像,直到攝像機管道被破壞,而另一個管道可能在它的位置配置,支持多個并行會話,

Request:使攝像機管道處理資料的動作,這可以是請求處理從影像傳感器中提取的一幀資料,或處理從存盤器中提取的一幀資料,結果必須從驅動程式回傳到相機應用程式,

Sub-Request:將單個請求分解為多個內部請求的操作,驅動處理完的子請求的結果不會直接回傳,而是合并成為單個結果對應原始請求,子請求用于啟用諸如HDR,其中多次曝光變化的傳感器需要產生單一的影像,或

多幀后處理,其中多個影像合并創建一個單一的輸出影像,

Steam:用于處理的具有相同大小和格式的緩沖區序列影像資料,可以指定多個不同型別的流作為相機的輸入和輸出管道,這組流是定義用例的關鍵組件,

Per-session setting:影響相機處理管道的設定,這些設定不在會話開始時更改,例如,允許影像穩定處理,

Per-request setting:影響單個請求的設定,例如,手動曝光值,

拓撲結構 :表示單個用例的有向無環圖(DAG),劃好了道格一系列處理節點和一組鏈接,它們描述正在處理的緩沖區通過這些節點,拓撲是通過XML檔案指定的,

Engine:可以用來處理資料的硬體,光譜ISP,驍龍CPU,Adreno,和DSP是Chi API可用引擎的例子,

Node:camera管道中的一個邏輯功能塊,它在單個引擎節點連接在一起形成拓撲結構,在Chi API的初始版本中,所有ISP外部的節點通過CPU代碼呼叫,CPU代碼呼叫本機API,本機API驅動OpenCL和FastCV等引擎,Chi API可以在未來擴 展到允許快取和重用硬體命令,而不需要重用本地api,

Pipeline:支持資料操作的惟一背景關系,每個管道都可以維護自己的狀態跨多個請求,而不受其他管道的影響,管道利用拓撲來定義使用的引擎和資料處理流程,

Statistics:演算法包括3A,這是用來自動控制影像傳感器和相機ISP,以達到更好的影像質量,這些領域特定的演算法是作為Chi API的專用部分處理,

Live Stream:處理從影像傳感器接收資料的任何配置,并且不能修改以前請求中的任何資料,實時流處理速度不適合的處理傳感器資料速率可以移動到offline stream去處理,

Offline Stream:離線流處理程序不接收來自影像傳感器的資料的任何配置,在Chi API中,離線流可以與實時流配對,而無需額外添加延遲,離線流的結果可以回傳給相機應用程式,

四、Framework層

MTK和高通用的都是Android的架構,在framework層的都是一樣的代碼,但是為了讀者有更好的閱讀體驗,我還這里寫一下這部分的代碼(Android Q 之MTK代碼分析(一)--Camera Hal3 Service_Cam_韋的博客-CSDN博客)

CameraService服務啟動是通過LoadBootScripts() 函式加載cameraserver.rc

camera provider行程和cameraserver行程和底層的驅動互動,camera provider行程非常重要,camera HAL層幾乎全部運行在camera provider行程中完成,

首先看下camera provider所在原始碼中的位置:hardware/interfaces/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc

根據Android Camera分層架構可以看出來,framework有四個組件,(CameraService、CameraDeviceClient、Camera3Device、CameraProviderManager

1、CameraServiceframeworks\av\services\camera\libcameraservice\CameraService.cpp

CameraService::CameraService() {
    ALOGI("CameraService started (pid=%d)", getpid());   
}

void CameraService::onFirstRef()
{
    ALOGI("CameraService process starting");
    res = enumerateProviders();
}
status_t CameraService::enumerateProviders() {
    status_t res;

    //創建物件,要判斷Provider物件為0才能創建
    mCameraProviderManager = new CameraProviderManager(); 
    res = mCameraProviderManager->initialize(this);
 
    deviceIds = mCameraProviderManager->getCameraDeviceIds();

    return OK;
}

從camera分層架構來看,CameraService要創建CameraProviderMangaer

cameraservice.cpp中 enumerateProviders列舉Provider開始創建CameraProviderManager物件并初始化

2、CameraDeviceClient (frameworks\av\services\camera\libcameraservice\api2\CameraDeviceClient.cpp

CameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService,
{

    ALOGI("CameraDeviceClient %s: Opened", cameraId.string());
}

status_t CameraDeviceClient::initialize(sp<CameraProviderManager> manager,
        const String8& monitorTags) {
    return initializeImpl(manager, monitorTags);
}
status_t CameraDeviceClient::initializeImpl(TProviderPtr providerPtr, const String8& monitorTags) {

    res = Camera2ClientBase::initialize(providerPtr, monitorTags);

    return OK;
}

frameworks\av\services\camera\libcameraservice\common\Camera2ClientBase.cpp

Camera2ClientBase<TClientBase>::Camera2ClientBase(
mDevice(new Camera3Device(cameraId)),
{
ALOGI("Camera %s: Opened. Client: %s (PID %d, UID %d)", cameraId.string(),String8(clientPackageName).string(), clientPid, clientUid);
}

從這塊CameraDeviceClient就創建Camera3Device物件

template <typename TClientBase>
status_t Camera2ClientBase<TClientBase>::initialize(sp<CameraProviderManager> manager,
        const String8& monitorTags) {
    return initializeImpl(manager, monitorTags);
}

template <typename TClientBase>
template <typename TProviderPtr>
status_t Camera2ClientBase<TClientBase>::initializeImpl(TProviderPtr providerPtr,
        const String8& monitorTags) {

    res = mDevice->initialize(providerPtr, monitorTags);

    return OK;
}

3、Camera3Deviceframeworks\av\services\camera\libcameraservice\device\Camera3Device.cpp

ICameraDeviceSession 這塊讓framework和HAL又聯系在一起

status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) {

    ALOGV("%s: Initializing HIDL device for camera %s", __FUNCTION__, mId.string());

    sp<ICameraDeviceSession> session;
}

4、CameraProviderManagerframeworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp

#include <android/hardware/camera/device/3.5/ICameraDevice.h>

這樣通過頭檔案的形式ICameraDevice.h,framework就和HAL的聯系上

status_t CameraProviderManager::ProviderInfo::initialize(
        sp<provider::V2_4::ICameraProvider>& interface,
        hardware::hidl_bitfield<provider::V2_5::DeviceState> currentDeviceState) {
 
    ALOGI("Connecting to new camera provider: %s, isRemote? %d",
            mProviderName.c_str(), interface->isRemote());

    Status status;
    // Get initial list of camera devices, if any
    std::vector<std::string> devices;
    hardware::Return<void> ret = interface->getCameraIdList([&status, this, &devices](

    hardware::Return<Status> st = interface->setCallback(this); //這塊用ICameraProvider 介面連接上HAL
    ALOGI("Camera provider %s ready with %zu camera devices",
            mProviderName.c_str(), mDevices.size());

    mInitialized = true;
    return OK;
}

ICameraProvider ,interface->setCallback(this)讓framework連上HAL之后,

以上就是framework的四個組件,以及framework和HAL的聯系

五、高通平臺HAL3 camx

5.1、這邊附上一個架構圖,簡單直接了解camx架構

圖片內容來自:Android Camera簡單整理(二)-Qcom HAL3 Camx架構學習 - 簡書 (jianshu.com)

5.2、CameraServer 到Provider的呼叫關系

在CameraService中,主要介面在CameraService.cpp 和 Camera3Device.cpp中

在CameraProvider中, 主要介面在CameraDevice.cpp 和CameraDeviceSession.cpp

5.3、Provider 到 hal3的呼叫關系

在provider中,mDevice->ops即為Camera3.h中的camera3_device_ops結構體

hardware\libhardware\modules\camera\3_0\Camera.cpp

這樣就找到Camera hal層的函式指標的映射關系,

映射到vendor\qcom\proprietary\camx\src\core\hal\camxhal3entry.cpp 的g_Camera3DeviceOps

Camx的架構入口為Camx包中的camxhal3entry.cpp(\vendor\qcom\proprietary\camx\src\core\hal\camxhal3entry.cpp)

/// Array containing hw_module_methods_t methods
static hw_module_methods_t g_hwModuleMethods =
{
    CamX::open
};

/// Array containing camera3_device_ops_t methods
#if defined (_LINUX)
static camera3_device_ops_t g_camera3DeviceOps =
{
    .initialize                         = CamX::initialize,
    .configure_streams                  = CamX::configure_streams,
    .construct_default_request_settings = CamX::construct_default_request_settings,
    .process_capture_request            = CamX::process_capture_request,
    .dump                               = CamX::dump,
    .flush                              = CamX::flush,
};
#else // _LINUX
static camera3_device_ops_t g_camera3DeviceOps =
{
    CamX::initialize,
    CamX::configure_streams,
    NULL,
    CamX::construct_default_request_settings,
    CamX::process_capture_request,
    NULL,
    CamX::dump,
    CamX::flush,
    NULL,
    {0},
};
#endif // _LINUX

/// Array of HwDeviceCloseOps to hold the close method
static HwDeviceCloseOps g_hwDeviceCloseOps =
{
    close
};

5.4、Camx到Chi的映射

camhal3.cpp中,定義了g_jumpTableHAL3

camxchitypes.h定義了CHIAppCallback結構體

camxhal3module.h中定義了 chi_hal_callback_ops_t

camhal3module.cpp 中的建構式HAL3Module中

                CHIHALOverrideEntry funcCHIHALOverrideEntry =
                    reinterpret_cast<CHIHALOverrideEntry>(
                        CamX::OsUtils::LibGetAddr(m_hChiOverrideModuleHandle, "chi_hal_override_entry"));

chxextensioninterface.cpp中函式chi_hal_override_entry

chi這塊代碼有點生疏了,看個博客快速回憶下,感謝xiaozi63大佬的博客

圖片內容來自:深入理解Android相機體系結構之六_u012596975的博客-CSDN博客

5.5、Chi到 Camx的呼叫

5.6、Camx 到 kernel的呼叫

//TODO

以上將介紹高通平臺的camx架構,后面會對這塊補充細節,

參考檔案:Android Camera簡單整理(二)-Qcom HAL3 Camx架構學習 - 簡書 (jianshu.com)

推薦檔案:深入理解Android相機體系結構之六_u012596975的博客-CSDN博客

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/248582.html

標籤:其他

上一篇:傳智健康——一、專案概述和環境搭建

下一篇:軟體定義網路筆記(PART 1)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more