高通Android Camera Bring up

摘要:
高通AndroidCamera的迁移注:本文档以高通8916平台上OV5648的迁移为例,说明Android SOC的底层摄像头。高通摄像头的调试主要基于Senor的启动和调整。请注意,这里的传感器位于相机中,而不是传统意义上的传感器。2) 通过比较原理图和相机数据表,检查相机模块的引脚连接是否正确。
高通Android Camera的移植

注:此文档以在高通8916平台移植OV5648为例,给大家讲解Android SOC的底层Camera。

Reference:

介绍

camera原理:外部光线穿过lens后,经过color filter滤波后照射到sensor面上,sensor将从lens上传到过来的光线转换成电信号,再通过内部的AD转换为数字信号,如果sensor没有集成DSP,则通过DVP的方式传输到baseband,此时的数据格式是RAW DATA。必须通过平台的isp来处理。如果集成了DSP,这RAW DATA数据经过AWB,color matrix,lens shading,gamma,sharpness,AE和de-noise处理后输出YUV或者RGB格式的数据。最后会由CPU送到framebuffer中进行显示。

高通Camera的调试主要是以Senor的bring-up以及tuning。注意这里的Sensor是在Camera中,而不是传统意义上的Senor(例如三轴传感器等)。

顺带提一下,高通平台的Camera架构从以前用的mm-camera转向camx-chi,完全是两样不同的东西:软件架构不同、代码位置不同。

CamX

但是如果没有特殊的客制化需求,一般不在框架中进行修改。后面我们会专门介绍这个部分。

硬件部分

在硬件上:

1)首先对照模组是否和手中sensor的module相匹配。

2)对照原理图和camera datasheet,检查camera module 的pin脚连接是否正确。

3)供电确认,用万用表测量Camera的电源管脚,查看Camera的供电是否正常,模组端所需电压和board所供电压是否一致

4)用示波器量Camera的MCLK管脚,看是否正确,如果MCLK正常,通常情况下PCLK也应该有波形;

5)查看Camera的Spec文档,检查PWDN和RESET的管脚触发是否正常;检查代码中camera power up时序是否与datasheet的一致。

6)在Camera的Datasheet中找出该设备的I2C地址,检查I2C配置是否正确;查看I2C通信是否正常,是否能正常进行读写,用示波器量出I2C的SCL和SDA的波形是否正常,未通信时都为高电平,通信时SCL为I2C时钟信号,SDA为I2C数据通路信号;

7)假如自己对camera寄存器列表配置不明确,可以让Sensor FAE检查Camera的寄存器列表的配置是否正确(如:msm8996-camera-sensor-adp.dtsi),

Kernel 部分

Device Tree

设备树路径:kernel/arch/arm/boot/dts/qcom

文件名:msm8916-camera-sensor-qrd-skui.dtsi

对应的驱动:kernel/drivers/media/platform/msm/camera_v2/sensor;有关设备树的解析都在这里,可以通过阅读代码获取设备树属性的有关意义。

需添加的代码:

qcom,camera@6a {  //这需要与1.3节中添加的Clock地址向对应。

    cell-index = <0>;  //唯一标识,用来区分多个摄像头。

    compatible = "ovti,ov5648";// 这要与驱动代码中的名字相对应,即:static const struct of_device_id ov5648_dt_match[] = {..
    {
        .compatible = "ovti,ov5648",
        .data = &ov5648_s_ctrl
    },

    reg = <0x6a 0x0>; //// 这需要与1.3节中添加的Clock地址向对应。

    qcom,slave-id = <0x6c 0x300a 0x5648>;
    // 0x6c为摄像头的I2C地址,0x300a为摄像头存放ID的寄存器地址,0x5648为摄像头的ID,这都需要查看datasheet或直接问模组厂。

    qcom,csiphy-sd-index = <1>; // 用于接收传感器数据的csiphy实例,可以配置的值:0,1,2
    qcom,csid-sd-index = <1>;   // 用于接收传感器数据的csid核心实例,可以配置的值:0,1,2

    // 以上两个设置需要查看主板原理图,看主板上摄像头是接在CSI0还是CSI1上的,一般后摄像头都会接到CSI0上,前摄像头会接在CSI1上。

    qcom,mount-angle = <270>; // 摄像头在设备上的物理安装角度(sensor raw图默认的方向都是90或者270!)
    // 该参数为摄像头预览界面的方向,如果预览方向有被旋转,可以通过修改这个参数进行修正。

    qcom,eeprom-src = <&eeprom0>;       // 如果支持otp(eeprom)的话,就配置成各种的eeprom节点,否则不配置。
    qcom,actuator-src = <&actuator0>;   // 如果支持马达的话,就配置成各自的马达节点,否则不配置。
	qcom,led-flash-src = <&led_flash0>; // 如果支持闪光灯的话,就配置成各自的闪光灯节点,否则不配置。
    
    qcom,sensor-name = "ov5648_oty5f03";
    // 这个对应vendor中lib文件夹的文件名,具体可参看2.2节。

    cam_vdig-supply = <&pm8916_l2>;
    cam_vana-supply = <&pm8916_l17>;
    cam_vio-supply = <&pm8916_l6>;
    // 以上三个参数分别对应DVDD(vdig)、AVDD(vana)、DOVDD(vio)三个电压,具体所接的是哪路电压,需要参看主板原理图。

    qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana";
    qcom,cam-vreg-type = <0 1 0>;
    qcom,cam-vreg-min-voltage = <1200000 0 2850000>;
    qcom,cam-vreg-max-voltage = <1200000 0 2850000>;
    qcom,cam-vreg-op-mode = <200000 0 80000>;
    //这五个配置要分别与上面的三个电压一一对应(按照从上到下的顺序),如果有对焦马达的还要在后面填一路AF的电压,如下所示:
    cam_vaf-supply = <&pm8916_l10>; // avdd供电,是否是要配置,配置成哪路系统供电,需要和硬件沟通!
    qcom,cam-vreg-name = "cam_vdig", "cam_vio",     "cam_vana",    "cam_vaf"; 
      /* 配置sensor需要的所有电源。
         可配置选项:"cam_vdig", "cam_vana", "cam_vio", "cam_vaf"
	     分别代表含义:dvdd,avdd,iovdd,af供电
		 不一定要全部配置,用到哪路配哪路,有些电路硬件自己拉高了,具体跟硬件沟通。
	   */
    qcom,cam-vreg-type = <0 1 0 0>;  // 指定用于此sensor的电源类型,0表示ldo电源,1表示lvs电源。默认配0.
      qcom,cam-vreg-min-voltage = <1200000 0 2850000 2800000>; 
      qcom,cam-vreg-max-voltage = <1200000 0 2850000 2800000>; // 供电电源的最大值,单位mV
      qcom,cam-vreg-op-mode = <200000 0 80000 100000>;  // 供电电源的最佳电压水平
	  //    上述电压值分别是按`qcom,cam-vreg-name = "cam_vdig","cam_vio","cam_vana","cam_vaf";` 顺序一一对应的!

    pinctrl-names = "cam_default", "cam_suspend"; // 默认就这么配置,前面代表clk,后面代表reset脚和standby脚,唤醒作用。
    pinctrl-0 = <&cam_sensor_mclk1_default   &cam_sensor_front_default>; // 按照顺序一一对应的
    pinctrl-1 = <&cam_sensor_mclk1_sleep     &cam_sensor_front_sleep>;   // 按照顺序一一对应的
    // 以上这两个需要区分的就是前后摄像头的配置不一样,上面这种配置是前摄像头的配置,后摄像头的配置如下所示:
    /* 如果是后摄像头,配置如下所示
    pinctrl-names = "cam_default", "cam_suspend";
    pinctrl-0 = <&cam_sensor_mclk0_default  &cam_sensor_rear_default>;
    pinctrl-1 = <&cam_sensor_mclk0_sleep    &cam_sensor_rear_sleep>;
    */

    gpios = <&msm_gpio 27 0>,    <&msm_gpio 28 0>,    <&msm_gpio 33 0>,    <&msm_gpio 119 0>;
    qcom,gpio-reset = <1>;    // 传感器 reset脚的索引
    qcom,gpio-standby = <2>;  // 传感器 standby脚的索引
    qcom,gpio-vana = <3>;
    qcom,gpio-req-tbl-num = <0 1 2 3>; // mclk,reset,stanby的索引;
        // 由于mclk为0,qcom,gpio-reset = <1>,qcom,gpio-standby = <2>;因此配置成 <0,1,2,3>
    qcom,gpio-req-tbl-flags = <1 0 0 0>; // gpio的方向,mclk为1,表示输出,reset、standby和vana都为0,表示输入。
    qcom,gpio-req-tbl-label = "CAMIF_MCLK",     "CAM_RESET",    "CAM_STANDBY",    "CAM_VANA";
    	/* gpio的名称。
				常用值:
				"CAMIF_MCLK", "CAM_RESET","CAM_STANDBY";
				"CAMIF_MCLK0", "CAM_RESET0","CAM_STANDBY0";
				"CAMIF_MCLK1", "CAM_RESET1","CAM_STANDBY1";
				"CAMIF_MCLK2", "CAM_RESET2","CAM_STANDBY2";
		*/
    // 上面这部分主要是配置GPIO口,这里需要注意的是gpios的数组要与gpio-req-tbl-label的名字一一对应,即gpio 27对应CAMIF_MCLK,而reset 、standby 、vana 分别对应gpios数组中的第1、2、3参数,gpio-req-tbl-num也对应于gpios中数组的标号。

    qcom,gpio-set-tbl-num = <1 1>;
    qcom,gpio-set-tbl-flags = <0 2>;
    qcom,gpio-set-tbl-delay = <1000 4000>;
    // 这三个参数是前摄像头的固定模式,后摄像头不需要这个设置,在配置后摄像头时直接去掉即可。

    qcom,csi-lane-assign = <0x4320>;
    // 该参数为主芯片mipi Lane个数配置寄存器。

    qcom,csi-lane-mask = <0x3>;
    // 该参数为配置mipi Lane个数,0x3为1组数据线加1组时钟线,0x07为2组数据线加1组时钟线,0x1f为4组数据线加1主时钟线。

    qcom,sensor-position = <1>;
    // 该参数,如果添加的是前摄像头需要配置成1,如果是后摄像头需要配置成0

    qcom,sensor-mode = <1>; // 传感器模式支持
    	/*
            0 -> back camera 2D
            1 -> front camera 2D
            2 -> back camera 3D
            3 -> back camera int 3D
    	*/
    qcom,cci-master = <0>; // sensor使用的master id。可选值: `0 -> MASTER 0`、`1 -> MASTER 1`

    status = "ok";

    clocks = <&clock_gcc clk_mclk1_clk_src>,    <&clock_gcc clk_gcc_camss_mclk1_clk>; // 设备使用的时钟
    clock-names = "cam_src_clk", "cam_clk"; // 设备所需时钟的名称
    // 上面两个Clocks和Clock-names是前摄像头的配置,后摄像头的配置如下:
    /*	
    clocks = <&clock_gcc clk_mclk0_clk_src>,    <&clock_gcc clk_gcc_camss_mclk0_clk>;
    clock-names = "cam_src_clk", "cam_clk";
	*/
};

另外如果有对焦马达还需要修改对焦马达的地址,如下所示:

actuator0: qcom,actuator@6e {
    cell-index = <3>;
    reg = <0x18>;
    compatible = "qcom,actuator";
    qcom,cci-master = <0>;
};

宏开关

代码路径:kernel/arch/arm/configs

文件名:msm8916_defconfig msm8916-perf_defconfig

需添加的代码:CONFIG_OV5648=y

Clock

代码路径:kernel/arch/arm/mach-msm

文件名:clock-8226.c

需添加的代码:

CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6f.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk1_clk_src.c, "90.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6d.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6a.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6c.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "20.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "78.qcom,camera"),

CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6f.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk1_clk.c, "90.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6d.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6a.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6c.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "78.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "20.qcom,camera"),

CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "62.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "62.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "0.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "1.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "0.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "1.qcom,camera"),

需要注意的是这里的标示(如:6a)不能重复,并且添加的时候需要同时添加一组代码。

编译

Kconfig和Makefile文件中添加对应IC代码:

代码路径:kernel/drivers/media/platform/msm/camera_v2(Kconfig路径),kernel/drivers/media/platform/msm/camera_v2sensor(Makefile路径)

文件名:Kconfig和Makefile

需添加的代码:

添加Kconfig:

config OV5648

bool "Sensor OV5648 (BAYER 5M)"
depends on MSMB_CAMERA

—help—

OmniVision 5 MP Bayer Sensor, only use 1 mipi lane,
preview set to 1296*972 at 30 fps,
snapshot set to 2592*1944 at 12 fps,
This sensor driver does not support auto focus.

添加Makefile:

obj-$(CONFIG_OV5648) = ov5648.o

Camera驱动

代码路径:kernel/drivers/media/platform/msm/camera_v2sensor

文件名:ov5648.c

需添加的代码:

该部分主要要注意电源的设置,它包括传感器电源信息,IO控制和Mclk。通常情况下,无需修改该部分内容,因为大部分配置已在设备树文件中完成;但可以修改.delay = 0 字段来和时间匹配。

static struct msm_sensor_power_setting ov5648_power_setting[] = {
    {
        .seq_type = SENSOR_VREG,
        .seq_val = CAM_VIO,
        .config_val = 0,
        .delay = 0,
    },
    {
        .seq_type = SENSOR_VREG,
        .seq_val = CAM_VAF,
        .config_val = 0,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_VDIG,
        .config_val = GPIO_OUT_LOW,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_VDIG,
        .config_val = GPIO_OUT_HIGH,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_VANA,
        .config_val = GPIO_OUT_HIGH,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_STANDBY,
        .config_val = GPIO_OUT_LOW,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_STANDBY,
        .config_val = GPIO_OUT_HIGH,
        .delay = 10,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_RESET,
        .config_val = GPIO_OUT_LOW,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_RESET,
        .config_val = GPIO_OUT_HIGH,
        .delay = 10,
    },
    {
        .seq_type = SENSOR_CLK,
        .seq_val = SENSOR_CAM_MCLK,
        .config_val = 23880000,
        .delay = 10,
    },
    {
        .seq_type = SENSOR_I2C_MUX,
        .seq_val = 0,
        .config_val = 0,
        .delay = 0,
    },
};
static struct msm_sensor_power_setting ov5648_power_down_setting[] = {
    {
        .seq_type = SENSOR_VREG,
        .seq_val = CAM_VIO,
        .config_val = 0,
        .delay = 0,
    },
    {
        .seq_type = SENSOR_VREG,
        .seq_val = CAM_VAF,
        .config_val = 0,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_VANA,
        .config_val = GPIO_OUT_LOW,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_STANDBY,
        .config_val = GPIO_OUT_LOW,
        .delay = 5,
    },
    {
        .seq_type = SENSOR_GPIO,
        .seq_val = SENSOR_GPIO_RESET,
        .config_val = GPIO_OUT_LOW,
        .delay = 10,
    },
    {
        .seq_type = SENSOR_CLK,
        .seq_val = SENSOR_CAM_MCLK,
        .config_val = 23880000,
        .delay = 10,
    },
    {
        .seq_type = SENSOR_I2C_MUX,
        .seq_val = 0,
        .config_val = 0,
        .delay = 0,
    },
};

Vendor部分

Makefile

在Makefile文件中添加IC代码:

代码路径:qcom/proprietary/common/config

文件名:device-vendor.mk

需添加的代码:

MM_CAMERA = libchromatix_ov5648_oty5f03_common
MM_CAMERA = libchromatix_ov5648_oty5f03_default_video
MM_CAMERA = libchromatix_ov5648_oty5f03_preview
MM_CAMERA = libchromatix_ov5648_oty5f03_snapshot
MM_CAMERA = libchromatix_ov5648_oty5f03_zsl
MM_CAMERA = libmmcamera_ov5648_oty5f03

注意:如果这里没有添加以上代码,在编译的时候就不会生成相应的so文件。

这so文件可以在srcLINUXandroidout argetproductmsm8916_32systemendorlib目录下找到,如下所示:

libchromatix_ov5648_oty5f03_common.so
libchromatix_ov5648_oty5f03_default_video.so
libchromatix_ov5648_oty5f03_preview.so
libchromatix_ov5648_oty5f03_snapshot.so
libchromatix_ov5648_oty5f03_zsl.so
libmmcamera_ov5648_oty5f03.so

Lib驱动

代码路径:

vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs

文件夹名:ov5648_oty5f03

需添加的代码如下。

移植相机接口配置

这部分内容定义了传感器接口配置,包括I2C和MIPI。请确认设置不会和dtsi文件中的类似内容冲突。

static struct msm_camera_sensor_slave_info sensor_slave_info = {
    .camera_id = CAMERA_0,
    .slave_addr = 0x6c,
    .addr_type = MSM_CAMERA_I2C_WORD_ADDR,
    .sensor_id_info = {
        .sensor_id_reg_addr = 0x300a,
        .sensor_id = 0x5648,
    },
    .power_setting_array = {
        .power_setting = ov5648_oty5f03_power_setting,
        .size = ARRAY_SIZE(ov5648_oty5f03_power_setting),
        .power_down_setting = ov5648_oty5f03_power_down_setting,
        .size_down = ARRAY_SIZE(ov5648_oty5f03_power_down_setting),
    },
};
static sensor_output_t sensor_output = {
    .output_format = SENSOR_BAYER,
    .connection_mode = SENSOR_MIPI_CSI,
    .raw_output = SENSOR_10_BIT_DIRECT,
};
#ifndef VFE_40
static struct csi_lane_params_t csi_lane_params = {
    .csi_lane_assign = 0xE4,
    .csi_lane_mask = 0x3,
    .csi_if = 1,
    .csid_core = {0},
    .csi_phy_sel = 0,
};
#else
static struct csi_lane_params_t csi_lane_params = {
    .csi_lane_assign = 0x4320,
    .csi_lane_mask = 0x3,
    .csi_if = 1,
    .csid_core = {0},
    .csi_phy_sel = 1,
};
#endif

移植传感器输出配置

这部分内容介绍了传感器不同模式的配置和设置,包含各模式的I2C 寄存器设备、CSI参数、crop参数、传感器输出信息和chormatix数组。这些配置的数组大小应和传感器支持的模式种类相同。

static struct msm_camera_i2c_reg_setting res_settings[] = {
    {
        .reg_setting = res0_reg_array,
        .size = ARRAY_SIZE(res0_reg_array),
        .addr_type = MSM_CAMERA_I2C_WORD_ADDR,
        .data_type = MSM_CAMERA_I2C_BYTE_DATA,
        .delay = 0,
    },
    {
        .reg_setting = res1_reg_array,
        .size = ARRAY_SIZE(res1_reg_array),
        .addr_type = MSM_CAMERA_I2C_WORD_ADDR,
        .data_type = MSM_CAMERA_I2C_BYTE_DATA,
        .delay = 0,
    },
};
// ……
static struct msm_camera_csi2_params *csi_params[] = {
    &ov5648_oty5f03_csi_params,
    &ov5648_oty5f03_csi_params,
};
// ……
static struct sensor_crop_parms_t crop_params[] = {
    {0, 0, 0, 0},
    {0, 0, 0, 0},
};
// ……
static struct sensor_lib_out_info_t sensor_out_info[] = {
    {
        .x_output = 2592,
        .y_output = 1944,
        .line_length_pclk = 2816,
        .frame_length_lines = 2380,
        .vt_pixel_clk = 84000000,
        .op_pixel_clk = 84000000,
        .binning_factor = 1,
        .max_fps = 12.5,
        .min_fps = 7.5,
        .mode = SENSOR_DEFAULT_MODE,
    },
    {
        .x_output = 1296,
        .y_output = 972,
        .line_length_pclk = 1408,
        .frame_length_lines = 992,
        .vt_pixel_clk = 42000000,
        .op_pixel_clk = 42000000,
        .binning_factor = 1,
        .max_fps = 30.0,
        .min_fps = 7.5,
        .mode = SENSOR_DEFAULT_MODE,
    },
};
// ……
static struct sensor_lib_chromatix_t ov5648_oty5f03_chromatix[] = {
    {
        .common_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(common),
        .camera_preview_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(snapshot),
        .camera_snapshot_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(snapshot),
        .camcorder_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(default_video),
    },
    {
        .common_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(common),
        .camera_preview_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(preview),
        .camera_snapshot_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(preview),
        .camcorder_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(default_video),
    },
};

镜头信息移植

相机处理流程(比如曝光计算)需要镜头信息。因此,以下结构需添加正确的镜头信息。

static sensor_lens_info_t default_lens_info = {
    .focal_length = 2.37,
    .pix_size = 1.4,
    .f_number = 2.4,
    .total_f_dist = 1.97,
    .hor_view_angle = 70.24,
    .ver_view_angle = 52.68,

};

曝光配置移植

通常情况下,不同传感器有不同的曝光控制方式。所以,当传感器打开后,需移植曝光配置以成功调试传感器的曝光控制。

包括以下函数:

  • ov5648_real_to_register_gain – 将实际逻辑增益转换为寄存器值。

  • ov5648_register_to_real_gain – 将寄存器值转换成真实的逻辑增益。

  • ov5648_calculate_exposure – 获取曝光时间和增益的另一个曝光配置.

  • ov5648_fill_exposure_array – 准备另一个曝光配置数组。

添加Chromatix文件

代码路径:vendor/qcom/proprietary/mm-camera/mm-camera2media-controller/modules/sensor/schro/matix1/libchromatix

文件夹名:chromatix_ov5648_oty5f03

需添加的代码:该部分主要是针对raw格式是摄像头,而yuv格式的摄像头不需要做该步骤,而这添加的内容主要是raw摄像头效果参数的.h文件,这需要向模组或IC厂索要该部分的文件。

免责声明:文章转载自《高通Android Camera Bring up》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何学好VC和MFC(各前辈学习方法及感受整理)(三)SpringBoot分层概览下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

gpio IOCTL控制

之前工作的时候,linux下用过GPIO的,无非就是配置输出输入模式,set/get value ,或者是gpio中断之类的,用户态配置GPIO主要是两种方式:用户态使用mmap直接将GPIO 地址映射过来,操作地址, 或者 IOCTL发命令给内核,内核来控制,最近半年都在写单片机的代码。时间久了有点忘了,最近使用都是偷懒直接使用了/sys下的设备,通过s...

STM32 0.96OLED I2C 显示(转载)

转载于:https://www.cnblogs.com/hjf-log/p/stm32-oled.html 使用stm32工程模板,移植其他人使用0.96寸的Oled代码,在OLED上显示字符,使用的引脚是PB3和PB4,是用了重映射的引脚 这里使用的IC是stm32f103vet6,软件是keil5 百度网盘链接:https://pan.baidu.c...

Linux如何进行GPIO读写操作的?

摘要:本文介绍GPIO的读写,介绍基本原理,以及不同读写方式的性能。 本文分享自华为云社区《Linux 基于sysfs的GPIO读写操作》,作者:一颗小树x 。 前言 最近接触到Linux系统中的GPIO开发,这里做个小总结,也分享一下;本文会介绍GPIO的读写,介绍基本原理,以及不同读写方式的性能。 一、GPIO sysfs interface 基本原...

STM32学习笔记(八) SPI总线(操作外部flash)

1. SPI总线简介 SPI全称串行外设接口,是一种高速,全双工,同步的外设总线;它工作在主从方式,常规需要至少4根线才能够正常工作。SPI作为基本的外设接口,在FLASH,EPPROM和一些数字通讯中,具有广泛的应用。SPI总线由四个接口构成: CS :片选端,由主设备控制 MISO:主设备输入,从设备输出 MOSI:主设备输出,从设备输入 SCK :时...

Shell脚本学习笔记3——控制GPIO

在我参与维护的一个项目中,硬件上有一处设计失误:本应该短接到地的一个GPIO没有短接到地,导致某一个功能不能实现,正式出货的时候会进行改版。 但目前还处于测试阶段,只需要先把这个功能实现出来,方案有两个,一是硬件上飞线去实现,而是通过软件去拉低这个GPIO。鉴于硬件飞线比较麻烦,所以我们选择软件上写一个脚本来实现。 我们可以先通过命令行来控制某一个GPIO...

电赛菜鸟营培训(一)——STM32F103CB之LED控制

一、STM32F103C8 引脚分布 二、LED的共阴、共阳接法 这里应该是七段数码管的接法。 限流电阻选择为470,在Multism中仿真,也需要接入,否则会出现闪烁情况。或者直接更改属性。 三、消除按钮的机械振动 1、键的特性 键盘是由若干独立的键组成,键的按下与释放是通过机械触点的闭合与断开来实现的,因机械触点的弹性作用,在闭合与断开的瞬间均有...