天天看點

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

目錄

  • 驅動目錄
  • sample中相關部分分析
  • 海思中的sensor驅動架構
  • sensor_register_callback詳細分析

驅動目錄

在SDK的

\Hi3518E_SDK_V1.0.3.0\package\mpp\ko

底下

hi3518e_isp.ko是isp相關部分驅動

sensor部分的源碼在

\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor

可以通過Makefile看到編譯出來的驅動

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

編出來的驅動放到了lib目錄中

sample中相關部分分析

系統一開始進行記憶體配置設定、mpp初始化,等操作,做完之後就開始進入vi部分

vi部分的第一步就是配置sensor的接口

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

在VI開始的時候,會根據sensor的名字進行配置mipi,如果是mipi接口就配置mipi,不是就配置為空

接口配置完之後,就是isp的初始化

SAMPLE_COMM_ISP_Init

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

這個callback就是在驅動裡面,sensor驅動裡的所有函數就是通過這個函數和應用層關聯起來的

這裡要注意的是,這裡的sensor驅動不是核心驅動,是應用層驅動。

真正的核心不是lib是ko,使用insmod進行安裝,這才是真正工作在核心态的。

這裡使用的是應用層驅動,好處是靈活。比如這裡sensor改了,是不用去重新編譯燒錄核心的,隻需要将新的sensor對于的.a和.so編譯一下,再連結進去運作就可以了,不用動核心。

應用層驅動的壞處是很容易被替換,是以不穩定性是有的,本身的效率與純核心層的驅動相比效率沒有那麼高。

應用層驅動一定是基于一個工作在核心層的驅動的,而不是自己去操作對應的寄存器,這裡的核心層驅動就指的就是I2C驅動。

sensor_register_callback

進去ar0130的應用層驅動

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

後兩段是3A算法中的AE和AW

關鍵的是第一個配置AR0130的寄存器

cmos_init_sensor_exp_function

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

以内部第一個函數

sensor_init

為例,裡面是sensor支援的兩種原始尺寸

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

sensor_init_720p_30fps

為例

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

有非常多配置寄存器的操作,那怎麼寫呢,肯定是通過I2C總線

追入

sensor_write_register

,看到内部有一個編譯選項

#ifdef HI_GPIO_I2C

海思定義了兩種I2C,一種是硬體I2C,一種是軟體GPIO模拟I2C

追入

sensor_i2c_init

函數,可以看到

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

核心裡實作了一個驅動,叫

i2c-0

,是海思将硬體上的i2c-0硬體接口封裝出來的。它是一個總線驅動,工作在核心态,實際不同的sensor應用層驅動,就是調用的這一個驅動進行硬體的去寫。

是以sensor驅動中,沒有i2c底層操作,隻有i2c層次的操作,即隻管往i2c發的東西,不管它是怎麼發的。

海思中的sensor驅動架構

mpp中定義了一套sensor驅動的實作和封裝(應用層驅動)

每一個sensor的應用層驅動包含兩個檔案

  • xxxx_cmos.c中定義回調和上層函數(面向功能)
  • xxxx_sensor_ctl.c中定義底層硬體相關的寄存器值配置函數(底層)

kernel中的I2C驅動提供I2C層面的實體層操作接口,隻關心I2C中的值如何傳輸

sensor_register_callback詳細分析

sensor_register_callback

就是應用層和底層互動的函數接口。

函數主要做了回調的綁定,就是實作設計好了一套架構,别人把這套架構及函數名訂好了,而且函數已經調用了。隻是在注冊的時候提供函數的一個實體

sensor驅動就是注冊方,也就是在我們的mpp中,規定好了sensor實作的功能,将sensor的所有行為訂好了,并有相應的函數和這個行為做對應。sensor驅動提供sensor行為的具體方法。

sensor_register_callback

就是sensor驅動為mpp提供回調函數實作的實體。

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

HI_MPI_ISP_SensorRegCallBack

就是典型的用來注冊sensor的函數,有三個參數

  • IspDev

    海思VI中的一個單元,規定了sensor的行為

  • AR0130_ID

    海思給每一個sensor規定了一個唯一的編碼,用于區分不同sensor,也做預留,将來可以通過這個編号來某些東西

  • &stAeRegister

    是最關鍵的資料結構,在isp中定義的有關sensor的一套操作全在這裡,每一個操作對應一個函數去執行。它為isp預留了很多函數指針,isp要做什麼操作隻需要去調用對應的函數指針即可。如下圖

    每一種sensor具體的驅動,負責将這些函數指針和具體的函數挂接起來。

    海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析
    以第一個

    HI_VOID(*pfn_cmos_sensor_init)(HI_VOID);

    為例,sensor的應用層驅動就會有一個函數和它對應

底下有ISP相關配置,注意這裡不是海思VI中的ISP,是sensor内部的ISP。大部分sensor内部有一個簡單的ISP。

&stAeRegister

cmos_init_sensor_exp_function

中填充,将其内部的函數指針和sensor的應用層驅動的函數相接。

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

進入

sensor_init

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析
海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析

這裡就是在設定

sensor

的寄存器,通過底層的i2c驅動和硬體進行互動。

除了sensor的配置,底下還有兩個結構相似的配置,是AE(自動曝光)和AWB(自動白平衡),分别對應了不同的功能,結構是一模一樣的。

可以看到沒有AF(自動對焦),因為sensor不支援AF功能

海思3518E開發筆記4.4——sensor驅動源碼分析驅動目錄sample中相關部分分析海思中的sensor驅動架構sensor_register_callback詳細分析