【高通SDM660平台 Android 10.0】(12) --- Camera Chromatix 代码分析

【高通SDM660平台 Android 10.0】Qcom Camera Daemon 代码分析

  • 一、chromatix_imx258_lc898217xc 目录
    • 1.1 例:imx258_lc898217xc_common
      • 1.1.1 chromatix_imx258_lc898217xc_common.c
      • 1.1.2 chromatix_common.h
    • 1.2 例:imx258_lc898217xc_preview
      • 1.2.1 chromatix_imx258_lc898217xc_preview.c


《【高通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
在它下面,我们看到很多目录,
【高通SDM660平台 Android 10.0】(12) --- Camera Chromatix 代码分析_第1张图片

其实这些目录,每个 目录对应着一个lib库,所有用到的定义在

mm-camera/mm-camera2/media-controller/modules/sensors/configs/imx258_lc898217xc_chromatix.xml

<ChromatixConfigurationRoot>
  <CommonChromatixInfo>
    <ChromatixName>
      <ISPCommon>imx258_lc898217xc_commonISPCommon>
      <PostProc>imx258_lc898217xc_postprocPostProc>
      <CPPPreview>imx258_lc898217xc_cpp_previewCPPPreview>
      <CPPSnapshot>imx258_lc898217xc_cpp_snapshotCPPSnapshot>
      <CPPLiveshot>imx258_lc898217xc_cpp_liveshotCPPLiveshot>
    ChromatixName>
  CommonChromatixInfo>
  <ResolutionChromatixInfo>
    <ChromatixName sensor_resolution_index="0">
      <ISPPreview>imx258_lc898217xc_snapshotISPPreview>
      <ISPSnapshot>imx258_lc898217xc_snapshotISPSnapshot>
      <ISPVideo>imx258_lc898217xc_default_videoISPVideo>
      <CPPVideo>imx258_lc898217xc_cpp_videoCPPVideo>
      <A3Preview>imx258_lc898217xc_zsl_preview_3aA3Preview>
      <A3Video>imx258_lc898217xc_zsl_video_3aA3Video>
    ChromatixName>
    <ChromatixName sensor_resolution_index="1">
      <ISPPreview>imx258_lc898217xc_previewISPPreview>
      <ISPSnapshot>imx258_lc898217xc_previewISPSnapshot>
      <ISPVideo>imx258_lc898217xc_previewISPVideo>
      <CPPVideo>imx258_lc898217xc_cpp_videoCPPVideo>
      <A3Preview>imx258_lc898217xc_4k_preview_3aA3Preview>
      <A3Video>imx258_lc898217xc_4k_video_3aA3Video>
    ChromatixName>
    <ChromatixName sensor_resolution_index="2">
      <ISPPreview>imx258_lc898217xc_previewISPPreview>
      <ISPSnapshot>imx258_lc898217xc_previewISPSnapshot>
      <ISPVideo>imx258_lc898217xc_previewISPVideo>
      <CPPVideo>imx258_lc898217xc_cpp_videoCPPVideo>
      <A3Preview>imx258_lc898217xc_default_preview_3aA3Preview>
      <A3Video>imx258_lc898217xc_default_video_3aA3Video>
    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;
}

你可能感兴趣的:(Qualcomm经验总结,Android,Camera)