海思的sensor驅動大部分工作在應用層,即應用層驅動(非ko形式存在),這樣一來在對sensor改動時,就不需要重新編譯內核了。
缺點是,不穩定,效率會比較低。純應用層驅動是沒辦法操作硬件的,所以需要調用底層i2c驅動。
1、驅動源碼路徑
Hi3518E_SDK_V1.0.3.0\package\mpp\mpp\component\isp\sensor目錄下。2、sensor驅動調用
sensor驅動編譯完之後會生成xxx.a和xxx.so兩個庫,一個是靜態鏈接用的,一個是動態鏈接用的。
這兩個文件會被放到Hi3518E_SDK_V1.0.3.0\package\mpp\mpp\lib目錄下。3、sensor驅動文件命名規則
xxxx_cmos.c中定義回調和上層函數。
xxxx_sensor_ctl.c中定義底層硬件相關的寄存器值配置函數。4、sensor驅動在哪被調用
從之前的sample_venc開始看,在第三部分step 3: start vi dev & chn to capture
SAMPLE_COMM_VI_StartVi()
SAMPLE_COMM_VI_StartIspAndVi()
SAMPLE_COMM_ISP_Init()
sensor_register_callback()
sensor_register_callback這個函數就在sensor驅動裏面,這裏會調用到kernel內的i2c驅動對sensor進行硬件操作。
5、sensor_register_callback
這個函數就是對整個sensor初始化,內部封裝了操作sensor所需要的函數,(ISP、AE(自動曝光)、AWB(白平衡))
其中的cmos_init_sensor_exp_function函數將sensor操作時所需要的函數一一掛接起來,例如初始化調用的sensor_init。6、sensor_init
初始化sensor,初始化的方式就是調用i2c函數接口來實現操作sensor內部寄存器。7、黑電平
黑電平(Black Level Correction)也就是黑色的最低點,以8bit數據來說,指在經過一定校準的顯示裝置上,沒有一行光亮輸出的視頻信號電平。定義圖像數據爲0時對應的信號電平。
sensor中的黑電平是可以調節的,就相當於標準值,就像零攝氏度這種概念。8、sensor驅動編譯實戰
(1)修改驅動源碼
以AR0130爲例,修改mpp\component\isp\sensor\ar0130目錄下的應用驅動源碼。
如果是調整黑電平,就修改ar0130目錄下的ar0130_coms.c文件裏面的cmos_get_isp_black_level函數中的au16BlackLevel數組。(2)清除,並重新編譯
首次編譯需要在mpp\component\isp目錄下將整個isp進行編譯。
執行make clean指令。
再執行make
(3)確認mpp中lib目錄下的libsnsxxx.a/so已經被更新。
(4)重新編譯sample並運行查看效果。