zoukankan      html  css  js  c++  java
  • MTK Camera 开机启动流程(转载)

    一、MTK平台Camera框架

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

         这里主要介绍kernel部分和HAL层部分。

        1、Kernel 部分主要有两块:

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

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

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

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

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

              2.3、feature io,包含各种3A等性能配置。

                      

    二、Camera打开流程分析

             Camera开启流程图如下:

            主要发生在两个时间点:

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

        2、打开Camera应用时:camera会有上电,完成sensor的寄存器初始化配置,向上层传递基本参数和配置信息,以及preview和capture模式循环。

          

    1、开机初始化过程

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

    [plain] view plaincopy
     
    1. 12-24 10:02:07.601   148   148 D MtkCam/module: [instantiate_camera_module]  
    2. 12-24 10:02:07.601   148   148 D MtkCam/Utils/Property: [clear] pid/tid=148/148  
    3. 12-24 10:02:07.601   148   148 I CameraService: Loaded "MediaTek Camera Module" camera module  
    4. 12-24 10:02:07.601   148   148 D MtkCam/MtkCamUtils: [CamDevMetaInfoMap::clear] pid/tid=148/148  
    5. 12-24 10:02:07.601   148   148 D SensorHal: [getInstance][SensorHalImp] getInstance  
    6. 12-24 10:02:07.601   148   148 D SensorHal: [createImp][createImp]: 0  
    7. 12-24 10:02:07.601   148   148 D SeninfDrvImp: [getInstance][getInstance]  
    8. 12-24 10:02:07.601   148   148 D SeninfDrvImp: [SeninfDrvImp][SeninfDrvImp]  
    9. 12-24 10:02:07.601   148   148 D SeninfDrvImp: [init][init]: 0  

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

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

    [cpp] view plaincopy
     
    1. /****************************************************************************** 
    2.  * 
    3.  ******************************************************************************/  
    4. int32_t  
    5. CamDeviceManagerImp::  
    6. enumDeviceLocked()  
    7. {  
    8.     Utils::CamProfile _profile(__FUNCTION__, "CamDeviceManagerImp");  
    9.     //  
    10.     status_t status = OK;  
    11.     int32_t i4DeviceNum = 0;  
    12.     //  
    13.     mEnumMap.clear();  
    14. //------------------------------------------------------------------------------  
    15. #if '1'==MTKCAM_HAVE_SENSOR_HAL  
    16.   
    17.     mEnumMap.clear();  
    18.     DevMetaInfo::clear();  
    19.     //  
    20.     int32_t isFakeOrientation = 0;  
    21.     int32_t i4DevSetupOrientation = 0;  
    22.     camera_info camInfo;  
    23.     camInfo.device_version = CAMERA_DEVICE_API_VERSION_1_0;  
    24.     camInfo.static_camera_characteristics = NULL;  
    25.     //  
    26.     SensorHal* pSensorHal = SensorHal::createInstance();//创建sensor对象  
    27.     if  ( ! pSensorHal )  
    28.     {  
    29.         MY_LOGE("pSensorHal == NULL");  
    30.         return 0;  
    31.     }  
    32.     //  
    33.     int32_t const iSensorsList = pSensorHal->searchSensor();//此函数是入口,主要查找匹配的硬件sensor  
    34.     //  
    35.     //  
    36.     if  ( (iSensorsList & SENSOR_DEV_MAIN_3D) == SENSOR_DEV_MAIN_3D )  
    37.     {  
    38.         MY_LOGI("Stereo 3D Camera found");  
    39. #warning "[TODO] Stereo 3D Camera"  
    40.     }  
    41.     //  
    42.     if  ( (iSensorsList & SENSOR_DEV_MAIN) == SENSOR_DEV_MAIN )  
    43.     {  
    44.         int32_t const deviceId = i4DeviceNum;  
    45.         //  
    46.         halSensorDev_e const eHalSensorDev = SENSOR_DEV_MAIN;  
    47.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_FAKE_ORIENTATION, (int)&isFakeOrientation);  
    48.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_ORIENTATION_ANGLE, (int)&i4DevSetupOrientation);  
    49.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_FACING_DIRECTION, (int)&camInfo.facing);  
    50.         camInfo.orientation = i4DevSetupOrientation;  
    51.         if  ( isFakeOrientation )  
    52.         {  
    53.             camInfo.orientation = (0==camInfo.facing) ? 90 : 270;  
    54.             MY_LOGW("Fake orientation:%d instead of %d, facing=%d HalSensorDev=%#x", camInfo.orientation, i4DevSetupOrientation, camInfo.facing, eHalSensorDev);  
    55.         }  
    56.         DevMetaInfo::add(deviceId, camInfo, i4DevSetupOrientation, eDevId_ImgSensor, eHalSensorDev);  
    57.         //  
    58.         sp<EnumInfo> pInfo = new EnumInfo;  
    59.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    60.         pInfo->pMetadata            = NULL;  
    61.         pInfo->iFacing              = camInfo.facing;  
    62.         pInfo->iWantedOrientation   = camInfo.orientation;  
    63.         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
    64.         mEnumMap.add(deviceId, pInfo);  
    65.         //  
    66.         i4DeviceNum++;  
    67.     }  
    68.     //  
    69.     if  ( (iSensorsList & SENSOR_DEV_SUB) == SENSOR_DEV_SUB )  
    70.     {  
    71.         int32_t const deviceId = i4DeviceNum;  
    72.         //  
    73.         halSensorDev_e const eHalSensorDev = SENSOR_DEV_SUB;  
    74.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_FAKE_ORIENTATION, (int)&isFakeOrientation);  
    75.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_ORIENTATION_ANGLE, (int)&i4DevSetupOrientation);  
    76.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_FACING_DIRECTION, (int)&camInfo.facing);  
    77.         camInfo.orientation = i4DevSetupOrientation;  
    78.         if  ( isFakeOrientation )  
    79.         {  
    80.             camInfo.orientation = (0==camInfo.facing) ? 90 : 270;  
    81.             MY_LOGW("Fake orientation:%d instead of %d, facing=%d HalSensorDev=%#x", camInfo.orientation, i4DevSetupOrientation, camInfo.facing, eHalSensorDev);  
    82.         }  
    83.         DevMetaInfo::add(deviceId, camInfo, i4DevSetupOrientation, eDevId_ImgSensor, eHalSensorDev);  
    84.         //  
    85.         sp<EnumInfo> pInfo = new EnumInfo;  
    86.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    87.         pInfo->pMetadata            = NULL;  
    88.         pInfo->iFacing              = camInfo.facing;  
    89.         pInfo->iWantedOrientation   = camInfo.orientation;  
    90.         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
    91.         mEnumMap.add(deviceId, pInfo);  
    92.         //  
    93.         i4DeviceNum++;  
    94.     }  
    95.     //  
    96. //    if  ( (iSensorsList & SENSOR_DEV_ATV) == SENSOR_DEV_ATV )  
    97.     {  
    98.         int32_t const deviceId = 0xFF;  
    99.         //  
    100.         halSensorDev_e const eHalSensorDev = SENSOR_DEV_ATV;  
    101.         camInfo.facing = 0;  
    102.         camInfo.orientation = 0;  
    103.         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_AtvSensor, eHalSensorDev);  
    104.         //  
    105.         sp<EnumInfo> pInfo = new EnumInfo;  
    106.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    107.         pInfo->pMetadata            = NULL;  
    108.         pInfo->iFacing              = camInfo.facing;  
    109.         pInfo->iWantedOrientation   = camInfo.orientation;  
    110.         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
    111.         mEnumMap.add(deviceId, pInfo);  
    112.         //  
    113. //        i4DeviceNum++;  
    114.     }  
    115.     //  
    116.     //  
    117.     if  ( pSensorHal )  
    118.     {  
    119.         pSensorHal->destroyInstance();  
    120.         pSensorHal = NULL;  
    121.     }  
    122.     //  
    123.     MY_LOGI("iSensorsList=0x%08X, i4DeviceNum=%d", iSensorsList, i4DeviceNum);  
    124.     for (size_t i = 0; i < mEnumMap.size(); i++)  
    125.     {  
    126.         int32_t const deviceId = mEnumMap.keyAt(i);  
    127.         sp<EnumInfo> pInfo = mEnumMap.valueAt(i);  
    128.         uint32_t const uDeviceVersion   = pInfo->uDeviceVersion;  
    129.         camera_metadata const*pMetadata = pInfo->pMetadata;  
    130.         int32_t const iFacing           = pInfo->iFacing;  
    131.         int32_t const iWantedOrientation= pInfo->iWantedOrientation;  
    132.         int32_t const iSetupOrientation = pInfo->iSetupOrientation;  
    133.         MY_LOGI(  
    134.             "[0x%02x] orientation(wanted/setup)=(%d/%d) facing:%d metadata:%p DeviceVersion:0x%x",   
    135.             deviceId, iWantedOrientation, iSetupOrientation,   
    136.             iFacing, pMetadata, uDeviceVersion  
    137.         );  
    138.     }  
    139.   
    140. #else   //----------------------------------------------------------------------  
    141.   
    142.     #warning "[WARN] Simulation for CamDeviceManagerImp::enumDeviceLocked()"  
    143.   
    144.     mEnumMap.clear();  
    145.     DevMetaInfo::clear();  
    146.     {  
    147.         int32_t const deviceId = 0;  
    148.         //  
    149.         camera_info camInfo;  
    150.         camInfo.device_version  = CAMERA_DEVICE_API_VERSION_1_0;  
    151.         camInfo.static_camera_characteristics = NULL;  
    152.         camInfo.facing      = 0;  
    153.         camInfo.orientation = 90;  
    154.         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_ImgSensor, 0x01/*SENSOR_DEV_MAIN*/);  
    155.         //  
    156.         sp<EnumInfo> pInfo = new EnumInfo;  
    157.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    158.         pInfo->pMetadata            = NULL;  
    159.         pInfo->iFacing              = 0;  
    160.         pInfo->iWantedOrientation   = 90;  
    161.         pInfo->iSetupOrientation    = 90;  
    162.         mEnumMap.add(deviceId, pInfo);  
    163.     }  
    164.     //  
    165.     {  
    166.         int32_t const deviceId = 0xFF;  
    167.         //  
    168.         camera_info camInfo;  
    169.         camInfo.device_version  = CAMERA_DEVICE_API_VERSION_1_0;  
    170.         camInfo.static_camera_characteristics = NULL;  
    171.         camInfo.facing      = 0;  
    172.         camInfo.orientation = 0;  
    173.         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_AtvSensor, 0x04/*SENSOR_DEV_ATV*/);  
    174.         //  
    175.         sp<EnumInfo> pInfo = new EnumInfo;  
    176.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    177.         pInfo->pMetadata            = NULL;  
    178.         pInfo->iFacing              = 0;  
    179.         pInfo->iWantedOrientation   = 0;  
    180.         pInfo->iSetupOrientation    = 0;  
    181.         mEnumMap.add(deviceId, pInfo);  
    182.     }  
    183.     //  
    184.     i4DeviceNum = 1;  
    185.   
    186. #endif  
    187. //------------------------------------------------------------------------------  
    188.     //  
    189.     _profile.print("");  
    190.     return  i4DeviceNum;  
    191. }  

           

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

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

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. ********************************************************************************/  
    3.   
    4. MINT32   
    5. ImgSensorDrv::impSearchSensor(pfExIdChk pExIdChkCbf)  
    6. {  
    7.     MUINT32 SensorEnum = (MUINT32) DUAL_CAMERA_MAIN_SENSOR;  
    8.     MUINT32 i,id[KDIMGSENSOR_MAX_INVOKE_DRIVERS] = {0,0};  
    9.     MBOOL SensorConnect=TRUE;  
    10.     UCHAR cBuf[64];  
    11.     MINT32 err = SENSOR_NO_ERROR;  
    12.     MINT32 err2 = SENSOR_NO_ERROR;  
    13.     ACDK_SENSOR_INFO_STRUCT SensorInfo;  
    14.     ACDK_SENSOR_CONFIG_STRUCT SensorConfigData;  
    15.     ACDK_SENSOR_RESOLUTION_INFO_STRUCT SensorResolution;  
    16.     MINT32 sensorDevs = SENSOR_NONE;  
    17.     IMAGE_SENSOR_TYPE sensorType = IMAGE_SENSOR_TYPE_UNKNOWN;  
    18.     IMGSENSOR_SOCKET_POSITION_ENUM socketPos = IMGSENSOR_SOCKET_POS_NONE;  
    19.   
    20.   
    21.     //! If imp sensor search process already done before,   
    22.     //! only need to return the sensorDevs, not need to   
    23.     //! search again.   
    24.     if (SENSOR_DOES_NOT_EXIST != m_mainSensorId) {  
    25.         //been processed.  
    26.         LOG_MSG("[impSearchSensor] Already processed  ");   
    27.         if (BAD_SENSOR_INDEX != m_mainSensorIdx) {  
    28.             sensorDevs |= SENSOR_MAIN;  
    29.         }  
    30.   
    31.         if (BAD_SENSOR_INDEX != m_subSensorIdx) {  
    32.             sensorDevs |= SENSOR_SUB;  
    33.         }  
    34.   
    35.         #ifdef  ATVCHIP_MTK_ENABLE  
    36.   
    37.             sensorDevs |= SENSOR_ATV;  
    38.   
    39.         #endif  
    40.   
    41.   
    42.         return sensorDevs;   
    43.     }  
    44.       
    45.     GetSensorInitFuncList(&m_pstSensorInitFunc);//----(1)获取hal层的sensor列表  
    46.   
    47.     LOG_MSG("SENSOR search start  ");  
    48.   
    49.     if (-1 != m_fdSensor) {  
    50.         ::close(m_fdSensor);  
    51.         m_fdSensor = -1;  
    52.     }  
    53.     sprintf(cBuf,"/dev/%s",CAMERA_HW_DEVNAME);  
    54.     m_fdSensor = ::open(cBuf, O_RDWR);  
    55.     if (m_fdSensor < 0) {  
    56.          LOG_ERR("[impSearchSensor]: error opening %s: %s  ", cBuf, strerror(errno));   
    57.         return sensorDevs;  
    58.     }  
    59.     LOG_MSG("[impSearchSensor] m_fdSensor = %d   ", m_fdSensor);  
    60.   
    61.     // search main/main_2/sub 3 sockets  
    62.    #ifdef MTK_SUB_IMGSENSOR   
    63.     for (SensorEnum = DUAL_CAMERA_MAIN_SENSOR; SensorEnum <= DUAL_CAMERA_SUB_SENSOR; SensorEnum <<= 1)  {  
    64.         LOG_MSG("impSearchSensor search to sub ");  
    65.    #else  
    66.     for (SensorEnum = DUAL_CAMERA_MAIN_SENSOR; SensorEnum < DUAL_CAMERA_SUB_SENSOR; SensorEnum <<= 1)  {  
    67.         LOG_MSG("impSearchSensor search to main ");     
    68.    #endif       
    69.         //skip atv case  
    70.         if ( 0x04 == SensorEnum ) continue;  
    71.         //  
    72.         for (i = 0; i < MAX_NUM_OF_SUPPORT_SENSOR; i++) {  
    73.             //end of driver list  
    74.             if (m_pstSensorInitFunc[i].getCameraDefault == NULL) {  
    75.                 LOG_MSG("m_pstSensorInitFunc[i].getCameraDefault is NULL: %d  ", i);                  
    76.                 break;  
    77.             }  
    78.                 //set sensor driver  
    79.             id[KDIMGSENSOR_INVOKE_DRIVER_0] = (SensorEnum << KDIMGSENSOR_DUAL_SHIFT) | i;  
    80.             LOG_MSG("set sensor driver id =%x ", id[KDIMGSENSOR_INVOKE_DRIVER_0]);   
    81.             err = ioctl(m_fdSensor, KDIMGSENSORIOC_X_SET_DRIVER,&id[KDIMGSENSOR_INVOKE_DRIVER_0] );//--(2)调用kernel层的kdSetDriver函数  
    82.                 if (err < 0) {  
    83.                     LOG_ERR("ERROR:KDCAMERAHWIOC_X_SET_DRIVER ");  
    84.                 }  
    85.   
    86.              
    87.   
    88.                 //err = open();  
    89.                 err = ioctl(m_fdSensor, KDIMGSENSORIOC_T_CHECK_IS_ALIVE);//---(3)上下电camera并读取sensor的ID,如果匹配则成功  
    90.                   
    91.   
    92.                   
    93.                 if (err < 0) {  
    94.                     LOG_MSG("[impSearchSensor] Err-ctrlCode (%s)  ", strerror(errno));//  
    95.                 }  
    96.             //  
    97.             sensorType = this->getCurrentSensorType((SENSOR_DEV_ENUM)SensorEnum);  
    98.             //  
    99.             socketPos = this->getSocketPosition((CAMERA_DUAL_CAMERA_SENSOR_ENUM)SensorEnum);  
    100.                 //check extra ID , from EEPROM maybe  
    101.                 //may need to keep power here  
    102.                 if (NULL != pExIdChkCbf) {  
    103.                     err2 = pExIdChkCbf();  
    104.                     if (err2 < 0) {  
    105.                         LOG_ERR("Error:pExIdChkCbf()  ");  
    106.                     }  
    107.                 }  
    108.   
    109.                 //power off sensor  
    110.                 close();  
    111.   
    112.                 if (err < 0 || err2 < 0) {  
    113.                     LOG_MSG("sensor ID mismatch ");  
    114.                 }  
    115.                 else {  
    116.                     if (SensorEnum == DUAL_CAMERA_MAIN_SENSOR) {  
    117.                 //m_mainSensorIdx = i;  
    118.                 //m_mainSensorId = m_pstSensorInitFunc[m_mainSensorIdx].SensorId;  
    119.                 m_mainSensorDrv.index[m_mainSensorDrv.number] = i;  
    120.                 m_mainSensorDrv.type[m_mainSensorDrv.number] = sensorType;  
    121.                 if ( IMAGE_SENSOR_TYPE_RAW == sensorType && BAD_SENSOR_INDEX == m_mainSensorDrv.firstRawIndex ) {  
    122.                     m_mainSensorDrv.firstRawIndex = i;  
    123.                 }  
    124.                 else if ( IMAGE_SENSOR_TYPE_YUV == sensorType && BAD_SENSOR_INDEX == m_mainSensorDrv.firstYuvIndex ) {  
    125.                     m_mainSensorDrv.firstYuvIndex = i;  
    126.                 }  
    127.                 m_mainSensorDrv.position = socketPos;  
    128.                 m_mainSensorDrv.sensorID = m_pstSensorInitFunc[m_mainSensorDrv.index[m_mainSensorDrv.number]].SensorId;  
    129.                 // LOG_MSG("MAIN sensor m_mainSensorDrv.number=%d, m_mainSensorDrv.index=%d ",m_mainSensorDrv.number,m_mainSensorDrv.index[m_mainSensorDrv.number]);  
    130.                 m_mainSensorDrv.number++;  
    131.                 //  
    132.                 m_pMainSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;  
    133.                 if  ( m_pMainSensorInfo )  
    134.                 {  
    135.                     NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;  
    136.                     LOG_MSG("found <%#x/%s/%s>", pSensorInfo->GetID(), pSensorInfo->getDrvName(), pSensorInfo->getDrvMacroName());  
    137.                 }  
    138.                 else  
    139.                 {  
    140.                     LOG_WRN("m_pMainSensorInfo==NULL ");  
    141.                 }  
    142.                 LOG_MSG("MAIN sensor found:[%d]/[0x%x]/[%d]/[%d]  ",i,id[KDIMGSENSOR_INVOKE_DRIVER_0],sensorType,socketPos);  
    143.                 //break;  
    144.             }  
    145.             else if (SensorEnum == DUAL_CAMERA_SUB_SENSOR) {  
    146.                 //m_subSensorIdx = i;  
    147.                 //m_subSensorId = m_pstSensorInitFunc[m_subSensorIdx].SensorId;  
    148.                 m_subSensorDrv.index[m_subSensorDrv.number] = i;  
    149.                 m_subSensorDrv.type[m_subSensorDrv.number] = sensorType;  
    150.                 if ( IMAGE_SENSOR_TYPE_RAW == sensorType && BAD_SENSOR_INDEX == m_subSensorDrv.firstRawIndex ) {  
    151.                     m_subSensorDrv.firstRawIndex = i;  
    152.                 }  
    153.                 else if ( IMAGE_SENSOR_TYPE_YUV == sensorType && BAD_SENSOR_INDEX == m_subSensorDrv.firstYuvIndex ) {  
    154.                     m_subSensorDrv.firstYuvIndex = i;  
    155.                 }  
    156.                 m_subSensorDrv.position = socketPos;  
    157.                 m_subSensorDrv.sensorID = m_pstSensorInitFunc[m_subSensorDrv.index[m_subSensorDrv.number]].SensorId;  
    158.                 //LOG_MSG("SUB sensor m_subSensorDrv.number=%d, m_subSensorDrv.index=%d ",m_subSensorDrv.number,m_subSensorDrv.index[m_subSensorDrv.number]);  
    159.                 m_subSensorDrv.number++;  
    160.                 //  
    161.                 m_pSubSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;  
    162.                 if  ( m_pSubSensorInfo )  
    163.                 {  
    164.                     NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;  
    165.                     LOG_MSG("found <%#x/%s/%s>", pSensorInfo->GetID(), pSensorInfo->getDrvName(), pSensorInfo->getDrvMacroName());  
    166.                 }  
    167.                 else  
    168.                 {  
    169.                     LOG_WRN("m_pSubSensorInfo==NULL ");  
    170.                 }  
    171.                 LOG_MSG("SUB sensor found:[%d]/[0x%x]/[%d]/[%d]  ",i,id[KDIMGSENSOR_INVOKE_DRIVER_0],sensorType,socketPos);  
    172.                 //break;  
    173.             }  
    174.         }//  
    175.           
    176.         }  
    177.     }  
    178.     //close system call may be off sensor power. check first!!!  
    179.     ::close(m_fdSensor);  
    180.     m_fdSensor = -1;  
    181.     //  
    182.     if (BAD_SENSOR_INDEX != m_mainSensorDrv.index[0]) {  
    183.         m_mainSensorId = m_mainSensorDrv.sensorID;  
    184.         //init to choose first  
    185.         m_mainSensorIdx = m_mainSensorDrv.index[0];  
    186.         sensorDevs |= SENSOR_MAIN;  
    187.     }  
    188.   
    189.     if (BAD_SENSOR_INDEX != m_subSensorDrv.index[0]) {  
    190.         m_subSensorId = m_subSensorDrv.sensorID;  
    191.         //init to choose first  
    192.         m_subSensorIdx = m_subSensorDrv.index[0];  
    193.         sensorDevs |= SENSOR_SUB;  
    194.     }  
    195.   
    196.     #ifdef  ATVCHIP_MTK_ENABLE  
    197.       
    198.         sensorDevs |= SENSOR_ATV;  
    199.       
    200.     #endif  
    201.   
    202.   
    203.     if (sensorDevs == SENSOR_NONE) {  
    204.         LOG_ERR( "Error No sensor found!!  ");  
    205.     }  
    206.     //  
    207.     LOG_MSG("SENSOR search end: 0x%x /[0x%x][%d]/[0x%x][%d] ", sensorDevs,  
    208.     m_mainSensorId,m_mainSensorIdx,m_subSensorId,m_subSensorIdx);  
    209.   
    210.     return sensorDevs;  
    211. }//  

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

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

    [cpp] view plaincopy
     
    1. UINT32 GetSensorInitFuncList(MSDK_SENSOR_INIT_FUNCTION_STRUCT **ppSensorList)  
    2. {  
    3.     if (NULL == ppSensorList) {  
    4.         ALOGE("ERROR: NULL pSensorList ");  
    5.         return MHAL_UNKNOWN_ERROR;  
    6.     }  
    7.     *ppSensorList = &SensorList[0];//这里直接调用hal层的sensor列表  
    8.     return MHAL_NO_ERROR;  
    9. // GetSensorInitFuncList()  

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

    [cpp] view plaincopy
     
    1. MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =  
    2. {  
    3.     //add by zym  
    4. #if defined(GC2235_MIPI_RAW)  
    5.     RAW_INFO(GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, NULL),   
    6. #endif  
    7. // add by zhouzuoyu  
    8. #if defined(GC2235_KOTECH_MIPI_RAW)  
    9.     RAW_INFO(GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, NULL),   
    10. #endif  
    11. #if defined(OV16825_MIPI_RAW)  
    12.     RAW_INFO(OV16825MIPI_SENSOR_ID, SENSOR_DRVNAME_OV16825_MIPI_RAW,NULL),   
    13. #endif  
    14. #if defined(IMX135_MIPI_RAW)  
    15.         RAW_INFO(IMX135_SENSOR_ID, SENSOR_DRVNAME_IMX135_MIPI_RAW,NULL),   
    16. #endif  
    17. #if defined(OV8830_RAW)  
    18.     RAW_INFO(OV8830_SENSOR_ID, SENSOR_DRVNAME_OV8830_RAW, NULL),  
    19. #endif  
    20.   
    21. /*  ADD sensor driver before this line */  
    22.     {0,{0},NULL, NULL, NULL}//end of list  
    23. };   

    (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

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. * kdSetDriver 
    3. ********************************************************************************/  
    4. int kdSetDriver(unsigned int* pDrvIndex)  
    5. {  
    6.     ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT *pSensorList = NULL;  
    7.     u32 drvIdx[KDIMGSENSOR_MAX_INVOKE_DRIVERS] = {0,0};  
    8.     u32 i;  
    9.   
    10.     PK_XLOG_INFO("pDrvIndex:0x%08x/0x%08x  ",pDrvIndex[KDIMGSENSOR_INVOKE_DRIVER_0],pDrvIndex[KDIMGSENSOR_INVOKE_DRIVER_1]);  
    11.     //set driver for MAIN or SUB sensor  
    12.   
    13.     if (0 != kdGetSensorInitFuncList(&pSensorList))//----(2.1)获取kernel层的sensor列表  
    14.     {  
    15.         PK_ERR("ERROR:kdGetSensorInitFuncList() ");  
    16.         return -EIO;  
    17.     }  
    18.   
    19.     for ( i = KDIMGSENSOR_INVOKE_DRIVER_0; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
    20.         //  
    21.         spin_lock(&kdsensor_drv_lock);  
    22.         g_bEnableDriver[i] = FALSE;  
    23.         g_invokeSocketIdx[i] = (CAMERA_DUAL_CAMERA_SENSOR_ENUM)((pDrvIndex[i] & KDIMGSENSOR_DUAL_MASK_MSB)>>KDIMGSENSOR_DUAL_SHIFT);  
    24.     spin_unlock(&kdsensor_drv_lock);  
    25.   
    26.         drvIdx[i] = (pDrvIndex[i] & KDIMGSENSOR_DUAL_MASK_LSB);//----(2.2)g_invokeSocketIdx,drvIdx解释  
    27.         //  
    28.         if ( DUAL_CAMERA_NONE_SENSOR == g_invokeSocketIdx[i] ) { continue; }  
    29.   
    30.   
    31.         //ToDo: remove print information  
    32.         PK_XLOG_INFO("[kdSetDriver] i,g_invokeSocketIdx[%d] = %d : ",i,i,drvIdx[i]);  
    33.         PK_XLOG_INFO("[kdSetDriver] i,drvIdx[%d] = %d : ",i,i,drvIdx[i]);  
    34.         //  
    35.         if ( MAX_NUM_OF_SUPPORT_SENSOR > drvIdx[i] ) {  
    36.             if (NULL == pSensorList[drvIdx[i]].SensorInit) {  
    37.                 PK_ERR("ERROR:kdSetDriver() ");  
    38.                 return -EIO;  
    39.             }  
    40.   
    41.             pSensorList[drvIdx[i]].SensorInit(&g_pInvokeSensorFunc[i]);//----(2.3)获取指定sensor的fun函数,例如ov5670的func  
    42.             if (NULL == g_pInvokeSensorFunc[i]) {  
    43.                 PK_ERR("ERROR:NULL g_pSensorFunc[%d] ",i);  
    44.             return -EIO;  
    45.             }  
    46.             //  
    47.             spin_lock(&kdsensor_drv_lock);  
    48.             g_bEnableDriver[i] = TRUE;  
    49.             spin_unlock(&kdsensor_drv_lock);  
    50.             //get sensor name  
    51.             memcpy((char*)g_invokeSensorNameStr[i],(char*)pSensorList[drvIdx[i]].drvname,sizeof(pSensorList[drvIdx[i]].drvname));  
    52.             //return sensor ID  
    53.             //pDrvIndex[0] = (unsigned int)pSensorList[drvIdx].SensorId;  
    54.             PK_XLOG_INFO("[kdSetDriver] :[%d][%d][%d][%s][%d] ",i,g_bEnableDriver[i],g_invokeSocketIdx[i],g_invokeSensorNameStr[i],sizeof(pSensorList[drvIdx[i]].drvname));  
    55.         }  
    56.     }  
    57.     return 0;  
    58. }  

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

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

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. * general camera image sensor kernel driver 
    3. *******************************************************************************/  
    4. UINT32 kdGetSensorInitFuncList(ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT **ppSensorList)  
    5. {  
    6.     if (NULL == ppSensorList)  
    7.     {  
    8.         PK_DBG("[kdGetSensorInitFuncList]ERROR: NULL ppSensorList ");  
    9.         return 1;  
    10.     }  
    11.     *ppSensorList = &kdSensorList[0];  
    12.     return 0;  
    13. // kdGetSensorInitFuncList()  

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

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

    [cpp] view plaincopy
     
    1. ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] =  
    2. {  
    3. //add by zym  
    4. #if defined(GC2235_MIPI_RAW)  
    5.     {GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, GC2235MIPISensorInit},   
    6. #endif  
    7.   
    8. // add by zhouzuoyu  
    9. #if defined(GC2235_KOTECH_MIPI_RAW)  
    10.     {GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, GC2235MIPISensorInit},   
    11. #endif  
    12.   
    13. #if defined(OV16825_MIPI_RAW)  
    14.         {OV16825MIPI_SENSOR_ID, SENSOR_DRVNAME_OV16825_MIPI_RAW, OV16825MIPISensorInit},   
    15. #endif  
    16. #if defined(IMX135_MIPI_RAW)  
    17.         {IMX135_SENSOR_ID, SENSOR_DRVNAME_IMX135_MIPI_RAW, IMX135_MIPI_RAW_SensorInit},   
    18. #endif  
    19. #if defined(OV8830_RAW)  
    20.     {OV8830_SENSOR_ID, SENSOR_DRVNAME_OV8830_RAW, OV8830SensorInit},   
    21. #endif  
    22. /*  ADD sensor driver before this line */  
    23.     {0,{0},NULL}, //end of list  
    24. };  
    25. //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;">  
    26. </span></span>  

    (2.2)g_invokeSocketIdx,drvIdx解释

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

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

             调用的函数是OV5670_MIPI_RAW_SensorInit()。

    [cpp] view plaincopy
     
    1. #if defined(OV5670_MIPI_RAW)  
    2.     {OV5670_SENSOR_ID, SENSOR_DRVNAME_OV5670_MIPI_RAW, OV5670_MIPI_RAW_SensorInit},   
    3. #endif  

                

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

    [cpp] view plaincopy
     
    1. SENSOR_FUNCTION_STRUCT  SensorFuncOV5670=  
    2. {  
    3.     OV5670Open,  
    4.     OV5670GetInfo,  
    5.     OV5670GetResolution,  
    6.     OV5670FeatureControl,  
    7.     OV5670Control,  
    8.     OV5670Close  
    9. };  
    10.   
    11. UINT32 OV5670_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc)//---调用此函数  
    12. {  
    13.     if (pfFunc!=NULL)  
    14.         *pfFunc=&SensorFuncOV5670;  
    15.   
    16.     return ERROR_NONE;  
    17. }  

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

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

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

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. * adopt_CAMERA_HW_CheckIsAlive 
    3. ********************************************************************************/  
    4. inline static int adopt_CAMERA_HW_CheckIsAlive(void)  
    5. {  
    6.     UINT32 err = 0;  
    7.     UINT32 err1 = 0;  
    8.     UINT32 i = 0;  
    9.     MUINT32 sensorID = 0;  
    10.     MUINT32 retLen = 0;  
    11.   
    12.   
    13.     KD_IMGSENSOR_PROFILE_INIT();  
    14.     //power on sensor  
    15.     kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr,true, CAMERA_HW_DRVNAME1);//----(3.1)sensor上电  
    16.     //wait for power stable  
    17.     mDELAY(10);  
    18.     KD_IMGSENSOR_PROFILE("kdModulePowerOn");  
    19.   
    20.     if (g_pSensorFunc) {  
    21.         for ( i = KDIMGSENSOR_INVOKE_DRIVER_0 ; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
    22.             if(DUAL_CAMERA_NONE_SENSOR != g_invokeSocketIdx[i]){  
    23.                 err = g_pSensorFunc->SensorFeatureControl(g_invokeSocketIdx[i], SENSOR_FEATURE_CHECK_SENSOR_ID, (MUINT8*)&sensorID, &retLen);//---(3.2)获取sensor ID  
    24.                 if (sensorID == 0) {    //not implement this feature ID  
    25.                     PK_DBG(" Not implement!!, use old open function to check ");  
    26.                     err = ERROR_SENSOR_CONNECT_FAIL;  
    27.                 }  
    28.                 else if (sensorID == 0xFFFFFFFF) {    //fail to open the sensor  
    29.                     PK_DBG(" No Sensor Found");  
    30.                     err = ERROR_SENSOR_CONNECT_FAIL;  
    31.                 }  
    32.                 else {  
    33.   
    34.                     PK_DBG(" Sensor found ID = 0x%x ", sensorID);  
    35.                     err = ERROR_NONE;  
    36.                 }  
    37.                 if(ERROR_NONE != err)  
    38.                 {  
    39.                     PK_DBG("ERROR:adopt_CAMERA_HW_CheckIsAlive(), No imgsensor alive  ");  
    40.                 }  
    41.             }  
    42.         }  
    43.     }  
    44.     else {  
    45.         PK_DBG("ERROR:NULL g_pSensorFunc ");  
    46.     }  
    47.   
    48.     //reset sensor state after power off  
    49.     err1 = g_pSensorFunc->SensorClose();  
    50.     if(ERROR_NONE != err1) {  
    51.         PK_DBG("SensorClose  ");  
    52.     }  
    53.     //  
    54.     kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr, false, CAMERA_HW_DRVNAME1);      
    55.     //  
    56.     KD_IMGSENSOR_PROFILE("CheckIsAlive");  
    57.   
    58.     return err?-EIO:err;  
    59. }   /* adopt_CAMERA_HW_Open() */  


    (3.1)Sensor 上电, kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr,true, CAMERA_HW_DRVNAME1);

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. * kdModulePowerOn 
    3. ********************************************************************************/  
    4. int  
    5. kdModulePowerOn(  
    6. CAMERA_DUAL_CAMERA_SENSOR_ENUM socketIdx[KDIMGSENSOR_MAX_INVOKE_DRIVERS],  
    7. char sensorNameStr[KDIMGSENSOR_MAX_INVOKE_DRIVERS][32],  
    8. BOOL On,  
    9. char* mode_name )  
    10. {  
    11. MINT32 ret = ERROR_NONE;  
    12. u32 i = 0;  
    13.   
    14.     for ( i = KDIMGSENSOR_INVOKE_DRIVER_0 ; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
    15.         if ( g_bEnableDriver[i] ) {  
    16.             //PK_XLOG_INFO("[%s][%d][%d][%s][%s] ",__FUNCTION__,g_bEnableDriver[i],socketIdx[i],sensorNameStr[i],mode_name);  
    17.             ret = kdCISModulePowerOn(socketIdx[i],sensorNameStr[i],On,mode_name);//实际上电的func  
    18.             if ( ERROR_NONE != ret ) {  
    19.                 PK_ERR("[%s]",__FUNCTION__);  
    20.                 return ret;  
    21.             }  
    22.         }  
    23.     }  
    24.     return ERROR_NONE;  
    25. }  


    ===>mediatek/custom/huaqin82_slwt_2s_td/kernel/camera/camera/kd_camera_hw.c

    [cpp] view plaincopy
     
    1. int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, BOOL On, char* mode_name)  
    2. {  
    3.     PK_DBG("[camera] **kdCISModulePowerOn:SensorIdx:%d,pinSetIdx:%d",SensorIdx,pinSetIdx);  
    4.     //dump_stack();  
    5.     if (DUAL_CAMERA_MAIN_SENSOR == SensorIdx){  
    6.     if (currSensorName &&   
    7.        ((0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
    8.        ||(0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName))  
    9.        ||(0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName))  
    10.           ||(0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))  
    11.         ||(0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName))  
    12.         ||(0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName))  
    13.       ||(0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName))  
    14.        ||(0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName))  
    15.         || (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))  
    16.         || (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))  
    17.        ||(0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName))  
    18.         ||(0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))  
    19.               ||(0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName))  
    20.         ||(0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))  
    21.         ||(0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV, currSensorName))  
    22.         || (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV, currSensorName))  
    23.         ||(0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW, currSensorName))  
    24.         ||(0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName))  
    25.         ||(0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName))  
    26.         //|| to add other main camera here  
    27.        ))  
    28.             pinSetIdx = 0;  
    29.     else  
    30.     {  
    31.         PK_DBG("[ryf-main]kdCISModulePowerOn get in---  sensorIdx not compare with sensor name: %s ", currSensorName);  
    32.         //if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName)))  
    33.         //{  
    34.         //      pinSetIdx = 1;  
    35.         //}  
    36.         //else{  
    37.             goto _kdCISModulePowerOn_exit_;  
    38.         //}  
    39.     }  
    40.     }  
    41.     else if (DUAL_CAMERA_SUB_SENSOR == SensorIdx) {  
    42.     if (currSensorName &&   
    43.         ((0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName))  
    44.         || (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName))  
    45.         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW, currSensorName))  
    46.           || (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName))  
    47.           || (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName))     
    48.          || (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName))   
    49.           || (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName))   
    50.         || (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
    51.         || (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))  
    52.         ||(0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))  
    53.         ||(0 == strcmp(SENSOR_DRVNAME_GC0312_YUV, currSensorName))  
    54.         ||(0 == strcmp(SENSOR_DRVNAME_HI704_YUV, currSensorName))  
    55.               //||(0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV, currSensorName))  
    56.         //|| to add other sub camera here  
    57.        ))  
    58.             pinSetIdx = 1;  
    59.     else  
    60.     {  
    61.         //if (currSensorName &&  
    62.            //((0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
    63.             //|| to add other main camera here  
    64.            //))  
    65.         //{  
    66.         //  pinSetIdx = 0;  
    67.         //}  
    68.         PK_DBG("{ryf-sub}kdCISModulePowerOn get in---  sensorIdx not compare with sensro:%s ",currSensorName);  
    69.         goto _kdCISModulePowerOn_exit_;  
    70.     }  
    71.     }  
    72.     else if (DUAL_CAMERA_MAIN_2_SENSOR == SensorIdx) {  
    73.        // pinSetIdx = 2;  
    74.     }  
    75.   
    76.     PK_DBG("kdCISModulePowerOn:SensorIdx:%d,pinSetIdx:%d",SensorIdx,pinSetIdx);  
    77.     Rst_PDN_Init();  
    78.   
    79.     //power ON  
    80.     if (On)   
    81.     {  
    82.      PK_DBG("kdCISModulePowerOn -on:currSensorName=%s ",currSensorName);  
    83.         if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))) {  
    84.             PK_DBG("is ov5648mipi on ");  
    85.             if (0 == pinSetIdx) {  
    86.                 if (TRUE != kd_ov5648_main_poweron(mode_name))  
    87.                     goto _kdCISModulePowerOn_exit_;  
    88.             } else if (1 == pinSetIdx) {  
    89.                 if (TRUE != kd_ov5648_sub_poweron(mode_name))  
    90.                     goto _kdCISModulePowerOn_exit_;  
    91.             }  
    92.         }   
    93.     else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName)))             
    94.         {  
    95.         PK_DBG("is s5k4e1ga on  ");  
    96.             if(TRUE != kd_s5k4e1gamipi_poweron(mode_name))  
    97.                  goto _kdCISModulePowerOn_exit_;  
    98.         }   
    99.     else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName)))            
    100.         {  
    101.         PK_DBG("is hi544 on  ");  
    102.             if(TRUE != kd_hi544raw_poweron(mode_name))  
    103.                  goto _kdCISModulePowerOn_exit_;  
    104.         }   
    105.        else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName)))            
    106.         {  
    107.          PK_DBG("is gc2235 on ");  
    108.             if(TRUE != kd_gc2235mipiraw_poweron(mode_name))  
    109.                  goto _kdCISModulePowerOn_exit_;  
    110.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))) {  
    111.             PK_DBG("is gc2235_raw on ");  
    112.               
    113.             if (TRUE != kd_gc2235raw_poweron(mode_name))  
    114.                  goto _kdCISModulePowerOn_exit_;  
    115.         }    
    116. /*  else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI253_YUV,currSensorName))) 
    117.         { 
    118.          PK_DBG("is hi253 on "); 
    119.             if(TRUE != kd_hi253yuv_poweron(mode_name)) 
    120.                  goto _kdCISModulePowerOn_exit_; 
    121.         }*/  
    122.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName))) {    
    123.         PK_DBG("is ov88251 on  ");   
    124.         if(TRUE != kd_ov88251mipiraw_poweron(mode_name))      
    125.                 goto _kdCISModulePowerOn_exit_;  
    126.         }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName))) {   
    127.         PK_DBG("is ov88252 on  ");   
    128.         if(TRUE != kd_ov88252mipiraw_poweron(mode_name))      
    129.                 goto _kdCISModulePowerOn_exit_;  
    130.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))) {  
    131.             PK_DBG("is ov8858 on  ");  
    132.             kd_a5142mipiraw_sub_poweron(mode_name);  
    133.             kd_a5142mipiraw_sub_powerdown(mode_name);  
    134.             if(TRUE != kd_ov8858mipiraw_poweron(mode_name))   
    135.                 goto _kdCISModulePowerOn_exit_;  
    136.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW,currSensorName))) {  
    137.             PK_DBG("is s5k4h5yx on  ");  
    138.             kd_a5142mipiraw_sub_poweron(mode_name);  
    139.             kd_a5142mipiraw_sub_powerdown(mode_name);  
    140.             if (TRUE != kd_s5k4h5yxmipiraw_poweron(mode_name))    
    141.                 goto _kdCISModulePowerOn_exit_;  
    142.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))) {  
    143.             PK_DBG("is t4k35 on  ");     
    144.             if(TRUE != kd_t4k35mipiraw_poweron(mode_name))    
    145.                 goto _kdCISModulePowerOn_exit_;  
    146.         } else if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))   
    147.         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName)))) {  
    148.             if(pinSetIdx==0)  
    149.             {  
    150.                 if(TRUE != kd_s5k3h7ymipiraw_poweron(mode_name))  
    151.                     goto _kdCISModulePowerOn_exit_;  
    152.             }  
    153.             else  
    154.             {  
    155.                 if(TRUE != kd_s5k3h72ymipiraw_poweron(mode_name))  
    156.                     goto _kdCISModulePowerOn_exit_;  
    157.             }  
    158.         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName))) {  
    159.          PK_DBG("is gc2035 on ");  
    160.             if(TRUE != kd_gc2035_poweron(mode_name))  
    161.                  goto _kdCISModulePowerOn_exit_;  
    162.         }   
    163.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName)))  
    164.         {  
    165.             if(TRUE != kd_ov5648a_poweron(mode_name))  
    166.                  goto _kdCISModulePowerOn_exit_;  
    167.         }  
    168.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName)))  
    169.         {  
    170.             if(TRUE != kd_ov5670_poweron(mode_name))  
    171.                  goto _kdCISModulePowerOn_exit_;  
    172.         }  
    173.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName)))  
    174.         {  
    175.             if(TRUE != kd_hi551_poweron(mode_name))  
    176.                  goto _kdCISModulePowerOn_exit_;  
    177.         }  
    178.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName)))  
    179.         {  
    180.             if(TRUE != kd_ov5648b_poweron(mode_name))  
    181.                  goto _kdCISModulePowerOn_exit_;  
    182.         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))) //lili add  
    183.         {  
    184.             if(TRUE != kd_ov5648_main_poweron(mode_name))  
    185.                  goto _kdCISModulePowerOn_exit_;  
    186.         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName))) {  
    187.          PK_DBG("is s5k3h72ymipi on ");  
    188.             if(TRUE != kd_s5k3h72ymipiraw_poweron(mode_name))  
    189.                  goto _kdCISModulePowerOn_exit_;  
    190.         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName)))              
    191.                 {  
    192.                    PK_DBG("is gc0329 on ");  
    193.                        if(TRUE != kd_gc0329_poweron(mode_name))  
    194.                                 goto _kdCISModulePowerOn_exit_;  
    195.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))) {  
    196.             if (0 == pinSetIdx) {  
    197.                 PK_DBG("is A5142 main on  ");  
    198.                 if(TRUE != kd_a5142mipiraw_main_poweron(mode_name))  
    199.                     goto _kdCISModulePowerOn_exit_;  
    200.             } else {  
    201.                 PK_DBG("is A5142 sub on  ");  
    202.                 if(TRUE != kd_a5142mipiraw_sub_poweron(mode_name))  
    203.                     goto _kdCISModulePowerOn_exit_;  
    204.             }  
    205.               
    206.            }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0312_YUV,currSensorName)))            
    207.                 {  
    208.                    PK_DBG("is gc0312 on ");    
    209.                        if(TRUE != kd_gc0312_poweron(mode_name))  
    210.                                 goto _kdCISModulePowerOn_exit_;  
    211.            }   
    212.            else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI704_YUV,currSensorName)))              
    213.                 {  
    214.                    PK_DBG("is hi704 on ");    
    215.                        if(TRUE != kd_hi704yuv_poweron(mode_name))  
    216.                                 goto _kdCISModulePowerOn_exit_;  
    217.            }   
    218.                else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV,currSensorName)))            
    219.                 {  
    220.                    PK_DBG("is gc0310 on ");  
    221.                        if(TRUE != kd_gc0310_poweron(mode_name))  
    222.                                 goto _kdCISModulePowerOn_exit_;  
    223.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV,currSensorName))) {  
    224.             PK_DBG("is gc2145 on ");  
    225.   
    226.             if (TRUE != kd_gc2145_poweron(mode_name))  
    227.                 goto _kdCISModulePowerOn_exit_;  
    228.         }  
    229.         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName)))  
    230.         {     
    231.             PK_DBG("is hi258 on  ");   
    232.             if(TRUE != kd_hi258mipiraw_poweron(mode_name))  
    233.                 goto _kdCISModulePowerOn_exit_;  
    234.         }  
    235.          else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName))) {  
    236.             PK_DBG("is ov2680 on  ");    
    237.             if(TRUE != kd_ov2680mipiraw_poweron(mode_name))   
    238.                 goto _kdCISModulePowerOn_exit_;  
    239.         }  
    240.     else   
    241.     {  
    242.         PK_DBG("kdCISModulePowerOn get in---  other , please add the power on code!!!!!! ");  
    243.         goto _kdCISModulePowerOn_exit_;  
    244.         }  
    245.   }  
    246.   else {//power OFF  
    247.   
    248.     PK_DBG("kdCISModulePowerOn -off:currSensorName=%s ",currSensorName);  
    249.   
    250.   
    251.      if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName)))           
    252.         {  
    253.             PK_DBG("is ov5648_mipi_raw down ");  
    254.             if (0 == pinSetIdx) {  
    255.                 if(TRUE != kd_ov5648_main_powerdown(mode_name))  
    256.                     goto _kdCISModulePowerOn_exit_;  
    257.             } else if (1 == pinSetIdx) {  
    258.                 if(TRUE != kd_ov5648_sub_powerdown(mode_name))  
    259.                     goto _kdCISModulePowerOn_exit_;  
    260.             }  
    261.         } else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName)))              
    262.         {  
    263.          PK_DBG("is s5k4e1ga down ");  
    264.             if(TRUE != kd_s5k4e1gamipi_powerdown(mode_name))  
    265.                  goto _kdCISModulePowerOn_exit_;  
    266.         }  
    267.         else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName)))           
    268.         {  
    269.          PK_DBG("is hi544 down ");  
    270.             if(TRUE != kd_hi544raw_powerdown(mode_name))  
    271.                  goto _kdCISModulePowerOn_exit_;  
    272.         }  
    273.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName)))  
    274.         {  
    275.             PK_DBG("is ov88251 down ");  
    276.              if(TRUE != kd_ov88251mipiraw_powerdown(mode_name))  
    277.               goto _kdCISModulePowerOn_exit_;     
    278.           
    279.         }  
    280.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName)))  
    281.         {  
    282.             PK_DBG("is ov5670 down ");  
    283.              if(TRUE != kd_ov5670mipiraw_powerdown(mode_name))  
    284.               goto _kdCISModulePowerOn_exit_;     
    285.           
    286.         }  
    287.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName)))  
    288.         {  
    289.             PK_DBG("is hi551 down ");  
    290.              if(TRUE != kd_hi551mipiraw_powerdown(mode_name))  
    291.               goto _kdCISModulePowerOn_exit_;     
    292.           
    293.         }  
    294.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName)))  
    295.         {  
    296.             PK_DBG("is ov88252 down ");  
    297.              if(TRUE != kd_ov88252mipiraw_powerdown(mode_name))  
    298.               goto _kdCISModulePowerOn_exit_;             
    299.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))) {  
    300.             PK_DBG("is ov8858 down ");  
    301.             if(TRUE != kd_ov8858mipiraw_powerdown(mode_name))  
    302.                 goto _kdCISModulePowerOn_exit_;  
    303.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW, currSensorName))) {  
    304.             PK_DBG("is s5k4h5yx down ");  
    305.             if (TRUE != kd_s5k4h5yxmipiraw_powerdown(mode_name))  
    306.                 goto _kdCISModulePowerOn_exit_;  
    307.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))) {  
    308.             PK_DBG("is t4k35 down ");  
    309.             if(TRUE != kd_t4k35mipiraw_powerdown(mode_name))  
    310.                 goto _kdCISModulePowerOn_exit_;  
    311.         }  
    312.     else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName)))              
    313.         {  
    314.          PK_DBG("is gc2235 down ");  
    315.             if(TRUE != kd_gc2235mipiraw_powerdown(mode_name))  
    316.                  goto _kdCISModulePowerOn_exit_;  
    317.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))) {  
    318.             PK_DBG("is gc2235 down ");  
    319.               
    320.             if (TRUE != kd_gc2235raw_powerdown(mode_name))  
    321.                  goto _kdCISModulePowerOn_exit_;  
    322.         }  
    323. /*  else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI253_YUV,currSensorName))) 
    324.         { 
    325.          PK_DBG("is hi253 down "); 
    326.             if(TRUE != kd_hi253yuv_powerdown(mode_name)) 
    327.                  goto _kdCISModulePowerOn_exit_; 
    328.         }*/   
    329.         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))) {  
    330.             if (0 == pinSetIdx) {  
    331.                 PK_DBG("is A5142 main down  ");  
    332.                 if (TRUE != kd_a5142mipiraw_main_powerdown(mode_name))  
    333.                 goto _kdCISModulePowerOn_exit_;  
    334.             } else {  
    335.                 PK_DBG("is A5142 sub down  ");  
    336.                 if (TRUE != kd_a5142mipiraw_sub_powerdown(mode_name))  
    337.                 goto _kdCISModulePowerOn_exit_;  
    338.             }  
    339.         } else if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))   
    340.         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName))))      
    341.         {  
    342.                     PK_DBG("is s5k3h7 down ");  
    343.                 if(pinSetIdx==0)  
    344.                         {  
    345.                  if(TRUE != kd_s5k3h7ymipiraw_powerdown(mode_name))  
    346.                   goto _kdCISModulePowerOn_exit_;  
    347.                 }  
    348.                 else {  
    349.                 if(TRUE != kd_s5k3h72ymipiraw_powerdown(mode_name))  
    350.                           goto _kdCISModulePowerOn_exit_;  
    351.                 }  
    352.   
    353.         }  
    354.           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName)))              
    355.         {  
    356.          PK_DBG("is gc2035 down ");  
    357.             if(TRUE != kd_gc2035_powerdown(mode_name))  
    358.                  goto _kdCISModulePowerOn_exit_;  
    359.         }  
    360.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName)))             
    361.         {  
    362.          PK_DBG("is s5k3h72y_mipi_raw down ");  
    363.             if(TRUE != kd_s5k3h72ymipiraw_powerdown(mode_name))  
    364.                  goto _kdCISModulePowerOn_exit_;  
    365.         }  
    366.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName)))  
    367.         {  
    368.             if(TRUE != kd_ov5648a_powerdown(mode_name))  
    369.                  goto _kdCISModulePowerOn_exit_;  
    370.         }  
    371.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName)))  
    372.         {  
    373.             if(TRUE != kd_ov5648b_powerdown(mode_name))  
    374.                  goto _kdCISModulePowerOn_exit_;  
    375.         }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))) //lili add  
    376.         {  
    377.             if(TRUE != kd_ov5648_main_powerdown(mode_name))  
    378.                  goto _kdCISModulePowerOn_exit_;  
    379.         }  
    380.       else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName)))              
    381.        {  
    382.                 PK_DBG("is gc0329 down ");  
    383.                     if(TRUE != kd_gc0329yuv_powerdown(mode_name))  
    384.                             goto _kdCISModulePowerOn_exit_;  
    385.         }   
    386.        else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0312_YUV,currSensorName)))             
    387.        {  
    388.                 PK_DBG("is gc0312 down ");  
    389.                     if(TRUE != kd_gc0312_powerdown(mode_name))  
    390.                             goto _kdCISModulePowerOn_exit_;  
    391.         }   
    392.           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI704_YUV,currSensorName)))           
    393.        {  
    394.                 PK_DBG("is hi704 down ");  
    395.                     if(TRUE != kd_hi704yuv_powerdown(mode_name))  
    396.                             goto _kdCISModulePowerOn_exit_;  
    397.         }  
    398.           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV,currSensorName)))             
    399.        {  
    400.                 PK_DBG("is gc0310 down ");  
    401.                     if(TRUE != kd_gc0310_powerdown(mode_name))  
    402.                             goto _kdCISModulePowerOn_exit_;  
    403.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV,currSensorName))) {  
    404.             PK_DBG("is gc2145 down ");  
    405.   
    406.             if (TRUE != kd_gc2145_powerdown(mode_name))  
    407.                 goto _kdCISModulePowerOn_exit_;  
    408.         }   
    409.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName)))  
    410.         {  
    411.             PK_DBG("is hi258 down ");  
    412.             if(TRUE != kd_hi258mipiraw_powerdown(mode_name))  
    413.                 goto _kdCISModulePowerOn_exit_;  
    414.     }  
    415.         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName)))  
    416.          {  
    417.             PK_DBG("is ov2680 down ");  
    418.             if(TRUE != kd_ov2680mipiraw_powerdown(mode_name))  
    419.                 goto _kdCISModulePowerOn_exit_;  
    420.     }   
    421.     else   
    422.     {  
    423.         PK_DBG("kdCISModulePowerDown get in---  other , please add the power down code!!!!!! ");  
    424.         goto _kdCISModulePowerOn_exit_;  
    425.         }  
    426.   
    427.   }  
    428.     return 0;  
    429.   
    430. _kdCISModulePowerOn_exit_:  
    431.     return -EIO;  
    432. }  
    433. EXPORT_SYMBOL(kdCISModulePowerOn);  

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

    [cpp] view plaincopy
     
    1. static int kd_ov5670_poweron( char *mode_name)  
    2. {  
    3.     int ret;  
    4.         printk("kd_ov5670_poweron1 start.. ");  
    5.   
    6.         ret = kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1200, VOL_2800, mode_name,0);//给camera上三路电  
    7.      PK_DBG("kd_ov88251mipiraw_poweron start.. ");  
    8.         mdelay(10);// wait power to be stable    
    9.         //disable_inactive_sensor();//disable inactive sensor  
    10.         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!!  ");}  
    11.         mdelay(10);  
    12.         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!!  ");}  
    13.         mdelay(1);  
    14.       
    15.     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!!  ");}  
    16.     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!!  ");}  
    17.     mdelay(10);  
    18.     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!!  ");}  
    19.     mdelay(5);  
    20. poweronerr:  
    21.     return ret;  
    22. }  


    (3.2)获取sensor ID,err = g_pSensorFunc->SensorFeatureControl(g_invokeSocketIdx[i], SENSOR_FEATURE_CHECK_SENSOR_ID, (MUINT8*)&sensorID, &retLen);

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

    [cpp] view plaincopy
     
    1. OV5670FeatureControl  

    ===>mediatek/custom/common/kernel/imgsensor/ov5670_mipi_raw

    [cpp] view plaincopy
     
    1. UINT32 OV5670FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId,  
    2.                                                                 UINT8 *pFeaturePara,UINT32 *pFeatureParaLen)  
    3. {  
    4.     UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara;  
    5.     UINT16 *pFeatureData16=(UINT16 *) pFeaturePara;  
    6.     UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara;  
    7.     UINT32 *pFeatureData32=(UINT32 *) pFeaturePara;  
    8.     UINT32 SensorRegNumber;  
    9.     UINT32 i;  
    10.     PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara;  
    11.     MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara;  
    12.     MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara;  
    13.     MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara;  
    14.     MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara;  
    15.     MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara;  
    16.   
    17.     switch (FeatureId)  
    18.     {  
    19.         case SENSOR_FEATURE_GET_RESOLUTION:  
    20.             *pFeatureReturnPara16++= OV5670_IMAGE_SENSOR_FULL_WIDTH;  
    21.             *pFeatureReturnPara16= OV5670_IMAGE_SENSOR_FULL_HEIGHT;  
    22.             *pFeatureParaLen=4;  
    23.             break;  
    24.         case SENSOR_FEATURE_GET_PERIOD:  
    25.                                 *pFeatureReturnPara16++= OV5670_FeatureControl_PERIOD_PixelNum;  
    26.                                 *pFeatureReturnPara16= OV5670_FeatureControl_PERIOD_LineNum;  
    27.                                 *pFeatureParaLen=4;  
    28.                                 break;  
    29.         case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ:  
    30.                         switch(OV5670CurrentScenarioId)  
    31.                         {  
    32.                                 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:  
    33.                                         *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK;  
    34.                                         *pFeatureParaLen=4;  
    35.                                         break;  
    36.                                 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:  
    37.                                         *pFeatureReturnPara32 = OV5670_VIDEO_PCLK;  
    38.                                         *pFeatureParaLen=4;  
    39.                                         break;  
    40.                                 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:  
    41.                                 case MSDK_SCENARIO_ID_CAMERA_ZSD:  
    42.                                         *pFeatureReturnPara32 = OV5670_CAPTURE_PCLK;  
    43.                                         *pFeatureParaLen=4;  
    44.                                         break;  
    45.                                 default:  
    46.                                         *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK;  
    47.                                         *pFeatureParaLen=4;  
    48.                                         break;  
    49.                         }  
    50.                     break;  
    51.   
    52.         case SENSOR_FEATURE_SET_ESHUTTER:  
    53.             OV5670_SetShutter(*pFeatureData16);  
    54.             break;  
    55.         case SENSOR_FEATURE_SET_NIGHTMODE:  
    56.             OV5670_NightMode((BOOL) *pFeatureData16);  
    57.             break;  
    58.         case SENSOR_FEATURE_SET_GAIN:  
    59.            OV5670_SetGain((UINT16) *pFeatureData16);  
    60.             break;  
    61.         case SENSOR_FEATURE_SET_FLASHLIGHT:  
    62.             break;  
    63.         case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ:  
    64.             //OV5670_isp_master_clock=*pFeatureData32;  
    65.             break;  
    66.         case SENSOR_FEATURE_SET_REGISTER:  
    67.             OV5670_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData);  
    68.             break;  
    69.         case SENSOR_FEATURE_GET_REGISTER:  
    70.             pSensorRegData->RegData = OV5670_read_cmos_sensor(pSensorRegData->RegAddr);  
    71.             break;  
    72.         case SENSOR_FEATURE_SET_CCT_REGISTER:  
    73.             SensorRegNumber=FACTORY_END_ADDR;  
    74.             for (i=0;i<SensorRegNumber;i++)  
    75.             {  
    76.                 spin_lock(&ov5670mipiraw_drv_lock);  
    77.                 OV5670SensorCCT[i].Addr=*pFeatureData32++;  
    78.                 OV5670SensorCCT[i].Para=*pFeatureData32++;  
    79.                                 spin_unlock(&ov5670mipiraw_drv_lock);  
    80.             }  
    81.             break;  
    82.         case SENSOR_FEATURE_GET_CCT_REGISTER:  
    83.             SensorRegNumber=FACTORY_END_ADDR;  
    84.             if (*pFeatureParaLen<(SensorRegNumber*sizeof(SENSOR_REG_STRUCT)+4))  
    85.                 return FALSE;  
    86.             *pFeatureData32++=SensorRegNumber;  
    87.             for (i=0;i<SensorRegNumber;i++)  
    88.             {  
    89.                 *pFeatureData32++=OV5670SensorCCT[i].Addr;  
    90.                 *pFeatureData32++=OV5670SensorCCT[i].Para;  
    91.             }  
    92.             break;  
    93.         case SENSOR_FEATURE_SET_ENG_REGISTER:  
    94.             SensorRegNumber=ENGINEER_END;  
    95.             for (i=0;i<SensorRegNumber;i++)  
    96.             {  
    97.                 spin_lock(&ov5670mipiraw_drv_lock);  
    98.                 OV5670SensorReg[i].Addr=*pFeatureData32++;  
    99.                 OV5670SensorReg[i].Para=*pFeatureData32++;  
    100.                                 spin_unlock(&ov5670mipiraw_drv_lock);  
    101.             }  
    102.             break;  
    103.         case SENSOR_FEATURE_GET_ENG_REGISTER:  
    104.             SensorRegNumber=ENGINEER_END;  
    105.             if (*pFeatureParaLen<(SensorRegNumber*sizeof(SENSOR_REG_STRUCT)+4))  
    106.                 return FALSE;  
    107.             *pFeatureData32++=SensorRegNumber;  
    108.             for (i=0;i<SensorRegNumber;i++)  
    109.             {  
    110.                 *pFeatureData32++=OV5670SensorReg[i].Addr;  
    111.                 *pFeatureData32++=OV5670SensorReg[i].Para;  
    112.             }  
    113.             break;  
    114.         case SENSOR_FEATURE_GET_REGISTER_DEFAULT:  
    115.             if (*pFeatureParaLen>=sizeof(NVRAM_SENSOR_DATA_STRUCT))  
    116.             {  
    117.                 pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION;  
    118.                 pSensorDefaultData->SensorId=OV5670_SENSOR_ID;  
    119.                 memcpy(pSensorDefaultData->SensorEngReg, OV5670SensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END);  
    120.                 memcpy(pSensorDefaultData->SensorCCTReg, OV5670SensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR);  
    121.             }  
    122.             else  
    123.                 return FALSE;  
    124.             *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT);  
    125.             break;  
    126.         case SENSOR_FEATURE_GET_CONFIG_PARA:  
    127.             memcpy(pSensorConfigData, &OV5670SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT));  
    128.             *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT);  
    129.             break;  
    130.         case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR:  
    131.             OV5670_camera_para_to_sensor();  
    132.             break;  
    133.   
    134.         case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA:  
    135.             OV5670_sensor_to_camera_para();  
    136.             break;  
    137.         case SENSOR_FEATURE_GET_GROUP_COUNT:  
    138.             *pFeatureReturnPara32++=OV5670_get_sensor_group_count();  
    139.             *pFeatureParaLen=4;  
    140.             break;  
    141.         case SENSOR_FEATURE_GET_GROUP_INFO:  
    142.             OV5670_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount);  
    143.             *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT);  
    144.             break;  
    145.         case SENSOR_FEATURE_GET_ITEM_INFO:  
    146.             OV5670_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo);  
    147.             *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT);  
    148.             break;  
    149.   
    150.         case SENSOR_FEATURE_SET_ITEM_INFO:  
    151.             OV5670_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue);  
    152.             *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT);  
    153.             break;  
    154.   
    155.         case SENSOR_FEATURE_GET_ENG_INFO:  
    156.             pSensorEngInfo->SensorId = 129;  
    157.             pSensorEngInfo->SensorType = CMOS_SENSOR;  
    158.             pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_Gb;  
    159.             *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT);  
    160.             break;  
    161.         case SENSOR_FEATURE_GET_LENS_DRIVER_ID:  
    162.             // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE  
    163.             // if EEPROM does not exist in camera module.  
    164.             *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE;  
    165.             *pFeatureParaLen=4;  
    166.             break;  
    167.   
    168.         case SENSOR_FEATURE_INITIALIZE_AF:  
    169.             break;  
    170.         case SENSOR_FEATURE_CONSTANT_AF:  
    171.             break;  
    172.         case SENSOR_FEATURE_MOVE_FOCUS_LENS:  
    173.             break;  
    174.         case SENSOR_FEATURE_SET_VIDEO_MODE:  
    175.             OV5670SetVideoMode(*pFeatureData16);  
    176.             break;  
    177.         case SENSOR_FEATURE_CHECK_SENSOR_ID://-------------调用此处读取ID  
    178.             OV5670GetSensorID(pFeatureReturnPara32);  
    179.             break;  
    180.         case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE:  
    181.             OV5670SetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1));  
    182.                 break;  
    183.                 case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO:  
    184.                         OV5670MIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1));  
    185.                         break;  
    186.                 case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO:  
    187.                         OV5670MIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1)));  
    188.                         break;  
    189.                 case SENSOR_FEATURE_SET_TEST_PATTERN:  
    190.                         OV5670SetTestPatternMode((BOOL)*pFeatureData16);  
    191.                         break;  
    192.                 case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE://for factory mode auto testing  
    193.                         *pFeatureReturnPara32=OV5670_TEST_PATTERN_CHECKSUM;  
    194.                         *pFeatureParaLen=4;  
    195.                      break;  
    196.         default:  
    197.             break;  
    198.     }  
    199.     return ERROR_NONE;  
    200. }  
    [cpp] view plaincopy
     
    1. UINT32 OV5670GetSensorID(UINT32 *sensorID)  
    2. {  
    3.     int  retry = 2;  
    4.   
    5.         OV5670DB("OV5670GetSensorID enter :  ");  
    6.     mdelay(5);  
    7.   
    8.     do {  
    9.         *sensorID = (OV5670_read_cmos_sensor(0x300B)<<8)|OV5670_read_cmos_sensor(0x300C);  
    10.         if (*sensorID == OV5670_SENSOR_ID)  
    11.                 {  
    12.                         OV5670DB("Sensor ID = 0x%04x ", *sensorID);  
    13.                 break;  
    14.                 }  
    15.         OV5670DB("Read Sensor ID Fail = 0x%04x ", *sensorID);  
    16.         retry--;  
    17.     } while (retry > 0);  
    18.   
    19.     if (*sensorID != OV5670_SENSOR_ID) {  
    20.                 OV5670DB("Read Sensor ID Fail = 0x%04x ", *sensorID);  
    21.   
    22.                 /* 
    23.         *sensorID = OV5670_SENSOR_ID; 
    24.         return ERROR_SENSOR_CONNECT_FAIL; 
    25.         */  
    26.          *sensorID = 0xFFFFFFFF;  
    27.      return ERROR_SENSOR_CONNECT_FAIL;  
    28.     }  
    29.     return ERROR_NONE;  
    30. }  

              以上是ov5670获取ID的函数。

    一、MTK平台Camera框架

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

         这里主要介绍kernel部分和HAL层部分。

        1、Kernel 部分主要有两块:

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

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

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

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

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

              2.3、feature io,包含各种3A等性能配置。

                      

    二、Camera打开流程分析

             Camera开启流程图如下:

            主要发生在两个时间点:

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

        2、打开Camera应用时:camera会有上电,完成sensor的寄存器初始化配置,向上层传递基本参数和配置信息,以及preview和capture模式循环。

          

    1、开机初始化过程

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

    [plain] view plaincopy
     
    1. 12-24 10:02:07.601   148   148 D MtkCam/module: [instantiate_camera_module]  
    2. 12-24 10:02:07.601   148   148 D MtkCam/Utils/Property: [clear] pid/tid=148/148  
    3. 12-24 10:02:07.601   148   148 I CameraService: Loaded "MediaTek Camera Module" camera module  
    4. 12-24 10:02:07.601   148   148 D MtkCam/MtkCamUtils: [CamDevMetaInfoMap::clear] pid/tid=148/148  
    5. 12-24 10:02:07.601   148   148 D SensorHal: [getInstance][SensorHalImp] getInstance  
    6. 12-24 10:02:07.601   148   148 D SensorHal: [createImp][createImp]: 0  
    7. 12-24 10:02:07.601   148   148 D SeninfDrvImp: [getInstance][getInstance]  
    8. 12-24 10:02:07.601   148   148 D SeninfDrvImp: [SeninfDrvImp][SeninfDrvImp]  
    9. 12-24 10:02:07.601   148   148 D SeninfDrvImp: [init][init]: 0  

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

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

    [cpp] view plaincopy
     
    1. /****************************************************************************** 
    2.  * 
    3.  ******************************************************************************/  
    4. int32_t  
    5. CamDeviceManagerImp::  
    6. enumDeviceLocked()  
    7. {  
    8.     Utils::CamProfile _profile(__FUNCTION__, "CamDeviceManagerImp");  
    9.     //  
    10.     status_t status = OK;  
    11.     int32_t i4DeviceNum = 0;  
    12.     //  
    13.     mEnumMap.clear();  
    14. //------------------------------------------------------------------------------  
    15. #if '1'==MTKCAM_HAVE_SENSOR_HAL  
    16.   
    17.     mEnumMap.clear();  
    18.     DevMetaInfo::clear();  
    19.     //  
    20.     int32_t isFakeOrientation = 0;  
    21.     int32_t i4DevSetupOrientation = 0;  
    22.     camera_info camInfo;  
    23.     camInfo.device_version = CAMERA_DEVICE_API_VERSION_1_0;  
    24.     camInfo.static_camera_characteristics = NULL;  
    25.     //  
    26.     SensorHal* pSensorHal = SensorHal::createInstance();//创建sensor对象  
    27.     if  ( ! pSensorHal )  
    28.     {  
    29.         MY_LOGE("pSensorHal == NULL");  
    30.         return 0;  
    31.     }  
    32.     //  
    33.     int32_t const iSensorsList = pSensorHal->searchSensor();//此函数是入口,主要查找匹配的硬件sensor  
    34.     //  
    35.     //  
    36.     if  ( (iSensorsList & SENSOR_DEV_MAIN_3D) == SENSOR_DEV_MAIN_3D )  
    37.     {  
    38.         MY_LOGI("Stereo 3D Camera found");  
    39. #warning "[TODO] Stereo 3D Camera"  
    40.     }  
    41.     //  
    42.     if  ( (iSensorsList & SENSOR_DEV_MAIN) == SENSOR_DEV_MAIN )  
    43.     {  
    44.         int32_t const deviceId = i4DeviceNum;  
    45.         //  
    46.         halSensorDev_e const eHalSensorDev = SENSOR_DEV_MAIN;  
    47.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_FAKE_ORIENTATION, (int)&isFakeOrientation);  
    48.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_ORIENTATION_ANGLE, (int)&i4DevSetupOrientation);  
    49.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_FACING_DIRECTION, (int)&camInfo.facing);  
    50.         camInfo.orientation = i4DevSetupOrientation;  
    51.         if  ( isFakeOrientation )  
    52.         {  
    53.             camInfo.orientation = (0==camInfo.facing) ? 90 : 270;  
    54.             MY_LOGW("Fake orientation:%d instead of %d, facing=%d HalSensorDev=%#x", camInfo.orientation, i4DevSetupOrientation, camInfo.facing, eHalSensorDev);  
    55.         }  
    56.         DevMetaInfo::add(deviceId, camInfo, i4DevSetupOrientation, eDevId_ImgSensor, eHalSensorDev);  
    57.         //  
    58.         sp<EnumInfo> pInfo = new EnumInfo;  
    59.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    60.         pInfo->pMetadata            = NULL;  
    61.         pInfo->iFacing              = camInfo.facing;  
    62.         pInfo->iWantedOrientation   = camInfo.orientation;  
    63.         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
    64.         mEnumMap.add(deviceId, pInfo);  
    65.         //  
    66.         i4DeviceNum++;  
    67.     }  
    68.     //  
    69.     if  ( (iSensorsList & SENSOR_DEV_SUB) == SENSOR_DEV_SUB )  
    70.     {  
    71.         int32_t const deviceId = i4DeviceNum;  
    72.         //  
    73.         halSensorDev_e const eHalSensorDev = SENSOR_DEV_SUB;  
    74.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_FAKE_ORIENTATION, (int)&isFakeOrientation);  
    75.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_ORIENTATION_ANGLE, (int)&i4DevSetupOrientation);  
    76.         pSensorHal->sendCommand(eHalSensorDev, SENSOR_CMD_GET_SENSOR_FACING_DIRECTION, (int)&camInfo.facing);  
    77.         camInfo.orientation = i4DevSetupOrientation;  
    78.         if  ( isFakeOrientation )  
    79.         {  
    80.             camInfo.orientation = (0==camInfo.facing) ? 90 : 270;  
    81.             MY_LOGW("Fake orientation:%d instead of %d, facing=%d HalSensorDev=%#x", camInfo.orientation, i4DevSetupOrientation, camInfo.facing, eHalSensorDev);  
    82.         }  
    83.         DevMetaInfo::add(deviceId, camInfo, i4DevSetupOrientation, eDevId_ImgSensor, eHalSensorDev);  
    84.         //  
    85.         sp<EnumInfo> pInfo = new EnumInfo;  
    86.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    87.         pInfo->pMetadata            = NULL;  
    88.         pInfo->iFacing              = camInfo.facing;  
    89.         pInfo->iWantedOrientation   = camInfo.orientation;  
    90.         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
    91.         mEnumMap.add(deviceId, pInfo);  
    92.         //  
    93.         i4DeviceNum++;  
    94.     }  
    95.     //  
    96. //    if  ( (iSensorsList & SENSOR_DEV_ATV) == SENSOR_DEV_ATV )  
    97.     {  
    98.         int32_t const deviceId = 0xFF;  
    99.         //  
    100.         halSensorDev_e const eHalSensorDev = SENSOR_DEV_ATV;  
    101.         camInfo.facing = 0;  
    102.         camInfo.orientation = 0;  
    103.         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_AtvSensor, eHalSensorDev);  
    104.         //  
    105.         sp<EnumInfo> pInfo = new EnumInfo;  
    106.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    107.         pInfo->pMetadata            = NULL;  
    108.         pInfo->iFacing              = camInfo.facing;  
    109.         pInfo->iWantedOrientation   = camInfo.orientation;  
    110.         pInfo->iSetupOrientation    = i4DevSetupOrientation;  
    111.         mEnumMap.add(deviceId, pInfo);  
    112.         //  
    113. //        i4DeviceNum++;  
    114.     }  
    115.     //  
    116.     //  
    117.     if  ( pSensorHal )  
    118.     {  
    119.         pSensorHal->destroyInstance();  
    120.         pSensorHal = NULL;  
    121.     }  
    122.     //  
    123.     MY_LOGI("iSensorsList=0x%08X, i4DeviceNum=%d", iSensorsList, i4DeviceNum);  
    124.     for (size_t i = 0; i < mEnumMap.size(); i++)  
    125.     {  
    126.         int32_t const deviceId = mEnumMap.keyAt(i);  
    127.         sp<EnumInfo> pInfo = mEnumMap.valueAt(i);  
    128.         uint32_t const uDeviceVersion   = pInfo->uDeviceVersion;  
    129.         camera_metadata const*pMetadata = pInfo->pMetadata;  
    130.         int32_t const iFacing           = pInfo->iFacing;  
    131.         int32_t const iWantedOrientation= pInfo->iWantedOrientation;  
    132.         int32_t const iSetupOrientation = pInfo->iSetupOrientation;  
    133.         MY_LOGI(  
    134.             "[0x%02x] orientation(wanted/setup)=(%d/%d) facing:%d metadata:%p DeviceVersion:0x%x",   
    135.             deviceId, iWantedOrientation, iSetupOrientation,   
    136.             iFacing, pMetadata, uDeviceVersion  
    137.         );  
    138.     }  
    139.   
    140. #else   //----------------------------------------------------------------------  
    141.   
    142.     #warning "[WARN] Simulation for CamDeviceManagerImp::enumDeviceLocked()"  
    143.   
    144.     mEnumMap.clear();  
    145.     DevMetaInfo::clear();  
    146.     {  
    147.         int32_t const deviceId = 0;  
    148.         //  
    149.         camera_info camInfo;  
    150.         camInfo.device_version  = CAMERA_DEVICE_API_VERSION_1_0;  
    151.         camInfo.static_camera_characteristics = NULL;  
    152.         camInfo.facing      = 0;  
    153.         camInfo.orientation = 90;  
    154.         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_ImgSensor, 0x01/*SENSOR_DEV_MAIN*/);  
    155.         //  
    156.         sp<EnumInfo> pInfo = new EnumInfo;  
    157.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    158.         pInfo->pMetadata            = NULL;  
    159.         pInfo->iFacing              = 0;  
    160.         pInfo->iWantedOrientation   = 90;  
    161.         pInfo->iSetupOrientation    = 90;  
    162.         mEnumMap.add(deviceId, pInfo);  
    163.     }  
    164.     //  
    165.     {  
    166.         int32_t const deviceId = 0xFF;  
    167.         //  
    168.         camera_info camInfo;  
    169.         camInfo.device_version  = CAMERA_DEVICE_API_VERSION_1_0;  
    170.         camInfo.static_camera_characteristics = NULL;  
    171.         camInfo.facing      = 0;  
    172.         camInfo.orientation = 0;  
    173.         DevMetaInfo::add(deviceId, camInfo, camInfo.orientation, eDevId_AtvSensor, 0x04/*SENSOR_DEV_ATV*/);  
    174.         //  
    175.         sp<EnumInfo> pInfo = new EnumInfo;  
    176.         pInfo->uDeviceVersion       = CAMERA_DEVICE_API_VERSION_1_0;  
    177.         pInfo->pMetadata            = NULL;  
    178.         pInfo->iFacing              = 0;  
    179.         pInfo->iWantedOrientation   = 0;  
    180.         pInfo->iSetupOrientation    = 0;  
    181.         mEnumMap.add(deviceId, pInfo);  
    182.     }  
    183.     //  
    184.     i4DeviceNum = 1;  
    185.   
    186. #endif  
    187. //------------------------------------------------------------------------------  
    188.     //  
    189.     _profile.print("");  
    190.     return  i4DeviceNum;  
    191. }  

           

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

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

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. ********************************************************************************/  
    3.   
    4. MINT32   
    5. ImgSensorDrv::impSearchSensor(pfExIdChk pExIdChkCbf)  
    6. {  
    7.     MUINT32 SensorEnum = (MUINT32) DUAL_CAMERA_MAIN_SENSOR;  
    8.     MUINT32 i,id[KDIMGSENSOR_MAX_INVOKE_DRIVERS] = {0,0};  
    9.     MBOOL SensorConnect=TRUE;  
    10.     UCHAR cBuf[64];  
    11.     MINT32 err = SENSOR_NO_ERROR;  
    12.     MINT32 err2 = SENSOR_NO_ERROR;  
    13.     ACDK_SENSOR_INFO_STRUCT SensorInfo;  
    14.     ACDK_SENSOR_CONFIG_STRUCT SensorConfigData;  
    15.     ACDK_SENSOR_RESOLUTION_INFO_STRUCT SensorResolution;  
    16.     MINT32 sensorDevs = SENSOR_NONE;  
    17.     IMAGE_SENSOR_TYPE sensorType = IMAGE_SENSOR_TYPE_UNKNOWN;  
    18.     IMGSENSOR_SOCKET_POSITION_ENUM socketPos = IMGSENSOR_SOCKET_POS_NONE;  
    19.   
    20.   
    21.     //! If imp sensor search process already done before,   
    22.     //! only need to return the sensorDevs, not need to   
    23.     //! search again.   
    24.     if (SENSOR_DOES_NOT_EXIST != m_mainSensorId) {  
    25.         //been processed.  
    26.         LOG_MSG("[impSearchSensor] Already processed  ");   
    27.         if (BAD_SENSOR_INDEX != m_mainSensorIdx) {  
    28.             sensorDevs |= SENSOR_MAIN;  
    29.         }  
    30.   
    31.         if (BAD_SENSOR_INDEX != m_subSensorIdx) {  
    32.             sensorDevs |= SENSOR_SUB;  
    33.         }  
    34.   
    35.         #ifdef  ATVCHIP_MTK_ENABLE  
    36.   
    37.             sensorDevs |= SENSOR_ATV;  
    38.   
    39.         #endif  
    40.   
    41.   
    42.         return sensorDevs;   
    43.     }  
    44.       
    45.     GetSensorInitFuncList(&m_pstSensorInitFunc);//----(1)获取hal层的sensor列表  
    46.   
    47.     LOG_MSG("SENSOR search start  ");  
    48.   
    49.     if (-1 != m_fdSensor) {  
    50.         ::close(m_fdSensor);  
    51.         m_fdSensor = -1;  
    52.     }  
    53.     sprintf(cBuf,"/dev/%s",CAMERA_HW_DEVNAME);  
    54.     m_fdSensor = ::open(cBuf, O_RDWR);  
    55.     if (m_fdSensor < 0) {  
    56.          LOG_ERR("[impSearchSensor]: error opening %s: %s  ", cBuf, strerror(errno));   
    57.         return sensorDevs;  
    58.     }  
    59.     LOG_MSG("[impSearchSensor] m_fdSensor = %d   ", m_fdSensor);  
    60.   
    61.     // search main/main_2/sub 3 sockets  
    62.    #ifdef MTK_SUB_IMGSENSOR   
    63.     for (SensorEnum = DUAL_CAMERA_MAIN_SENSOR; SensorEnum <= DUAL_CAMERA_SUB_SENSOR; SensorEnum <<= 1)  {  
    64.         LOG_MSG("impSearchSensor search to sub ");  
    65.    #else  
    66.     for (SensorEnum = DUAL_CAMERA_MAIN_SENSOR; SensorEnum < DUAL_CAMERA_SUB_SENSOR; SensorEnum <<= 1)  {  
    67.         LOG_MSG("impSearchSensor search to main ");     
    68.    #endif       
    69.         //skip atv case  
    70.         if ( 0x04 == SensorEnum ) continue;  
    71.         //  
    72.         for (i = 0; i < MAX_NUM_OF_SUPPORT_SENSOR; i++) {  
    73.             //end of driver list  
    74.             if (m_pstSensorInitFunc[i].getCameraDefault == NULL) {  
    75.                 LOG_MSG("m_pstSensorInitFunc[i].getCameraDefault is NULL: %d  ", i);                  
    76.                 break;  
    77.             }  
    78.                 //set sensor driver  
    79.             id[KDIMGSENSOR_INVOKE_DRIVER_0] = (SensorEnum << KDIMGSENSOR_DUAL_SHIFT) | i;  
    80.             LOG_MSG("set sensor driver id =%x ", id[KDIMGSENSOR_INVOKE_DRIVER_0]);   
    81.             err = ioctl(m_fdSensor, KDIMGSENSORIOC_X_SET_DRIVER,&id[KDIMGSENSOR_INVOKE_DRIVER_0] );//--(2)调用kernel层的kdSetDriver函数  
    82.                 if (err < 0) {  
    83.                     LOG_ERR("ERROR:KDCAMERAHWIOC_X_SET_DRIVER ");  
    84.                 }  
    85.   
    86.              
    87.   
    88.                 //err = open();  
    89.                 err = ioctl(m_fdSensor, KDIMGSENSORIOC_T_CHECK_IS_ALIVE);//---(3)上下电camera并读取sensor的ID,如果匹配则成功  
    90.                   
    91.   
    92.                   
    93.                 if (err < 0) {  
    94.                     LOG_MSG("[impSearchSensor] Err-ctrlCode (%s)  ", strerror(errno));//  
    95.                 }  
    96.             //  
    97.             sensorType = this->getCurrentSensorType((SENSOR_DEV_ENUM)SensorEnum);  
    98.             //  
    99.             socketPos = this->getSocketPosition((CAMERA_DUAL_CAMERA_SENSOR_ENUM)SensorEnum);  
    100.                 //check extra ID , from EEPROM maybe  
    101.                 //may need to keep power here  
    102.                 if (NULL != pExIdChkCbf) {  
    103.                     err2 = pExIdChkCbf();  
    104.                     if (err2 < 0) {  
    105.                         LOG_ERR("Error:pExIdChkCbf()  ");  
    106.                     }  
    107.                 }  
    108.   
    109.                 //power off sensor  
    110.                 close();  
    111.   
    112.                 if (err < 0 || err2 < 0) {  
    113.                     LOG_MSG("sensor ID mismatch ");  
    114.                 }  
    115.                 else {  
    116.                     if (SensorEnum == DUAL_CAMERA_MAIN_SENSOR) {  
    117.                 //m_mainSensorIdx = i;  
    118.                 //m_mainSensorId = m_pstSensorInitFunc[m_mainSensorIdx].SensorId;  
    119.                 m_mainSensorDrv.index[m_mainSensorDrv.number] = i;  
    120.                 m_mainSensorDrv.type[m_mainSensorDrv.number] = sensorType;  
    121.                 if ( IMAGE_SENSOR_TYPE_RAW == sensorType && BAD_SENSOR_INDEX == m_mainSensorDrv.firstRawIndex ) {  
    122.                     m_mainSensorDrv.firstRawIndex = i;  
    123.                 }  
    124.                 else if ( IMAGE_SENSOR_TYPE_YUV == sensorType && BAD_SENSOR_INDEX == m_mainSensorDrv.firstYuvIndex ) {  
    125.                     m_mainSensorDrv.firstYuvIndex = i;  
    126.                 }  
    127.                 m_mainSensorDrv.position = socketPos;  
    128.                 m_mainSensorDrv.sensorID = m_pstSensorInitFunc[m_mainSensorDrv.index[m_mainSensorDrv.number]].SensorId;  
    129.                 // LOG_MSG("MAIN sensor m_mainSensorDrv.number=%d, m_mainSensorDrv.index=%d ",m_mainSensorDrv.number,m_mainSensorDrv.index[m_mainSensorDrv.number]);  
    130.                 m_mainSensorDrv.number++;  
    131.                 //  
    132.                 m_pMainSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;  
    133.                 if  ( m_pMainSensorInfo )  
    134.                 {  
    135.                     NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;  
    136.                     LOG_MSG("found <%#x/%s/%s>", pSensorInfo->GetID(), pSensorInfo->getDrvName(), pSensorInfo->getDrvMacroName());  
    137.                 }  
    138.                 else  
    139.                 {  
    140.                     LOG_WRN("m_pMainSensorInfo==NULL ");  
    141.                 }  
    142.                 LOG_MSG("MAIN sensor found:[%d]/[0x%x]/[%d]/[%d]  ",i,id[KDIMGSENSOR_INVOKE_DRIVER_0],sensorType,socketPos);  
    143.                 //break;  
    144.             }  
    145.             else if (SensorEnum == DUAL_CAMERA_SUB_SENSOR) {  
    146.                 //m_subSensorIdx = i;  
    147.                 //m_subSensorId = m_pstSensorInitFunc[m_subSensorIdx].SensorId;  
    148.                 m_subSensorDrv.index[m_subSensorDrv.number] = i;  
    149.                 m_subSensorDrv.type[m_subSensorDrv.number] = sensorType;  
    150.                 if ( IMAGE_SENSOR_TYPE_RAW == sensorType && BAD_SENSOR_INDEX == m_subSensorDrv.firstRawIndex ) {  
    151.                     m_subSensorDrv.firstRawIndex = i;  
    152.                 }  
    153.                 else if ( IMAGE_SENSOR_TYPE_YUV == sensorType && BAD_SENSOR_INDEX == m_subSensorDrv.firstYuvIndex ) {  
    154.                     m_subSensorDrv.firstYuvIndex = i;  
    155.                 }  
    156.                 m_subSensorDrv.position = socketPos;  
    157.                 m_subSensorDrv.sensorID = m_pstSensorInitFunc[m_subSensorDrv.index[m_subSensorDrv.number]].SensorId;  
    158.                 //LOG_MSG("SUB sensor m_subSensorDrv.number=%d, m_subSensorDrv.index=%d ",m_subSensorDrv.number,m_subSensorDrv.index[m_subSensorDrv.number]);  
    159.                 m_subSensorDrv.number++;  
    160.                 //  
    161.                 m_pSubSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;  
    162.                 if  ( m_pSubSensorInfo )  
    163.                 {  
    164.                     NSFeature::SensorInfoBase* pSensorInfo = m_pstSensorInitFunc[i].pSensorInfo;  
    165.                     LOG_MSG("found <%#x/%s/%s>", pSensorInfo->GetID(), pSensorInfo->getDrvName(), pSensorInfo->getDrvMacroName());  
    166.                 }  
    167.                 else  
    168.                 {  
    169.                     LOG_WRN("m_pSubSensorInfo==NULL ");  
    170.                 }  
    171.                 LOG_MSG("SUB sensor found:[%d]/[0x%x]/[%d]/[%d]  ",i,id[KDIMGSENSOR_INVOKE_DRIVER_0],sensorType,socketPos);  
    172.                 //break;  
    173.             }  
    174.         }//  
    175.           
    176.         }  
    177.     }  
    178.     //close system call may be off sensor power. check first!!!  
    179.     ::close(m_fdSensor);  
    180.     m_fdSensor = -1;  
    181.     //  
    182.     if (BAD_SENSOR_INDEX != m_mainSensorDrv.index[0]) {  
    183.         m_mainSensorId = m_mainSensorDrv.sensorID;  
    184.         //init to choose first  
    185.         m_mainSensorIdx = m_mainSensorDrv.index[0];  
    186.         sensorDevs |= SENSOR_MAIN;  
    187.     }  
    188.   
    189.     if (BAD_SENSOR_INDEX != m_subSensorDrv.index[0]) {  
    190.         m_subSensorId = m_subSensorDrv.sensorID;  
    191.         //init to choose first  
    192.         m_subSensorIdx = m_subSensorDrv.index[0];  
    193.         sensorDevs |= SENSOR_SUB;  
    194.     }  
    195.   
    196.     #ifdef  ATVCHIP_MTK_ENABLE  
    197.       
    198.         sensorDevs |= SENSOR_ATV;  
    199.       
    200.     #endif  
    201.   
    202.   
    203.     if (sensorDevs == SENSOR_NONE) {  
    204.         LOG_ERR( "Error No sensor found!!  ");  
    205.     }  
    206.     //  
    207.     LOG_MSG("SENSOR search end: 0x%x /[0x%x][%d]/[0x%x][%d] ", sensorDevs,  
    208.     m_mainSensorId,m_mainSensorIdx,m_subSensorId,m_subSensorIdx);  
    209.   
    210.     return sensorDevs;  
    211. }//  

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

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

    [cpp] view plaincopy
     
    1. UINT32 GetSensorInitFuncList(MSDK_SENSOR_INIT_FUNCTION_STRUCT **ppSensorList)  
    2. {  
    3.     if (NULL == ppSensorList) {  
    4.         ALOGE("ERROR: NULL pSensorList ");  
    5.         return MHAL_UNKNOWN_ERROR;  
    6.     }  
    7.     *ppSensorList = &SensorList[0];//这里直接调用hal层的sensor列表  
    8.     return MHAL_NO_ERROR;  
    9. // GetSensorInitFuncList()  

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

    [cpp] view plaincopy
     
    1. MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] =  
    2. {  
    3.     //add by zym  
    4. #if defined(GC2235_MIPI_RAW)  
    5.     RAW_INFO(GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, NULL),   
    6. #endif  
    7. // add by zhouzuoyu  
    8. #if defined(GC2235_KOTECH_MIPI_RAW)  
    9.     RAW_INFO(GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, NULL),   
    10. #endif  
    11. #if defined(OV16825_MIPI_RAW)  
    12.     RAW_INFO(OV16825MIPI_SENSOR_ID, SENSOR_DRVNAME_OV16825_MIPI_RAW,NULL),   
    13. #endif  
    14. #if defined(IMX135_MIPI_RAW)  
    15.         RAW_INFO(IMX135_SENSOR_ID, SENSOR_DRVNAME_IMX135_MIPI_RAW,NULL),   
    16. #endif  
    17. #if defined(OV8830_RAW)  
    18.     RAW_INFO(OV8830_SENSOR_ID, SENSOR_DRVNAME_OV8830_RAW, NULL),  
    19. #endif  
    20.   
    21. /*  ADD sensor driver before this line */  
    22.     {0,{0},NULL, NULL, NULL}//end of list  
    23. };   

    (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

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. * kdSetDriver 
    3. ********************************************************************************/  
    4. int kdSetDriver(unsigned int* pDrvIndex)  
    5. {  
    6.     ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT *pSensorList = NULL;  
    7.     u32 drvIdx[KDIMGSENSOR_MAX_INVOKE_DRIVERS] = {0,0};  
    8.     u32 i;  
    9.   
    10.     PK_XLOG_INFO("pDrvIndex:0x%08x/0x%08x  ",pDrvIndex[KDIMGSENSOR_INVOKE_DRIVER_0],pDrvIndex[KDIMGSENSOR_INVOKE_DRIVER_1]);  
    11.     //set driver for MAIN or SUB sensor  
    12.   
    13.     if (0 != kdGetSensorInitFuncList(&pSensorList))//----(2.1)获取kernel层的sensor列表  
    14.     {  
    15.         PK_ERR("ERROR:kdGetSensorInitFuncList() ");  
    16.         return -EIO;  
    17.     }  
    18.   
    19.     for ( i = KDIMGSENSOR_INVOKE_DRIVER_0; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
    20.         //  
    21.         spin_lock(&kdsensor_drv_lock);  
    22.         g_bEnableDriver[i] = FALSE;  
    23.         g_invokeSocketIdx[i] = (CAMERA_DUAL_CAMERA_SENSOR_ENUM)((pDrvIndex[i] & KDIMGSENSOR_DUAL_MASK_MSB)>>KDIMGSENSOR_DUAL_SHIFT);  
    24.     spin_unlock(&kdsensor_drv_lock);  
    25.   
    26.         drvIdx[i] = (pDrvIndex[i] & KDIMGSENSOR_DUAL_MASK_LSB);//----(2.2)g_invokeSocketIdx,drvIdx解释  
    27.         //  
    28.         if ( DUAL_CAMERA_NONE_SENSOR == g_invokeSocketIdx[i] ) { continue; }  
    29.   
    30.   
    31.         //ToDo: remove print information  
    32.         PK_XLOG_INFO("[kdSetDriver] i,g_invokeSocketIdx[%d] = %d : ",i,i,drvIdx[i]);  
    33.         PK_XLOG_INFO("[kdSetDriver] i,drvIdx[%d] = %d : ",i,i,drvIdx[i]);  
    34.         //  
    35.         if ( MAX_NUM_OF_SUPPORT_SENSOR > drvIdx[i] ) {  
    36.             if (NULL == pSensorList[drvIdx[i]].SensorInit) {  
    37.                 PK_ERR("ERROR:kdSetDriver() ");  
    38.                 return -EIO;  
    39.             }  
    40.   
    41.             pSensorList[drvIdx[i]].SensorInit(&g_pInvokeSensorFunc[i]);//----(2.3)获取指定sensor的fun函数,例如ov5670的func  
    42.             if (NULL == g_pInvokeSensorFunc[i]) {  
    43.                 PK_ERR("ERROR:NULL g_pSensorFunc[%d] ",i);  
    44.             return -EIO;  
    45.             }  
    46.             //  
    47.             spin_lock(&kdsensor_drv_lock);  
    48.             g_bEnableDriver[i] = TRUE;  
    49.             spin_unlock(&kdsensor_drv_lock);  
    50.             //get sensor name  
    51.             memcpy((char*)g_invokeSensorNameStr[i],(char*)pSensorList[drvIdx[i]].drvname,sizeof(pSensorList[drvIdx[i]].drvname));  
    52.             //return sensor ID  
    53.             //pDrvIndex[0] = (unsigned int)pSensorList[drvIdx].SensorId;  
    54.             PK_XLOG_INFO("[kdSetDriver] :[%d][%d][%d][%s][%d] ",i,g_bEnableDriver[i],g_invokeSocketIdx[i],g_invokeSensorNameStr[i],sizeof(pSensorList[drvIdx[i]].drvname));  
    55.         }  
    56.     }  
    57.     return 0;  
    58. }  

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

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

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. * general camera image sensor kernel driver 
    3. *******************************************************************************/  
    4. UINT32 kdGetSensorInitFuncList(ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT **ppSensorList)  
    5. {  
    6.     if (NULL == ppSensorList)  
    7.     {  
    8.         PK_DBG("[kdGetSensorInitFuncList]ERROR: NULL ppSensorList ");  
    9.         return 1;  
    10.     }  
    11.     *ppSensorList = &kdSensorList[0];  
    12.     return 0;  
    13. // kdGetSensorInitFuncList()  

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

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

    [cpp] view plaincopy
     
    1. ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] =  
    2. {  
    3. //add by zym  
    4. #if defined(GC2235_MIPI_RAW)  
    5.     {GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, GC2235MIPISensorInit},   
    6. #endif  
    7.   
    8. // add by zhouzuoyu  
    9. #if defined(GC2235_KOTECH_MIPI_RAW)  
    10.     {GC2235MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2235_MIPI_RAW, GC2235MIPISensorInit},   
    11. #endif  
    12.   
    13. #if defined(OV16825_MIPI_RAW)  
    14.         {OV16825MIPI_SENSOR_ID, SENSOR_DRVNAME_OV16825_MIPI_RAW, OV16825MIPISensorInit},   
    15. #endif  
    16. #if defined(IMX135_MIPI_RAW)  
    17.         {IMX135_SENSOR_ID, SENSOR_DRVNAME_IMX135_MIPI_RAW, IMX135_MIPI_RAW_SensorInit},   
    18. #endif  
    19. #if defined(OV8830_RAW)  
    20.     {OV8830_SENSOR_ID, SENSOR_DRVNAME_OV8830_RAW, OV8830SensorInit},   
    21. #endif  
    22. /*  ADD sensor driver before this line */  
    23.     {0,{0},NULL}, //end of list  
    24. };  
    25. //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;">  
    26. </span></span>  

    (2.2)g_invokeSocketIdx,drvIdx解释

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

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

             调用的函数是OV5670_MIPI_RAW_SensorInit()。

    [cpp] view plaincopy
     
    1. #if defined(OV5670_MIPI_RAW)  
    2.     {OV5670_SENSOR_ID, SENSOR_DRVNAME_OV5670_MIPI_RAW, OV5670_MIPI_RAW_SensorInit},   
    3. #endif  

                

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

    [cpp] view plaincopy
     
    1. SENSOR_FUNCTION_STRUCT  SensorFuncOV5670=  
    2. {  
    3.     OV5670Open,  
    4.     OV5670GetInfo,  
    5.     OV5670GetResolution,  
    6.     OV5670FeatureControl,  
    7.     OV5670Control,  
    8.     OV5670Close  
    9. };  
    10.   
    11. UINT32 OV5670_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc)//---调用此函数  
    12. {  
    13.     if (pfFunc!=NULL)  
    14.         *pfFunc=&SensorFuncOV5670;  
    15.   
    16.     return ERROR_NONE;  
    17. }  

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

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

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

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. * adopt_CAMERA_HW_CheckIsAlive 
    3. ********************************************************************************/  
    4. inline static int adopt_CAMERA_HW_CheckIsAlive(void)  
    5. {  
    6.     UINT32 err = 0;  
    7.     UINT32 err1 = 0;  
    8.     UINT32 i = 0;  
    9.     MUINT32 sensorID = 0;  
    10.     MUINT32 retLen = 0;  
    11.   
    12.   
    13.     KD_IMGSENSOR_PROFILE_INIT();  
    14.     //power on sensor  
    15.     kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr,true, CAMERA_HW_DRVNAME1);//----(3.1)sensor上电  
    16.     //wait for power stable  
    17.     mDELAY(10);  
    18.     KD_IMGSENSOR_PROFILE("kdModulePowerOn");  
    19.   
    20.     if (g_pSensorFunc) {  
    21.         for ( i = KDIMGSENSOR_INVOKE_DRIVER_0 ; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
    22.             if(DUAL_CAMERA_NONE_SENSOR != g_invokeSocketIdx[i]){  
    23.                 err = g_pSensorFunc->SensorFeatureControl(g_invokeSocketIdx[i], SENSOR_FEATURE_CHECK_SENSOR_ID, (MUINT8*)&sensorID, &retLen);//---(3.2)获取sensor ID  
    24.                 if (sensorID == 0) {    //not implement this feature ID  
    25.                     PK_DBG(" Not implement!!, use old open function to check ");  
    26.                     err = ERROR_SENSOR_CONNECT_FAIL;  
    27.                 }  
    28.                 else if (sensorID == 0xFFFFFFFF) {    //fail to open the sensor  
    29.                     PK_DBG(" No Sensor Found");  
    30.                     err = ERROR_SENSOR_CONNECT_FAIL;  
    31.                 }  
    32.                 else {  
    33.   
    34.                     PK_DBG(" Sensor found ID = 0x%x ", sensorID);  
    35.                     err = ERROR_NONE;  
    36.                 }  
    37.                 if(ERROR_NONE != err)  
    38.                 {  
    39.                     PK_DBG("ERROR:adopt_CAMERA_HW_CheckIsAlive(), No imgsensor alive  ");  
    40.                 }  
    41.             }  
    42.         }  
    43.     }  
    44.     else {  
    45.         PK_DBG("ERROR:NULL g_pSensorFunc ");  
    46.     }  
    47.   
    48.     //reset sensor state after power off  
    49.     err1 = g_pSensorFunc->SensorClose();  
    50.     if(ERROR_NONE != err1) {  
    51.         PK_DBG("SensorClose  ");  
    52.     }  
    53.     //  
    54.     kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr, false, CAMERA_HW_DRVNAME1);      
    55.     //  
    56.     KD_IMGSENSOR_PROFILE("CheckIsAlive");  
    57.   
    58.     return err?-EIO:err;  
    59. }   /* adopt_CAMERA_HW_Open() */  


    (3.1)Sensor 上电, kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*)g_invokeSocketIdx, g_invokeSensorNameStr,true, CAMERA_HW_DRVNAME1);

    [cpp] view plaincopy
     
    1. /******************************************************************************* 
    2. * kdModulePowerOn 
    3. ********************************************************************************/  
    4. int  
    5. kdModulePowerOn(  
    6. CAMERA_DUAL_CAMERA_SENSOR_ENUM socketIdx[KDIMGSENSOR_MAX_INVOKE_DRIVERS],  
    7. char sensorNameStr[KDIMGSENSOR_MAX_INVOKE_DRIVERS][32],  
    8. BOOL On,  
    9. char* mode_name )  
    10. {  
    11. MINT32 ret = ERROR_NONE;  
    12. u32 i = 0;  
    13.   
    14.     for ( i = KDIMGSENSOR_INVOKE_DRIVER_0 ; i < KDIMGSENSOR_MAX_INVOKE_DRIVERS ; i++ ) {  
    15.         if ( g_bEnableDriver[i] ) {  
    16.             //PK_XLOG_INFO("[%s][%d][%d][%s][%s] ",__FUNCTION__,g_bEnableDriver[i],socketIdx[i],sensorNameStr[i],mode_name);  
    17.             ret = kdCISModulePowerOn(socketIdx[i],sensorNameStr[i],On,mode_name);//实际上电的func  
    18.             if ( ERROR_NONE != ret ) {  
    19.                 PK_ERR("[%s]",__FUNCTION__);  
    20.                 return ret;  
    21.             }  
    22.         }  
    23.     }  
    24.     return ERROR_NONE;  
    25. }  


    ===>mediatek/custom/huaqin82_slwt_2s_td/kernel/camera/camera/kd_camera_hw.c

    [cpp] view plaincopy
     
    1. int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, BOOL On, char* mode_name)  
    2. {  
    3.     PK_DBG("[camera] **kdCISModulePowerOn:SensorIdx:%d,pinSetIdx:%d",SensorIdx,pinSetIdx);  
    4.     //dump_stack();  
    5.     if (DUAL_CAMERA_MAIN_SENSOR == SensorIdx){  
    6.     if (currSensorName &&   
    7.        ((0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
    8.        ||(0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName))  
    9.        ||(0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName))  
    10.           ||(0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))  
    11.         ||(0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName))  
    12.         ||(0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName))  
    13.       ||(0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName))  
    14.        ||(0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName))  
    15.         || (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))  
    16.         || (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))  
    17.        ||(0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName))  
    18.         ||(0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))  
    19.               ||(0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName))  
    20.         ||(0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))  
    21.         ||(0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV, currSensorName))  
    22.         || (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV, currSensorName))  
    23.         ||(0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW, currSensorName))  
    24.         ||(0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName))  
    25.         ||(0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName))  
    26.         //|| to add other main camera here  
    27.        ))  
    28.             pinSetIdx = 0;  
    29.     else  
    30.     {  
    31.         PK_DBG("[ryf-main]kdCISModulePowerOn get in---  sensorIdx not compare with sensor name: %s ", currSensorName);  
    32.         //if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName)))  
    33.         //{  
    34.         //      pinSetIdx = 1;  
    35.         //}  
    36.         //else{  
    37.             goto _kdCISModulePowerOn_exit_;  
    38.         //}  
    39.     }  
    40.     }  
    41.     else if (DUAL_CAMERA_SUB_SENSOR == SensorIdx) {  
    42.     if (currSensorName &&   
    43.         ((0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName))  
    44.         || (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName))  
    45.         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW, currSensorName))  
    46.           || (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName))  
    47.           || (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName))     
    48.          || (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName))   
    49.           || (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName))   
    50.         || (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
    51.         || (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))  
    52.         ||(0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))  
    53.         ||(0 == strcmp(SENSOR_DRVNAME_GC0312_YUV, currSensorName))  
    54.         ||(0 == strcmp(SENSOR_DRVNAME_HI704_YUV, currSensorName))  
    55.               //||(0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV, currSensorName))  
    56.         //|| to add other sub camera here  
    57.        ))  
    58.             pinSetIdx = 1;  
    59.     else  
    60.     {  
    61.         //if (currSensorName &&  
    62.            //((0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))  
    63.             //|| to add other main camera here  
    64.            //))  
    65.         //{  
    66.         //  pinSetIdx = 0;  
    67.         //}  
    68.         PK_DBG("{ryf-sub}kdCISModulePowerOn get in---  sensorIdx not compare with sensro:%s ",currSensorName);  
    69.         goto _kdCISModulePowerOn_exit_;  
    70.     }  
    71.     }  
    72.     else if (DUAL_CAMERA_MAIN_2_SENSOR == SensorIdx) {  
    73.        // pinSetIdx = 2;  
    74.     }  
    75.   
    76.     PK_DBG("kdCISModulePowerOn:SensorIdx:%d,pinSetIdx:%d",SensorIdx,pinSetIdx);  
    77.     Rst_PDN_Init();  
    78.   
    79.     //power ON  
    80.     if (On)   
    81.     {  
    82.      PK_DBG("kdCISModulePowerOn -on:currSensorName=%s ",currSensorName);  
    83.         if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))) {  
    84.             PK_DBG("is ov5648mipi on ");  
    85.             if (0 == pinSetIdx) {  
    86.                 if (TRUE != kd_ov5648_main_poweron(mode_name))  
    87.                     goto _kdCISModulePowerOn_exit_;  
    88.             } else if (1 == pinSetIdx) {  
    89.                 if (TRUE != kd_ov5648_sub_poweron(mode_name))  
    90.                     goto _kdCISModulePowerOn_exit_;  
    91.             }  
    92.         }   
    93.     else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName)))             
    94.         {  
    95.         PK_DBG("is s5k4e1ga on  ");  
    96.             if(TRUE != kd_s5k4e1gamipi_poweron(mode_name))  
    97.                  goto _kdCISModulePowerOn_exit_;  
    98.         }   
    99.     else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName)))            
    100.         {  
    101.         PK_DBG("is hi544 on  ");  
    102.             if(TRUE != kd_hi544raw_poweron(mode_name))  
    103.                  goto _kdCISModulePowerOn_exit_;  
    104.         }   
    105.        else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName)))            
    106.         {  
    107.          PK_DBG("is gc2235 on ");  
    108.             if(TRUE != kd_gc2235mipiraw_poweron(mode_name))  
    109.                  goto _kdCISModulePowerOn_exit_;  
    110.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))) {  
    111.             PK_DBG("is gc2235_raw on ");  
    112.               
    113.             if (TRUE != kd_gc2235raw_poweron(mode_name))  
    114.                  goto _kdCISModulePowerOn_exit_;  
    115.         }    
    116. /*  else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI253_YUV,currSensorName))) 
    117.         { 
    118.          PK_DBG("is hi253 on "); 
    119.             if(TRUE != kd_hi253yuv_poweron(mode_name)) 
    120.                  goto _kdCISModulePowerOn_exit_; 
    121.         }*/  
    122.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName))) {    
    123.         PK_DBG("is ov88251 on  ");   
    124.         if(TRUE != kd_ov88251mipiraw_poweron(mode_name))      
    125.                 goto _kdCISModulePowerOn_exit_;  
    126.         }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName))) {   
    127.         PK_DBG("is ov88252 on  ");   
    128.         if(TRUE != kd_ov88252mipiraw_poweron(mode_name))      
    129.                 goto _kdCISModulePowerOn_exit_;  
    130.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))) {  
    131.             PK_DBG("is ov8858 on  ");  
    132.             kd_a5142mipiraw_sub_poweron(mode_name);  
    133.             kd_a5142mipiraw_sub_powerdown(mode_name);  
    134.             if(TRUE != kd_ov8858mipiraw_poweron(mode_name))   
    135.                 goto _kdCISModulePowerOn_exit_;  
    136.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW,currSensorName))) {  
    137.             PK_DBG("is s5k4h5yx on  ");  
    138.             kd_a5142mipiraw_sub_poweron(mode_name);  
    139.             kd_a5142mipiraw_sub_powerdown(mode_name);  
    140.             if (TRUE != kd_s5k4h5yxmipiraw_poweron(mode_name))    
    141.                 goto _kdCISModulePowerOn_exit_;  
    142.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))) {  
    143.             PK_DBG("is t4k35 on  ");     
    144.             if(TRUE != kd_t4k35mipiraw_poweron(mode_name))    
    145.                 goto _kdCISModulePowerOn_exit_;  
    146.         } else if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))   
    147.         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName)))) {  
    148.             if(pinSetIdx==0)  
    149.             {  
    150.                 if(TRUE != kd_s5k3h7ymipiraw_poweron(mode_name))  
    151.                     goto _kdCISModulePowerOn_exit_;  
    152.             }  
    153.             else  
    154.             {  
    155.                 if(TRUE != kd_s5k3h72ymipiraw_poweron(mode_name))  
    156.                     goto _kdCISModulePowerOn_exit_;  
    157.             }  
    158.         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName))) {  
    159.          PK_DBG("is gc2035 on ");  
    160.             if(TRUE != kd_gc2035_poweron(mode_name))  
    161.                  goto _kdCISModulePowerOn_exit_;  
    162.         }   
    163.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName)))  
    164.         {  
    165.             if(TRUE != kd_ov5648a_poweron(mode_name))  
    166.                  goto _kdCISModulePowerOn_exit_;  
    167.         }  
    168.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName)))  
    169.         {  
    170.             if(TRUE != kd_ov5670_poweron(mode_name))  
    171.                  goto _kdCISModulePowerOn_exit_;  
    172.         }  
    173.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName)))  
    174.         {  
    175.             if(TRUE != kd_hi551_poweron(mode_name))  
    176.                  goto _kdCISModulePowerOn_exit_;  
    177.         }  
    178.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName)))  
    179.         {  
    180.             if(TRUE != kd_ov5648b_poweron(mode_name))  
    181.                  goto _kdCISModulePowerOn_exit_;  
    182.         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))) //lili add  
    183.         {  
    184.             if(TRUE != kd_ov5648_main_poweron(mode_name))  
    185.                  goto _kdCISModulePowerOn_exit_;  
    186.         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName))) {  
    187.          PK_DBG("is s5k3h72ymipi on ");  
    188.             if(TRUE != kd_s5k3h72ymipiraw_poweron(mode_name))  
    189.                  goto _kdCISModulePowerOn_exit_;  
    190.         } else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName)))              
    191.                 {  
    192.                    PK_DBG("is gc0329 on ");  
    193.                        if(TRUE != kd_gc0329_poweron(mode_name))  
    194.                                 goto _kdCISModulePowerOn_exit_;  
    195.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))) {  
    196.             if (0 == pinSetIdx) {  
    197.                 PK_DBG("is A5142 main on  ");  
    198.                 if(TRUE != kd_a5142mipiraw_main_poweron(mode_name))  
    199.                     goto _kdCISModulePowerOn_exit_;  
    200.             } else {  
    201.                 PK_DBG("is A5142 sub on  ");  
    202.                 if(TRUE != kd_a5142mipiraw_sub_poweron(mode_name))  
    203.                     goto _kdCISModulePowerOn_exit_;  
    204.             }  
    205.               
    206.            }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0312_YUV,currSensorName)))            
    207.                 {  
    208.                    PK_DBG("is gc0312 on ");    
    209.                        if(TRUE != kd_gc0312_poweron(mode_name))  
    210.                                 goto _kdCISModulePowerOn_exit_;  
    211.            }   
    212.            else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI704_YUV,currSensorName)))              
    213.                 {  
    214.                    PK_DBG("is hi704 on ");    
    215.                        if(TRUE != kd_hi704yuv_poweron(mode_name))  
    216.                                 goto _kdCISModulePowerOn_exit_;  
    217.            }   
    218.                else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV,currSensorName)))            
    219.                 {  
    220.                    PK_DBG("is gc0310 on ");  
    221.                        if(TRUE != kd_gc0310_poweron(mode_name))  
    222.                                 goto _kdCISModulePowerOn_exit_;  
    223.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV,currSensorName))) {  
    224.             PK_DBG("is gc2145 on ");  
    225.   
    226.             if (TRUE != kd_gc2145_poweron(mode_name))  
    227.                 goto _kdCISModulePowerOn_exit_;  
    228.         }  
    229.         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName)))  
    230.         {     
    231.             PK_DBG("is hi258 on  ");   
    232.             if(TRUE != kd_hi258mipiraw_poweron(mode_name))  
    233.                 goto _kdCISModulePowerOn_exit_;  
    234.         }  
    235.          else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName))) {  
    236.             PK_DBG("is ov2680 on  ");    
    237.             if(TRUE != kd_ov2680mipiraw_poweron(mode_name))   
    238.                 goto _kdCISModulePowerOn_exit_;  
    239.         }  
    240.     else   
    241.     {  
    242.         PK_DBG("kdCISModulePowerOn get in---  other , please add the power on code!!!!!! ");  
    243.         goto _kdCISModulePowerOn_exit_;  
    244.         }  
    245.   }  
    246.   else {//power OFF  
    247.   
    248.     PK_DBG("kdCISModulePowerOn -off:currSensorName=%s ",currSensorName);  
    249.   
    250.   
    251.      if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName)))           
    252.         {  
    253.             PK_DBG("is ov5648_mipi_raw down ");  
    254.             if (0 == pinSetIdx) {  
    255.                 if(TRUE != kd_ov5648_main_powerdown(mode_name))  
    256.                     goto _kdCISModulePowerOn_exit_;  
    257.             } else if (1 == pinSetIdx) {  
    258.                 if(TRUE != kd_ov5648_sub_powerdown(mode_name))  
    259.                     goto _kdCISModulePowerOn_exit_;  
    260.             }  
    261.         } else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW,currSensorName)))              
    262.         {  
    263.          PK_DBG("is s5k4e1ga down ");  
    264.             if(TRUE != kd_s5k4e1gamipi_powerdown(mode_name))  
    265.                  goto _kdCISModulePowerOn_exit_;  
    266.         }  
    267.         else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW,currSensorName)))           
    268.         {  
    269.          PK_DBG("is hi544 down ");  
    270.             if(TRUE != kd_hi544raw_powerdown(mode_name))  
    271.                  goto _kdCISModulePowerOn_exit_;  
    272.         }  
    273.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88251_MIPI_RAW,currSensorName)))  
    274.         {  
    275.             PK_DBG("is ov88251 down ");  
    276.              if(TRUE != kd_ov88251mipiraw_powerdown(mode_name))  
    277.               goto _kdCISModulePowerOn_exit_;     
    278.           
    279.         }  
    280.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5670_MIPI_RAW,currSensorName)))  
    281.         {  
    282.             PK_DBG("is ov5670 down ");  
    283.              if(TRUE != kd_ov5670mipiraw_powerdown(mode_name))  
    284.               goto _kdCISModulePowerOn_exit_;     
    285.           
    286.         }  
    287.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI551_MIPI_RAW,currSensorName)))  
    288.         {  
    289.             PK_DBG("is hi551 down ");  
    290.              if(TRUE != kd_hi551mipiraw_powerdown(mode_name))  
    291.               goto _kdCISModulePowerOn_exit_;     
    292.           
    293.         }  
    294.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV88252_MIPI_RAW,currSensorName)))  
    295.         {  
    296.             PK_DBG("is ov88252 down ");  
    297.              if(TRUE != kd_ov88252mipiraw_powerdown(mode_name))  
    298.               goto _kdCISModulePowerOn_exit_;             
    299.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV8858_MIPI_RAW,currSensorName))) {  
    300.             PK_DBG("is ov8858 down ");  
    301.             if(TRUE != kd_ov8858mipiraw_powerdown(mode_name))  
    302.                 goto _kdCISModulePowerOn_exit_;  
    303.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K4H5YX_MIPI_RAW, currSensorName))) {  
    304.             PK_DBG("is s5k4h5yx down ");  
    305.             if (TRUE != kd_s5k4h5yxmipiraw_powerdown(mode_name))  
    306.                 goto _kdCISModulePowerOn_exit_;  
    307.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_T4K35_MIPI_RAW,currSensorName))) {  
    308.             PK_DBG("is t4k35 down ");  
    309.             if(TRUE != kd_t4k35mipiraw_powerdown(mode_name))  
    310.                 goto _kdCISModulePowerOn_exit_;  
    311.         }  
    312.     else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_MIPI_RAW,currSensorName)))              
    313.         {  
    314.          PK_DBG("is gc2235 down ");  
    315.             if(TRUE != kd_gc2235mipiraw_powerdown(mode_name))  
    316.                  goto _kdCISModulePowerOn_exit_;  
    317.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2235_RAW,currSensorName))) {  
    318.             PK_DBG("is gc2235 down ");  
    319.               
    320.             if (TRUE != kd_gc2235raw_powerdown(mode_name))  
    321.                  goto _kdCISModulePowerOn_exit_;  
    322.         }  
    323. /*  else  if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI253_YUV,currSensorName))) 
    324.         { 
    325.          PK_DBG("is hi253 down "); 
    326.             if(TRUE != kd_hi253yuv_powerdown(mode_name)) 
    327.                  goto _kdCISModulePowerOn_exit_; 
    328.         }*/   
    329.         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_A5142_MIPI_RAW, currSensorName))) {  
    330.             if (0 == pinSetIdx) {  
    331.                 PK_DBG("is A5142 main down  ");  
    332.                 if (TRUE != kd_a5142mipiraw_main_powerdown(mode_name))  
    333.                 goto _kdCISModulePowerOn_exit_;  
    334.             } else {  
    335.                 PK_DBG("is A5142 sub down  ");  
    336.                 if (TRUE != kd_a5142mipiraw_sub_powerdown(mode_name))  
    337.                 goto _kdCISModulePowerOn_exit_;  
    338.             }  
    339.         } else if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_MIPI_RAW,currSensorName))   
    340.         || (0 == strcmp(SENSOR_DRVNAME_S5K3H7Y_2LANE_MIPI_RAW,currSensorName))))      
    341.         {  
    342.                     PK_DBG("is s5k3h7 down ");  
    343.                 if(pinSetIdx==0)  
    344.                         {  
    345.                  if(TRUE != kd_s5k3h7ymipiraw_powerdown(mode_name))  
    346.                   goto _kdCISModulePowerOn_exit_;  
    347.                 }  
    348.                 else {  
    349.                 if(TRUE != kd_s5k3h72ymipiraw_powerdown(mode_name))  
    350.                           goto _kdCISModulePowerOn_exit_;  
    351.                 }  
    352.   
    353.         }  
    354.           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV,currSensorName)))              
    355.         {  
    356.          PK_DBG("is gc2035 down ");  
    357.             if(TRUE != kd_gc2035_powerdown(mode_name))  
    358.                  goto _kdCISModulePowerOn_exit_;  
    359.         }  
    360.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_S5K3H72Y_MIPI_RAW,currSensorName)))             
    361.         {  
    362.          PK_DBG("is s5k3h72y_mipi_raw down ");  
    363.             if(TRUE != kd_s5k3h72ymipiraw_powerdown(mode_name))  
    364.                  goto _kdCISModulePowerOn_exit_;  
    365.         }  
    366.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648A_MIPI_RAW,currSensorName)))  
    367.         {  
    368.             if(TRUE != kd_ov5648a_powerdown(mode_name))  
    369.                  goto _kdCISModulePowerOn_exit_;  
    370.         }  
    371.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648B_MIPI_RAW,currSensorName)))  
    372.         {  
    373.             if(TRUE != kd_ov5648b_powerdown(mode_name))  
    374.                  goto _kdCISModulePowerOn_exit_;  
    375.         }else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_LARGEN_MIPI_RAW,currSensorName))) //lili add  
    376.         {  
    377.             if(TRUE != kd_ov5648_main_powerdown(mode_name))  
    378.                  goto _kdCISModulePowerOn_exit_;  
    379.         }  
    380.       else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0329_YUV,currSensorName)))              
    381.        {  
    382.                 PK_DBG("is gc0329 down ");  
    383.                     if(TRUE != kd_gc0329yuv_powerdown(mode_name))  
    384.                             goto _kdCISModulePowerOn_exit_;  
    385.         }   
    386.        else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0312_YUV,currSensorName)))             
    387.        {  
    388.                 PK_DBG("is gc0312 down ");  
    389.                     if(TRUE != kd_gc0312_powerdown(mode_name))  
    390.                             goto _kdCISModulePowerOn_exit_;  
    391.         }   
    392.           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI704_YUV,currSensorName)))           
    393.        {  
    394.                 PK_DBG("is hi704 down ");  
    395.                     if(TRUE != kd_hi704yuv_powerdown(mode_name))  
    396.                             goto _kdCISModulePowerOn_exit_;  
    397.         }  
    398.           else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC0310_MIPI_YUV,currSensorName)))             
    399.        {  
    400.                 PK_DBG("is gc0310 down ");  
    401.                     if(TRUE != kd_gc0310_powerdown(mode_name))  
    402.                             goto _kdCISModulePowerOn_exit_;  
    403.         } else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC2145_MIPI_YUV,currSensorName))) {  
    404.             PK_DBG("is gc2145 down ");  
    405.   
    406.             if (TRUE != kd_gc2145_powerdown(mode_name))  
    407.                 goto _kdCISModulePowerOn_exit_;  
    408.         }   
    409.         else if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_HI258MIPI_YUV,currSensorName)))  
    410.         {  
    411.             PK_DBG("is hi258 down ");  
    412.             if(TRUE != kd_hi258mipiraw_powerdown(mode_name))  
    413.                 goto _kdCISModulePowerOn_exit_;  
    414.     }  
    415.         else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV2680_MIPI_RAW,currSensorName)))  
    416.          {  
    417.             PK_DBG("is ov2680 down ");  
    418.             if(TRUE != kd_ov2680mipiraw_powerdown(mode_name))  
    419.                 goto _kdCISModulePowerOn_exit_;  
    420.     }   
    421.     else   
    422.     {  
    423.         PK_DBG("kdCISModulePowerDown get in---  other , please add the power down code!!!!!! ");  
    424.         goto _kdCISModulePowerOn_exit_;  
    425.         }  
    426.   
    427.   }  
    428.     return 0;  
    429.   
    430. _kdCISModulePowerOn_exit_:  
    431.     return -EIO;  
    432. }  
    433. EXPORT_SYMBOL(kdCISModulePowerOn);  

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

    [cpp] view plaincopy
     
    1. static int kd_ov5670_poweron( char *mode_name)  
    2. {  
    3.     int ret;  
    4.         printk("kd_ov5670_poweron1 start.. ");  
    5.   
    6.         ret = kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1200, VOL_2800, mode_name,0);//给camera上三路电  
    7.      PK_DBG("kd_ov88251mipiraw_poweron start.. ");  
    8.         mdelay(10);// wait power to be stable    
    9.         //disable_inactive_sensor();//disable inactive sensor  
    10.         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!!  ");}  
    11.         mdelay(10);  
    12.         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!!  ");}  
    13.         mdelay(1);  
    14.       
    15.     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!!  ");}  
    16.     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!!  ");}  
    17.     mdelay(10);  
    18.     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!!  ");}  
    19.     mdelay(5);  
    20. poweronerr:  
    21.     return ret;  
    22. }  


    (3.2)获取sensor ID,err = g_pSensorFunc->SensorFeatureControl(g_invokeSocketIdx[i], SENSOR_FEATURE_CHECK_SENSOR_ID, (MUINT8*)&sensorID, &retLen);

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

    [cpp] view plaincopy
     
    1. OV5670FeatureControl  

    ===>mediatek/custom/common/kernel/imgsensor/ov5670_mipi_raw

    [cpp] view plaincopy
     
    1. UINT32 OV5670FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId,  
    2.                                                                 UINT8 *pFeaturePara,UINT32 *pFeatureParaLen)  
    3. {  
    4.     UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara;  
    5.     UINT16 *pFeatureData16=(UINT16 *) pFeaturePara;  
    6.     UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara;  
    7.     UINT32 *pFeatureData32=(UINT32 *) pFeaturePara;  
    8.     UINT32 SensorRegNumber;  
    9.     UINT32 i;  
    10.     PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara;  
    11.     MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara;  
    12.     MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara;  
    13.     MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara;  
    14.     MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara;  
    15.     MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara;  
    16.   
    17.     switch (FeatureId)  
    18.     {  
    19.         case SENSOR_FEATURE_GET_RESOLUTION:  
    20.             *pFeatureReturnPara16++= OV5670_IMAGE_SENSOR_FULL_WIDTH;  
    21.             *pFeatureReturnPara16= OV5670_IMAGE_SENSOR_FULL_HEIGHT;  
    22.             *pFeatureParaLen=4;  
    23.             break;  
    24.         case SENSOR_FEATURE_GET_PERIOD:  
    25.                                 *pFeatureReturnPara16++= OV5670_FeatureControl_PERIOD_PixelNum;  
    26.                                 *pFeatureReturnPara16= OV5670_FeatureControl_PERIOD_LineNum;  
    27.                                 *pFeatureParaLen=4;  
    28.                                 break;  
    29.         case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ:  
    30.                         switch(OV5670CurrentScenarioId)  
    31.                         {  
    32.                                 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:  
    33.                                         *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK;  
    34.                                         *pFeatureParaLen=4;  
    35.                                         break;  
    36.                                 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:  
    37.                                         *pFeatureReturnPara32 = OV5670_VIDEO_PCLK;  
    38.                                         *pFeatureParaLen=4;  
    39.                                         break;  
    40.                                 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:  
    41.                                 case MSDK_SCENARIO_ID_CAMERA_ZSD:  
    42.                                         *pFeatureReturnPara32 = OV5670_CAPTURE_PCLK;  
    43.                                         *pFeatureParaLen=4;  
    44.                                         break;  
    45.                                 default:  
    46.                                         *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK;  
    47.                                         *pFeatureParaLen=4;  
    48.                                         break;  
    49.                         }  
    50.                     break;  
    51.   
    52.         case SENSOR_FEATURE_SET_ESHUTTER:  
    53.             OV5670_SetShutter(*pFeatureData16);  
    54.             break;  
    55.         case SENSOR_FEATURE_SET_NIGHTMODE:  
    56.             OV5670_NightMode((BOOL) *pFeatureData16);  
    57.             break;  
    58.         case SENSOR_FEATURE_SET_GAIN:  
    59.            OV5670_SetGain((UINT16) *pFeatureData16);  
    60.             break;  
    61.         case SENSOR_FEATURE_SET_FLASHLIGHT:  
    62.             break;  
    63.         case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ:  
    64.             //OV5670_isp_master_clock=*pFeatureData32;  
    65.             break;  
    66.         case SENSOR_FEATURE_SET_REGISTER:  
    67.             OV5670_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData);  
    68.             break;  
    69.         case SENSOR_FEATURE_GET_REGISTER:  
    70.             pSensorRegData->RegData = OV5670_read_cmos_sensor(pSensorRegData->RegAddr);  
    71.             break;  
    72.         case SENSOR_FEATURE_SET_CCT_REGISTER:  
    73.             SensorRegNumber=FACTORY_END_ADDR;  
    74.             for (i=0;i<SensorRegNumber;i++)  
    75.             {  
    76.                 spin_lock(&ov5670mipiraw_drv_lock);  
    77.                 OV5670SensorCCT[i].Addr=*pFeatureData32++;  
    78.                 OV5670SensorCCT[i].Para=*pFeatureData32++;  
    79.                                 spin_unlock(&ov5670mipiraw_drv_lock);  
    80.             }  
    81.             break;  
    82.         case SENSOR_FEATURE_GET_CCT_REGISTER:  
    83.             SensorRegNumber=FACTORY_END_ADDR;  
    84.             if (*pFeatureParaLen<(SensorRegNumber*sizeof(SENSOR_REG_STRUCT)+4))  
    85.                 return FALSE;  
    86.             *pFeatureData32++=SensorRegNumber;  
    87.             for (i=0;i<SensorRegNumber;i++)  
    88.             {  
    89.                 *pFeatureData32++=OV5670SensorCCT[i].Addr;  
    90.                 *pFeatureData32++=OV5670SensorCCT[i].Para;  
    91.             }  
    92.             break;  
    93.         case SENSOR_FEATURE_SET_ENG_REGISTER:  
    94.             SensorRegNumber=ENGINEER_END;  
    95.             for (i=0;i<SensorRegNumber;i++)  
    96.             {  
    97.                 spin_lock(&ov5670mipiraw_drv_lock);  
    98.                 OV5670SensorReg[i].Addr=*pFeatureData32++;  
    99.                 OV5670SensorReg[i].Para=*pFeatureData32++;  
    100.                                 spin_unlock(&ov5670mipiraw_drv_lock);  
    101.             }  
    102.             break;  
    103.         case SENSOR_FEATURE_GET_ENG_REGISTER:  
    104.             SensorRegNumber=ENGINEER_END;  
    105.             if (*pFeatureParaLen<(SensorRegNumber*sizeof(SENSOR_REG_STRUCT)+4))  
    106.                 return FALSE;  
    107.             *pFeatureData32++=SensorRegNumber;  
    108.             for (i=0;i<SensorRegNumber;i++)  
    109.             {  
    110.                 *pFeatureData32++=OV5670SensorReg[i].Addr;  
    111.                 *pFeatureData32++=OV5670SensorReg[i].Para;  
    112.             }  
    113.             break;  
    114.         case SENSOR_FEATURE_GET_REGISTER_DEFAULT:  
    115.             if (*pFeatureParaLen>=sizeof(NVRAM_SENSOR_DATA_STRUCT))  
    116.             {  
    117.                 pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION;  
    118.                 pSensorDefaultData->SensorId=OV5670_SENSOR_ID;  
    119.                 memcpy(pSensorDefaultData->SensorEngReg, OV5670SensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END);  
    120.                 memcpy(pSensorDefaultData->SensorCCTReg, OV5670SensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR);  
    121.             }  
    122.             else  
    123.                 return FALSE;  
    124.             *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT);  
    125.             break;  
    126.         case SENSOR_FEATURE_GET_CONFIG_PARA:  
    127.             memcpy(pSensorConfigData, &OV5670SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT));  
    128.             *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT);  
    129.             break;  
    130.         case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR:  
    131.             OV5670_camera_para_to_sensor();  
    132.             break;  
    133.   
    134.         case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA:  
    135.             OV5670_sensor_to_camera_para();  
    136.             break;  
    137.         case SENSOR_FEATURE_GET_GROUP_COUNT:  
    138.             *pFeatureReturnPara32++=OV5670_get_sensor_group_count();  
    139.             *pFeatureParaLen=4;  
    140.             break;  
    141.         case SENSOR_FEATURE_GET_GROUP_INFO:  
    142.             OV5670_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount);  
    143.             *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT);  
    144.             break;  
    145.         case SENSOR_FEATURE_GET_ITEM_INFO:  
    146.             OV5670_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo);  
    147.             *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT);  
    148.             break;  
    149.   
    150.         case SENSOR_FEATURE_SET_ITEM_INFO:  
    151.             OV5670_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue);  
    152.             *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT);  
    153.             break;  
    154.   
    155.         case SENSOR_FEATURE_GET_ENG_INFO:  
    156.             pSensorEngInfo->SensorId = 129;  
    157.             pSensorEngInfo->SensorType = CMOS_SENSOR;  
    158.             pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_Gb;  
    159.             *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT);  
    160.             break;  
    161.         case SENSOR_FEATURE_GET_LENS_DRIVER_ID:  
    162.             // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE  
    163.             // if EEPROM does not exist in camera module.  
    164.             *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE;  
    165.             *pFeatureParaLen=4;  
    166.             break;  
    167.   
    168.         case SENSOR_FEATURE_INITIALIZE_AF:  
    169.             break;  
    170.         case SENSOR_FEATURE_CONSTANT_AF:  
    171.             break;  
    172.         case SENSOR_FEATURE_MOVE_FOCUS_LENS:  
    173.             break;  
    174.         case SENSOR_FEATURE_SET_VIDEO_MODE:  
    175.             OV5670SetVideoMode(*pFeatureData16);  
    176.             break;  
    177.         case SENSOR_FEATURE_CHECK_SENSOR_ID://-------------调用此处读取ID  
    178.             OV5670GetSensorID(pFeatureReturnPara32);  
    179.             break;  
    180.         case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE:  
    181.             OV5670SetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1));  
    182.                 break;  
    183.                 case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO:  
    184.                         OV5670MIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1));  
    185.                         break;  
    186.                 case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO:  
    187.                         OV5670MIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1)));  
    188.                         break;  
    189.                 case SENSOR_FEATURE_SET_TEST_PATTERN:  
    190.                         OV5670SetTestPatternMode((BOOL)*pFeatureData16);  
    191.                         break;  
    192.                 case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE://for factory mode auto testing  
    193.                         *pFeatureReturnPara32=OV5670_TEST_PATTERN_CHECKSUM;  
    194.                         *pFeatureParaLen=4;  
    195.                      break;  
    196.         default:  
    197.             break;  
    198.     }  
    199.     return ERROR_NONE;  
    200. }  
    [cpp] view plaincopy
     
    1. UINT32 OV5670GetSensorID(UINT32 *sensorID)  
    2. {  
    3.     int  retry = 2;  
    4.   
    5.         OV5670DB("OV5670GetSensorID enter :  ");  
    6.     mdelay(5);  
    7.   
    8.     do {  
    9.         *sensorID = (OV5670_read_cmos_sensor(0x300B)<<8)|OV5670_read_cmos_sensor(0x300C);  
    10.         if (*sensorID == OV5670_SENSOR_ID)  
    11.                 {  
    12.                         OV5670DB("Sensor ID = 0x%04x ", *sensorID);  
    13.                 break;  
    14.                 }  
    15.         OV5670DB("Read Sensor ID Fail = 0x%04x ", *sensorID);  
    16.         retry--;  
    17.     } while (retry > 0);  
    18.   
    19.     if (*sensorID != OV5670_SENSOR_ID) {  
    20.                 OV5670DB("Read Sensor ID Fail = 0x%04x ", *sensorID);  
    21.   
    22.                 /* 
    23.         *sensorID = OV5670_SENSOR_ID; 
    24.         return ERROR_SENSOR_CONNECT_FAIL; 
    25.         */  
    26.          *sensorID = 0xFFFFFFFF;  
    27.      return ERROR_SENSOR_CONNECT_FAIL;  
    28.     }  
    29.     return ERROR_NONE;  
    30. }  

              以上是ov5670获取ID的函数。

    三、开机打开sensor总结           

      • 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下电

    三、开机打开sensor总结           

      • 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下电
  • 相关阅读:
    不透明度
    浮动塌陷
    滑动门技术
    文本替换
    清除浮动
    浮动
    定位概述
    IE6中使用通用选择器模拟子选择器效果
    js对象
    bzoj:2049: [Sdoi2008]Cave 洞穴勘测
  • 原文地址:https://www.cnblogs.com/reality-soul/p/4668532.html
Copyright © 2011-2022 走看看