Sprd平台添加Camera驱动(SL8521E/SC9820E)

前言

Qocm平台 Android5.1 和 Android8.0 (N1 msm8909)流程基本一致,Android9.0(msm8953)框架变化较大。

而展讯平台Android4.4(SC9820E),框架又有所不同,因此共三份文档。

  1. A-(msm8953 Android9.0)
  2. B-(msm8909 Android5.1/8.0)
  3. C-(SC9820E Android4.4)

    本文是 C-(SC9820E Android4.4)

SC9820E平台特性

硬件平台:SL8521E

软件平台:Android-4.4

Sensor IC:

主摄:GC5025 5M(500w像素),主摄,最大 2 lane,5M像素

前摄:sp0a09z 0M3(30w像素),前摄,最大 1 lane,2M像素。

其他:支持闪光灯,自动对焦,持续对焦,录像功能,HDR。

数据格式:RGGB

前言

1 Kernel 部分

1.1 主摄硬件原理图 (Rear Camera SCH)

1.1.1 Rear Cam mipi 布线串联共模电感

1.1.2 Rear cam csi 1 主摄接线

1.1.3 Rear cam rst 脚

1.1.4 Rear cam mclk 时钟脚

1.1.5 Rear cam pwn 脚

1.1.6 Rear cam 获取主摄信息

1.2 主摄设备树配置 (Rear Camera dts cfg)

1.2.1 Rear cam I2C 节点配置

1.2.2 Rear cam mipi 节点配置

1.3 前摄硬件原理图 (Front Camera SCh)

1.3.1 Front cam mipi 布线串联共模电感 

1.3.2 Front cam csi 0 前摄接线

1.3.3 Front cam rst 脚

1.3.4 Front cam mclk 脚

1.3.5 Front cam pwn 脚

1.3.6 Front cam 获取前摄信息 

1.4 前摄设备树配置 (Front Camera dts cfg)

1.4.1 Front cam I2C 节点配置 

1.4.2 Front cam mipi 节点配置

2 vendor 部分

2.1 device 下项目配置 camera

2.2 vendor 添加 lib 和 chromatix 文件

2.3 vendor 引用 lib 驱动入口函数

2.4 AF 驱动 & 修改编译选项

2.5 OTP 驱动 ( eeprom) & 修改编译选项

3 Tips

你再快,也永远有人比你快!Fighting ~~

1 Kernel 部分

1.1 主摄硬件原理图 (Rear Camera SCH)

查阅硬件主板主摄相关接口信息如下:

主摄 gc5025 500w:

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.1.1 Rear Cam mipi 布线串联共模电感

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.1.2 Rear cam csi 1 主摄接线

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.1.3 Rear cam rst 脚

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.1.4 Rear cam mclk 时钟脚

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.1.5 Rear cam pwn 脚

Sprd平台添加Camera驱动(SL8521E/SC9820E)

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.1.6 Rear cam 获取主摄信息

1. MIPI – CSI 接线

  1. MCSI1_CLK_P, MCSI1_CLK_P ;
  2. MCSI1_DATA1_P,MCSI1_DATA1_N;
  3. MCSI1_DATA0_P,MCSI1_DATA0_N;

2. cam rst复位脚、 cam mclk 时钟脚、csm pwn 脚

  1. gpio45、gpio43、gpio47;

3. 供电部分

  1. VDD  IO核心电,1.8V – VDDCAMIO;
  2. VDD  IO数字电,1.2V – VDDCAMCORE;
  3. VDD  AF马达电,2.8V – VDDCAMMOT;
  4. VDD  模拟电,   2.8V – VDDCAMA;

1.2 主摄设备树配置 (Rear Camera dts cfg)

dts配置路径:kernel\arch\arm\boot\dts\xxx\xxx_sp9820e-2h10-native.dts

1.2.1 Rear cam I2C 节点配置

Rear Camera 配置节点:

&i2c0 { // 根据camera挂载更改
	status = "okay";
	clock-frequency = <400000>;

    /* Rear Camera */
	sensor_main: sensor-main@37 {
		compatible = "sprd,sensor-main";
		reg = <0x37>;
		clock-names = "clk_src","sensor_eb",
			"clk_96m","clk_76m8",
			"clk_48m","clk_26m";
		clocks = <&clk_sensor1>, <&clk_mm_ckg_gates 2>,
			<&clk_twpll_96m>,<&clk_twpll_76m8>,
			<&clk_twpll_48m>,<&ext_26m>;
		vddio-supply = <&vddcamio>;
		vddcama-supply = <&vddcama>;
		vddcamd-supply = <&vddcamd>;
		vddcammot-supply = <&vddcammot>;
		reset-gpios = <&ap_gpio 45 0>;
		power-down-gpios = <&ap_gpio 47 0>;
		host = "dcam0";
		port {
			sensor_main_0: endpoint {
				remote-endpoint = <&phy1_out>;
			};
		};
	};
...
};

1.2.2 Rear cam mipi 节点配置

&mipi_csi_phy1 {
	status = "okay";
	sprd,phyid = <1>;
	sprd,csi = <&csi0>;
	port {
	phy1_out: endpoint {
		remote-endpoint = <&sensor_main_0>;
		};
	};
};

1.3 前摄硬件原理图 (Front Camera SCh)

前摄 sp0a09z 03M(30w)像素

Sprd平台添加Camera驱动(SL8521E/SC9820E)

 

1.3.1 Front cam mipi 布线串联共模电感 

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.3.2 Front cam csi 0 前摄接线

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.3.3 Front cam rst 脚

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.3.4 Front cam mclk 脚

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.3.5 Front cam pwn 脚

Sprd平台添加Camera驱动(SL8521E/SC9820E)

1.3.6 Front cam 获取前摄信息 

1. MIPI – CSI0 接线

  1. MCSI0_CLK_P,MCSI0_CLK_N
  2. MCSI0_DATA0_P,MCSI1_DATA0_N

2. cam rst复位脚、 cam mclk 时钟脚、csm pwn 脚

  1. gpio44、gpio42、gpio46

3. 供电部分

  1. VDD  IO核心电1.8V – VDDCAMIO
  2. VDD  模拟电   2.8V – VDDCAMA

1.4 前摄设备树配置 (Front Camera dts cfg)

1.4.1 Front cam I2C 节点配置 

&i2c0 { // 根据实际挂载修改
	status = "okay";
	clock-frequency = <400000>;
...
	sensor_sub:sensor-sub@3d {
		compatible = "sprd,sensor-sub";
		reg = <0x3d>;
		clock-names = "clk_src","sensor_eb",
			"clk_96m","clk_76m8",
			"clk_48m","clk_26m";
		clocks = <&clk_sensor0>, <&clk_mm_ckg_gates 1>,
			<&clk_twpll_96m>,<&clk_twpll_76m8>,
			<&clk_twpll_48m>,<&ext_26m>;
		vddio-supply = <&vddcamio>;
		vddcama-supply = <&vddcama>;
		vddcamd-supply = <&vddcamd>;
		vddcammot-supply = <&vddcammot>;
		reset-gpios = <&ap_gpio 44 0>;
		power-down-gpios = <&ap_gpio 46 0>;
		host = "dcam1";
		port {
			sensor_sub_0: endpoint {
				remote-endpoint = <&phy0_m_out>;
			};
		};
	};
};

1.4.2 Front cam mipi 节点配置

&mipi_csi_phy0_m {
	status = "okay";
	sprd,phyid = <2>;
	sprd,csi = <&csi1>;
	port {
		phy0_m_out:endpoint {
			remote-endpoint = <&sensor_sub_0>;
		};
	};
};

 

2 vendor 部分

2.1 device 下项目配置 camera

路径: device\xxx\BoardConfig.mk

1.  修改对应的camera的对应像素信息配置,根据camera 规格书配置。

#select camera 2M,3M,5M,8M,13M,16M,21M

CAMERA_SUPPORT_SIZE := 5M // 代表主摄
FRONT_CAMERA_SUPPORT_SIZE := 0M3 // 代表前摄

关闭对立冲突的宏

FRONT_CAMERA_SUPPORT_SIZE := 0M3
...
TARGET_BOARD_NO_FRONT_SENSOR := false

这两个宏的含义是相反的

如果使用了前摄就需要把 TARGET_BOARD_NO_FRONT_SENSOR 置false。

2. 修改前后摄像头对应的型号

#camera sensor type
CAMERA_SENSOR_TYPE_BACK := "gc5025,gc5035"
CAMERA_SENSOR_TYPE_FRONT := "sp0a09z"

3. 修改对焦功能配置

#select continuous auto focus
+TARGET_BOARD_CAMERA_CAF := true
 #select camera support autofocus
+TARGET_BOARD_CAMERA_AUTOFOCUS := true

4. 以上信息务必根据实际需要填写

5. 若第一次无法点亮,可以屏蔽AF和FLASH LED功能,优先保证出图后,再调试其他功能。

2.2 vendor 添加 lib 和 chromatix 文件

一般lib和chromatix驱动文件厂家会提供,若不提供。

需要找一个比较相近的sensor,或同一个数据格式、同一个厂商的驱动文件上修改而来。

vendor驱动文件主要分2部分:

  1. lib 驱动参数配置部分和chromatix 效果参数配置部分
  2. 编译选项配置

不同于qcom架构,展讯的cam 驱动中,lib 驱动配置和效果参数配置文件位于同一个目录下。

以gc5025举例,添加lib驱动和chromatix驱动:

lib 驱动

路径:vendor\sprd\modules\libcamera\sensor\sensor_drv\classic\Galaxycore\gc5025\

文件

    sensor_gc5025_mipi_raw.c // 计算曝光等函数
    sensor_gc5025_mipi_raw.h // 驱动参数配置

chromatix 驱动

路径:vendor\sprd\modules\libcamera\sensor\sensor_drv\classic\Galaxycore\gc5025\parameters

文件:

    isp_nr.h
    sensor_gc5025_raw_param_cap_0.c
    sensor_gc5025_raw_param_common.c
    sensor_gc5025_raw_param_main.c
    sensor_gc5025_raw_param_prv_0.c
    sensor_gc5025_raw_param_video_0.c
...

2.3 vendor 引用 lib 驱动入口函数

修改路径: vendor/sprd/modules/libcamera/sensor/sensor_cfg.c

注意:主摄和前摄要添加到不同的数组中。

back_sensor_infor_tab[]
front_sensor_infor_tab[]

1. 声明

主摄声明

#ifdef GC5025
extern SENSOR_INFO_T g_sensor_gc5025_mipi_raw_info;
#endif

前摄声明

#ifdef SP2509
extern SENSOR_INFO_T g_sp2509_mipi_raw_info;
#endif

2. 添加进数组中

主摄添加:

const SENSOR_MATCH_T back_sensor_infor_tab[] = {
// gc area
...
#ifdef GC5035
    {MODULE_SUNNY, "gc5035", &g_gc5035_mipi_raw_info, {&dw9714_drv_entry, 0}, NULL},
#endif
...
};

前摄添加

const SENSOR_MATCH_T front_sensor_infor_tab[] = {
// sp area
...
#ifdef SP2509
    {MODULE_SUNNY, "sp2509", &g_sp2509_mipi_raw_info, {NULL, 0}, NULL},
#endif
...
};

2.4 AF 驱动 & 修改编译选项

gc5025使用了 dw9714 AF 马达驱动,以此为例添加 dw9714 AF马达驱动:

1. 打开使用 AF 的宏

    马达是自动对焦使用的,需要打开相对应的宏

修改路径:vendor\sprd\modules\libcamera\SprdCtrl.mk

    代码如:

    #select continuous auto focus 持续对焦宏控
    TARGET_BOARD_CAMERA_CAF := true

    #select camera support autofocus 自动对焦宏控
    TARGET_BOARD_CAMERA_AUTOFOCUS := true

持续对焦控制方式:

TARGET_BOARD_CAMERA_CAF,若为真(true),则定义支持持续对焦的宏
===>
ifeq ($(strip $(TARGET_BOARD_CAMERA_CAF)),true)
LOCAL_CFLAGS += -DCONFIG_CAMERA_CAF
endif

自动对焦控制方式:

TARGET_BOARD_CAMERA_AUTOFOCUS,若不为真(true),则定义不支持自动对焦的宏

定义有点绕,但是控制原理还是和正常一样,这样做有一个好处,就是AF的功能默认就是开启的。

即:

AUTOFOCUS = true,判断条件不成立,无动作,就(默认)支持自动对焦功能。

AUTOFOCUS = false,判断条件成立,定义不支持AF的宏,就不支持自动对焦功能。

ifneq ($(strip $(TARGET_BOARD_CAMERA_AUTOFOCUS)),true)
LOCAL_CFLAGS += -DCONFIG_CAMERA_AUTOFOCUS_NOT_SUPPORT
endif

2 配置对应的AF 的宏

2.1 打开 AF 宏定义

device\prj_name\xxx\BoardConfig.mk

代码如:(这个宏经过追溯代码调用,好像不起作用。。。)

#VCM DRIVER
TARGET_BOARD_AF_VCM_DW9714 := true

​​​​​​​2.2 添加AF 索引

   路径:vendor\sprd\modules\libcamera\sensor\sensor_cfg.c

代码如:

extern struct sns_af_drv_entry dw9714_drv_entry;

#ifdef GC5025
    {MODULE_SUNNY, "gc5025", &g_sensor_gc5025_mipi_raw_info, {&dw9714_drv_entry, 0}, NULL},
#endif

3 添加AF驱动文件

路径:vendor\sprd\modules\libcamera\sensor\af_drv\dw9714\

2.5 OTP 驱动 ( eeprom) & 修改编译选项

路径: vendor\sprd\modules\libcamera\sensor\otp_drv\driver\

部分cam 不使用eeprom(OTP)驱动,这里以 imx258的OTP驱动添加为例:

1 打开 使用OTP 的宏控开关

路径:vendor\sprd\modules\libcamera\sensor\sensor_cfg.c

代码修改:

extern otp_drv_entry_t imx258_drv_entry;

{MODULE_TRULY, "imx258", &g_imx258_mipi_raw_info, {&dw9800_drv_entry, 0}, &imx258_drv_entry},

2 添加 OTP 驱动文件

路径: vendor\sprd\modules\libcamera\sensor\otp_drv\driver\imx258\

驱动文件:

    imx258_otp_drv.c
    imx258_golden_otp.h
    imx258_otp_drv.h

 

3 Tips

全刷验证。

 

 

你再快,也永远有人比你快!Fighting ~~

上一篇:脚步IK,视线跟随


下一篇:Activity切换效果,阿里P8大牛手把手教你