MTK之camera框架
来源:互联网 发布:云端软件平台pc 编辑:程序博客网 时间:2024/05/21 22:38
/*自己分析camera驱动程序*/
image_sensor驱动程序
/ *
* case KDIMGSENSORIOC_X_SET_DRIVER:
* i4RetValue = kdSetDriver((unsigned int*)pBuff);
* /
关键函数 int kdSetDriver(unsigned int* pDrvIndex);
{
....
kdGetSensorInitFuncList(&pSensorList);//即 *pSensorList = &kdSensorList[0].
...
drvIdx[i] = (pDrvIndex[i] & KDIMGSENSOR_DUAL_MASK_LSB);//获得是哪一个驱动
...
pSensorList[drvIdx[i]].SensorInit;//判断sensorinit是否为空
pSensorList[drvIdx[i]].SensorInit(&g_pInvokeSensorFunc[i]);//即*g_pInvokeSensorFunc[i]
= &SensorFuncOV5647;
相应的ic驱动
/*ps:其中g_pInvokeSensorFunc为静态的全局变量*/
}
typedef struct{MUINT32 SensorId;MUINT8 drvname[32];
MUINT32 (* SensorInit)(PSENSOR_FUNCTION_STRUCT *pfFunc);} ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT, *PACDK_KD_SENSOR_INIT_FUNCTION_STRUCT;
ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT<strong> <span style="color:#ff0000;">kdSensorList</span></strong>[MAX_NUM_OF_SUPPORT_SENSOR+1] ={#if defined(OV8830_RAW) {OV8830_SENSOR_ID, SENSOR_DRVNAME_OV8830_RAW, OV8830SensorInit}, #endif#if defined(OV9740_MIPI_YUV) {OV9740MIPI_SENSOR_ID, SENSOR_DRVNAME_OV9740_MIPI_YUV, OV9740_MIPI_YUV_SensorInit}, #endif#if defined(IMX073_MIPI_RAW) {IMX073_SENSOR_ID, SENSOR_DRVNAME_IMX073_MIPI_RAW, IMX073_MIPI_RAW_SensorInit},#endif.....}
以SensorFuncOV5647系列的imagesensor为例:
typedef struct{ MUINT32 (* SensorOpen)(void); MUINT32 (* SensorGetInfo) (MUINT32 *pScenarioId[2], MSDK_SENSOR_INFO_STRUCT *pSensorInfo[2],MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData[2]); MUINT32 (* SensorGetResolution) (MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution[2]); MUINT32 (* SensorFeatureControl) (CAMERA_DUAL_CAMERA_SENSOR_ENUM InvokeCamera,MSDK_SENSOR_FEATURE_ENUM FeatureId, MUINT8 *pFeaturePara,MUINT32 *pFeatureParaLen); MUINT32 (* SensorControl) (MSDK_SCENARIO_ID_ENUM ScenarioId,MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); MUINT32 (* SensorClose)(void);} MULTI_SENSOR_FUNCTION_STRUCT, *PMULTI_SENSOR_FUNCTION_STRUCT;
SENSOR_FUNCTION_STRUCTSensorFuncOV5647={OV5647Open,OV5647GetInfo,OV5647GetResolution,OV5647FeatureControl,OV5647Control,OV5647Close};UINT32 OV5647SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc){/* To Do : Check Sensor status here */if (pfFunc!=NULL)*pfFunc=&SensorFuncOV5647;return ERROR_NONE;}
UINT32 err = 0; KD_IMGSENSOR_PROFILE_INIT(); //power on sensor if (atomic_read(&g_CamHWOpend) == 0 ) { //只有一个程序打开该设备 if (g_pSensorFunc) { //?? *g_pSensorFunc = &kd_MultiSensorFunc应该定义一个 *g_pSensorFunc =&g_pInvokeSensorFunc err = g_pSensorFunc->SensorOpen();//调用IC驱动定义的SensorOpen函数 if(ERROR_NONE != err) { PK_DBG(" ERROR:SensorOpen(), turn off power \n"); kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*) g_invokeSocketIdx, g_invokeSensorNameStr, false, CAMERA_HW_DRVNAME1); } } else { PK_DBG(" ERROR:NULL g_pSensorFunc\n"); } KD_IMGSENSOR_PROFILE("SensorOpen"); }else {PK_ERR("adopt_CAMERA_HW_Open Fail, g_CamHWOpend = %d\n ",atomic_read(&g_CamHWOpend) );} if (err == 0 ) { atomic_set(&g_CamHWOpend, 1); } return err?-EIO:err;}
当调用open函数时,最终调用IC驱动的open函数
UINT32 OV5647Open(void){kal_uint16 sensor_id=0; // check if sensor ID correctsensor_id=((OV5647_read_cmos_sensor(0x300A)<<8)| OV5647_read_cmos_sensor(0x300B)); #ifdef OV5647_DRIVER_TRACESENSORDB("OV5647Open, sensor_id:%x \n",sensor_id);#endifif (sensor_id != OV5647_SENSOR_ID)return ERROR_SENSOR_CONNECT_FAIL;/* initail sequence write in */OV5647_Sensor_Init();spin_lock(&ov5647_drv_lock);OV5647AutoFlicKerMode = KAL_FALSE;OV5647_sensor.Prv_line_length = OV5647_PV_PERIOD_PIXEL_NUMS;//For ZSDspin_unlock(&ov5647_drv_lock);return ERROR_NONE;}
0 0
- MTK之camera框架
- MTK Camera驱动框架学习
- MTK-CAMERA
- Android之 Camera 框架
- Camera框架之Camera2
- MTK CCT之CAMERA TUNNING调试学习总结
- MTK CCT之CAMERA TUNNING调试学习总结
- MTK CCT之CAMERA TUNNING调试学习总结
- MTK CCT之CAMERA TUNNING调试学习总结
- mtk camera isp
- mtk camera isp
- MTK Camera Power
- MTK Android Driver :camera
- MTK Android Driver :camera
- MTK Android Driver :camera
- mtk camera 移植步骤
- MTK 移植camera说明
- mtk camera 移植步骤
- mysql导入数据方法mysqlimport
- Mips/MHz
- ADS(AXD)调试出现 DBE Warning 00067
- 数字视频基础(三)
- 关于GDI+的那些事(1)——效率、双缓冲
- MTK之camera框架
- 数字视频基础(四)
- 客客安装英文语言包
- WinDbg双机调试,很慢
- sql之left join、right join、inner join的区别
- Unity中的 HideInInspector和SerializeField 用法
- 数据库移植遇到的问题
- Android上实现仿IOS弹性ScrollView
- 微软工程师建议的11条数据库设计准则