高通 camera 调试

高通camera驱动分析

./qcom/proprietary/mm-still/codec_v1/omx/jpeg_encoder/Android.mk:15:CHROMATIX_VERSION := 0309

这个定义用那个版本,这个就是用0309的版本

在调试的时候发现不能点亮,发现是pdaf关掉就可以了。 is_pdaf_support =0;

在调试代码的时候发现, 内核部分只有配置电压和始终的代码,初始化部分都在 vendor下, 通过名字匹配。af也是一样。

sensor_init.c 里可以添加 支持的sensor类型,可以支持多颗sensor ,能够自动识。

OV8865

1、kernel部分:

A、kernel_driver:

把驱动文件ov8865_qtech_f8865ac.c 放到kernel/drivers/media/platform/msm/camera_v2/sensor/目录下

B、kernel_dtsi:

把如下板级信息加到kernel/arch/arm/boot/dts/msm8610-qrd-camera-sensor.dtsi文件中

actuator1: qcom,actuator@18 {

cell-index = <4>;

reg = <0x18>;

compatible = "qcom,actuator";

qcom,cci-master = <0>;

};

eeprom0:qom,eeprom@2b{

cell-index = <0>;

reg = <0x2b 0x0>;

...

...

};

qcom,camera@7f {

compatible = "qcom,ov8865_qtech";

reg = <0x7f>;

qcom,slave-id = <0x6c 0x300b 0x8865>;

qcom,csid-sd-index = <0>;

qcom,actuator-src = <&actuator1>;

qcom,eeprom-src = <&eeprom0>;

qcom,led-flash-src = <&led_flash0>;

qcom,mount-angle = <90>;

qcom,sensor-name = "ov8865_qtech";

cam_vdig-supply = <&pm8110_l7>;

cam_vana-supply = <&pm8110_l19>;

cam_vio-supply = <&pm8110_l14>;

qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana";

qcom,cam-vreg-type = <0 0 0>;

qcom,cam-vreg-min-voltage = <1500000 1800000 2850000>;

qcom,cam-vreg-max-voltage = <1500000 1800000 2850000>;

qcom,cam-vreg-op-mode = <200000 200000 100000>;

qcom,gpio-no-mux = <0>;

gpios = <&msmgpio 13 0>,

<&msmgpio 21 0>,

<&msmgpio 20 0>,

<&pm8110_gpios 2 0>;

qcom,gpio-reset = <1>;

qcom,gpio-standby = <2>;

qcom,gpio-vdig = <3>;

qcom,gpio-req-tbl-num = <0 1 2 3>;

qcom,gpio-req-tbl-flags = <1 0 0 0>;

qcom,gpio-req-tbl-label = "CAMIF_MCLK",

"CAM_RESET1",

"CAM_STANDBY",

"CAM_VDIG";

qcom,csi-lane-assign = <0xe4>;

qcom,csi-lane-mask = <0x3>;

qcom,sensor-position = <0>;

qcom,sensor-mode = <1>;

qcom,cci-master = <0>;

};

C、kernel-clock:

这部分主要是针对 B 的,增加一些I2C地址

如下代码断:

--- a/arch/arm/mach-msm/clock-8610.c

+++ b/arch/arm/mach-msm/clock-8610.c

@@ -3033,6 +3033,7 @@ static struct clk_lookup msm_clocks_8610[] = {

CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6-0020"),

CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6-006a"),

CLK_LOOKUP("cam_src_clk", mclk1_clk_src.c, "6-0048"),

+ CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6-006c"), //front camera ismclk1_clk_src.c back camera ismclk0_clk_src.c

CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-006f"),

CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-0034"),

CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-007d"),

@@ -3042,6 +3043,7 @@ static struct clk_lookup msm_clocks_8610[] = {

CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-0020"),

CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-006a"),

CLK_LOOKUP("cam_clk", mclk1_clk.c, "6-0048"),

+ CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-006c"),

D、把C文件加到Makefile

--- a/drivers/media/platform/msm/camera_v2/sensor/Makefile

+++ b/drivers/media/platform/msm/camera_v2/sensor/Makefile

@@ -22,3 +22,4 @@ obj-y += gc2035.o

#obj-$(CONFIG_SP1628) += sp1628.o

obj-$(CONFIG_GC0339) += gc0339.o

obj-$(CONFIG_HM1090) += HM1090.o

+obj-y +=ov8865_qtech_f8865ac.o

kernel部分就这么多了,此时可以先编译一个bootimage看看能不能编译过。

2、vendor部分

这一部分主要包括:效果(chromatix)、马达AF驱动(actuators)、库文件(sensor_libs)

A、效果(chromatix):把chromatix_ov8865_qtech_f8865ac整个文件夹放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/chromatix/0301/libchromatix/下

B、马达AF驱动(actuators) :把af_main_cam_camcorder_6.h、af_main_cam_camera_6.h AF头文件放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/0301/目录下。

同时做如下工作:

--- a/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/actuator.c

+++ b/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/actuator.c

@@ -13,7 +14,7 @@

-static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = {

+static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][7] = {

@@ -21,6 +22,7 @@ static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = {

#include "af_main_cam_camera_2.h"

#include "af_main_cam_camera_3.h"

#include "af_main_cam_camera_4.h"

#include "af_main_cam_camera_5.h"

+ #include "af_main_cam_camera_6.h"

@@ -29,6 +31,7 @@ static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = {

#include "af_main_cam_camcorder_2.h"

#include "af_main_cam_camcorder_3.h"

#include "af_main_cam_camcorder_4.h"

#include "af_main_cam_camcorder_5.h"

+ #include "af_main_cam_camcorder_6.h"

}

};

在af_main_cam_camcorder_6.h中会有af_header_info_t:

如下:

/* af_header_info_t */

{

/* header_version */

0x301,

/* cam_name */

ACTUATOR_MAIN_CAM_6,

/* module_name */

"ov8865",

/* actuator_name */

"BU64243GWZ",

}, /* af_header_info_t */

其中ACTUATOR_MAIN_CAM_6这个需要在kernel中定义,在kernel/include/media/msm_cam_sensor.h文件中添加ACTUATOR_MAIN_CAM_6

enum af_camera_name {

ACTUATOR_MAIN_CAM_0,

ACTUATOR_MAIN_CAM_1,

ACTUATOR_MAIN_CAM_2,

ACTUATOR_MAIN_CAM_3,

ACTUATOR_MAIN_CAM_4,

ACTUATOR_MAIN_CAM_5,

ACTUATOR_MAIN_CAM_6

ACTUATOR_WEB_CAM_0,

ACTUATOR_WEB_CAM_1,

ACTUATOR_WEB_CAM_2,

};

C、库文件(sensor_libs) :把ov8865_qtech_f8865ac整个文件夹放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/目录下

D、把相关文件添加到config中,如下:

--- a/common/config/device-vendor.mk

+++ b/common/config/device-vendor.mk

@@ -526,6 +526,7 @@ MM_CAMERA += libmmcamera_s5k3l1yx

+MM_CAMERA += libmmcamera_ov8865_qtech //库文件

MM_CAMERA += libmmcamera_SKUAA_ST_gc0339

@@ -617,6 +618,10 @@ MM_CAMERA += libchromatix_ov8825_7853f_snapshot

MM_CAMERA += libchromatix_ov8825_7853f_zsl

+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_snapshot //效果文件

+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_preview

+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_common

+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_default_video

MM_CAMERA += libchromatix_SKUAA_ST_gc0339_common

@@ -640,6 +645,7 @@ MM_CAMERA += libchromatix_skuf_ov5648_p5v23c_preview

MM_CAMERA += libmmcamera_truly_cm7700_eeprom

+MM_CAMERA += libmmcamera_qtech_f8865ac_eeprom //e2prom文件

MM_CAMERA += libmmcamera_sunny_p12v01m_eeprom

编systemimage.img验证

1camera基本代码架构

高通平台对于camera的代码组织,大体上还是遵循Android的框架:即上层应用和HAL层交互,高通平台在HAL层里面实现自己的一套管理策略;在kernel中实现sensor的底层驱动。但是,对于最核心的sensor端的底层设置、ISP效果相关等代码则是单独进行了抽离,放在了一个daemon进程中进行管理:

 

\

 

由于高通把大部分具体的设置及参数放到了daemon进程中,所以在kernel部分只是进行了V4L2的设备注册、IIC设备注册等简单的动作:

 

\

 

如上图,camera在kernel层的主文件为msm.c,负责设备的具体注册及相关方法的填充;在msm_sensor.c文件中,主要维护高通自己的一个sensor相关结构体—msm_sensor_ctrl_t,同时把dts文件中的配置信息读取出来;kernel层对于不同的sensor对应自己的一个驱动文件—xxsensor.c,主要是把powersetting的设定填充到msm_sensor_ctrl_t中。

在vendor目录下,高通把各个sensor实质性的代码放置在此。一部分代码是高通自己实现的daemon进程和kernel层及HAL层进行通讯的框架代码;另一部分则是和sensor相关的chromatix效果代码和sensorlib部分代码(initsetting、lensinfo、outputinfo)。

 

\

 

如上图,高通平台通过一个函数指针数组sub_module_init来管理sensor相关的组件;其中重要的是sensor_sub_module_init和chromatix_sub_module_init模块,对于sensor模块需要对应填充sensor_lib_t下的接口,对于chromatix模块则是通过高通的chromatix工具生成。

从更高的层次来看,sensor部分的代码只是camera子系统的一部分。打开高通vendor下面关于camera的源码也可以看到,/mm-camera2/media-controller/modules目录下面,sensors只是modules文件下面其中的一个子目录。

 

\

 

2主要移植步骤

2.1kernel层代码移植

对于kernel层的代码移植,实际上对dts文件的移植。因为kernel层驱动代码基本已经被高通的框架以及vendor下代码架空,只剩下一个上电的列表。具体步骤为:

1.在目录kernel/arch/arm/boot/dts/下的对应dtsi文件中新增camera节点,主要关注节点中的IIC地址、sensro的ID信息、电压设定信息:

 

\

 

2.在目录kernel/drivers/media/platform/msm/camera_v2/sensor/目录新增xxsensor.c文件,主要填充msm_sensor_power_setting结构体:sensor上电的包含的引脚设定和电压设定,具体格式可以参考同目录下的其他文件。

3.kernel下面的相关mk文件:

 

\

 

其他:如果sensor中带有eeprom,需要在dts文件中增加eeprom的节点信息;同样,sensor带有对焦功能,需要在dts文件中增加actuator节点信息;对于带eeprom的sensor,还需要配置eeprom的时钟控制代码(有待研究)。

2.2vendor下代码移植

Vendor下面的代码主要是两部分,一个是sensor_libs目录下的sensor具体设定、配置文件,另一个是chromatix下面的ISP效果文件。具体为:

1.sensor_libs目录下文件:包括一个Android.mk文件和一个.c文件。其中Android.mk文件参考同目录下其他.mk文件修改和对应sensor有关设定即可;.c文件中需要填充的为一个sensor_lib_t类型的结构体:

 

\

 

2.chromatix目录下相关文件,在对应sensor目录下包含4个目录和一个Android文件,总共13个文件,这些文件都会由chromatix调试工具生成。下面为IMX179文件实例:

 

\

 

3.vendor下还有eeprom文件,模组自带的eeprom数据处理相关;AF相关文件,调试工具生成的关于AF的效果文件;配置文件,把需要编译的模块填进配置文件中。

 

\

### 高通 Camera ISP 调试方法与教程 高通平台下的Camera ISP调试是一项复杂而精细的任务,涉及硬件配置、软件驱动以及算法优化等多个方面。以下是针对高通平台下Camera ISP调试的一些核心知识点和解决方案: #### 1. **ISP调试基础** - ISP(Image Signal Processor)的主要功能是对原始传感器数据进行预处理,从而生成高质量的图像输出。对于高通MSM8996芯片而言,其内置的ISP模块支持多种高级特性,如降噪、白平衡调整、色彩校正等[^1]。 - 在实际应用中,了解ISP管道中的各个阶段及其作用至关重要。这些阶段通常包括镜头阴影校正(LSC)、自动曝光(AE)、自动白平衡(AWB)、去马赛克(Demosaic)、锐化(Sharpening)等。 #### 2. **工具链准备** - 使用高通官方提供的工具集是高效完成ISP调试的前提条件之一。例如,`QC Image Tool (QCT)` 和 `Snapdragon Profiler` 可帮助开发者分析性能瓶颈并验证调优效果[^1]。 - 此外还需要熟悉Linux环境下的命令行操作,因为很多参数设置需通过脚本文件实现。 #### 3. **具体调试流程** - 自动增益控制(AGC): 设置合适的初始值范围,并依据场景亮度动态调节放大倍数以维持最佳信噪比(SNR)[^1]. - 白平衡(WB): 结合不同光照条件下物体反射光谱特征来计算补偿系数矩阵. - 曝光时间管理: 平衡帧率与画质之间关系的同时满足实时性需求. #### 4. **常见问题解决策略** 如果遇到某些特定情况下的异常现象,则可以从以下几个角度入手排查原因: - 图像偏色严重可能是因为AWB算法未充分考虑光源类型变化所致; - 噪声水平过高可能是由于ISO感光度设定不当或者RAW域噪声抑制不足引起; - 动态模糊过多则应重新审视快门速度选取原则。 ```bash # 示例:加载自定义camera HAL库 export LD_LIBRARY_PATH=/vendor/lib/hw:$LD_LIBRARY_PATH insmod /system/lib/modules/camera.msm8996.ko ``` 以上代码展示了如何在基于Android系统的设备上手动加载适用于MSM8996 SoC的摄像头HAL层驱动程序。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值