以白平衡设置为例:
1.packages/apps/Camera目录下的Camera.java:
mParameters.setWhiteBalance(whiteBalance)
2.frameworks/base/目录下的Camera.java:
public void setWhiteBalance(String value) {
set(KEY_WHITE_BALANCE, value);
}
注释:set方法是将所有键值对封装到一个map中:
mMap.put(key, value);
3.packages/apps/Camera目录下的Camera.java:
mCameraDevice.setParameters(mParameters);
4.frameworks/base/目录下的Camera.java:
native_setParameters(params.flatten());
注:flatten方法是将mMap中的键值对封装成一个String值
5.CameraService.cpp:
status_t CameraService::Client::setParameters(const String8& params) {
......
CameraParameters p(params);
return mHardware->setParameters(p);
}
注:在CameraParameters构造函数中,将参数unflatten:
CameraParameters(const String8 ¶ms) { unflatten(params); }
6.SprdCameraHardwareInterface.cpp:
根据键值取回白平衡的值,并向下传递:
SET_PARM(CAMERA_PARM_WB, mParameters.getWhiteBalance());
7.SprdOEMCamera.c中:
camera_set_ctrl(id, parm, camera_before_set, camera_after_set);
8.Cmr_set.c中:
case CAMERA_PARM_WB:
camera_set_wb(parm, &skip_mode, &skip_number);
9.Cmr_set.c中:
int camera_set_wb(uint32_t wb_mode, uint32_t *skip_mode, uint32_t *skip_num)
{ ..
....
if (V4L2_SENSOR_FORMAT_RAWRGB == cxt->sn_cxt.sn_if.img_fmt) {
. .....
}else{
*skip_mode = IMG_SKIP_SW;
*skip_num = cxt->sn_cxt.sensor_info->change_setting_skip_num;
ret = Sensor_Ioctl(SENSOR_IOCTL_SET_WB_MODE, wb_mode);
} ..
....
}
注意:Sensor_drv_u.h中SENSOR_IOCTL_SET_WB_MODE这个枚举值定义的位置关系到下面set_wb_mode的位置,两者要对应
10.Sensor_drv_u.c中:
uint32_t Sensor_Ioctl(uint32_t cmd, uint32_t arg)
{ ..
....
func_tab_ptr = s_p_sensor_cxt->sensor_info_ptr->ioctl_func_tab_ptr;//获取驱动函数表
temp = *(uint32_t *) ((uint32_t) func_tab_ptr + cmd * S_BIT_2);
func_ptr = (SENSOR_IOCTL_FUNC_PTR) temp;
if (PNULL != func_ptr) {
ret_value = func_ptr(arg);//这里继续去执行参数设置
}
return ret_value;
}
注:s_p_sensor_cxt->sensor_info_ptr的初始化是在_Sensor_Identify时:
sensor_info_tab_ptr=(SENSOR_INFO_T**)Sensor_GetInforTab(sensor_id);
sensor_info_ptr = sensor_info_tab_ptr[sensor_index];//根据sensor_index取出我们对应的sensor info。
s_p_sensor_cxt->sensor_info_ptr = sensor_info_ptr;
Sensor_GetInforTab的实现在Sensor_cfg.c中:
SENSOR_INFO_T ** Sensor_GetInforTab(SENSOR_ID_E sensor_id)
{ ..
....
switch(sensor_id)
{
case SENSOR_MAIN:
{
sensor_infor_tab_ptr=(SENSOR_INFO_T*)&main_sensor_infor_tab;
break;
}
case SENSOR_SUB:
{
sensor_infor_tab_ptr=(SENSOR_INFO_T*)&sub_sensor_infor_tab;
break;
}
case SENSOR_ATV:
{
sensor_infor_tab_ptr=(SENSOR_INFO_T*)&atv_infor_tab;
break;
}
}
return (SENSOR_INFO_T **)sensor_infor_tab_ptr;
}
main_sensor_infor_tab就是各个sensor的info数组,根据sensor_info_tab_ptr[sensor_index]中的sensor_index取出我们对应的sensor info。
const SENSOR_INFO_T* main_sensor_infor_tab[]=
{
#ifdef CONFIG_BACK_CAMERA_MIPI
&g_s5k4ec_mipi_yuv_info,
&g_ov8825_mipi_raw_info,
//&g_ov8830_mipi_raw_info,
&g_ov5640_mipi_yuv_info,
&g_imx179_mipi_raw_info,
&g_ov8865_mipi_raw_info,
&g_ov13850_mipi_raw_info,
#endif
#ifdef CONFIG_BACK_CAMERA_CCIR
&g_GT2005_yuv_info,
#endif
PNULL
};
11.以ov5640为例:
Sensor_ov5640_mipi.c:
第10步获取到的func_tab_ptr指针即为s_ov5640_ioctl_func_tab,
获取到的func_ptr函数指针即为_ov5640_set_awb。
最终通过_ov5640_set_awb来完成驱动awb的设置。注意这个定义的位置和SENSOR_IOCTL_SET_WB_MODE、set_wb_mode一样,都要位置保持一致。
参考链接:(10条消息) android从应用到驱动之—camera(1)---程序调用流程_android 驱动程序调用流程_adazone的博客-CSDN博客
浙公网安备 33010602011771号