由於實際專案開發中,前後攝像頭使用前後相同型別的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的變...