1. camera provider

目录:hardware/interfaces/camera/

service.cpp->cameraprovider_2_4.cpp(HIDL_FETCH_ICameraProvider)->HIDL_FETCH_ICameraProvider->new CameraProvider<IMPL>()->LegacyCameraProviderImpl_2_4.cpp(LegacyCameraProviderImpl_2_4::initialize)->hw_get_module(CAMERA_HARDWARE_MODULE_ID, (const hw_module_t **)&rawModule); -> new CameraModule(rawModule) -> CameraModule.cpp(通过CAMERA_HARDWARE_MODULE_ID寻找到camx的hal3)

2. camx hal3

A. init:先调用mModule->init (CameraModule.cpp),通过ID 进入camxhal3entry.cpp入口,在init通过static_cast<JumpTableHAL3*>(g_dispatchHAL3.GetJumpTable()) ,进入到camxhal3.cpp的init方法。同时也调用了getNumberOfCameras, 在camxhal3.cpp中HAL3Module::GetInstance,通过HAL3Module::GetInstance()静态方法实例化了HAL3Module对象,
在其构造方法里面通过HwEnvironment::GetInstance()静态方法又实例化了HwEnvironment对象,
在其构造方法中,实例化了SettingsManager对象,然后又在它构造方法中通过OverrideSettingsFile对象获取了位于/vendor/etc/camera/camoverridesettings.txt文件中的平台相关的配置信息(通过这种Override机制方便平台厂商加入自定义配置),该配置文件中,可以加入平台特定的配置项,比如可以通过设置multiCameraEnable的值来表示当前平台是否支持多摄,或者通过设置overrideLogLevels设置项来配置CamX-CHI部分的Log输出等级等等。

camx/src/core/hal/camxhal3entry.cpp

CAMX_VISIBILITY_PUBLIC camera_module_t HAL_MODULE_INFO_SYM =
{.common ={.tag                = HARDWARE_MODULE_TAG,.module_api_version = CAMERA_MODULE_API_VERSION_CURRENT,.hal_api_version    = HARDWARE_HAL_API_VERSION,.id                 = CAMERA_HARDWARE_MODULE_ID,.name               = "QTI Camera HAL",.author             = "Qualcomm Technologies, Inc.",.methods            = &CamX::g_hwModuleMethods},.get_number_of_cameras  = CamX::get_number_of_cameras,.get_camera_info        = CamX::get_camera_info,.set_callbacks          = CamX::set_callbacks,.get_vendor_tag_ops     = CamX::get_vendor_tag_ops,.open_legacy            = CamX::open_legacy,.set_torch_mode         = CamX::set_torch_mode,.init                   = CamX::init
};
static camera3_device_ops_t g_camera3DeviceOps =
{.initialize                         = CamX::initialize,.configure_streams                  = CamX::configure_streams,.construct_default_request_settings = CamX::construct_default_request_settings,.process_capture_request            = CamX::process_capture_request,.dump                               = CamX::dump,.flush                              = CamX::flush,
};int init()
{JumpTableHAL3* pHAL3 = static_cast<JumpTableHAL3*>(g_dispatchHAL3.GetJumpTable());CAMX_ASSERT(pHAL3);CAMX_ASSERT(pHAL3->init);return pHAL3->init();
}

camx/src/core/hal/camxhal3.cpp

static int get_number_of_cameras(void)
{CAMX_ENTRYEXIT_SCOPE(CamxLogGroupHAL, SCOPEEventHAL3GetNumberOfCameras);return static_cast<int>(HAL3Module::GetInstance()->GetNumCameras());
}

B.  同时在HwEnvironment构造方法中会调用其Initialize方法,其中mode为CSLHwEnabled, 在该方法中实例化了CSLModeManager对象,并通过CSLModeManager提供的接口,获取了所有底层支持的硬件设备信息,其中包括了Camera Request Manager、CAPS模块(该驱动模块主要用于CSL获取Camera平台驱动信息,以及IPE/BPS模块的电源控制)以及Sensor/IPE/Flash等硬件模块,还加载了chi-cdk的so库,并且通过调用CSLHwInternalProbeSensorHW方法获取了当前设备安装的Sensor模组信息,并且将获取的信息暂存起来,等待后续阶段使用,总得来说在HwEnvironment初始化的过程中,通过探测方法获取了所有底层的硬件驱动模块,并将其信息存储下来供后续阶段使用。其中用到event事件的用法。

camx\src\core\camxhwenvironment.cpp

CamxResult HwEnvironment::Initialize()
{result = CSLInitialize(&params); //open subdev等等设备result = ProbeChiComponents(pExternalComponent, &m_numExternalComponent); //加载chi-cdk库}HwEnvironment* HwEnvironment::GetInstance()
{static HwEnvironment s_HwEnvironmentSingleton;if (InitCapsInitialize == s_HwEnvironmentSingleton.m_initCapsStatus){s_HwEnvironmentSingleton.InitCaps();  }return &s_HwEnvironmentSingleton;
}VOID HwEnvironment::InitCaps()
{EnumerateDevices();ProbeImageSensorModules();  //读取com.qti.sensormodule.*.binEnumerateSensorDevices();  //CSLEnumerateDevices->CSLHwInternalProbeSensorHW,下发                //CAM_SENSOR_PROBE_CMD,match硬件是否成功;InitializeSensorSubModules(); //check VIDIOC_SUBSCRIBE_EVENT(V4L_EVENT_CAM_REQ_MGR_SENSOR_LOCK) CAM_HANDLE_USER_POINTER InitializeSensorStaticCaps();result = m_staticEntryMethods.GetStaticCaps(&m_platformCaps[0]); //camxtitan17xcontext.cpp
}VOID HwEnvironment::ProbeImageSensorModules()
{result = ImageSensorModuleDataManager::Create(&pSensorManager, this); //获取驱动module数据cam_map |= set_cam_map(pSensorName); // 比对驱动sensor_name 和hal定义是否一致。result = pData->Probe(&detected, &deviceIndex); //ImageSensorModuleData::Probe
}

camx\src\csl\hw\camxcslhw.cpp

CamxResult CSLInitializeHW()
{// 查找并获取/dev/videoX 设备,该节点对应着Kernel部分的Request ManagerCSLHwEnumerateAndAddCSLHwDevice(CSLInternalHwVideodevice, CAM_VNODE_DEVICE_TYPE);// 查找并获取/dev/v4l-subdevX cpas设备CSLHwEnumerateAndAddCSLHwDevice(CSLInternalHwVideoSubdevice, CAM_CPAS_DEVICE_TYPE);// 查找并获取/dev/v4l-subdevX其它设备,诸如Sensor/IFE/IPE/Flash等CSLHwEnumerateAndAddCSLHwDevice(CSLInternalHwVideoSubdeviceAll, 0);// g_pCSLModeManager 为CSLModeManagerg_pCSLModeManager = CAMX_NEW CSLModeManager(pInitializeParams);
}CamxResult CSLImageSensorProbeHW(CSLMemHandle                hPacket,SIZE_T                      offset,CSLImageSensorProbeResult*  pProbeResult)
{CamxResult result = CamxResultEFailed;if ((NULL != pProbeResult) && (CSLInvalidHandle != hPacket)){if (TRUE == CSLHwInstanceGetRefCount()){INT32   deviceIndex;result = CSLHwInternalProbeSensorHW(hPacket, offset, &deviceIndex);if (CamxResultSuccess == result){pProbeResult->detected    = TRUE;pProbeResult->deviceIndex = deviceIndex;}CSLHwInstancePutRefCount();}}else{result = CamxResultEInvalidArg;}return result;
}

camx\src\core\camximagesensormoduledata.cpp

camximagesensormoduledata.cpp
CamxResult ImageSensorModuleData::Probe(BOOL*   pDetected,INT32*  pDeviceIndex){result = CSLImageSensorProbe(pProbePacket->GetMemHandle(), pProbePacket->GetOffset(), &probeResult);result = GetSensorDataObject()->LoadSensorLibrary(); //加载/vendor/lib64/camera/com.qti.sensor.*.so
}

camx\src\csl\hw\camxcslhwinternalsensor.cpp

CamxResult CSLHwInternalProbeSensorHW(CSLMemHandle hPacket,SIZE_T       offset,INT32*       pDeviceIndex)
{ioctlCmd.op_code     = CAM_SENSOR_PROBE_CMD;ioctlCmd.size        = sizeof(ioctlCmd.handle);ioctlCmd.handle_type = CAM_HANDLE_MEM_HANDLE;ioctlCmd.reserved    = 0;ioctlCmd.handle      = hPacket;result = pLoophw->deviceOp.Ioctl(pLoophw, VIDIOC_CAM_CONTROL, &ioctlCmd);result = CSLHwInternalDefaultSubscribeEvents(&g_CSLHwInstance.CSLHwSensorSlotDevices[hIndex],V4L_EVENT_CAM_REQ_MGR_SENSOR_LOCK,CAM_SENSOR_EVENT_TYPE); // 使用event handleioctlCmd.op_code     = CAM_SENSOR_INTR_INIT;ioctlCmd.size        = sizeof(cam_sensor_gpio_intr_config);ioctlCmd.handle_type = CAM_HANDLE_USER_POINTER;ioctlCmd.reserved    = 0;ioctlCmd.handle      = (uint64_t)pIntrInfo;result =  ioctl(deviceFd, VIDIOC_CAM_CONTROL, &ioctlCmd);}

3. 之后通过调用HwEnvironment对象中的ProbeChiComponents方法在/vendor/lib64/camera/components路径下找寻各个Node生成的So库,并获取Node提供的标准对外接口,这些Node不但包括CHI部分用户自定义的模块,还包括了CamX部分实现的硬件模块,并最后都将其都存入ExternalComponentInfo对象中,等待后续阶段使用。 (camxhal3module.cpp ->camxchicomponent.cpp(Initialize)-> camxchicomponent.cpp(ProbeChiComponents));

从上图不难看出,在HAL3Module构造方法中会去通过dlopen方法加载com.qti.chi.override.so库,并通过dlsym映射出CHI部分的入口方法chi_hal_override_entry,并调用该方法将HAL3Module对像中的成员变量m_ChiAppCallbacks(CHIAppCallbacks)传入CHI中,其中包含了很多函数指针,这些函数指针分别对应着CHI部分的操作方法集中的方法,一旦进入到CHI中,就会将CHI本地的操作方法集合中的函数地址依次赋值给m_ChiAppCallbacks,这样CamX后续就可以通过这个成员变量调用到CHI中方法,从而保持了与CHI的通讯。

同样地,CHI中的ExtensionModule在初始化的时候,其构造方法中也会通过调用dlopen方法加载camera.qcom.so库,并将其入口方法ChiEntry通过dlsym映射出来,之后调用该方法,将g_chiContextOps(ChiContextOps,该结构体中定义了很多指针函数)作为参数传入CamX中,一旦进入CamX中,便会将本地的操作方法地址依次赋值给g_chiContextOps中的每一个函数指针,这样CHI之后就可以通过g_chiContextOps访问到CamX方法。

Camx 基本组件及其结构关系_yaoming168的博客-CSDN博客

camx框架-Camera初始化相关推荐

  1. 安全传输平台项目——配置管理终端-框架搭建-初始化

    在学习安全传输平台项目总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. 10-安全传输平台项目-第09天(配置管理终端-框架搭建-初始化) 一.复习 1.复习数 ...

  2. 【GO】Iris框架项目初始化并解决GoLand的代码提示问题

    为什么使用Iris 因为它是少数Go框架中支持MVC的框架,并且是最快的go框架 具体操作 创建项目 创建项目 IDE采用goland,直接选择第一个来创建项目 初始化mod go mod 可以让你摆 ...

  3. Camera初始化流程

    CameraService 启动流程分析 本轮文章均使用sprd 12 设备进行分析 CameraService初始化于 cameraserver.rc文件 service cameraserver ...

  4. DirectX10 学习笔记2:在多文档框架中初始化DirectX 10

    显示功能是在视图类中完成的,所以DX10的初始化及绘制工作都是视图类中完成. 首先建立一个多文档工程,工程名为02_01,在视图类头文件中加载相关的库,并包含头文件: 在视图类的头文件中添加DX10相 ...

  5. Admin.net框架数据初始化

    启用数据库 按你的需求对应启用数据库即可 nuget运行库 Pomelo.EntityFrameworkCore.MySql Zack.EFCore.Batch.MySQL.Pomelo_NET6 更 ...

  6. 【camx】camera sensor点亮

    一.准备工作 a.文件准备1)驱动代码2)模组规格书3)datasheet文件4)硬件原理图5)接口文件 b.信息查找模组规格书:sensorname.视场角.景深.光圈.I2C地址.厂商datash ...

  7. 高通 Camera HAL3:CAMX、CHI-CDK 详解

    网上关于高通CameraHAL3的介绍文档不多,之前做高通CameraHAL3的一些总结.整理,杂乱了一点,将就着看吧. 一.初步认知 高通CameraHAL3的架构很庞大,代码量也很巨大. 先对CA ...

  8. android_驱动_qcom_【高通SDM660平台】(4) --- Camera Init 初始化流程

    [高通SDM660平台]Camera Init 初始化流程 一.Camera 系统架构 二.Camera Init 初始化流程 2.1 CameraService 启动 2.2 CameraServi ...

  9. MTK平台开机初始化时 camera驱动流程|MTK camera调试常见几十种问题处理方法

    转载:https://www.jianshu.com/p/75ab1d82bbd3 mtk的驱动多是以模块加载的方式(module_init():module_exit():)加载到内核中去的:正因为 ...

最新文章

  1. tp5中mysql使用REGEXP 正则匹配
  2. 谈谈分布式事务(Distributed Transaction)[共5篇]
  3. devops 开发_开发五年,DevOps手册问世
  4. TechDay实录|摘取皇冠上的明珠,中文NLP的不二选择——PaddlePaddle
  5. sql limit 子句_SQL按子句概述和示例
  6. automake生成静态库文件_gcc编译工具生成动态库和静态库之一----介绍
  7. 宏基4750网卡驱动linux,宏基4750g网卡驱动下载
  8. 趋势线与123法则应用图解,很多大佬偷偷在用
  9. python等高线绘制_用matplotlib画等高线图详解
  10. U-net网络框架 学习笔记
  11. 密码管理方案之SafeInCloud+坚果云同步
  12. Linux性能监控命令_nmon 安装与使用
  13. 检测某个地图某个怪物的数量的脚本
  14. centos打显卡驱动命令_centos7系统,显卡驱动安装教程
  15. 运营商悄悄展开流量价格战,中国电信祭出29元含100GB流量卡
  16. 【数据结构】十进制转化为二进制
  17. 计算机组网技术形考4单元答案,最新国家开放大学电大《计算机组网技术》网络核心课形考任务四答案...
  18. 【新学期,新FLAG】
  19. python----模块和包
  20. KVC与KVO的不同

热门文章

  1. 安卓应用加固壳判断java厂商_Android APK加固(加壳)工具
  2. [论文学习] - 2014ECCV - TCDCN
  3. Flutter Missing parentheses in call to ‘print‘. Did you mean print(‘Insert‘, text,‘to line‘, line_nu
  4. 同样嗑B站6个月,被室友吊打 35K Offer!
  5. 官网下载Eclipse历史版本
  6. 程序员的呓语---萎缩的情商
  7. 用了几年的iPhone 11竟然可以免费换电池
  8. python简易爬虫
  9. 2021-10-27【WGS】丨Pacbio三代甲基化修饰流程
  10. 一文理解 JWT、JWS、JWE、JWA、JWK、JOSE