【高通SDM660平台 Android 10.0】Qcom Camera Daemon 代码分析
《【高通SDM660平台】(1) — Camera 驱动 Bringup Guide》
《【高通SDM660平台】(2) — Camera Kernel 驱动层代码逻辑分析》
《【高通SDM660平台】(3) — Camera V4L2 驱动层分析 》
《【高通SDM660平台】(4) — Camera Init 初始化流程 》
《【高通SDM660平台】(5) — Camera Open 流程》
《【高通SDM660平台】(6) — Camera getParameters 及 setParameters 流程》
《【高通SDM660平台】(7) — Camera onPreview 代码流程》
《【高通SDM660平台】(8) — Camera MetaData介绍》
《【高通SDM660平台 Android 10.0】(9) — Qcom Camera Daemon 代码分析》
《【高通SDM660平台 Android 10.0】(10) — Camera Sensor lib 与 Kernel Camera Probe 代码分析》
《【高通SDM660平台 Android 10.0】(11) — Eeprom lib 与 Kernel eeprom代码分析》
《【高通SDM660平台 Android 10.0】(12) — Camera Chromatix 代码分析》
《【高通SDM660平台】Camera Capture 流程》
《【高通SDM660平台】Camera mm-qcamera-app 代码分析》
《【高通SDM660平台 Android 10.0】 — 高通马达、eeprom、flash 等外设代码分析》
由文章篇幅太长,本文是对前面的文章第1.1.1.6章的补充《【高通SDM660平台 Android 10.0】(9) — Qcom Camera Daemon 代码分析》,
主要是分析下 Camera Chromatix lib 库的内容(以 libchromatix_imx258_lc898217xc_common.so 为列),加载 chromatix 库文件主要是加载 lib 库中 头文件的 结构体参数。
详细看下。
一、chromatix_imx258_lc898217xc 目录
在进入目录前,我们会看到 0309 和 0310 这两个目录,
其主要是根据平台来决定的,定位地方位于如下:
可以看出,我们使用的是下 BUILD_MM_CAMERA2
且平台是 sdm660
,所以 CHROMATIX_VERSION := 0310
# /vendor/qcom/proprietary/mm-camera/Android.mk
ifeq ($(BUILD_SERVER), true)
CHROMATIX_VERSION := 0208
else ifeq ($(BUILD_MM_CAMERA2), true)
ifeq ($(OEM_CHROMATIX_0308), 1)
CHROMATIX_VERSION := 0308E
else ifeq ($(call is-board-platform-in-list,msm8937 msm8953 sdm660 msm8998 apq8098_latv $(TRINKET)),true)
CHROMATIX_VERSION := 0310
else
CHROMATIX_VERSION := 0309
endif
endif
我们进入目录 mm-camera/mm-camera2/media-controller/modules/sensors/chromatix/0310/chromatix_imx258_lc898217xc
在它下面,我们看到很多目录,
其实这些目录,每个 目录对应着一个lib库,所有用到的定义在
mm-camera/mm-camera2/media-controller/modules/sensors/configs/imx258_lc898217xc_chromatix.xml
<ChromatixConfigurationRoot>
<CommonChromatixInfo>
<ChromatixName>
<ISPCommon>imx258_lc898217xc_common</ISPCommon>
<PostProc>imx258_lc898217xc_postproc</PostProc>
<CPPPreview>imx258_lc898217xc_cpp_preview</CPPPreview>
<CPPSnapshot>imx258_lc898217xc_cpp_snapshot</CPPSnapshot>
<CPPLiveshot>imx258_lc898217xc_cpp_liveshot</CPPLiveshot>
</ChromatixName>
</CommonChromatixInfo>
<ResolutionChromatixInfo>
<ChromatixName sensor_resolution_index="0">
<ISPPreview>imx258_lc898217xc_snapshot</ISPPreview>
<ISPSnapshot>imx258_lc898217xc_snapshot</ISPSnapshot>
<ISPVideo>imx258_lc898217xc_default_video</ISPVideo>
<CPPVideo>imx258_lc898217xc_cpp_video</CPPVideo>
<A3Preview>imx258_lc898217xc_zsl_preview_3a</A3Preview>
<A3Video>imx258_lc898217xc_zsl_video_3a</A3Video>
</ChromatixName>
<ChromatixName sensor_resolution_index="1">
<ISPPreview>imx258_lc898217xc_preview</ISPPreview>
<ISPSnapshot>imx258_lc898217xc_preview</ISPSnapshot>
<ISPVideo>imx258_lc898217xc_preview</ISPVideo>
<CPPVideo>imx258_lc898217xc_cpp_video</CPPVideo>
<A3Preview>imx258_lc898217xc_4k_preview_3a</A3Preview>
<A3Video>imx258_lc898217xc_4k_video_3a</A3Video>
</ChromatixName>
<ChromatixName sensor_resolution_index="2">
<ISPPreview>imx258_lc898217xc_preview</ISPPreview>
<ISPSnapshot>imx258_lc898217xc_preview</ISPSnapshot>
<ISPVideo>imx258_lc898217xc_preview</ISPVideo>
<CPPVideo>imx258_lc898217xc_cpp_video</CPPVideo>
<A3Preview>imx258_lc898217xc_default_preview_3a</A3Preview>
<A3Video>imx258_lc898217xc_default_video_3a</A3Video>
</ChromatixName>
我们举例来看下,以 imx258_lc898217xc_common 和 imx258_lc898217xc_preview 这两个为例:
1.1 例:imx258_lc898217xc_common
imx258_lc898217xc_common 对应的库文件位于:
/vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/chromatix/0310/chromatix_imx258_lc898217xc/common/Android.mk
我们来看下它的内容:
可以看到 ,
是将 chromatix_imx258_lc898217xc_common.c
编译成 libchromatix_imx258_lc898217xc_common.so
共享库
LOCAL_SRC_FILES:= chromatix_imx258_lc898217xc_common.c
LOCAL_MODULE := libchromatix_imx258_lc898217xc_common
LOCAL_SHARED_LIBRARIES := libcutils
ifeq ($(MM_DEBUG),true)
LOCAL_SHARED_LIBRARIES += liblog
endif
include $(BUILD_SHARED_LIBRARY)
1.1.1 chromatix_imx258_lc898217xc_common.c
可以看到 ,包该C 文件,包含了两个头文件 ,及 实现了一个方法。
#include "chromatix_common.h"
static chromatix_VFE_common_type chromatix_imx258_lc898217xc_parms = {
#include "chromatix_imx258_lc898217xc_common.h"
};
/*============================================================================
* FUNCTION - load_chromatix -
* DESCRIPTION:
*==========================================================================*/
void *load_chromatix(void)
{
return &chromatix_imx258_lc898217xc_parms;
}
1.1.2 chromatix_common.h
chromatix_common.h 中,包含了 chromatix 所有的结构体定义。
比如 chromatix_imx258_lc898217xc_parms 的 结构体的定义如下:
typedef struct
{
//=========================================================================
// Chromatix header version info (MUST BE THE FIRST PARAMETER)
//=========================================================================
ChromatixVersionInfoType chromatix_version_info;
//=========================================================================
// Pedestal correction type:
// 2-D black correction to To replace the single black point in 0x304
//=========================================================================
chromatix_pedestalcorrection_type chromatix_pedestal_correction;
//=========================================================================
// Linearization
//=========================================================================
chromatix_L_type chromatix_L;
//=========================================================================
// Black Level Subtract and Scaling
//=========================================================================
Chromatix_blk_subtract_scale_type Chromatix_BLSS_data;
//=========================================================================
// Lens Rolloff (Rolloff)
//=========================================================================
chromatix_rolloff_type chromatix_rolloff;
//=========================================================================
// Luma adaptation
// These are parameters for special effects, manual BSM
//=========================================================================
chromatix_LA_special_effects_type chromatix_LA_special_effects;
} chromatix_VFE_common_type;
1.2 例:imx258_lc898217xc_preview
imx258_lc898217xc_preview 对应的库文件位于:
mm-camera/mm-camera2/media-controller/modules/sensors/chromatix/0310/chromatix_imx258_lc898217xc/isp/preview/Android.mk
最终会编译成 libchromatix_imx258_lc898217xc_preview.so 共享库
LOCAL_C_INCLUDES += chromatix_imx258_lc898217xc_preview.h
LOCAL_SRC_FILES:= chromatix_imx258_lc898217xc_preview.c
LOCAL_MODULE := libchromatix_imx258_lc898217xc_preview
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_SHARED_LIBRARIES += liblog
include $(BUILD_SHARED_LIBRARY)
1.2.1 chromatix_imx258_lc898217xc_preview.c
在 c 代码中,方法也一样,调用 load_chromatix 会直接返接 chromatix_parms_type 结构体。
在 chromatix_parms_type 结构体中,会包含 preview 时使用到的 camera chromatix ,详细可以进入 chromatix_imx258_lc898217xc_preview.h 看下,
这些数据是由 Camera Turnning 工程师来调试的,有机会我们同样后续会出一系列 Turnning 的文章
(不过Turnning 是要有实操的,并不是看文档就能够学会的,还是非常看重经验的)
#include "chromatix.h"
static chromatix_parms_type chromatix_imx258_lc898217xc_parms = {
#include "chromatix_imx258_lc898217xc_preview.h"
};
/*============================================================================
* FUNCTION - load_chromatix -
* DESCRIPTION:
*==========================================================================*/
void *load_chromatix(void)
{
return &chromatix_imx258_lc898217xc_parms;
}