目錄
- 驅動目錄
- 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看到編譯出來的驅動
編出來的驅動放到了lib目錄中
sample中相關部分分析
系統一開始進行記憶體配置設定、mpp初始化,等操作,做完之後就開始進入vi部分
vi部分的第一步就是配置sensor的接口
在VI開始的時候,會根據sensor的名字進行配置mipi,如果是mipi接口就配置mipi,不是就配置為空
接口配置完之後,就是isp的初始化
SAMPLE_COMM_ISP_Init
這個callback就是在驅動裡面,sensor驅動裡的所有函數就是通過這個函數和應用層關聯起來的
這裡要注意的是,這裡的sensor驅動不是核心驅動,是應用層驅動。
真正的核心不是lib是ko,使用insmod進行安裝,這才是真正工作在核心态的。
這裡使用的是應用層驅動,好處是靈活。比如這裡sensor改了,是不用去重新編譯燒錄核心的,隻需要将新的sensor對于的.a和.so編譯一下,再連結進去運作就可以了,不用動核心。
應用層驅動的壞處是很容易被替換,是以不穩定性是有的,本身的效率與純核心層的驅動相比效率沒有那麼高。
應用層驅動一定是基于一個工作在核心層的驅動的,而不是自己去操作對應的寄存器,這裡的核心層驅動就指的就是I2C驅動。
從
sensor_register_callback
進去ar0130的應用層驅動
後兩段是3A算法中的AE和AW
關鍵的是第一個配置AR0130的寄存器
cmos_init_sensor_exp_function
以内部第一個函數
sensor_init
為例,裡面是sensor支援的兩種原始尺寸
以
sensor_init_720p_30fps
為例
有非常多配置寄存器的操作,那怎麼寫呢,肯定是通過I2C總線
追入
sensor_write_register
,看到内部有一個編譯選項
#ifdef HI_GPIO_I2C
海思定義了兩種I2C,一種是硬體I2C,一種是軟體GPIO模拟I2C
追入
sensor_i2c_init
函數,可以看到
核心裡實作了一個驅動,叫
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提供回調函數實作的實體。
HI_MPI_ISP_SensorRegCallBack
就是典型的用來注冊sensor的函數,有三個參數
-
IspDev
海思VI中的一個單元,規定了sensor的行為
-
AR0130_ID
海思給每一個sensor規定了一個唯一的編碼,用于區分不同sensor,也做預留,将來可以通過這個編号來某些東西
-
&stAeRegister
是最關鍵的資料結構,在isp中定義的有關sensor的一套操作全在這裡,每一個操作對應一個函數去執行。它為isp預留了很多函數指針,isp要做什麼操作隻需要去調用對應的函數指針即可。如下圖
每一種sensor具體的驅動,負責将這些函數指針和具體的函數挂接起來。
以第一個
為例,sensor的應用層驅動就會有一個函數和它對應HI_VOID(*pfn_cmos_sensor_init)(HI_VOID);
底下有ISP相關配置,注意這裡不是海思VI中的ISP,是sensor内部的ISP。大部分sensor内部有一個簡單的ISP。
&stAeRegister
在
cmos_init_sensor_exp_function
中填充,将其内部的函數指針和sensor的應用層驅動的函數相接。
進入
sensor_init
這裡就是在設定
sensor
的寄存器,通過底層的i2c驅動和硬體進行互動。
除了sensor的配置,底下還有兩個結構相似的配置,是AE(自動曝光)和AWB(自動白平衡),分别對應了不同的功能,結構是一模一樣的。
可以看到沒有AF(自動對焦),因為sensor不支援AF功能