本文从流程、代码、log三个方面介绍openCamera 0的hal端流程。

一,流程图

二,代码逻辑

从SprdCamera3Factory开始

int SprdCamera3Factory::open(const struct hw_module_t *module, const char *id,struct hw_device_t **hw_device) {HAL_LOGD("E");return gSprdCamera3Factory.open_(module, id, hw_device);
}

继续调用SprdCamera3Factory的 open_ 函数:

  • 1,校验
  • 2,是否支持multicamera(我们以Camera 0为例说明,暂不考虑这些情况)
  • 3,继续调用 cameraDeviceOpen
int SprdCamera3Factory::open_(const struct hw_module_t *module, const char *id,struct hw_device_t **hw_device) {//1,校验if (module != &HAL_MODULE_INFO_SYM.common) {HAL_LOGE("invalid param module %p, expect %p", module,&HAL_MODULE_INFO_SYM.common);return -EINVAL;}if (!id || !hw_device) {HAL_LOGE("invalid param");return -EINVAL;}int idInt = atoi(id);if (idInt < 0) {HAL_LOGE("invalid param camera_id: %s", id);return -EINVAL;}idInt = idCheck(idInt);int cameraId = overrideCameraIdIfNeeded(idInt);HAL_LOGI("open camera %d", cameraId);if (SPRD_FRONT_HIGH_RES == cameraId ||SPRD_BACK_HIGH_RESOLUTION_ID == cameraId) {sensor_set_HD_mode(1);} else {sensor_set_HD_mode(0);}/* try dynamic ID */if (mUseCameraId == DynamicId && cameraId < mNumberOfCameras) {int ret = mCameras[cameraId]->openCamera(hw_device);if (!ret && mTorchHelper)mTorchHelper->lockTorch(cameraId);return ret;}//2,是否支持multicamera,并且为也是cameraId(我们以Camera 0为例说明,暂不考虑这些情况)
#ifdef CONFIG_MULTICAMERA_SUPPORT/* try private multi-camera */if (cameraId == SPRD_MULTI_CAMERA_ID || cameraId == SPRD_FOV_FUSION_ID ||cameraId == SPRD_DUAL_VIEW_VIDEO_ID)return SprdCamera3MultiCamera::camera_device_open(module, id,hw_device);
#endifif(atoi(id) == SPRD_BLUR_ID || atoi(id) == SPRD_PORTRAIT_ID)switchTuningParam((int)SENSOR_TUNING_PARAM_BOKEH);elseswitchTuningParam((int)SENSOR_TUNING_PARAM_DEFAULT);/* try other multi-camera */if (mWrapper && is_single_expose(cameraId))return mWrapper->cameraDeviceOpen(module, id, hw_device);//3,继续调用 cameraDeviceOpen/* then try single camera */return cameraDeviceOpen(cameraId, hw_device);
}

SprdCamera3Factory 的 cameraDeviceOpen 函数

  • 1,实例化 SprdCamera3HWI,并传入cameraId
  • 2,调用 SprdCamera3HWI 的 openCamera
int SprdCamera3Factory::cameraDeviceOpen(int camera_id,struct hw_device_t **hw_device) {int rc = NO_ERROR;int phyId = 0;int is_high_res_mode = 0;unsigned int on_off = 0;struct phySensorInfo *phyPtr = NULL;char prop[PROPERTY_VALUE_MAX];phyId = multi_id_to_phyid(camera_id);if (camera_id < 0 || phyId >= mNumOfCameras)return -ENODEV;if (phyId < 0)phyId = 0;phyPtr = sensorGetPhysicalSnsInfo(phyId);if (phyPtr->phyId != phyPtr->slotId)return -ENODEV;//1,实例化 SprdCamera3HWI,并传入cameraIdSprdCamera3HWI *hw = new SprdCamera3HWI(phyId);if (!hw) {HAL_LOGE("Allocation of hardware interface failed");return NO_MEMORY;}// Only 3d calibration use this// TBD: move 3d calibration to multi cameraHAL_LOGD("SPRD Camera Hal, camera_id=%d", camera_id);if (SPRD_3D_CALIBRATION_ID == camera_id) {hw->setMultiCameraMode(MODE_3D_CALIBRATION);property_set("vendor.cam.dualmode", "high_mode");}if (SPRD_BOKEH_CALI_GOLDEN_ID == camera_id) {hw->setMultiCameraMode(MODE_BOKEH_CALI_GOLDEN);property_set("vendor.cam.dualmode", "high_mode");}if (SPRD_OPTICSZOOM_W_ID == camera_id) {hw->setMultiCameraMode(MODE_OPTICSZOOM_CALIBRATION);}if (SPRD_OPTICSZOOM_T_ID == camera_id) {hw->setMultiCameraMode(MODE_OPTICSZOOM_CALIBRATION);}//2,调用 SprdCamera3HWI 的 openCamerarc = hw->openCamera(hw_device);if (rc != 0) {delete hw;} else {if (SPRD_FRONT_HIGH_RES == camera_id ||SPRD_BACK_HIGH_RESOLUTION_ID == camera_id) {is_high_res_mode = 1;hw->camera_ioctrl(CAMERA_TOCTRL_SET_HIGH_RES_MODE,&is_high_res_mode, NULL);}property_get("persist.vendor.cam.ultrawide.enable", prop, "1");if (SPRD_ULTRA_WIDE_ID == camera_id)on_off = atoi(prop);hw->camera_ioctrl(CAMERA_IOCTRL_ULTRA_WIDE_MODE, &on_off, NULL);}return rc;
}

流程转到SprdCamera3HWI中

SprdCamera3HWI::openCamera(struct hw_device_t **hw_device) === 》
int SprdCamera3HWI::openCamera()

  • 1,创建SprdCamera3Setting,并传入mCameraId
  • 2,创建SprdCamera3OEMIf,并传入mCameraId
  • 3,调用SprdCamera3OEMIf的openCamera函数
int SprdCamera3HWI::openCamera() {ATRACE_CALL();int ret = NO_ERROR;HAL_LOGI(":hal3: E camId=%d", mCameraId);if (mCameraId >= CAMERA_ID_COUNT) {HAL_LOGE("hal_err: mCameraId is invalid");return UNKNOWN_ERROR;}if (mOEMIf) {HAL_LOGE("Failure: Camera already opened");return ALREADY_EXISTS;}//1,创建SprdCamera3Setting,并传入mCameraIdmSetting = new SprdCamera3Setting(mCameraId);if (mSetting == NULL) {HAL_LOGE("alloc setting failed.");return NO_MEMORY;}//2,创建SprdCamera3OEMIf,并传入mCameraIdmOEMIf = new SprdCamera3OEMIf(mCameraId, mSetting);if (!mOEMIf) {HAL_LOGE("alloc oemif failed.");if (mSetting) {delete mSetting;mSetting = NULL;}return NO_MEMORY;}mOEMIf->camera_ioctrl(CAMERA_IOCTRL_SET_MULTI_CAMERAMODE, &mMultiCameraMode,NULL);mOEMIf->camera_ioctrl(CAMERA_IOCTRL_SET_MASTER_ID, &mMasterId, NULL);//3,调用SprdCamera3OEMIf的openCamera函数ret = mOEMIf->openCamera();if (ret) {HAL_LOGE("mOEMIf->openCamera failed");if (mOEMIf) {delete mOEMIf;mOEMIf = NULL;}if (mSetting) {delete mSetting;mSetting = NULL;}return ret;}mCameraOpened = true;if (mOEMIf->isIspToolMode()) {mOEMIf->ispToolModeInit();startispserver(mCameraId);ispvideo_RegCameraFunc(1, ispVideoStartPreview);ispvideo_RegCameraFunc(2, ispVideoStopPreview);ispvideo_RegCameraFunc(3, ispVideoTakePicture);ispvideo_RegCameraFunc(4, ispVideoSetParam);ispvideo_RegCameraFunc(5, ispVideoSetJpegQuality);}HAL_LOGI(":hal3: X");return NO_ERROR;
}

流程转到SprdCamera3OEMIf中

SprdCamera3OEMIf的openCamera函数很长,其中关键点在 调用oem层的camera_init函数,还有一些与otp相关的内容

ret = mHalOem->ops->camera_init(mCameraId, camera_cb, this, 0,&mCameraHandle, (void *)Callback_IonMalloc,(void *)Callback_Free);

三,log

打开主摄Camera的log

Cam3Factory的open
113381:11-16 15:37:51.194   460   985 D Cam3Factory: 171, open: E
113383:11-16 15:37:51.194   460   985 I Cam3Factory: 499, open_: open camera 0
构建SprdCamera3HWI
113391:11-16 15:37:51.195   460   985 I Cam3HWI : 127, SprdCamera3HWI: :hal3: Constructor E camId=0
113392:11-16 15:37:51.195   460   985 D Cam3HWI : 130, SprdCamera3HWI: mCameraId 0,mCameraDevice 0xe2dc1abc
113393:11-16 15:37:51.195   460   985 I Cam3HWI : 167, SprdCamera3HWI: :hal3: Constructor X
Cam3Factory的cameraDeviceOpen
113394:11-16 15:37:51.195   460   985 D Cam3Factory: 584, cameraDeviceOpen: SPRD Camera Hal, camera_id=0
SprdCamera3HWI的openCamera
113395:11-16 15:37:51.195   460   985 D Cam3HWI : 296, openCamera: camera3->open E
113396:11-16 15:37:51.195   460   985 I Cam3HWI : 339, openCamera: :hal3: E camId=0
构建SprdCamera3OEMIf
113397:11-16 15:37:51.195   460   985 I Cam3OEMIf: 607, SprdCamera3OEMIf: :hal3: Constructor E camId=0
113460:11-16 15:37:51.204   460   985 D Cam3OEMIf: 2732, setCameraState: X: camera state = SPRD_INIT, preview state = SPRD_IDLE, capture state = SPRD_IDLE focus state = SPRD_IDLE set param state = SPRD_IDLE
113528:11-16 15:37:51.212   460   985 I Cam3OEMIf: 675, SprdCamera3OEMIf: loaded libcamoem.so mHalOem->dso = 0x6a19bc5b
113529:11-16 15:37:51.212   460   985 I Cam3OEMIf: 812, SprdCamera3OEMIf: :hal3: Constructor X
SprdCamera3OEMIf的openCamera
113534:11-16 15:37:51.212   460   985 I Cam3OEMIf: 6687, openCamera: :hal3: E camId=0
113535:11-16 15:37:51.212   460   985 D Cam3OEMIf: 12188, log_monitor_thread_init: mLogMonitor init, 2
SprdCamera3OEMIf调用OEM端的camera_init
113538:11-16 15:37:51.213   460   985 I Cam3OEMIf: 6774, openCamera: :hal3: camera_init
113539:11-16 15:37:51.213   460  7952 I Cam3OEMIf: 12116, log_monitor_thread_proc: E, 2
114324:11-16 15:37:51.543   460   985 D Cam3OEMIf: 2732, setCameraState: X: camera state = SPRD_IDLE, preview state = SPRD_IDLE, capture state = SPRD_IDLE focus state = SPRD_IDLE set param state = SPRD_IDLE
114352:11-16 15:37:51.543   460   985 D Cam3OEMIf: 6823, openCamera: camera_id 0, mMultiCameraMode 0
114369:11-16 15:37:51.544   460   985 I Cam3OEMIf: 7054, openCamera: sprd_3dcalibration_cap_size w=3264, h=2448
114371:11-16 15:37:51.544   460   985 I Cam3OEMIf: 7065, openCamera: mIommuEnabled=1
114372:11-16 15:37:51.544   460   985 I Cam3OEMIf: 7331, setCamSecurity: multi camera mode = 0
114375:11-16 15:37:51.544   460  8005 D Cam3OEMIf: 11957, ZSLMode_monitor_thread_proc: zsl thread message.msg_type 0x801, sub-type 0x0, ret 0
114376:11-16 15:37:51.544   460  8005 D Cam3OEMIf: 11964, ZSLMode_monitor_thread_proc: zsl thread msg init
SprdCamera3OEMIf的openCamera结束
114377:11-16 15:37:51.544   460   985 I Cam3OEMIf: 7094, openCamera: :hal3: X
SprdCamera3HWI的openCamera结束
114378:11-16 15:37:51.544   460   985 I Cam3HWI : 394, openCamera: :hal3: X
114379:11-16 15:37:51.544   460   985 D Cam3HWI : 330, openCamera: camera3->open X mCameraSessionActive 1

我们看到Camera3Factory中的cameraId这个值,在实例化 SprdCamera3HWI、SprdCamera3Setting、SprdCamera3OEMIf时,均会传入。所以可以得知cameraId是与上述实例一对一绑定的,在closeCamera时,会将其实例销毁

openCamera的 hal 端流程相关推荐

  1. BPM端到端流程解决方案分享

    一.需求分析 1.企业规模的不断发展.管理水平的不断提升,通常伴随着企业各业务板块管理分工更细.更专业,IT系统同样越来越多.越来越专 业化.不可避免的,部门墙和信息孤岛出现了,企业的流程被部门或者I ...

  2. H3 BPM 端到端流程解决方案 (附H3 BPM软件下载地址)

    一.需求分析 1 企业规模的不断发展.管理水平的不断提升,通常伴随着企业各业务板块管理分工更细.更专业,IT系统同样越来越多.越来越专 业化.不可避免的,部门墙和信息孤岛出现了,企业的流程被部门或者I ...

  3. 华为端到端项目管理流程_华为这段话是我见过对端到端流程本质最精辟的阐述...

    关注供应链成长随笔,置顶公众号 自己搭台阶,一步步成为供应链专家 ━ ━ ━ ━ ━ ━ 很长一段时间里,经常在供应链的相关文章里看到端到端流程的片段: "世界一流企业实施端到端流程后,大幅 ...

  4. H3 BPM 端到端流程解决方案 (附H3 BPM软件下载地址)

    一.需求分析 1 企业规模的不断发展.管理水平的不断提升,通常伴随着企业各业务板块管理分工更细.更专业,IT系统同样越来越多.越来越专 业化.不可避免的,部门墙和信息孤岛出现了,企业的流程被部门或者I ...

  5. BPM生态之——端到端流程

    [端到端流程解决的问题] 端到端流程在企业流程管理过程中,用途非常广泛,当然给企业信息化建设所带来的好处也是非常多的: 打破信息孤岛:企业信息化建设过程中,会有非常多的应用系统,各系统之间信息.业务. ...

  6. 梳理研发过程中的各种端到端流程

    深入到研发项目的各个环节->将现有的执行的较好的过程进行提炼->形成流程图和相关流程文件 比较同类型的过程形成的不同流程->确认关键节点->优化流程图->将流程碎片组合成 ...

  7. 端到端流程打通企业经脉

    就像武侠小说中的高手一定要打通任督二脉,企业数字化建设也要打通内外连接,不仅要打通外部客户和供应商的连接,更要打通内部部门间的壁垒. 建立有效的面向外部的端到端流程,是企业实现自身价值,提升运转效率的 ...

  8. 在后端设计中,GDSLL,LEF,DEF,SDF,SPEF,SDC各代表什么意思?前端和中端流程中,SVF,SAIF又代表什么意思?

    后端名词术语:在后端设计中,GDSLL,LEF,DEF,SDF,SPEF,SDC各代表什么意思?前端和中端流程中,SVF,SAIF又代表什么意思? 1.GDSII:描述版图层次,形状,位置,几何图形, ...

  9. Netty学习笔记(二)Netty服务端流程启动分析

    先贴下在NIO和Netty里启动服务端的代码 public class NioServer { /*** 指定端口号启动服务* */public boolean startServer(int por ...

  10. netty 关闭chnnal_Netty 源码学习——服务端流程分析

    在上一篇我们已经介绍了客户端的流程分析,我们已经对启动已经大体上有了一定的认识,现在我们继续看对服务端的流程来看一看到底有什么区别. 服务端代码 public class NioServer { pr ...

最新文章

  1. JavaScript 面向对象的程序设计1
  2. .NET Core + Kubernetes:Helm
  3. ubuntu16.04安装metasploit+postgresql
  4. 跟我学《JavaScript高程3》第一讲,视频课程,课程笔记
  5. 3小时解决头疼的年终报表!
  6. 移动路线(信息学奥赛一本通-T1194)
  7. Java Web学习总结(41)——Java EE 8 新功能展望
  8. Safari 搜寻引擎被 Yahoo 绑架,试试这 4 种解决方法
  9. 智能翻译android,离线翻译SDK,让智能小设备如虎添翼
  10. php 实现 word 转为 图片
  11. linux下编写脚本文件 .sh
  12. CentOS7—Firefox—截图工具—fireshot插件
  13. 推荐几本大学生必看的书单
  14. 族蚂建站课堂:域名相关基础内容
  15. 《平凡的世界》读后感
  16. EXCEL快速提取中英文、数字的4个方法,总有一个适合你!
  17. PM血泪总结项目管理中存在的教训
  18. UA MATH564 概率论 计算至少有一个发生的概率:Waring公式
  19. 推荐系统之--- 推荐系统实例
  20. ecmall 调用微信分享接口

热门文章

  1. 用了半年的时间,把python学到了能出书的程度
  2. 一篇很哇塞的MyBatis入门到精通
  3. 浅谈opencv3.2中各个模块的简介
  4. Android FileProvider详细解析和踩坑指南
  5. 从伊朗虚假新闻活动案例来看国外造谣及传谣模式
  6. 使用Python自动化管理Exchange邮箱
  7. RPL(7):RFC6550翻译(7)---Upward Routes
  8. C++中如何读取一个数的位数_R语言入门之切尾均值(trimmed mean)和绝对中位差(mad)...
  9. fmt/core.h:1711:3: error: static assertion failed: Cannot format an argument.解决方案
  10. [translate]Multimodal Self-Paced Learning for Multi-Omics Feature Selection and Data Integration