MTK 前後使用相同型別的Camera

2021-08-08 09:05:14 字數 3810 閱讀 4779

由於實際專案開發中,前後攝像頭使用前後相同型別的camera,前後camera經fae優化使得驅動引數不一致,此時需要使用兩份不同的驅動檔案;這就涉及到如何在同一款camera上同時使用兩套不同的驅動;

驅動相容原則:「另外乙份驅動使用自定義sensor id 和sensor name中,在系統讀取sensor id的時候使用正確的id進行匹配」;

這樣就能夠繞過兩款攝像頭都是相同的id的問題了;

以sp5507+sp5507為例

(1)將kernel層**整個目錄sp5507_mipi_raw和

hal層**整個目錄sp5507_mipi_raw各拷貝乙份為sp5507_mipi_sub_raw,建議字尾保持raw或yuv;

(2)將前後攝像頭優化後的引數合併到**中;

(3)修改sp5507_mipi_sub_raw中的檔名;

(4)sp5507_mipi_sub_raw拷貝到mediatek/custom/common/kernel/imgsensor/和mediatek/custom/common/hal/imgsensor/目錄下;

(5)開啟mediatek/custom/common/kernel/imgsensor/inc/kd_imgsensor.h檔案, 定義sensor id和sensor name

#define sp5507mipi_sensor_id                    0x5670  

#define sensor_drvname_sp5507mipi_raw           "sp5507_mipi_raw"

#define sp5507mipi_sub_sensor_id                    0x5671  //在原來的基礎上做加1

#define sensor_drvname_sp5507mipi_sub_raw           "sp2509_mipi_sub_raw"

(6)在mediatek/custom/common/kernel/imgsensor/src/kd_sensorlist.h檔案中宣告初始化函式;

uint32 sp5507_mipi_raw_sensorinit(psensor_function_struct *pffunc); 

uint32 sp5507_mipi_sub_raw_sensorinit(psensor_function_struct *pffunc);  //該函式為kernel中的初始化函式改為這個sp5507_mipi_sub_raw_sensorinit;

在kdsensorlist陣列中新增:

#if defined(sp5507_mipi_raw)   

,#endif

#if defined(sp5507_mipi_sub_raw) 

,#endif

(7)在mediatek/custom/common/hal/imgsensor/src/sensorlist.cpp檔案的sensorlist陣列中新增

#if defined(sp5507_mipi_raw)

raw_info(sp5507mipi_sensor_id, sensor_drvname_sp5507mipi_raw, null),

#endif

#if defined(sp5507_mipi_sub_raw)

raw_info(sp5507mipi_sub_sensor_id,sensor_drvname_sp5507mipi_sub_raw, null),

#endif

**位置要跟kdsensorlist陣列中的位置保持一致;

(8) 修改mediatek/config/pro/projectconfig.mk配置檔案

custom_hal_imgsensor=sp5507_mipi_raw

custom_hal_main_imgsensor=sp5507_mipi_raw  //後攝像頭

custom_hal_sub_imgsensor=

sp5507_mipi_sub_raw//前攝像頭

custom_kernel_imgsensor=sp5507_mipi_raw

custom_kernel_main_imgsensor =sp5507_mipi_raw  //後攝像頭

custom_kernel_sub_imgsensor=

sp5507_mipi_sub_raw //前攝像頭

(9)驅動檔案的修改

修改kernel層中部分重要的函式名和變數名,否則kernel在鏈結階段會出現重複定義的錯誤提示;修改kernel和hal中的include物件,否則出現找不到.h檔案的提示;

修改kernel層中的***xmipiraw_sub_sensor.h檔案中的sensor id巨集為kd_imgsensor.h中定義的sensor id巨集:

#define ov5670_sensor_id  sp5507mipi_sub_sensor_id 

再修改hal層中的camera_info_***xmipiraw.h中的sensor_id和sensor_drvname為kd_imgsensor.h中定義的巨集,修改config.ftbl.***x_mipi_raw.h中的ftable_definition(sensor_drvname_***x_mipi_raw)的sensor_drvname為kd_imgsensor.h中定義的sensor name巨集;

(10)修改kernel層中id匹配

搜尋使用到獲取裝置id的**段,發現只有open函式和getsensorid函式有通過i2c獲取裝置id的操作;

[cpp]view plain

copy

uint32

ov5670subopen_sub(

void

)  else

break

;  }  

......  

return

error_none;  

//最後會返回無錯誤

}  

[cpp]view plain

copy

uint32

ov5670subgetsensorid(

uint32

*sensorid)  

ov5670subdb("read sensor id fail = 0x%04x\n"

, *sensorid);  

retry--;  

} while

(retry > 0);  

if(*sensorid != ov5670sub_sensor_id)   

return

error_none;  "font-family: arial;"

>

//最後會返回無錯誤

}  

(11)上電時序

上電時序只需要在原來基礎之上做下相容就可以了;

開啟mediatek\custom\pro\kernel\camera\camera\kd_camera_hw.c檔案

修改kdcismodulepoweron()函式;

在檔案中兩處使用到(0 == strcmp(sensor_drvname_sp5507mipi_raw,currsensorname))的地方都加上加上「 || 

(0 == strcmp(sensor_drvname_sp5507mipi_sub_raw,currsensorname))

」 就可以相容前後攝像頭了;

通過這一系列的操作,就實現了前後使用相同型別的camera裝置並且前後對應各自的驅動**;

資料庫設計情景之相同型別下的不同型別

已知使用者需要同時購買動物和石頭兩種不同的東西 只是隨便舉個例子,不要去糾結動物和石頭 這種情況一般有兩種設計方式 方式一 animal表 rock表 shop car表 animal id int,name varchar,int,age int rock id int,name varchar,...

SAP合同型別的使用

sap系統中有兩種標準合同型別 mk和wk 並不是說只有這兩種,而是本文只 這兩種 合同裡的行專案有兩個 m和w 同樣,本文只 這兩個 按標準定義,mk和wk表示數量合同和價值合同,m和k分別表示物料未知和物料組。經測試,其實際效果是這樣的 標準系統 mk m 數量必輸,必輸 wk m 數量非必輸,...

Python中實現不同類的相同介面使用

在實際應用中,我們需要實現不同功能使用相同的介面以方便操作者使用,簡化操作步驟 下面我們來實現不同類的相同介面的使用 1 首先定義三個不同的類,裡面分別實現了對圓,長方形,梯形的面積面積求解 並分別例項化三個類。2 重新定義個函式,使用getattr 這個方法,表示對傳進來的class name的變...