1:
本文主要介紹下攝像頭 主攝和子攝(硬件)去匹配攝像頭驅動原則以及攝像頭匹配lens驅動原則。本文以現在所做的朵唯項目爲例,平臺82+90 kk版本。
其實非常簡單,明白兩個函數即可。
0,1,2,3 // i 輪訓
#define IMX179_MAIN_SY_ID 0x1001
#define IMX179_MAIN_XL_ID 0x1002
#define IMX179_SUB_SY_ID 0x1003
#define IMX179_SUB_XL_ID 0x1004
MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =
{
#if defined(IMX179_MIPI_RAW_SY1_4LANE)
RAW_INFO(IMX179_MAIN_SY_ID, SENSOR_DRVNAME_IMX179_MIPI_SY1_RAW, NULL),
#endif
#if defined(IMX179_MIPI_RAW_XL2_4LANE)
RAW_INFO(IMX179_MAIN_XL_ID, SENSOR_DRVNAME_IMX179_MIPI_XL2_RAW, NULL),
#endif
#if defined(IMX179_MIPI_RAW_SY3_2LANE)
RAW_INFO(IMX179_SUB_SY_ID, SENSOR_DRVNAME_IMX179_MIPI_SY3_RAW, NULL),
#endif
#if defined(IMX179_MIPI_RAW_XL4_2LANE)
RAW_INFO(IMX179_SUB_XL_ID, SENSOR_DRVNAME_IMX179_MIPI_XL4_RAW, NULL),
#endif
}
攝像頭主攝和子攝(硬件)去匹配攝像頭驅動原則
參看文件 Imgsensor_drv.cpp (platform\mt6582\hardware\mtkcam\core\drv\imgsensor) 中的ImgSensorDrv類的 impSearchSensor成員函數
粘貼改函數如下:
MINT32 ImgSensorDrv::impSearchSensor(pfExIdChk pExIdChkCbf)
{
MUINT32 SensorEnum = (MUINT32) DUAL_CAMERA_MAIN_SENSOR; // 主攝還是子攝
MUINT32 i, id[KDIMGSENSOR_MAX_INVOKE_DRIVERS] = {0,0}; // 只用到id[0]
MUINT32 imx169_flag = 255; // pxs_001
MUINT32 imx169_tag = 0;
MBOOL SensorConnect=TRUE;
UCHAR cBuf[64];
MINT32 err = SENSOR_NO_ERROR;
MINT32 err2 = SENSOR_NO_ERROR;
ACDK_SENSOR_INFO_STRUCT SensorInfo; // 從底層獲取的信息,不用關心
ACDK_SENSOR_CONFIG_STRUCT SensorConfigData;
ACDK_SENSOR_RESOLUTION_INFO_STRUCT SensorResolution;
MINT32 sensorDevs = SENSOR_NONE;
IMAGE_SENSOR_TYPE sensorType = IMAGE_SENSOR_TYPE_UNKNOWN;
IMGSENSOR_SOCKET_POSITION_ENUM socketPos = IMGSENSOR_SOCKET_POS_NONE;
//! If imp sensor search process already done before,
//! only need to return the sensorDevs, not need to
//! search again.
if (SENSOR_DOES_NOT_EXIST != m_mainSensorId) { // 相等 不執行
//been processed.
LOG_MSG("[impSearchSensor] Already processed \n");
if (BAD_SENSOR_INDEX != m_mainSensorIdx) {
sensorDevs |= SENSOR_MAIN;
}
if (BAD_SENSOR_INDEX != m_subSensorIdx) {
sensorDevs |= SENSOR_SUB;
}
#ifdef ATVCHIP_MTK_ENABLE
sensorDevs |= SENSOR_ATV;
#endif
return sensorDevs;
}
//pxs_002
GetSensorInitFuncList(& m_pstSensorInitFunc ); // 獲取hal層的sensor列表,
LOG_MSG("SENSOR search start \n");
if (-1 != m_fdSensor) {
::close(m_fdSensor);
m_fdSensor = -1;
}
sprintf(cBuf,"/dev/%s",CAMERA_HW_DEVNAME);
m_fdSensor = ::open(cBuf, O_RDWR); // 打開設備節點 /dev/kd_camera_hw
if (m_fdSensor < 0) {
LOG_ERR("[impSearchSensor]: error opening %s: %s \n", cBuf, strerror(errno));
return sensorDevs;
}
LOG_MSG("[impSearchSensor] m_fdSensor = %d \n", m_fdSensor);
//pxs_003
// search main/main_2/sub 3 sockets 開始進行枚舉
#ifdef MTK_SUB_IMGSENSOR 該宏定義
// for i = 1; i<=2 ; i ++ . main_sensor =1 ;
for (SensorEnum = DUAL_CAMERA_MAIN_SENSOR; SensorEnum <= DUAL_CAMERA_SUB_SENSOR; SensorEnum <<= 1) { //表示主攝和子攝的輪訓
LOG_MSG("impSearchSensor search to sub\n");
#else
// for i = 1; i<2 ; i ++ . main_sensor =1 ;
for (SensorEnum = DUAL_CAMERA_MAIN_SENSOR; SensorEnum < DUAL_CAMERA_SUB_SENSOR; SensorEnum <<= 1) {
LOG_MSG("impSearchSensor search to main\n");
#endif
//skip atv case
if ( 0x04 == SensorEnum ) continue; //不是3d攝像頭,所以該處不會走到
//
for (i = 0; i < MAX_NUM_OF_SUPPORT_SENSOR; i++) { //所支持的驅動
//end of driver list
if (imx169_flag == i) continue;
if (m_pstSensorInitFunc[i].getCameraDefault == NULL) { //參看代碼,不會往下執行
LOG_MSG("m_pstSensorInitFunc[i].getCameraDefault is NULL: %d \n", i);
break;
}
//set sensor driver
id[KDIMGSENSOR_INVOKE_DRIVER_0] = (SensorEnum << KDIMGSENSOR_DUAL_SHIFT) | i; // 用第i 款驅動去匹配我們的主攝和子攝
LOG_MSG("set sensor driver id =%x\n", id[KDIMGSENSOR_INVOKE_DRIVER_0]);
err = ioctl( m_fdSensor, KDIMGSENSORIOC_X_SET_DRIVER, &id[ KDIMGSENSOR_INVOKE_DRIVER_0 ] ); // kd_sensorlist.c 設置我們的驅動,
if (err < 0) {
LOG_ERR("ERROR:KDCAMERAHWIOC_X_SET_DRIVER\n");
}
//pxs_004
//err = open();
err = ioctl(m_fdSensor, KDIMGSENSORIOC_T_CHECK_IS_ALIVE ); // 執行讀sensor id的函數
#if defined(DOOV_D1)
if(err ==0){
// 這裏很重要,有4顆模組,輪訓的時候 i>=2 的時候,那麼必將會是 sub,因爲i =0,1 的時候是 main
if (i>=2)
{
imx169_sub = 1; // i=2 ;i=3 的時候才跑到 sub
imx169_main =0;
}
else{
imx169_main =1;
imx169_sub = 0;
}
}
// if(err ==0){
// imx169_flag = i;
// imx169_tag = 1;
// }
#endif
if (err < 0) {
LOG_MSG("[impSearchSensor] Err-ctrlCode (%s) \n", strerror(errno));
}
//
sensorType = this->getCurrentSensorType((SENSOR_DEV_ENUM)SensorEnum); // 獲取sensor類型 //
socketPos 獲取位置 = this->getSocketPosition( (CAMERA_DUAL_CAMERA_SENSOR_ENUM ) SensorEnum );
//check extra ID , from EEPROM maybe
//may need to keep power here
if (NULL != pExIdChkCbf) {
err2 = pExIdChkCbf();
if (err2 < 0) {
LOG_ERR("Error:pExIdChkCbf() \n");
}
}
//power off sensor
close();
if (err < 0 || err2 < 0) // 這裏很重要,如果上面的KDIMGSENSORIOC_X_SET_DRIVER 和 KDIMGSENSORIOC_T_CHECK_IS_ALIVE 不成功,說明沒有匹配ok
LOG_MSG("sensor ID mismatch\n");
else { // // 這裏很重要,如果上面的KDIMGSENSORIOC_X_SET_DRIVER 和 KDIMGSENSORIOC_T_CHECK_IS_ALIVE 成功,匹配ok
//pxs_005
//這裏表示攝像頭讀ID成功
#if defined(DOOV_D1) // 主設輪訓完成
if (SensorEnum == DUAL_CAMERA_MAIN_SENSOR && imx169_main ==1) {
#else
if (SensorEnum == DUAL_CAMERA_MAIN_SENSOR ) {
#endif
{ //若是主攝 進行初始化,即填充m_mainSensorDrv.
//m_mainSensorIdx = i;
//m_mainSensorId = m_pstSensorInitFunc[m_mainSensorIdx].SensorId;
m_mainSensorDrv.index[m_mainSensorDrv.number] = i;
m_mainSensorDrv.type[m_mainSensorDrv.number] = sensorType;
if ( IMAGE_SENSOR_TYPE_RAW == sensorType && BAD_SENSOR_INDEX == m_mainSensorDrv.firstRawIndex ) {
m_mainSensorDrv.firstRawIndex = i;
}
else if ( IMAGE_SENSOR_TYPE_YUV == sensorType && BAD_SENSOR_INDEX == m_mainSensorDrv.firstYuvIndex ) {
m_mainSensorDrv.firstYuvIndex = i;
}
m_mainSensorDrv.position = socketPos;
m_mainSensorDrv.sensorID = m_pstSensorInitFunc[ m_mainSensorDrv.index[ m_mainSensorDrv.number ] ].SensorId;
// LOG("MAIN sensor m_mainSensorDrv.number=%d,m_mainSensorDrv.index=%d\n",m_mainSensorDrv.number,m_mainSensorDrv.index[m_mainSensorDrv.number]);
m_mainSensorDrv.number++;
//
m_pMainSensorInfo = m_pstSensorInitFunc[i].pSensorInfo ;
if ( m_pMainSensorInfo )
{
NSFeature::SensorInfoBase * pSensorInfo = m_pstSensorInitFunc[ i ].pSensorInfo ;
LOG_MSG("found <%#x/%s/%s>", pSensorInfo->GetID(), pSensorInfo->getDrvName(), pSensorInfo->getDrvMacroName());
// found <0x135/imx135mipiraw/SENSOR_DRVNAME_IMX135_MIPI_RAW>
}
else
{
LOG_WRN("m_pMainSensorInfo==NULL\n");
}
LOG_MSG("MAIN sensor found:[%d]/[0x%x]/[%d]/[%d] \n" , i, id[KDIMGSENSOR_INVOKE_DRIVER_0], sensorType ,socketPos );
//break;
}
//pxs_006
#if defined(DOOV_D1)
else if (SensorEnum == DUAL_CAMERA_SUB_SENSOR && imx169_sub ==1) { // 若是子攝,即填充成員變量m_subSensorDrv.
#else
else if (SensorEnum == DUAL_CAMERA_SUB_SENSOR ) {
#endif
//m_subSensorIdx = i;
//m_subSensorId = m_pstSensorInitFunc[m_subSensorIdx].SensorId;
m_subSensorDrv.index[m_subSensorDrv.number] = i;
m_subSensorDrv.type[m_subSensorDrv.number] = sensorType;
if ( IMAGE_SENSOR_TYPE_RAW == sensorType && BAD_SENSOR_INDEX == m_subSensorDrv.firstRawIndex ) {
m_subSensorDrv.firstRawIndex = i;
}
else if ( IMAGE_SENSOR_TYPE_YUV == sensorType && BAD_SENSOR_INDEX == m_subSensorDrv.firstYuvIndex ) {
m_subSensorDrv.firstYuvIndex = i;
}
m_subSensorDrv.position = socketPos;
m_subSensorDrv.sensorID = m_pstSensorInitFunc[m_subSensorDrv.index[m_subSensorDrv.number]].SensorId;
//LOG_MSG("SUB sensor m_subSensorDrv.number=%d, m_subSensorDrv.index=%d\n",m_subSensorDrv.number,m_subSensorDrv.index[m_subSensorDrv.number]);
m_subSensorDrv.number++;
//
m_pSubSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;
if ( m_pSubSensorInfo )
{
NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc[ i ].pSensorInfo ;
LOG_MSG( "found <%#x/%s/%s>" , pSensorInfo->GetID(), pSensorInfo->getDrvName(), pSensorInfo->getDrvMacroName() );
}
else
{
LOG_WRN("m_pSubSensorInfo==NULL\n");
}
LOG_MSG("SUB sensor found:[%d]/[0x%x]/[%d]/[%d] \n",i,id[KDIMGSENSOR_INVOKE_DRIVER_0],sensorType,socketPos);
//break;
}
}//
if (imx169_tag ==1){
imx169_tag = 0;
break;
}
}
}
//pxs_007
//close system call may be off sensor power. check first!!!
::close(m_fdSensor);
m_fdSensor = -1;
//
if (BAD_SENSOR_INDEX != m_mainSensorDrv.index[0]) {
m_mainSensorId = m_mainSensorDrv.sensorID;
//init to choose first
m_mainSensorIdx = m_mainSensorDrv.index[0]; // 重要
sensorDevs |= SENSOR_MAIN;
}
if (BAD_SENSOR_INDEX != m_subSensorDrv.index[0]) {
m_subSensorId = m_subSensorDrv.sensorID;
//init to choose first
m_subSensorIdx = m_subSensorDrv.index[0]; //重要
sensorDevs |= SENSOR_SUB;
}
#ifdef ATVCHIP_MTK_ENABLE
sensorDevs |= SENSOR_ATV;
#endif
if (sensorDevs == SENSOR_NONE) {
LOG_ERR( "Error No sensor found!! \n");
}
LOG("SENSOR search end: 0x%x /[0x%x][%d]/[0x%x][%d]\n", sensorDevs, m_mainSensorId,m_mainSensorIdx,m_subSensorId,m_subSensorIdx);
// 01-01 12:54:14.914573 418 418 D ImgSensorDrv: [impSearchSensor]SENSOR search end: 0x3 /[0x230][0]/[0xffffff][255]/[0x30c8][1]
return sensorDevs;
}
//其實,該函數最重要的目的即初始化了兩個非常重要的成員變量m_mainSensorIdx和 m_subSensorIdx ,分別表示主攝驅動和子攝驅動所在的索引。
=================================================================================================================================
攝像頭匹配lens驅動原則
文件 Mcu_drv.cpp (platform\mt6582\hardware\mtkcam\core\featureio\drv\lens) 中的 MCUDrv類的lensSearch成員函數
int MCUDrv::lensSearch(
unsigned int a_u4CurrSensorDev, 主攝還是子攝
unsigned int a_u4CurrSensorId SENSOR ID
)
{
INT32 i;
int err;
ACDK_SENSOR_FEATURECONTROL_STRUCT featureCtrl; // 自定義一個featureCtrl命令
MUINT32 FeaturePara = 0;
MUINT32 FeatureParaLen = sizeof(MUINT32);
MCU_DRV_DBG("lensSearch() - Entry \n");
MCU_DRV_DBG("[CurrSensorDev]0x%04x [CurrSensorId]0x%04x\n", a_u4CurrSensorDev, a_u4CurrSensorId);
LensCustomInit();
LensCustomGetInitFunc(&MCUDrv::m_LensInitFunc[0]);
// added by yangbo 0718
MCUDrv::m_fdMCU = open("/dev/kd_camera_hw", O_RDWR); 打開設備節點
if (MCUDrv::m_fdMCU < 0) {
MCU_DRV_ERR("error opening %s", strerror(errno));
return MCUDrv::MCU_INVALID_DRIVER;
}
初始化這個featureCtrl命令
featureCtrl.InvokeCamera = (CAMERA_DUAL_CAMERA_SENSOR_ENUM)a_u4CurrSensorDev;
//(CAMERA_DUAL_CAMERA_SENSOR_ENUM)a_u4CurrSensorDev; //DUAL_CAMERA_MAIN_SENSOR;
featureCtrl.FeatureId = SENSOR_FEATURE_GET_MID; // 自定義
featureCtrl.pFeaturePara = (MUINT8 *)&FeaturePara;
featureCtrl.pFeatureParaLen = (MUINT32 *)&FeatureParaLen;
err = ioctl(MCUDrv::m_fdMCU, KDIMGSENSORIOC_X_FEATURECONCTROL, &featureCtrl);
if (err < 0) {
MCU_DRV_ERR("[initMCU] ioctl - SENSOR_FEATURE_CHECK_SENSOR_ID, error %s", strerror(errno));
}
MCU_DRV_DBG("lens_Search()yangb0 -yangbo= FeaturePara=0x%04x\n",FeaturePara); // 此時得到的爲底層區分好的模組ID
MCU_DRV_DBG("lens_Search() -yangbo= FeaturePara=0x%04x\n",FeaturePara);
MCU_DRV_DBG("[LensInitTable-0][SensorId]0x%04x,[LensId]0x%04x\n", MCUDrv::m_LensInitFunc[0].SensorId, MCUDrv::m_LensInitFunc[0].LensId);
MCU_DRV_DBG("[LensInitTable-1][SensorId]0x%04x,[LensId]0x%04x\n", MCUDrv::m_LensInitFunc[1].SensorId, MCUDrv::m_LensInitFunc[1].LensId);
MCU_DRV_DBG("[LensInitTable-2][SensorId]0x%04x,[LensId]0x%04x\n", MCUDrv::m_LensInitFunc[2].SensorId, MCUDrv::m_LensInitFunc[2].LensId);
MCU_DRV_DBG("[LensInitTable-3][SensorId]0x%04x,[LensId]0x%04x\n", MCUDrv::m_LensInitFunc[3].SensorId, MCUDrv::m_LensInitFunc[3].LensId);
MCUDrv::m_u4CurrLensIdx = 0;
if (a_u4CurrSensorDev == SENSOR_DEV_MAIN) // only search for main sensor, dummy for sub sensor always -> need modify for support 3D
{
for (i=0; i<4; i++) {
if ((MCUDrv::m_LensInitFunc[i].LensId == DUMMY_LENS_ID) ||
(MCUDrv::m_LensInitFunc[i].LensId == SENSOR_DRIVE_LENS_ID) ||
(MCUDrv::m_LensInitFunc[i].LensId == FM50AF_LENS_ID)
)
{
MCUDrv::m_u4CurrLensIdx = i;
}
}
// force assign LensIdx if SensorId != DUMMY_SENSOR_ID (to support backup lens/new lens driver)
for (i=0; i<4; i++) {
if ((MCUDrv::m_LensInitFunc[i].SensorId == a_u4CurrSensorId) && (a_u4CurrSensorId!=0xFFFF) && (a_u4CurrSensorId!=0x0))
{
MCUDrv::m_u4CurrLensIdx = i;
MCU_DRV_DBG("[idx]%d [CurrSensorId]0x%04x,[CurrLensIdx]0x%04x\n", i, a_u4CurrSensorId, MCUDrv::m_u4CurrLensIdx);
break;
}
else if(a_u4CurrSensorId == IMX179_SENSOR_ID)
{
if(FeaturePara == IMX179_MAIN_SY_ID) // 若是信利模組
{
MCUDrv::m_u4CurrLensIdx = 1; lens列表索引爲1
MCU_DRV_DBG("[idx]%d [CurrSensorId]0x%04x,[CurrLensIdx]0x%04x\n", i, a_u4CurrSensorId, MCUDrv::m_u4CurrLensIdx);
break;
}
else if(FeaturePara == IMX179_MAIN_XL_ID) // 若是瞬宇模組
{
MCUDrv::m_u4CurrLensIdx = 2; lens列表索引爲2
MCU_DRV_DBG("[idx]%d [CurrSensorId]0x%04x,[CurrLensIdx]0x%04x\n", i, a_u4CurrSensorId, MCUDrv::m_u4CurrLensIdx);
break;
}
else
{
MCUDrv::m_u4CurrLensIdx = i; 否則爲i
MCU_DRV_DBG("[idx]%d [CurrSensorId]0x%04x,[CurrLensIdx]0x%04x\n", i, a_u4CurrSensorId, MCUDrv::m_u4CurrLensIdx);
break;
}
}
}
}
else //sub or main2 case
{
for (i=0; i<MAX_NUM_OF_SUPPORT_LENS; i++) {
if ((MCUDrv::m_LensInitFunc[i].SensorId == a_u4CurrSensorId) && (a_u4CurrSensorId!=0xFFFF) && (a_u4CurrSensorId!=0x0))
{
MCUDrv::m_u4CurrLensIdx = i;
MCU_DRV_DBG("[idx]%d [CurrSensorId]0x%04x,[CurrLensIdx]0x%04x\n", i, a_u4CurrSensorId, MCUDrv::m_u4CurrLensIdx);
break;
}
}
}
LensCustomSetIndex(MCUDrv::m_u4CurrLensIdx);
MCU_DRV_DBG("[CurrLensIdx]%d", MCUDrv::m_u4CurrLensIdx);
return MCU_NO_ERROR;
}
該函數最重要的目的也就是設置lens列表所在的索引,對於朵唯項目而言,即表示爲不同的模組去匹配不同的lens驅動
=======================================================================================================================
關於今天提的四個驅動去匹配的問題,規則是這樣
要修改到hal層具體的匹配規則;在kd_sensorlist.h和sensorlist.cpp文件中按照如下順序定義列表;
{瞬宇主攝模組id1,name1,fun1} 第0個驅動列表和hal列表
{信利主攝模組id2,name2,fun2} 第1個驅動列表和hal列表
{瞬宇子攝模組id3,name3,fun3} 第2個驅動列表和hal列表
{信利子攝模組id4,name4,fun4} 第3個驅動列表和hal列表
四個id都是不一樣的,比如說分別爲 1001,1002,1003,1004
之後去修改匹配規則,像這樣去修改,在匹配主攝的時候,我們只去枚舉前兩個列表;在匹配子攝的時候去枚舉後兩個列表,
注意要在各sensor驅動裏注意讀sensor ID的函數後面再加上讀模組ID的驗證,在這裏的話,修改匹配規則如下:
前面省略。。。。
定義兩個變量
int imx169_sub = -1;
int imx169_main =-1;
#ifdef MTK_SUB_IMGSENSOR 該宏定義
for (SensorEnum = DUAL_CAMERA_MAIN_SENSOR; SensorEnum <= DUAL_CAMERA_SUB_SENSOR; SensorEnum <<= 1) { 表示主攝和子攝的輪訓
LOG_MSG("impSearchSensor search to sub\n");
#else
for (SensorEnum = DUAL_CAMERA_MAIN_SENSOR; SensorEnum < DUAL_CAMERA_SUB_SENSOR; SensorEnum <<= 1) {
LOG_MSG("impSearchSensor search to main\n");
#endif
//skip atv case
if ( 0x04 == SensorEnum ) continue; 不是3d攝像頭,所以該處不會走到
//
for (i = 0; i < MAX_NUM_OF_SUPPORT_SENSOR; i++) { 所支持的驅動
//end of driver list
// if (imx169_flag == i) continue;
if (m_pstSensorInitFunc[i].getCameraDefault == NULL) { 參看代碼,不會往下執行
LOG_MSG("m_pstSensorInitFunc[i].getCameraDefault is NULL: %d \n", i);
break;
}
//set sensor driver
id[KDIMGSENSOR_INVOKE_DRIVER_0] = (SensorEnum << KDIMGSENSOR_DUAL_SHIFT) | i; // 用第i款驅動去匹配我們的主攝和子攝
LOG_MSG("set sensor driver id =%x\n", id[KDIMGSENSOR_INVOKE_DRIVER_0]);
err = ioctl(m_fdSensor, KDIMGSENSORIOC_X_SET_DRIVER,&id[KDIMGSENSOR_INVOKE_DRIVER_0] ); 設置我們的驅動,
if (err < 0) {
LOG_ERR("ERROR:KDCAMERAHWIOC_X_SET_DRIVER\n");
}
//err = open();
err = ioctl(m_fdSensor, KDIMGSENSORIOC_T_CHECK_IS_ALIVE); // 執行讀sensor id的函數
if(err ==0){
if (i>=2)
{
imx169_sub = 1;
imx169_main =0;
}
else
imx169_main =1;
imx169_sub = 0;
}
if (err < 0) {
LOG_MSG("[impSearchSensor] Err-ctrlCode (%s) \n", strerror(errno));
}
//
sensorType = this->getCurrentSensorType((SENSOR_DEV_ENUM)SensorEnum); //獲取sensor類型 //
socketPos 獲取位置 = this->getSocketPosition((CAMERA_DUAL_CAMERA_SENSOR_ENUM)SensorEnum);
//check extra ID , from EEPROM maybe
//may need to keep power here
if (NULL != pExIdChkCbf) {
err2 = pExIdChkCbf();
if (err2 < 0) {
LOG_ERR("Error:pExIdChkCbf() \n");
}
}
//power off sensor
close();
if (err < 0 || err2 < 0) {
LOG_MSG("sensor ID mismatch\n");
}
else { 這裏表示攝像頭讀ID成功
if (SensorEnum == DUAL_CAMERA_MAIN_SENSOR && imx169_main ==1 ) { // 若是主攝 進行初始化,即填充m_mainSensorDrv.
//m_mainSensorIdx = i;
//m_mainSensorId = m_pstSensorInitFunc[m_mainSensorIdx].SensorId;
m_mainSensorDrv.index[m_mainSensorDrv.number] = i;
m_mainSensorDrv.type[m_mainSensorDrv.number] = sensorType;
if ( IMAGE_SENSOR_TYPE_RAW == sensorType && BAD_SENSOR_INDEX == m_mainSensorDrv.firstRawIndex ) {
m_mainSensorDrv.firstRawIndex = i;
}
else if ( IMAGE_SENSOR_TYPE_YUV == sensorType && BAD_SENSOR_INDEX == m_mainSensorDrv.firstYuvIndex ) {
m_mainSensorDrv.firstYuvIndex = i;
}
m_mainSensorDrv.position = socketPos;
m_mainSensorDrv.sensorID = m_pstSensorInitFunc[m_mainSensorDrv.index[m_mainSensorDrv.number]].SensorId;
// LOG_MSG("MAIN sensor m_mainSensorDrv.number=%d, m_mainSensorDrv.index=%d\n",m_mainSensorDrv.number,m_mainSensorDrv.index[m_mainSensorDrv.number]);
m_mainSensorDrv.number++;
//
m_pMainSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;
if ( m_pMainSensorInfo )
{
NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;
LOG_MSG("found <%#x/%s/%s>", pSensorInfo->GetID(), pSensorInfo->getDrvName(), pSensorInfo->getDrvMacroName());
}
else
{
LOG_WRN("m_pMainSensorInfo==NULL\n");
}
LOG_MSG("MAIN sensor found:[%d]/[0x%x]/[%d]/[%d] \n",i,id[KDIMGSENSOR_INVOKE_DRIVER_0],sensorType,socketPos);
//break;
}
else if (SensorEnum == DUAL_CAMERA_SUB_SENSOR && imx169_sub ==1) { // 若是子攝,即填充成員變量m_subSensorDrv.
//m_subSensorIdx = i;
//m_subSensorId = m_pstSensorInitFunc[m_subSensorIdx].SensorId;
m_subSensorDrv.index[m_subSensorDrv.number] = i;
m_subSensorDrv.type[m_subSensorDrv.number] = sensorType;
if ( IMAGE_SENSOR_TYPE_RAW == sensorType && BAD_SENSOR_INDEX == m_subSensorDrv.firstRawIndex ) {
m_subSensorDrv.firstRawIndex = i;
}
else if ( IMAGE_SENSOR_TYPE_YUV == sensorType && BAD_SENSOR_INDEX == m_subSensorDrv.firstYuvIndex ) {
m_subSensorDrv.firstYuvIndex = i;
}
m_subSensorDrv.position = socketPos;
m_subSensorDrv.sensorID = m_pstSensorInitFunc[m_subSensorDrv.index[m_subSensorDrv.number]].SensorId;
//LOG_MSG("SUB sensor m_subSensorDrv.number=%d, m_subSensorDrv.index=%d\n",m_subSensorDrv.number,m_subSensorDrv.index[m_subSensorDrv.number]);
m_subSensorDrv.number++;
//
m_pSubSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;
if ( m_pSubSensorInfo )
{
NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;
LOG_MSG("found <%#x/%s/%s>", pSensorInfo->GetID(), pSensorInfo->getDrvName(), pSensorInfo->getDrvMacroName());
}
else
{
LOG_WRN("m_pSubSensorInfo==NULL\n");
}
LOG_MSG("SUB sensor found:[%d]/[0x%x]/[%d]/[%d] \n",i,id[KDIMGSENSOR_INVOKE_DRIVER_0],sensorType,socketPos);
//break;
}
}//
}
}
//close system call may be off sensor power. check first!!!
::close(m_fdSensor);
m_fdSensor = -1;
//
if (BAD_SENSOR_INDEX != m_mainSensorDrv.index[0]) {
m_mainSensorId = m_mainSensorDrv.sensorID;
//init to choose first
m_mainSensorIdx = m_mainSensorDrv.index[0]; 重要
sensorDevs |= SENSOR_MAIN;
}
if (BAD_SENSOR_INDEX != m_subSensorDrv.index[0]) {
m_subSensorId = m_subSensorDrv.sensorID;
//init to choose first
m_subSensorIdx = m_subSensorDrv.index[0]; 重要
sensorDevs |= SENSOR_SUB;
}
#ifdef ATVCHIP_MTK_ENABLE
sensorDevs |= SENSOR_ATV;
#endif
if (sensorDevs == SENSOR_NONE) {
LOG_ERR( "Error No sensor found!! \n");
}
//
LOG("SENSOR search end: 0x%x /[0x%x][%d]/[0x%x][%d]\n", sensorDevs,m_mainSensorId,m_mainSensorIdx,m_subSensorId,m_subSensorIdx);
return sensorDevs;
}//
具體實例:6737T x7 項目
// 搜索順序是根據,sensorlist.cpp 中數組順序來的。
RAW_INFO(IALENGMIPI_SENSOR_ID, SENSOR_DRVNAME_IALENG_MIPI_RAW, NULL),
RAW_INFO(OV2680MIPI_SENSOR_ID, SENSOR_DRVNAME_OV2680_MIPI_RAW,NULL),
RAW_INFO(S5K3L8_SENSOR_ID, SENSOR_DRVNAME_S5K3L8_MIPI_RAW, NULL),
RAW_INFO(S5K3L2_SENSOR_ID, SENSOR_DRVNAME_S5K3L2_MIPI_RAW, NULL),
2:
如下這部分是開機過程中打印的log:
01-01 00:35:11.481128 480 480 D [ 63.460238].(1)[480:cameraserver][name:kd_sensorlist&]: d1
01-01 00:35:11.520166 480 480 D [ 63.499276].(0)[480:cameraserver][name:kd_sensorlist&]: d1
01-01 00:35:11.520361 480 480 D [ 63.499471].(0)[480:cameraserver][name:kd_sensorlist&]: 0x00010000/0x00000000
01-01 00:35:11.520901 480 480 D [ 63.500011]: .(0)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=1,drvIdx[0]=0
01-01 00:35:11.520901 480 480 D [ 63.500011]: .(0)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=1,drvIdx[0]=0
01-01 00:35:11.520922 480 480 D [ 63.500032]: .(0)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][1][ialengmipi]
01-01 00:35:11.520922 480 480 D [ 63.500032]: .(0)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][1][ialengmipi]
01-01 00:35:11.756854 480 480 E [ 63.735964]: .(0)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed, addr = 0x300a, data = 0x0 !!
01-01 00:35:11.761182 480 480 E [ 63.740292]: .(0)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed, addr = 0x300b, data = 0x0 !!
01-01 00:35:11.791698 480 480 D [ 63.770808].(0)[480:cameraserver][name:kd_sensorlist&]: 0x00010001/0x00000000
01-01 00:35:11.791711 480 480 D [ 63.770821]: .(0)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=1,drvIdx[0]=1
01-01 00:35:11.791711 480 480 D [ 63.770821]: .(0)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=1,drvIdx[0]=1
01-01 00:35:11.791721 480 480 D [ 63.770831]: .(0)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][1][ov2680mipiraw]
01-01 00:35:11.791721 480 480 D [ 63.770831]: .(0)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][1][ov2680mipiraw]
01-01 00:35:11.986520 480 480 E [ 63.965630]: .(1)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:11.991106 480 480 E [ 63.970216]: .(1)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:12.005729 480 480 E [ 63.984839]: .(1)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:12.008948 480 480 E [ 63.988058]: .(1)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:12.009244 480 480 E [ 63.988354]: .(1)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:12.009499 480 480 E [ 63.988609]: .(1)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:12.015000 480 480 D [ 63.994110].(1)[480:cameraserver][name:kd_sensorlist&]: 0x00010002/0x00000000
01-01 00:35:12.015013 480 480 D [ 63.994123]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=1,drvIdx[0]=2
01-01 00:35:12.015013 480 480 D [ 63.994123]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=1,drvIdx[0]=2
01-01 00:35:12.015023 480 480 D [ 63.994133]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][1][s5k3l8mipiraw]
01-01 00:35:12.015023 480 480 D [ 63.994133]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][1][s5k3l8mipiraw]
01-01 00:35:12.062980 480 480 D [ 64.042090].(1)[480:cameraserver][name:kd_sensorlist&]: 0x00010003/0x00000000
01-01 00:35:12.062993 480 480 D [ 64.042103]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=1,drvIdx[0]=3
01-01 00:35:12.062993 480 480 D [ 64.042103]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=1,drvIdx[0]=3
01-01 00:35:12.063003 480 480 D [ 64.042113]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][1][s5k3l2mipiraw]
01-01 00:35:12.063003 480 480 D [ 64.042113]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][1][s5k3l2mipiraw]
01-01 00:35:12.096391 480 480 D [ 64.075501]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][adopt_CAMERA_HW_CheckIsAlive] Sensor found ID = 0x30c2
01-01 00:35:12.096391 480 480 D [ 64.075501]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][adopt_CAMERA_HW_CheckIsAlive] Sensor found ID = 0x30c2
01-01 00:35:12.105293 480 480 D [ 64.084403].(1)[480:cameraserver][name:kd_sensorlist&]: 0x00020000/0x00000000
01-01 00:35:12.105306 480 480 D [ 64.084416]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=2,drvIdx[0]=0
01-01 00:35:12.105306 480 480 D [ 64.084416]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=2,drvIdx[0]=0
01-01 00:35:12.105316 480 480 D [ 64.084426]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][2][ialengmipi]
01-01 00:35:12.105316 480 480 D [ 64.084426]: .(1)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][2][ialengmipi]
01-01 00:35:12.444812 480 480 D [ 64.423922].(2)[480:cameraserver][name:kd_sensorlist&]: 0x00020001/0x00000000
01-01 00:35:12.444843 480 480 D [ 64.423953]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=2,drvIdx[0]=1
01-01 00:35:12.444843 480 480 D [ 64.423953]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=2,drvIdx[0]=1
01-01 00:35:12.444862 480 480 D [ 64.423972]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][2][ov2680mipiraw]
01-01 00:35:12.444862 480 480 D [ 64.423972]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][2][ov2680mipiraw]
01-01 00:35:12.719140 480 480 D [ 64.698250]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][adopt_CAMERA_HW_CheckIsAlive] Sensor found ID = 0x2680
01-01 00:35:12.719140 480 480 D [ 64.698250]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][adopt_CAMERA_HW_CheckIsAlive] Sensor found ID = 0x2680
01-01 00:35:12.740182 480 480 D [ 64.719292].(2)[480:cameraserver][name:kd_sensorlist&]: 0x00020002/0x00000000
01-01 00:35:12.740214 480 480 D [ 64.719324]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=2,drvIdx[0]=2
01-01 00:35:12.740214 480 480 D [ 64.719324]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=2,drvIdx[0]=2
01-01 00:35:12.740232 480 480 D [ 64.719342]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][2][s5k3l8mipiraw]
01-01 00:35:12.740232 480 480 D [ 64.719342]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][2][s5k3l8mipiraw]
01-01 00:35:12.821222 480 480 E [ 64.800332]: .(2)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:12.829249 480 480 E [ 64.808359]: .(2)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:12.859246 480 480 E [ 64.838356]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:12.864663 480 480 E [ 64.843773]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:12.895331 480 480 D [ 64.874441].(3)[480:cameraserver][name:kd_sensorlist&]: 0x00020003/0x00000000
01-01 00:35:12.895356 480 480 D [ 64.874466]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=2,drvIdx[0]=3
01-01 00:35:12.895356 480 480 D [ 64.874466]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=2,drvIdx[0]=3
01-01 00:35:12.895375 480 480 D [ 64.874485]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][2][s5k3l2mipiraw]
01-01 00:35:12.895375 480 480 D [ 64.874485]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][2][s5k3l2mipiraw]
01-01 00:35:13.036802 480 480 E [ 65.015912]: .(1)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:13.049086 480 480 E [ 65.028196]: .(1)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:13.078039 480 480 E [ 65.057149]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:13.086027 480 480 E [ 65.065137]: .(2)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:13.113309 480 480 D [ 65.092419].(2)[480:cameraserver][name:kd_sensorlist&]: 0x00040000/0x00000000
01-01 00:35:13.113337 480 480 D [ 65.092447]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=4,drvIdx[0]=0
01-01 00:35:13.113337 480 480 D [ 65.092447]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=4,drvIdx[0]=0
01-01 00:35:13.113356 480 480 D [ 65.092466]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][4][ialengmipi]
01-01 00:35:13.113356 480 480 D [ 65.092466]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][4][ialengmipi]
01-01 00:35:13.455118 480 480 D [ 65.434228]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][adopt_CAMERA_HW_CheckIsAlive] Sensor found ID = 0x7750
01-01 00:35:13.455118 480 480 D [ 65.434228]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][adopt_CAMERA_HW_CheckIsAlive] Sensor found ID = 0x7750
01-01 00:35:13.568518 480 480 D [ 65.547628].(2)[480:cameraserver][name:kd_sensorlist&]: 0x00040001/0x00000000
01-01 00:35:13.568548 480 480 D [ 65.547658]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=4,drvIdx[0]=1
01-01 00:35:13.568548 480 480 D [ 65.547658]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=4,drvIdx[0]=1
01-01 00:35:13.568567 480 480 D [ 65.547677]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][4][ov2680mipiraw]
01-01 00:35:13.568567 480 480 D [ 65.547677]: .(2)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][4][ov2680mipiraw]
01-01 00:35:13.820105 480 480 E [ 65.799215]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:13.829490 480 480 E [ 65.808600]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:13.836630 480 480 E [ 65.815740]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:13.843278 480 480 E [ 65.822388]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:13.854130 480 480 E [ 65.833240]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:13.861046 480 480 E [ 65.840156]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x30
01-01 00:35:13.898479 480 480 D [ 65.877589].(3)[480:cameraserver][name:kd_sensorlist&]: 0x00040002/0x00000000
01-01 00:35:13.898504 480 480 D [ 65.877614]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=4,drvIdx[0]=2
01-01 00:35:13.898504 480 480 D [ 65.877614]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=4,drvIdx[0]=2
01-01 00:35:13.898523 480 480 D [ 65.877633]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][4][s5k3l8mipiraw]
01-01 00:35:13.898523 480 480 D [ 65.877633]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][4][s5k3l8mipiraw]
01-01 00:35:13.972461 480 480 D [ 65.951571].(3)[480:cameraserver][name:kd_sensorlist&]: 0x00040003/0x00000000
01-01 00:35:13.972483 480 480 D [ 65.951593]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=4,drvIdx[0]=3
01-01 00:35:13.972483 480 480 D [ 65.951593]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] g_invokeSocketIdx[0]=4,drvIdx[0]=3
01-01 00:35:13.972502 480 480 D [ 65.951612]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][4][s5k3l2mipiraw]
01-01 00:35:13.972502 480 480 D [ 65.951612]: .(3)[480:cameraserver][name:kd_sensorlist&][kd_sensorlist][kdSetDriver] [0][1][4][s5k3l2mipiraw]
01-01 00:35:14.054258 480 480 E [ 66.033368]: .(2)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:14.058190 480 480 E [ 66.037300]: .(2)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:14.062873 480 480 E [ 66.041983]: .(2)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0
01-01 00:35:14.069803 480 480 E [ 66.048913]: .(3)[480:cameraserver][name:kd_sensorlist&][CAMERA SENSOR] I2C send failed!!, Addr = 0x0