1. 程式人生 > >基於qualcomm平臺的camera 驅動詳解

基於qualcomm平臺的camera 驅動詳解

前言:

一、Android camera架構


在framework中,camera主要是通過以下庫來協同工作的:

libandroid_runtime.so、libui.so、libcameraservice.so這幾個庫對應的檔案目錄主要是:

Libandroid_runtime.so:

frameworks/base/core/jni/android_hardware_Camera.cpp檔案,改檔案在編譯完成之後就是一個libandroid_runtime.so檔案

Libui.so:

Frameworks/base/libs/camera/* 目錄,這個目錄下有好多個相關的檔案:Camera.cpp、CameraParameters.cpp、ICamera.cpp、ICameraClient.cpp、ICameraService.cpp、ICameraRecordingProxy.cpp、ICameraRecordingProxyListener.cpp。這裡是整個camera的一個非常關鍵的地方,在編譯完成後主要是生成libui.so庫

libcameraservice.so:
Frameworks/base/services/camera/libcameraservice/* 目錄。由於camera在正常使用的過程中,需要傳輸的資料量是非常龐大的,所以整個體系都是基於C/S模式開發,而這部分,就是一個Service。而這個service對應的Client,其實就是上面所說的libui.so。

二、Camera驅動架構

Camera驅動的幾個重要組成部分


Imgsensor:整個camera驅動的核心,主要是攝像頭感光晶片部分,相機畫素大小、成像能力等都取決於此


Flashlight:就是一個控制led的外部IC晶片(當然有些平臺的PMIC上也會有內建),在相機中主要是主閃和預閃功能。在手機中除了拍照打閃之外,還有手電筒功能也是通過這部分實現

Actuator :即對焦馬達,在AF模組中才會有這部分東西,驅動內部的主要實現是控制攝像頭鏡頭的移動

EEPROM:主要是用來存一些校準資料,如攝像頭模組的OTP資料、AWB校準資料、Lens Shadding的校準資料等等,這一般在畫素較大的模組中使用,一般模組校準資料量比較小或者沒有校準資料的模組都不會用到它。


當然,還有其他的“附屬產品”,如CSI、CCI等。

三、Camera驅動的工作過程

可以簡單概述:kernel起來以後進行msm_sensor_driver的模組兒初始化,對dts配置進行相關的解析,在Android起來以後,會啟動camera 的守護程序Server,呼叫一系列的初始化介面,先獲取sensor name,根據name去匹配相關的初始化配置,再傳到底層寫入到模組暫存器




這裡先是填充了MCT的幾個基本的操作函式:set_mod;query_mod;start_session和stop_session。

這幾個基本的操作介面,其中包含了對sensor、actuator、eeprom等的操作介面

其次是對每一個sensor實體進行的一些基本init,包括find object、fill相關的一些操作介面等等


                 find sensor 的過程 

前面提到,在module_sensor_init函式中,對start_session這個介面進行了繫結,sensor的power up和reg init等操作,也就是在start_session這個介面當中完成,通過裡面相關的介面,最終會呼叫到kernel裡面的介面,進行上下電,match sensor id,讀寫暫存器等操作:


四、驅動除錯移植過程