查看: 27891|回复: 1
收起左侧

MTK Camera 开机启动流程

[复制链接]
发表于 2015-8-22 08:08:53 | 显示全部楼层 |阅读模式
一、MTK平台Camera框架
' d# i1 O1 N, _3 Q$ }- L% X

         MTK平台的Camera的架构见下图,

4 `9 @1 J/ {: Y

     
7 V, M/ v4 O  t这里主要介绍kernel部分和HAL层部分。

    1、Kernel 部分主要有两块:

           1.1、image sensordriver,负责具体型号的 sensor 的 id 检测,上电,以及在preview、capture、初始化、3A等等功能设定时的寄存器配置。

           1.2、isp driver,通过DMA将sensor数据流上传。

/ h/ |% a# }) o

        2、HAL层部分主要有三部分组成:

           2.1、imageio,主要负责数据buffer上传的pipe。

          2.2、drv,包含imgsensor和isp的hal层控制。

          2.3、feature io,包含各种3A等性能配置。, o% Y0 @5 x3 Z


+ f5 R3 G4 P2 E- p% @二、Camera打开流程分析

         Camera开启流程图如下:

        主要发生在两个时间点:

    1、开机时:camera完成了sensor框架初始化,id检测并匹配sensor,以及上下电操作。

    2、打开Camera应用时:camera会有上电,完成sensor的寄存器初始化配置,向上层传递基本参数和配置信息,以及preview和capture模式循环。
! f4 \! Y2 K) }% f3 F- S0 P' p1 [

& A' O% @" n* r- H
1、开机初始化过程

         由于一开始不知道上电camera初始化从哪开始,我们可以借助抓取的mtk mobile log去分析。先看hal层log开始处:

# u3 }! u/ I/ f+ C" _) l7 o- ^% ~6 K: K

8 B/ {. ^4 S3 _( S2 W) J1 v* i; ^- {$ B( F, d; z5 q/ }; E
  • 12-24 10:02:07.601   148   148 D MtkCam/module: [instantiate_camera_module]  
  • 12-24 10:02:07.601   148   148 D MtkCam/Utils/Property: [clear] pid/tid=148/148  
  • 12-24 10:02:07.601   148   148 I CameraService: Loaded "MediaTek Camera Module" camera module  
  • 12-24 10:02:07.601   148   148 D MtkCam/MtkCamUtils: [CamDevMetaInfoMap::clear] pid/tid=148/148  
  • 12-24 10:02:07.601   148   148 D SensorHal: [getInstance][SensorHalImp] getInstance  
  • 12-24 10:02:07.601   148   148 D SensorHal: [createImp][createImp]: 0  
  • 12-24 10:02:07.601   148   148 D SeninfDrvImp: [getInstance][getInstance]  
  • 12-24 10:02:07.601   148   148 D SeninfDrvImp: [SeninfDrvImp][SeninfDrvImp]  
  • 12-24 10:02:07.601   148   148 D SeninfDrvImp: [init][init]: 0  ; P( K2 u" ^; {2 Y0 x' D2 W

    # _% q& B5 l5 l1 P. x2 D# `! ]3 J
! h4 A' V7 c/ Y, g3 Q4 f; i3 S

        通过sourceinsight搜索发现开始是从CamDeviceManagerImp.cpp函数的enumDeviceLocked()开始。该函数的源代码如下:

===>mediatek/platform/mt6582/hardware/mtkcam/devicemgr/CamDeviceManagerImp.cpp


( c1 g& F! e: D6 T
  • /******************************************************************************
  • *
  • ******************************************************************************/  
  • int32_t  
  • CamDeviceManagerImp::  
  • enumDeviceLocked()  
  • {  
  •     Utils::CamProfile _profile(__FUNCTION__, "CamDeviceManagerImp");  
  •     //  
  •     status_t status = OK;  
  •     int32_t i4DeviceNum = 0;  
  •     //  
  •     mEnumMap.clear();  
  • //------------------------------------------------------------------------------  
  • #if '1'==MTKCAM_HAVE_SENSOR_HAL  
  •   
  •     mEnumMap.clear();  
  •     DevMetaInfo::clear();  
  •     //  
  •     int32_t isFakeOrientation = 0;  
  •     int32_t i4DevSetupOrientation = 0;  
  •     camera_info camInfo;  
  •     camInfo.device_version = CAMERA_DEVICE_API_VERSION_1_0;  
  •     camInfo.static_camera_characteristics = NULL;  
  •     //  
  •     SensorHal* pSensorHal = SensorHal::createInstance();//创建sensor对象  
  •     if  ( ! pSensorHal )  
  •     {  
  •         MY_LOGE("pSensorHal == NULL");  
  •         return 0;  
  •     }  
  •     //  
  •     int32_t const iSensorsList = pSensorHal->searchSensor();//此函数是入口,主要查找匹配的硬件sensor  
  •     //  
  •     //  
  •     if  ( (iSensorsList & SENSOR_DEV_MAIN_3D) == SENSOR_DEV_MAIN_3D )  
  •     {  
  •         MY_LOGI("Stereo 3D Camera found");  
  • #warning "[TODO] Stereo 3D Camera"  
  •     }  
  •     //  
  •     if  ( (iSensorsList & SENSOR_DEV_MAIN) == SENSOR_DEV_MAIN )  
  •     {  
  •         int32_t const deviceId = i4DeviceNum;  
  •         //  
  •         halSensorDev_e const eHalSensorDev = SENSOR_DEV_MAIN;  
  •         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_FAKE_ORIENTATION, (int)&isFakeOrientation);  
  •         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_ORIENTATION_ANGLE, (int)&i4DevSetupOrientation);  
  •         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_FACING_DIRECTION, (int)&camInfo.facing);  
  •         camInfo.orientation = i4DevSetupOrientation;  
  •         if  ( isFakeOrientation )  
  •         {  
  •             camInfo.orientation = (0==camInfo.facing) ? 90 : 270;  
  •             MY_LOGW("Fake orientation:%d instead of %d, facing=%d HalSensorDev=%#x", camInfo.orientation, i4DevSetupOrientation, camInfo.facing, eHalSensorDev);  
  •         }  
  •         DevMetaInfo::add(deviceId, camInfo, i4DevSetupOrientation, eDevId_ImgSensor, eHalSensorDev);  
  •         //  
  •         sp<EnumInfo> pInfo = new EnumInfo;  
  •         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
  •         pInfo->pMetadata            = NULL;  
  •         pInfo->iFacing              = camInfo.facing;  
  •         pInfo->iWantedOrientation   = camInfo.orientation;  
  •         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
  •         mEnumMap.add(deviceId, pInfo);  
  •         //  
  •         i4DeviceNum++;  
  •     }  
  •     //  
  •     if  ( (iSensorsList & SENSOR_DEV_SUB) == SENSOR_DEV_SUB )  
  •     {  
  •         int32_t const deviceId = i4DeviceNum;  
  •         //  
  •         halSensorDev_e const eHalSensorDev = SENSOR_DEV_SUB;  
  •         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_FAKE_ORIENTATION, (int)&isFakeOrientation);  
  •         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_ORIENTATION_ANGLE, (int)&i4DevSetupOrientation);  
  •         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_FACING_DIRECTION, (int)&camInfo.facing);  
  •         camInfo.orientation = i4DevSetupOrientation;  
  •         if  ( isFakeOrientation )  
  •         {  
  •             camInfo.orientation = (0==camInfo.facing) ? 90 : 270;  
  •             MY_LOGW("Fake orientation:%d instead of %d, facing=%d HalSensorDev=%#x", camInfo.orientation, i4DevSetupOrientation, camInfo.facing, eHalSensorDev);  
  •         }  
  •         DevMetaInfo::add(deviceId, camInfo, i4DevSetupOrientation, eDevId_ImgSensor, eHalSensorDev);  
  •         //  
  •         sp<EnumInfo> pInfo = new EnumInfo;  
  •         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
  •         pInfo->pMetadata            = NULL;  
  •         pInfo->iFacing              = camInfo.facing;  
  •         pInfo->iWantedOrientation   = camInfo.orientation;  
  •         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
  •         mEnumMap.add(deviceId, pInfo);  
  •         //  
  •         i4DeviceNum++;  
  •     }  
  •     //  
  • //    if  ( (iSensorsList & SENSOR_DEV_ATV) == SENSOR_DEV_ATV )  
  •     {  
  •         int32_t const deviceId = 0xFF;  
  •         //  
  •         halSensorDev_e const eHalSensorDev = SENSOR_DEV_ATV;  
  •         camInfo.facing = 0;  
  •         camInfo.orientation = 0;  
  •         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_AtvSensor, eHalSensorDev);  
  •         //  
  •         sp<EnumInfo> pInfo = new EnumInfo;  
  •         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
  •         pInfo->pMetadata            = NULL;  
  •         pInfo->iFacing              = camInfo.facing;  
  •         pInfo->iWantedOrientation   = camInfo.orientation;  
  •         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
  •         mEnumMap.add(deviceId, pInfo);  
  •         //  
  • //        i4DeviceNum++;  
  •     }  
  •     //  
  •     //  
  •     if  ( pSensorHal )  
  •     {  
  •         pSensorHal->destroyInstance();  
  •         pSensorHal = NULL;  
  •     }  
  •     //  
  •     MY_LOGI("iSensorsList=0x%08X, i4DeviceNum=%d", iSensorsList, i4DeviceNum);  
  •     for (size_t i = 0; i < mEnumMap.size(); i++)  
  •     {  
  •         int32_t const deviceId = mEnumMap.keyAt(i);  
  •         sp<EnumInfo> pInfo = mEnumMap.valueAt(i);  
  •         uint32_t const uDeviceVersion   = pInfo->uDeviceVersion;  
  •         camera_metadata const*pMetadata = pInfo->pMetadata;  
  •         int32_t const iFacing           = pInfo->iFacing;  
  •         int32_t const iWantedOrientation= pInfo->iWantedOrientation;  
  •         int32_t const iSetupOrientation = pInfo->iSetupOrientation;  
  •         MY_LOGI(  
  •             "[0x%02x] orientation(wanted/setup)=(%d/%d) facing:%d metadata:%p DeviceVersion:0x%x",   
  •             deviceId, iWantedOrientation, iSetupOrientation,   
  •             iFacing, pMetadata, uDeviceVersion  
  •         );  
  •     }  
  •   
  • #else   //----------------------------------------------------------------------  
  •   
  •     #warning "[WARN] Simulation for CamDeviceManagerImp::enumDeviceLocked()"  
  •   
  •     mEnumMap.clear();  
  •     DevMetaInfo::clear();  
  •     {  
  •         int32_t const deviceId = 0;  
  •         //  
  •         camera_info camInfo;  
  •         camInfo.device_version  = CAMERA_DEVICE_API_VERSION_1_0;  
  •         camInfo.static_camera_characteristics = NULL;  
  •         camInfo.facing      = 0;  
  •         camInfo.orientation = 90;  
  •         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_ImgSensor, 0x01/*SENSOR_DEV_MAIN*/);  
  •         //  
  •         sp<EnumInfo> pInfo = new EnumInfo;  
  •         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
  •         pInfo->pMetadata            = NULL;  
  •         pInfo->iFacing              = 0;  
  •         pInfo->iWantedOrientation   = 90;  
  •         pInfo->iSetupOrientation    = 90;  
  •         mEnumMap.add(deviceId, pInfo);  
  •     }  
  •     //  
  •     {  
  •         int32_t const deviceId = 0xFF;  
  •         //  
  •         camera_info camInfo;  
  •         camInfo.device_version  = CAMERA_DEVICE_API_VERSION_1_0;  
  •         camInfo.static_camera_characteristics = NULL;  
  •         camInfo.facing      = 0;  
  •         camInfo.orientation = 0;  
  •         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_AtvSensor, 0x04/*SENSOR_DEV_ATV*/);  
  •         //  
  •         sp<EnumInfo> pInfo = new EnumInfo;  
  •         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
  •         pInfo->pMetadata            = NULL;  
  •         pInfo->iFacing              = 0;  
  •         pInfo->iWantedOrientation   = 0;  
  •         pInfo->iSetupOrientation    = 0;  
  •         mEnumMap.add(deviceId, pInfo);  
  •     }  
  •     //  
  •     i4DeviceNum = 1;  
  •   
  • #endif  
  • //------------------------------------------------------------------------------  
  •     //  
  •     _profile.print("");  
  •     return  i4DeviceNum;  
  • }  / Y; V$ _; f# X# Q0 K% P
! I( v9 x$ x4 o9 R& d5 c! p

      
! g: l3 N& _8 s

     函数pSensorHal->searchSensor()将调用SensorDrv::searchSensor(NULL)函数,该函数再调用ImgSensor_drv.cpp文件中中的ImgSensorDrv::impSearchSensor函数。

===>mediatek/platform/mt6582/hardware/mtkcam/core/drv/imgsensor/ImgSensor_drv.cpp


0 s' n6 H' f4 d1 c- _0 L0 C
  • /*******************************************************************************
  • *
  • ********************************************************************************/  
  •   
  • MINT32   
  • ImgSensorDrv::impSearchSensor(pfExIdChk pExIdChkCbf)  
  • {  
  •     MUINT32 SensorEnum = (MUINT32) DUAL_CAMERA_MAIN_SENSOR;  
  •     MUINT32 i,id[KDIMGSENSOR_MAX_INVOKE_DRIVERS] = {0,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;   
  •     }  
  •       
  •     GetSensorInitFuncList(&m_pstSensorInitFunc);//----(1)获取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);  
  •     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);  
  •   
  •     // search main/main_2/sub 3 sockets  
  •    #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;  
  •         //  
  •         for (i = 0; i < MAX_NUM_OF_SUPPORT_SENSOR; i++) {  
  •             //end of driver list  
  •             if (m_pstSensorInitFunc.getCameraDefault == NULL) {  
  •                 LOG_MSG("m_pstSensorInitFunc.getCameraDefault is NULL: %d \n", i);                  
  •                 break;  
  •             }  
  •                 //set sensor driver  
  •             id[KDIMGSENSOR_INVOKE_DRIVER_0] = (SensorEnum << KDIMGSENSOR_DUAL_SHIFT) | 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] );//--(2)调用kernel层的kdSetDriver函数  
  •                 if (err < 0) {  
  •                     LOG_ERR("ERROR:KDCAMERAHWIOC_X_SET_DRIVER\n");  
  •                 }  
  •   
  •             
  •   
  •                 //err = open();  
  •                 err = ioctl(m_fdSensor, KDIMGSENSORIOC_T_CHECK_IS_ALIVE);//---(3)上下电camera并读取sensor的ID,如果匹配则成功  
  •                   
  •   
  •                   
  •                 if (err < 0) {  
  •                     LOG_MSG("[impSearchSensor] Err-ctrlCode (%s) \n", strerror(errno));//  
  •                 }  
  •             //  
  •             sensorType = this->getCurrentSensorType((SENSOR_DEV_ENUM)SensorEnum);  
  •             //  
  •             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 {  
  •                     if (SensorEnum == DUAL_CAMERA_MAIN_SENSOR) {  
  •                 //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.pSensorInfo;  
  •                 if  ( m_pMainSensorInfo )  
  •                 {  
  •                     NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc.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) {  
  •                 //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.pSensorInfo;  
  •                 if  ( m_pSubSensorInfo )  
  •                 {  
  •                     NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc.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_MSG("SENSOR search end: 0x%x /[0x%x][%d]/[0x%x][%d]\n", sensorDevs,  
  •     m_mainSensorId,m_mainSensorIdx,m_subSensorId,m_subSensorIdx);  
  •   
  •     return sensorDevs;  
  • }//  ! [0 d) n4 [/ t

(1)、获取hal层sensor列表GetSensorInitFuncList(&m_pstSensorInitFunc);

===>mediatek/custom/common/hal/imgsensor/src/sensorlist.cpp

# l9 q6 i6 S8 z* a8 d3 |: |
  • UINT32 GetSensorInitFuncList(MSDK_SENSOR_INIT_FUNCTION_STRUCT **ppSensorList)  
  • {  
  •     if (NULL == ppSensorList) {  
  •         ALOGE("ERROR: NULL pSensorList\n");  
  •         return MHAL_UNKNOWN_ERROR;  
  •     }  
  •     *ppSensorList = &SensorList[0];//这里直接调用hal层的sensor列表  
  •     return MHAL_NO_ERROR;  
  • } // GetSensorInitFuncList()  
    ; d4 b( x+ k) Z

" }7 ~7 ^  M+ V% t6 [" Q3 O$ v===>mediatek/custom/common/hal/imgsensor/src/sensorlist.cpp
7 m& Q2 |1 h; X6 B! _
1 u, f  V. T: J6 G
8 C! j. x* m" J9 F6 J
  • MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =  
  • {  
  •     //add by zym  
  • #if defined(GC2235_MIPI_RAW)  
  •     RAW_INFO(GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, NULL),   
  • #endif  
  • // add by zhouzuoyu  
  • #if defined(GC2235_KOTECH_MIPI_RAW)  
  •     RAW_INFO(GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, NULL),   
  • #endif  
  • #if defined(OV16825_MIPI_RAW)  
  •     RAW_INFO(OV16825MIPI_SENSOR_ID, SENSOR_DRVNAME_OV16825_MIPI_RAW,NULL),   
  • #endif  
  • #if defined(IMX135_MIPI_RAW)  
  •         RAW_INFO(IMX135_SENSOR_ID, SENSOR_DRVNAME_IMX135_MIPI_RAW,NULL),   
  • #endif  
  • #if defined(OV8830_RAW)  
  •     RAW_INFO(OV8830_SENSOR_ID, SENSOR_DRVNAME_OV8830_RAW, NULL),  
  • #endif  
  •   
  • /*  ADD sensor driver before this line */  
  •     {0,{0},NULL, NULL, NULL}//end of list  
  • };   7 W3 {) w6 |* v/ ?* o) P, l7 j
    ! a2 s+ q6 r* m! M: W
! L# z# m. k& ]
% \8 V1 w5 K/ r* ?
/ F$ I8 o7 k& b" r% q

(2)、获取kernel层的kdSetDriver函数err = ioctl(m_fdSensor, KDIMGSENSORIOC_X_SET_DRIVER,&id[KDIMGSENSOR_INVOKE_DRIVER_0] );

===>mediatek/custom/mt6582/kernel/imgsensor/src/kd_sensorlist.c


+ c8 Y2 C2 U. V+ P: T3 e: m1 c# @+ n6 G) I7 ?; F
  • /*******************************************************************************
  • * kdSetDriver
  • ********************************************************************************/  
  • int kdSetDriver(unsigned int* pDrvIndex)  
  • {  
  •     ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT *pSensorList = NULL;  
  •     u32 drvIdx[KDIMGSENSOR_MAX_INVOKE_DRIVERS] = {0,0};  
  •     u32 i;  
  •   
  •     PK_XLOG_INFO("pDrvIndex:0x%08x/0x%08x \n",pDrvIndex[KDIMGSENSOR_INVOKE_DRIVER_0],pDrvIndex[KDIMGSENSOR_INVOKE_DRIVER_1]);  
  •     //set driver for MAIN or SUB sensor  
  •   
  •     if (0 != kdGetSensorInitFuncList(&pSensorList))//----(2.1)获取kernel层的sensor列表  
  •     {  
  •         PK_ERR("ERROR:kdGetSensorInitFuncList()\n");  
  •         return -EIO;  
  •     }  
  •   
  •     for ( i = KDIMGSENSOR_INVOKE_DRIVER_0; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
  •         //  
  •         spin_lock(&kdsensor_drv_lock);  
  •         g_bEnableDriver = FALSE;  
  •         g_invokeSocketIdx = (CAMERA_DUAL_CAMERA_SENSOR_ENUM)((pDrvIndex & KDIMGSENSOR_DUAL_MASK_MSB)>>KDIMGSENSOR_DUAL_SHIFT);  
  •     spin_unlock(&kdsensor_drv_lock);  
  •   
  •         drvIdx = (pDrvIndex & KDIMGSENSOR_DUAL_MASK_LSB);//----(2.2)g_invokeSocketIdx,drvIdx解释  
  •         //  
  •         if ( DUAL_CAMERA_NONE_SENSOR == g_invokeSocketIdx ) { continue; }  
  •   
  •   
  •         //ToDo: remove print information  
  •         PK_XLOG_INFO("[kdSetDriver] i,g_invokeSocketIdx[%d] = %d :\n",i,i,drvIdx);  
  •         PK_XLOG_INFO("[kdSetDriver] i,drvIdx[%d] = %d :\n",i,i,drvIdx);  
  •         //  
  •         if ( MAX_NUM_OF_SUPPORT_SENSOR > drvIdx ) {  
  •             if (NULL == pSensorList[drvIdx].SensorInit) {  
  •                 PK_ERR("ERROR:kdSetDriver()\n");  
  •                 return -EIO;  
  •             }  
  •   
  •             pSensorList[drvIdx].SensorInit(&g_pInvokeSensorFunc);//----(2.3)获取指定sensor的fun函数,例如ov5670的func  
  •             if (NULL == g_pInvokeSensorFunc) {  
  •                 PK_ERR("ERROR:NULL g_pSensorFunc[%d]\n",i);  
  •             return -EIO;  
  •             }  
  •             //  
  •             spin_lock(&kdsensor_drv_lock);  
  •             g_bEnableDriver = TRUE;  
  •             spin_unlock(&kdsensor_drv_lock);  
  •             //get sensor name  
  •             memcpy((char*)g_invokeSensorNameStr,(char*)pSensorList[drvIdx].drvname,sizeof(pSensorList[drvIdx].drvname));  
  •             //return sensor ID  
  •             //pDrvIndex[0] = (unsigned int)pSensorList[drvIdx].SensorId;  
  •             PK_XLOG_INFO("[kdSetDriver] :[%d][%d][%d][%s][%d]\n",i,g_bEnableDriver,g_invokeSocketIdx,g_invokeSensorNameStr,sizeof(pSensorList[drvIdx].drvname));  
  •         }  
  •     }  
  •     return 0;  
  • }  
    2 c- X7 r$ b, w
    ! q7 r& b; o' k6 q+ S1 j

7 P& X6 ~4 R& P6 H. ?
! w2 I5 n, @- o3 |, ~

# d0 B% ?+ K" n! g/ E

(2.1)获取kernel层的sensor列表kdGetSensorInitFuncList(&pSensorList)

===>mediatek/custom/mt6582/kernel/imgsensor/src/kd_sensorlist.c  ?) ]5 A3 k+ m  N; z+ S


8 r% R' @; e, d7 _. G
( `4 ^! p8 o$ Z  Q& c
  • /*******************************************************************************
  • * general camera image sensor kernel driver
  • *******************************************************************************/  
  • UINT32 kdGetSensorInitFuncList(ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT **ppSensorList)  
  • {  
  •     if (NULL == ppSensorList)  
  •     {  
  •         PK_DBG("[kdGetSensorInitFuncList]ERROR: NULL ppSensorList\n");  
  •         return 1;  
  •     }  
  •     *ppSensorList = &kdSensorList[0];  
  •     return 0;  
  • } // kdGetSensorInitFuncList()  
    7 p# Z4 F) Q% t8 @2 p/ c& K
      p7 m3 ]6 \* K  d6 ]* U/ `0 F9 G
% ]) N6 L% f8 v5 @2 C/ F7 k
===>mediatek/custom/mt6582/kernel/imgsensor/src/kd_sensorlist.h9 p* Z$ K/ p: ]; h/ b

       hal层和kernel层的sensor列表顺序必须保持一致


' `' |- B% D# w2 E) N1 c4 A% e; X' B4 L
" b! l5 b/ F# t! z
$ N2 k" c( }& m" }) L4 l: L9 r
  • ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] =  
  • {  
  • //add by zym  
  • #if defined(GC2235_MIPI_RAW)  
  •     {GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, GC2235MIPISensorInit},   
  • #endif  
  •   
  • // add by zhouzuoyu  
  • #if defined(GC2235_KOTECH_MIPI_RAW)  
  •     {GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, GC2235MIPISensorInit},   
  • #endif  
  •   
  • #if defined(OV16825_MIPI_RAW)  
  •         {OV16825MIPI_SENSOR_ID, SENSOR_DRVNAME_OV16825_MIPI_RAW, OV16825MIPISensorInit},   
  • #endif  
  • #if defined(IMX135_MIPI_RAW)  
  •         {IMX135_SENSOR_ID, SENSOR_DRVNAME_IMX135_MIPI_RAW, IMX135_MIPI_RAW_SensorInit},   
  • #endif  
  • #if defined(OV8830_RAW)  
  •     {OV8830_SENSOR_ID, SENSOR_DRVNAME_OV8830_RAW, OV8830SensorInit},   
  • #endif  
  • /*  ADD sensor driver before this line */  
  •     {0,{0},NULL}, //end of list  
  • };  
  • //e_add new sensor driver here<span style="font-size:18px;"><span style="font-size:18px;">         </span>   </span>   <span style="font-size:18px;"><span style="font-size:18px;">  
  • </span></span>  4 v% Q/ I# h0 P  c6 O

    - }5 Q/ \4 G, Z  o% b
: l8 y; Z1 F: M& a
5 {! Q7 q% h1 ^3 H0 T


% a5 C1 m0 n% ]* a( K

(2.2)g_invokeSocketIdx,drvIdx解释

      上层传下来的 id 参数解析成两部分 g_invokeSocketIdx 区分目前正在匹配的是 main 还是sub,drvIdx 是 sensor 列表的序列号 。


' L5 V, ]! B4 Z: \( B2 @7 h

(2.3)获取指定sensor的func函数,例如ov5670的func,pSensorList[drvIdx].SensorInit(&g_pInvokeSensorFunc);

         调用的函数是OV5670_MIPI_RAW_SensorInit()。

  T! y4 f. v$ m( D3 T, }; l7 m
  • #if defined(OV5670_MIPI_RAW)  
  •     {OV5670_SENSOR_ID, SENSOR_DRVNAME_OV5670_MIPI_RAW, OV5670_MIPI_RAW_SensorInit},   
  • #endif  6 p6 J* O2 s" |4 F8 h

$ z2 x0 y" n- P) J* c" A/ G- F' {            9 t- z; Z3 c* g
1 G& M* o; w* k2 t# `  \) m8 L; ~

===>mediatek/custom/common/kernel/imgsensor/ov5670_mipi_raw/ov5670mipiraw_Sensor.c

. Y9 g( s$ {- i

: p; f* j% ~2 r8 r' ?  Z! D* U. M; Z
  • SENSOR_FUNCTION_STRUCT  SensorFuncOV5670=  
  • {  
  •     OV5670Open,  
  •     OV5670GetInfo,  
  •     OV5670GetResolution,  
  •     OV5670FeatureControl,  
  •     OV5670Control,  
  •     OV5670Close  
  • };  
  •   
  • UINT32 OV5670_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc)//---调用此函数  
  • {  
  •     if (pfFunc!=NULL)  
  •         *pfFunc=&SensorFuncOV5670;  
  •   
  •     return ERROR_NONE;  
  • }  ! ^- U0 f$ M* r( J. M
3 M; d0 y+ X8 d" r; P

   5670的sensorinit实现,主要是未了pfFunc这个函数指针的结构体指针赋值,这样我们就实现了驱动代码的分离,hal层只需要调用sensorlist.c这样一个虚拟设备的驱动,就可以和具体的Sensor Driver驱动通信。这样的做法与platform driver的设计思想差不多,在tp,lcm等驱动中也有体现。

' C; ~# J& e" V% C

(3)上下电camera并读取ID,err = ioctl(m_fdSensor, KDIMGSENSORIOC_T_CHECK_IS_ALIVE);

===>mediatek/custom/mt6582/kernel/imgsensor/src/kd_sensorlist.c

( O- q( i5 `5 ~

1 A- p9 S; }0 E2 M' y3 j2 c
  • /*******************************************************************************
  • * adopt_CAMERA_HW_CheckIsAlive
  • ********************************************************************************/  
  • inline static int adopt_CAMERA_HW_CheckIsAlive(void)  
  • {  
  •     UINT32 err = 0;  
  •     UINT32 err1 = 0;  
  •     UINT32 i = 0;  
  •     MUINT32 sensorID = 0;  
  •     MUINT32 retLen = 0;  
  •   
  •   
  •     KD_IMGSENSOR_PROFILE_INIT();  
  •     //power on sensor  
  •     kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr,true, CAMERA_HW_DRVNAME1);//----(3.1)sensor上电  
  •     //wait for power stable  
  •     mDELAY(10);  
  •     KD_IMGSENSOR_PROFILE("kdModulePowerOn");  
  •   
  •     if (g_pSensorFunc) {  
  •         for ( i = KDIMGSENSOR_INVOKE_DRIVER_0 ; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
  •             if(DUAL_CAMERA_NONE_SENSOR != g_invokeSocketIdx){  
  •                 err = g_pSensorFunc->SensorFeatureControl(g_invokeSocketIdx, SENSOR_FEATURE_CHECK_SENSOR_ID, (MUINT8*)&sensorID, &retLen);//---(3.2)获取sensor ID  
  •                 if (sensorID == 0) {    //not implement this feature ID  
  •                     PK_DBG(" Not implement!!, use old open function to check\n");  
  •                     err = ERROR_SENSOR_CONNECT_FAIL;  
  •                 }  
  •                 else if (sensorID == 0xFFFFFFFF) {    //fail to open the sensor  
  •                     PK_DBG(" No Sensor Found");  
  •                     err = ERROR_SENSOR_CONNECT_FAIL;  
  •                 }  
  •                 else {  
  •   
  •                     PK_DBG(" Sensor found ID = 0x%x\n", sensorID);  
  •                     err = ERROR_NONE;  
  •                 }  
  •                 if(ERROR_NONE != err)  
  •                 {  
  •                     PK_DBG("ERROR:adopt_CAMERA_HW_CheckIsAlive(), No imgsensor alive \n");  
  •                 }  
  •             }  
  •         }  
  •     }  
  •     else {  
  •         PK_DBG("ERROR:NULL g_pSensorFunc\n");  
  •     }  
  •   
  •     //reset sensor state after power off  
  •     err1 = g_pSensorFunc->SensorClose();  
  •     if(ERROR_NONE != err1) {  
  •         PK_DBG("SensorClose \n");  
  •     }  
  •     //  
  •     kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr, false, CAMERA_HW_DRVNAME1);      
  •     //  
  •     KD_IMGSENSOR_PROFILE("CheckIsAlive");  
  •   
  •     return err?-EIO:err;  
  • }   /* adopt_CAMERA_HW_Open() */  $ Z6 |; M; d& _, \" e  h( |! A! C0 L

3 r* Y+ ~1 G1 U) o, s+ h' H
0 K3 t& T5 _! E' `(3.1)Sensor 上电, kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr,true, CAMERA_HW_DRVNAME1);  U/ A- ?, l0 z6 L+ l+ o
- F" h5 E  F0 o9 I

4 L( o) H; X# q9 M8 s7 {9 v6 q
  • /*******************************************************************************
  • * kdModulePowerOn
  • ********************************************************************************/  
  • int  
  • kdModulePowerOn(  
  • CAMERA_DUAL_CAMERA_SENSOR_ENUM socketIdx[KDIMGSENSOR_MAX_INVOKE_DRIVERS],  
  • char sensorNameStr[KDIMGSENSOR_MAX_INVOKE_DRIVERS][32],  
  • BOOL On,  
  • char* mode_name )  
  • {  
  • MINT32 ret = ERROR_NONE;  
  • u32 i = 0;  
  •   
  •     for ( i = KDIMGSENSOR_INVOKE_DRIVER_0 ; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
  •         if ( g_bEnableDriver ) {  
  •             //PK_XLOG_INFO("[%s][%d][%d][%s][%s]\r\n",__FUNCTION__,g_bEnableDriver,socketIdx,sensorNameStr,mode_name);  
  •             ret = kdCISModulePowerOn(socketIdx,sensorNameStr,On,mode_name);//实际上电的func  
  •             if ( ERROR_NONE != ret ) {  
  •                 PK_ERR("[%s]",__FUNCTION__);  
  •                 return ret;  
  •             }  
  •         }  
  •     }  
  •     return ERROR_NONE;  
  • }  / O* L' C6 h9 }3 F1 f# k' {% B
0 u1 ~! R8 X( p% I& L7 a, L% H$ V9 ]7 i
3 T7 J9 S9 R; C& v
===>mediatek/custom/huaqin82_slwt_2s_td/kernel/camera/camera/kd_camera_hw.c5 J0 F+ T, m( u4 ^
9 }6 w% ?9 O! M5 y7 }% N$ U' }- h3 A
* m0 k& _! f) v5 S- a
  • int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, BOOL On, char* mode_name)  
  • {  
  •     PK_DBG("[camera] **kdCISModulePowerOn:SensorIdx:%d,pinSetIdx:%d",SensorIdx,pinSetIdx);  
  •     //dump_stack();  
  •     if (DUAL_CAMERA_MAIN_SENSOR == SensorIdx){  
  •     if (currSensorName &&   
  •        ((0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
  •        ||(0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName))  
  •        ||(0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName))  
  •           ||(0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName))  
  •       ||(0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName))  
  •        ||(0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName))  
  •         || (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))  
  •         || (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))  
  •        ||(0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))  
  •               ||(0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV, currSensorName))  
  •         || (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV, currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW, currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName))  
  •         //|| to add other main camera here  
  •        ))  
  •             pinSetIdx = 0;  
  •     else  
  •     {  
  •         PK_DBG("[ryf-main]kdCISModulePowerOn get in---  sensorIdx not compare with sensor name: %s\n", currSensorName);  
  •         //if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName)))  
  •         //{  
  •         //      pinSetIdx = 1;  
  •         //}  
  •         //else{  
  •             goto _kdCISModulePowerOn_exit_;  
  •         //}  
  •     }  
  •     }  
  •     else if (DUAL_CAMERA_SUB_SENSOR == SensorIdx) {  
  •     if (currSensorName &&   
  •         ((0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName))  
  •         || (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName))  
  •         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW, currSensorName))  
  •           || (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName))  
  •           || (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName))     
  •          || (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName))   
  •           || (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName))   
  •         || (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
  •         || (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_GC0312_YUV, currSensorName))  
  •         ||(0 == strcmp(SENSOR_DRVNAME_HI704_YUV, currSensorName))  
  •               //||(0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV, currSensorName))  
  •         //|| to add other sub camera here  
  •        ))  
  •             pinSetIdx = 1;  
  •     else  
  •     {  
  •         //if (currSensorName &&  
  •            //((0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
  •             //|| to add other main camera here  
  •            //))  
  •         //{  
  •         //  pinSetIdx = 0;  
  •         //}  
  •         PK_DBG("{ryf-sub}kdCISModulePowerOn get in---  sensorIdx not compare with sensro:%s\n",currSensorName);  
  •         goto _kdCISModulePowerOn_exit_;  
  •     }  
  •     }  
  •     else if (DUAL_CAMERA_MAIN_2_SENSOR == SensorIdx) {  
  •        // pinSetIdx = 2;  
  •     }  
  •   
  •     PK_DBG("kdCISModulePowerOn:SensorIdx:%d,pinSetIdx:%d",SensorIdx,pinSetIdx);  
  •     Rst_PDN_Init();  
  •   
  •     //power ON  
  •     if (On)   
  •     {  
  •      PK_DBG("kdCISModulePowerOn -on:currSensorName=%s\n",currSensorName);  
  •         if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))) {  
  •             PK_DBG("is ov5648mipi on\n");  
  •             if (0 == pinSetIdx) {  
  •                 if (TRUE != kd_ov5648_main_poweron(mode_name))  
  •                     goto _kdCISModulePowerOn_exit_;  
  •             } else if (1 == pinSetIdx) {  
  •                 if (TRUE != kd_ov5648_sub_poweron(mode_name))  
  •                     goto _kdCISModulePowerOn_exit_;  
  •             }  
  •         }   
  •     else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName)))            
  •         {  
  •         PK_DBG("is s5k4e1ga on \n");  
  •             if(TRUE != kd_s5k4e1gamipi_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }   
  •     else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName)))            
  •         {  
  •         PK_DBG("is hi544 on \n");  
  •             if(TRUE != kd_hi544raw_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }   
  •        else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName)))            
  •         {  
  •          PK_DBG("is gc2235 on\n");  
  •             if(TRUE != kd_gc2235mipiraw_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))) {  
  •             PK_DBG("is gc2235_raw on\n");  
  •               
  •             if (TRUE != kd_gc2235raw_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }   
  • /*  else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI253_YUV,currSensorName)))
  •         {
  •          PK_DBG("is hi253 on\n");
  •             if(TRUE != kd_hi253yuv_poweron(mode_name))
  •                  goto _kdCISModulePowerOn_exit_;
  •         }*/  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName))) {   
  •         PK_DBG("is ov88251 on \n");   
  •         if(TRUE != kd_ov88251mipiraw_poweron(mode_name))      
  •                 goto _kdCISModulePowerOn_exit_;  
  •         }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName))) {   
  •         PK_DBG("is ov88252 on \n");   
  •         if(TRUE != kd_ov88252mipiraw_poweron(mode_name))      
  •                 goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))) {  
  •             PK_DBG("is ov8858 on \n");  
  •             kd_a5142mipiraw_sub_poweron(mode_name);  
  •             kd_a5142mipiraw_sub_powerdown(mode_name);  
  •             if(TRUE != kd_ov8858mipiraw_poweron(mode_name))   
  •                 goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW,currSensorName))) {  
  •             PK_DBG("is s5k4h5yx on \n");  
  •             kd_a5142mipiraw_sub_poweron(mode_name);  
  •             kd_a5142mipiraw_sub_powerdown(mode_name);  
  •             if (TRUE != kd_s5k4h5yxmipiraw_poweron(mode_name))   
  •                 goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))) {  
  •             PK_DBG("is t4k35 on \n");     
  •             if(TRUE != kd_t4k35mipiraw_poweron(mode_name))   
  •                 goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))   
  •         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName)))) {  
  •             if(pinSetIdx==0)  
  •             {  
  •                 if(TRUE != kd_s5k3h7ymipiraw_poweron(mode_name))  
  •                     goto _kdCISModulePowerOn_exit_;  
  •             }  
  •             else  
  •             {  
  •                 if(TRUE != kd_s5k3h72ymipiraw_poweron(mode_name))  
  •                     goto _kdCISModulePowerOn_exit_;  
  •             }  
  •         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName))) {  
  •          PK_DBG("is gc2035 on\n");  
  •             if(TRUE != kd_gc2035_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }   
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName)))  
  •         {  
  •             if(TRUE != kd_ov5648a_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName)))  
  •         {  
  •             if(TRUE != kd_ov5670_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName)))  
  •         {  
  •             if(TRUE != kd_hi551_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName)))  
  •         {  
  •             if(TRUE != kd_ov5648b_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))) //lili add  
  •         {  
  •             if(TRUE != kd_ov5648_main_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName))) {  
  •          PK_DBG("is s5k3h72ymipi on\n");  
  •             if(TRUE != kd_s5k3h72ymipiraw_poweron(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName)))              
  •                 {  
  •                    PK_DBG("is gc0329 on\n");  
  •                        if(TRUE != kd_gc0329_poweron(mode_name))  
  •                                 goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))) {  
  •             if (0 == pinSetIdx) {  
  •                 PK_DBG("is A5142 main on \n");  
  •                 if(TRUE != kd_a5142mipiraw_main_poweron(mode_name))  
  •                     goto _kdCISModulePowerOn_exit_;  
  •             } else {  
  •                 PK_DBG("is A5142 sub on \n");  
  •                 if(TRUE != kd_a5142mipiraw_sub_poweron(mode_name))  
  •                     goto _kdCISModulePowerOn_exit_;  
  •             }  
  •               
  •            }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0312_YUV,currSensorName)))            
  •                 {  
  •                    PK_DBG("is gc0312 on\n");   
  •                        if(TRUE != kd_gc0312_poweron(mode_name))  
  •                                 goto _kdCISModulePowerOn_exit_;  
  •            }   
  •            else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI704_YUV,currSensorName)))              
  •                 {  
  •                    PK_DBG("is hi704 on\n");   
  •                        if(TRUE != kd_hi704yuv_poweron(mode_name))  
  •                                 goto _kdCISModulePowerOn_exit_;  
  •            }   
  •                else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV,currSensorName)))            
  •                 {  
  •                    PK_DBG("is gc0310 on\n");  
  •                        if(TRUE != kd_gc0310_poweron(mode_name))  
  •                                 goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV,currSensorName))) {  
  •             PK_DBG("is gc2145 on\n");  
  •   
  •             if (TRUE != kd_gc2145_poweron(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName)))  
  •         {     
  •             PK_DBG("is hi258 on \n");   
  •             if(TRUE != kd_hi258mipiraw_poweron(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •         }  
  •          else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName))) {  
  •             PK_DBG("is ov2680 on \n");   
  •             if(TRUE != kd_ov2680mipiraw_poweron(mode_name))   
  •                 goto _kdCISModulePowerOn_exit_;  
  •         }  
  •     else   
  •     {  
  •         PK_DBG("kdCISModulePowerOn get in---  other , please add the power on code!!!!!!\n");  
  •         goto _kdCISModulePowerOn_exit_;  
  •         }  
  •   }  
  •   else {//power OFF  
  •   
  •     PK_DBG("kdCISModulePowerOn -off:currSensorName=%s\n",currSensorName);  
  •   
  •   
  •      if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName)))           
  •         {  
  •             PK_DBG("is ov5648_mipi_raw down\n");  
  •             if (0 == pinSetIdx) {  
  •                 if(TRUE != kd_ov5648_main_powerdown(mode_name))  
  •                     goto _kdCISModulePowerOn_exit_;  
  •             } else if (1 == pinSetIdx) {  
  •                 if(TRUE != kd_ov5648_sub_powerdown(mode_name))  
  •                     goto _kdCISModulePowerOn_exit_;  
  •             }  
  •         } else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName)))              
  •         {  
  •          PK_DBG("is s5k4e1ga down\n");  
  •             if(TRUE != kd_s5k4e1gamipi_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName)))           
  •         {  
  •          PK_DBG("is hi544 down\n");  
  •             if(TRUE != kd_hi544raw_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName)))  
  •         {  
  •             PK_DBG("is ov88251 down\n");  
  •              if(TRUE != kd_ov88251mipiraw_powerdown(mode_name))  
  •               goto _kdCISModulePowerOn_exit_;     
  •          
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName)))  
  •         {  
  •             PK_DBG("is ov5670 down\n");  
  •              if(TRUE != kd_ov5670mipiraw_powerdown(mode_name))  
  •               goto _kdCISModulePowerOn_exit_;     
  •          
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName)))  
  •         {  
  •             PK_DBG("is hi551 down\n");  
  •              if(TRUE != kd_hi551mipiraw_powerdown(mode_name))  
  •               goto _kdCISModulePowerOn_exit_;     
  •          
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName)))  
  •         {  
  •             PK_DBG("is ov88252 down\n");  
  •              if(TRUE != kd_ov88252mipiraw_powerdown(mode_name))  
  •               goto _kdCISModulePowerOn_exit_;            
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))) {  
  •             PK_DBG("is ov8858 down\n");  
  •             if(TRUE != kd_ov8858mipiraw_powerdown(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW, currSensorName))) {  
  •             PK_DBG("is s5k4h5yx down\n");  
  •             if (TRUE != kd_s5k4h5yxmipiraw_powerdown(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))) {  
  •             PK_DBG("is t4k35 down\n");  
  •             if(TRUE != kd_t4k35mipiraw_powerdown(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •         }  
  •     else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName)))              
  •         {  
  •          PK_DBG("is gc2235 down\n");  
  •             if(TRUE != kd_gc2235mipiraw_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))) {  
  •             PK_DBG("is gc2235 down\n");  
  •               
  •             if (TRUE != kd_gc2235raw_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  • /*  else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI253_YUV,currSensorName)))
  •         {
  •          PK_DBG("is hi253 down\n");
  •             if(TRUE != kd_hi253yuv_powerdown(mode_name))
  •                  goto _kdCISModulePowerOn_exit_;
  •         }*/   
  •         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))) {  
  •             if (0 == pinSetIdx) {  
  •                 PK_DBG("is A5142 main down \n");  
  •                 if (TRUE != kd_a5142mipiraw_main_powerdown(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •             } else {  
  •                 PK_DBG("is A5142 sub down \n");  
  •                 if (TRUE != kd_a5142mipiraw_sub_powerdown(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •             }  
  •         } else if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))   
  •         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName))))      
  •         {  
  •                     PK_DBG("is s5k3h7 down\n");  
  •                 if(pinSetIdx==0)  
  •                         {  
  •                  if(TRUE != kd_s5k3h7ymipiraw_powerdown(mode_name))  
  •                   goto _kdCISModulePowerOn_exit_;  
  •                 }  
  •                 else {  
  •                 if(TRUE != kd_s5k3h72ymipiraw_powerdown(mode_name))  
  •                           goto _kdCISModulePowerOn_exit_;  
  •                 }  
  •   
  •         }  
  •           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName)))              
  •         {  
  •          PK_DBG("is gc2035 down\n");  
  •             if(TRUE != kd_gc2035_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName)))            
  •         {  
  •          PK_DBG("is s5k3h72y_mipi_raw down\n");  
  •             if(TRUE != kd_s5k3h72ymipiraw_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName)))  
  •         {  
  •             if(TRUE != kd_ov5648a_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName)))  
  •         {  
  •             if(TRUE != kd_ov5648b_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))) //lili add  
  •         {  
  •             if(TRUE != kd_ov5648_main_powerdown(mode_name))  
  •                  goto _kdCISModulePowerOn_exit_;  
  •         }  
  •       else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName)))              
  •        {  
  •                 PK_DBG("is gc0329 down\n");  
  •                     if(TRUE != kd_gc0329yuv_powerdown(mode_name))  
  •                             goto _kdCISModulePowerOn_exit_;  
  •         }   
  •        else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0312_YUV,currSensorName)))            
  •        {  
  •                 PK_DBG("is gc0312 down\n");  
  •                     if(TRUE != kd_gc0312_powerdown(mode_name))  
  •                             goto _kdCISModulePowerOn_exit_;  
  •         }   
  •           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI704_YUV,currSensorName)))           
  •        {  
  •                 PK_DBG("is hi704 down\n");  
  •                     if(TRUE != kd_hi704yuv_powerdown(mode_name))  
  •                             goto _kdCISModulePowerOn_exit_;  
  •         }  
  •           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV,currSensorName)))            
  •        {  
  •                 PK_DBG("is gc0310 down\n");  
  •                     if(TRUE != kd_gc0310_powerdown(mode_name))  
  •                             goto _kdCISModulePowerOn_exit_;  
  •         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV,currSensorName))) {  
  •             PK_DBG("is gc2145 down\n");  
  •   
  •             if (TRUE != kd_gc2145_powerdown(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •         }   
  •         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName)))  
  •         {  
  •             PK_DBG("is hi258 down\n");  
  •             if(TRUE != kd_hi258mipiraw_powerdown(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •     }  
  •         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName)))  
  •          {  
  •             PK_DBG("is ov2680 down\n");  
  •             if(TRUE != kd_ov2680mipiraw_powerdown(mode_name))  
  •                 goto _kdCISModulePowerOn_exit_;  
  •     }   
  •     else   
  •     {  
  •         PK_DBG("kdCISModulePowerDown get in---  other , please add the power down code!!!!!!\n");  
  •         goto _kdCISModulePowerOn_exit_;  
  •         }  
  •   
  •   }  
  •     return 0;  
  •   
  • _kdCISModulePowerOn_exit_:  
  •     return -EIO;  
  • }  
  • EXPORT_SYMBOL(kdCISModulePowerOn);  
    0 w- P9 o3 `  B: s. o$ N7 D
: Q7 }; R: D* ^( C" [$ c3 R/ _
- Y: S* d4 d, g- a

4 N* h0 G; f  W- F! D7 L

以ov5670为例,其上电code如下:

6 {$ x* s7 C# [1 S9 ?4 S
  • static int kd_ov5670_poweron( char *mode_name)  
  • {  
  •     int ret;  
  •         printk("kd_ov5670_poweron1 start..\n");  
  •   
  •         ret = kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1200, VOL_2800, mode_name,0);//给camera上三路电  
  •      PK_DBG("kd_ov88251mipiraw_poweron start..\n");  
  •         mdelay(10);// wait power to be stable   
  •         //disable_inactive_sensor();//disable inactive sensor  
  •         if(mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");}  
  •         mdelay(10);  
  •         if(mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_ON])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");}  
  •         mdelay(1);  
  •       
  •     if(mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_ON])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}  
  •     if(mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}  
  •     mdelay(10);  
  •     if(mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_ON])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}  
  •     mdelay(5);  
  • poweronerr:  
  •     return ret;  
  • }  
      Q" _  {  D% c* ~1 y. H9 K, k# }

9 C$ u$ u8 Y* W6 r4 g. y. e
* J: D# ?+ v/ X1 F& ~2 i% D(3.2)获取sensor ID,err = g_pSensorFunc->SensorFeatureControl(g_invokeSocketIdx, SENSOR_FEATURE_CHECK_SENSOR_ID, (MUINT8*)&sensorID, &retLen);+ `; V2 z/ _4 m

    此函数调用具体sensor的func,例如ov5670,则调用的

# y9 r. p0 U# K% Y
  • OV5670FeatureControl  
    # V% b( d! N- [3 r
; C6 y, f0 M! k1 z
===>mediatek/custom/common/kernel/imgsensor/ov5670_mipi_raw
/ h. h4 F* k4 W! O5 @  k! i! ?( S3 ?- B* ]7 V0 _9 z& f

0 G, y) ~2 ~, i9 J9 a
  • UINT32 OV5670FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId,  
  •                                                                 UINT8 *pFeaturePara,UINT32 *pFeatureParaLen)  
  • {  
  •     UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara;  
  •     UINT16 *pFeatureData16=(UINT16 *) pFeaturePara;  
  •     UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara;  
  •     UINT32 *pFeatureData32=(UINT32 *) pFeaturePara;  
  •     UINT32 SensorRegNumber;  
  •     UINT32 i;  
  •     PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara;  
  •     MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara;  
  •     MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara;  
  •     MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara;  
  •     MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara;  
  •     MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara;  
  •   
  •     switch (FeatureId)  
  •     {  
  •         case SENSOR_FEATURE_GET_RESOLUTION:  
  •             *pFeatureReturnPara16++= OV5670_IMAGE_SENSOR_FULL_WIDTH;  
  •             *pFeatureReturnPara16= OV5670_IMAGE_SENSOR_FULL_HEIGHT;  
  •             *pFeatureParaLen=4;  
  •             break;  
  •         case SENSOR_FEATURE_GET_PERIOD:  
  •                                 *pFeatureReturnPara16++= OV5670_FeatureControl_PERIOD_PixelNum;  
  •                                 *pFeatureReturnPara16= OV5670_FeatureControl_PERIOD_LineNum;  
  •                                 *pFeatureParaLen=4;  
  •                                 break;  
  •         case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ:  
  •                         switch(OV5670CurrentScenarioId)  
  •                         {  
  •                                 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:  
  •                                         *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK;  
  •                                         *pFeatureParaLen=4;  
  •                                         break;  
  •                                 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:  
  •                                         *pFeatureReturnPara32 = OV5670_VIDEO_PCLK;  
  •                                         *pFeatureParaLen=4;  
  •                                         break;  
  •                                 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:  
  •                                 case MSDK_SCENARIO_ID_CAMERA_ZSD:  
  •                                         *pFeatureReturnPara32 = OV5670_CAPTURE_PCLK;  
  •                                         *pFeatureParaLen=4;  
  •                                         break;  
  •                                 default:  
  •                                         *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK;  
  •                                         *pFeatureParaLen=4;  
  •                                         break;  
  •                         }  
  •                     break;  
  •   
  •         case SENSOR_FEATURE_SET_ESHUTTER:  
  •             OV5670_SetShutter(*pFeatureData16);  
  •             break;  
  •         case SENSOR_FEATURE_SET_NIGHTMODE:  
  •             OV5670_NightMode((BOOL) *pFeatureData16);  
  •             break;  
  •         case SENSOR_FEATURE_SET_GAIN:  
  •            OV5670_SetGain((UINT16) *pFeatureData16);  
  •             break;  
  •         case SENSOR_FEATURE_SET_FLASHLIGHT:  
  •             break;  
  •         case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ:  
  •             //OV5670_isp_master_clock=*pFeatureData32;  
  •             break;  
  •         case SENSOR_FEATURE_SET_REGISTER:  
  •             OV5670_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData);  
  •             break;  
  •         case SENSOR_FEATURE_GET_REGISTER:  
  •             pSensorRegData->RegData = OV5670_read_cmos_sensor(pSensorRegData->RegAddr);  
  •             break;  
  •         case SENSOR_FEATURE_SET_CCT_REGISTER:  
  •             SensorRegNumber=FACTORY_END_ADDR;  
  •             for (i=0;i<SensorRegNumber;i++)  
  •             {  
  •                 spin_lock(&ov5670mipiraw_drv_lock);  
  •                 OV5670SensorCCT.Addr=*pFeatureData32++;  
  •                 OV5670SensorCCT.Para=*pFeatureData32++;  
  •                                 spin_unlock(&ov5670mipiraw_drv_lock);  
  •             }  
  •             break;  
  •         case SENSOR_FEATURE_GET_CCT_REGISTER:  
  •             SensorRegNumber=FACTORY_END_ADDR;  
  •             if (*pFeatureParaLen<(SensorRegNumber*sizeof(SENSOR_REG_STRUCT)+4))  
  •                 return FALSE;  
  •             *pFeatureData32++=SensorRegNumber;  
  •             for (i=0;i<SensorRegNumber;i++)  
  •             {  
  •                 *pFeatureData32++=OV5670SensorCCT.Addr;  
  •                 *pFeatureData32++=OV5670SensorCCT.Para;  
  •             }  
  •             break;  
  •         case SENSOR_FEATURE_SET_ENG_REGISTER:  
  •             SensorRegNumber=ENGINEER_END;  
  •             for (i=0;i<SensorRegNumber;i++)  
  •             {  
  •                 spin_lock(&ov5670mipiraw_drv_lock);  
  •                 OV5670SensorReg.Addr=*pFeatureData32++;  
  •                 OV5670SensorReg.Para=*pFeatureData32++;  
  •                                 spin_unlock(&ov5670mipiraw_drv_lock);  
  •             }  
  •             break;  
  •         case SENSOR_FEATURE_GET_ENG_REGISTER:  
  •             SensorRegNumber=ENGINEER_END;  
  •             if (*pFeatureParaLen<(SensorRegNumber*sizeof(SENSOR_REG_STRUCT)+4))  
  •                 return FALSE;  
  •             *pFeatureData32++=SensorRegNumber;  
  •             for (i=0;i<SensorRegNumber;i++)  
  •             {  
  •                 *pFeatureData32++=OV5670SensorReg.Addr;  
  •                 *pFeatureData32++=OV5670SensorReg.Para;  
  •             }  
  •             break;  
  •         case SENSOR_FEATURE_GET_REGISTER_DEFAULT:  
  •             if (*pFeatureParaLen>=sizeof(NVRAM_SENSOR_DATA_STRUCT))  
  •             {  
  •                 pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION;  
  •                 pSensorDefaultData->SensorId=OV5670_SENSOR_ID;  
  •                 memcpy(pSensorDefaultData->SensorEngReg, OV5670SensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END);  
  •                 memcpy(pSensorDefaultData->SensorCCTReg, OV5670SensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR);  
  •             }  
  •             else  
  •                 return FALSE;  
  •             *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT);  
  •             break;  
  •         case SENSOR_FEATURE_GET_CONFIG_PARA:  
  •             memcpy(pSensorConfigData, &OV5670SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT));  
  •             *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT);  
  •             break;  
  •         case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR:  
  •             OV5670_camera_para_to_sensor();  
  •             break;  
  •   
  •         case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA:  
  •             OV5670_sensor_to_camera_para();  
  •             break;  
  •         case SENSOR_FEATURE_GET_GROUP_COUNT:  
  •             *pFeatureReturnPara32++=OV5670_get_sensor_group_count();  
  •             *pFeatureParaLen=4;  
  •             break;  
  •         case SENSOR_FEATURE_GET_GROUP_INFO:  
  •             OV5670_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount);  
  •             *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT);  
  •             break;  
  •         case SENSOR_FEATURE_GET_ITEM_INFO:  
  •             OV5670_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo);  
  •             *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT);  
  •             break;  
  •   
  •         case SENSOR_FEATURE_SET_ITEM_INFO:  
  •             OV5670_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue);  
  •             *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT);  
  •             break;  
  •   
  •         case SENSOR_FEATURE_GET_ENG_INFO:  
  •             pSensorEngInfo->SensorId = 129;  
  •             pSensorEngInfo->SensorType = CMOS_SENSOR;  
  •             pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_Gb;  
  •             *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT);  
  •             break;  
  •         case SENSOR_FEATURE_GET_LENS_DRIVER_ID:  
  •             // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE  
  •             // if EEPROM does not exist in camera module.  
  •             *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE;  
  •             *pFeatureParaLen=4;  
  •             break;  
  •   
  •         case SENSOR_FEATURE_INITIALIZE_AF:  
  •             break;  
  •         case SENSOR_FEATURE_CONSTANT_AF:  
  •             break;  
  •         case SENSOR_FEATURE_MOVE_FOCUS_LENS:  
  •             break;  
  •         case SENSOR_FEATURE_SET_VIDEO_MODE:  
  •             OV5670SetVideoMode(*pFeatureData16);  
  •             break;  
  •         case SENSOR_FEATURE_CHECK_SENSOR_ID://-------------调用此处读取ID  
  •             OV5670GetSensorID(pFeatureReturnPara32);  
  •             break;  
  •         case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE:  
  •             OV5670SetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1));  
  •                 break;  
  •                 case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO:  
  •                         OV5670MIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1));  
  •                         break;  
  •                 case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO:  
  •                         OV5670MIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1)));  
  •                         break;  
  •                 case SENSOR_FEATURE_SET_TEST_PATTERN:  
  •                         OV5670SetTestPatternMode((BOOL)*pFeatureData16);  
  •                         break;  
  •                 case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE://for factory mode auto testing  
  •                         *pFeatureReturnPara32=OV5670_TEST_PATTERN_CHECKSUM;  
  •                         *pFeatureParaLen=4;  
  •                      break;  
  •         default:  
  •             break;  
  •     }  
  •     return ERROR_NONE;  
  • }  
    6 d; {+ b4 s, x0 N+ Z  `6 y& f

! i% r" L" M  W- F8 x+ X' v; S! r& k
  \5 I. k( @& _# G, @9 Z+ R
2 V, g5 e' @2 m
  • UINT32 OV5670GetSensorID(UINT32 *sensorID)  
  • {  
  •     int  retry = 2;  
  •   
  •         OV5670DB("OV5670GetSensorID enter :\n ");  
  •     mdelay(5);  
  •   
  •     do {  
  •         *sensorID = (OV5670_read_cmos_sensor(0x300B)<<8)|OV5670_read_cmos_sensor(0x300C);  
  •         if (*sensorID == OV5670_SENSOR_ID)  
  •                 {  
  •                         OV5670DB("Sensor ID = 0x%04x\n", *sensorID);  
  •                 break;  
  •                 }  
  •         OV5670DB("Read Sensor ID Fail = 0x%04x\n", *sensorID);  
  •         retry--;  
  •     } while (retry > 0);  
  •   
  •     if (*sensorID != OV5670_SENSOR_ID) {  
  •                 OV5670DB("Read Sensor ID Fail = 0x%04x\n", *sensorID);  
  •   
  •                 /*
  •         *sensorID = OV5670_SENSOR_ID;
  •         return ERROR_SENSOR_CONNECT_FAIL;
  •         */  
  •          *sensorID = 0xFFFFFFFF;  
  •      return ERROR_SENSOR_CONNECT_FAIL;  
  •     }  
  •     return ERROR_NONE;  
  • }  
    : T4 N- t' Z# k# j+ n

2 d+ k2 S9 S- r# P$ T

/ F. f% Y1 [0 e, \/ Q$ @/ H

以上是ov5670获取ID的函数。. K3 l. D2 u+ B/ H4 F6 R

1 t8 q3 E* q0 T$ a  h( L0 T: K# H5 ?0 j

4 I8 Q2 t, p( h" t+ |
3 k. Y1 Q2 T7 g% ^2 [三、开机打开sensor总结           9 r% O. m; i1 v; S0 {
  • HAL层运行Search sensor这个线程
  • HAL层遍历sensorlist列表并挂载HAL层性能3A等一些参数获取的接口
  • HAL层下达setDriver的cmd,并下传正在遍历的sensorlist列表中的ID
  • Driver层根据这个ID,挂载Driver层sensorlist中对应的Sensorlist中对应的Sensor和具体Sensor底层操作接口
  • HAL层对正确遍历的sensor下达check ID的指令
  • Driver层为对应sensor上电,通过I2C读取预存在寄存器中的sensor id
  • 比较读取结果,不匹配,return error,继续遍历
  • 匹配,HAL层下达其他指令收集sensor信息
  • sensor下电
    + i+ R( F. x! h! G2 p! i
    + C) G! F: G7 |5 h

% |. J6 {# z+ @, z" @+ b* U9 F+ w, h' x7 j, Q" ~

7 Y  A, P0 l2 l8 T, W( c) i6 }
发表于 2015-8-22 08:12:22 | 显示全部楼层
好东西 给力很多 启发性的好东西!!!
高级模式
B Color Image Link Quote Code Smilies @朋友 |上传

本版积分规则

在线客服

客服电话

欢迎来电咨询

188-9985 8350

微信关注

手机APP程序:
扫码下载访问

微信公众平台:
摄像头之家公众号

微信小程序:
摄像头小程序

返回顶部

QQ|站点统计|小黑屋|手机版|Archiver|摄像头模组论坛网-摄像头方案网CCM99 ( 粤ICP备18155214号 )

Powered by Discuz! X3.4 Licensed© 2001-2013 Comsenz Inc.