以白平衡设置为例:

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博客

 

posted on 2023-04-12 19:15  六翅天蚕  阅读(165)  评论(0)    收藏  举报