前言
Qocm平台 Android5.1 和 Android8.0 (N1 msm8909)流程基本一致,Android9.0(msm8953)框架变化较大。
而展讯平台Android4.4(SC9820E),框架又有所不同,因此共三份文档。
- A-(msm8953 Android9.0)
- B-(msm8909 Android5.1/8.0)
- 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.2 主摄设备树配置 (Rear Camera dts cfg)
1.3 前摄硬件原理图 (Front Camera SCh)
1.4 前摄设备树配置 (Front Camera dts cfg)
2.2 vendor 添加 lib 和 chromatix 文件
1 Kernel 部分
1.1 主摄硬件原理图 (Rear Camera SCH)
查阅硬件主板主摄相关接口信息如下:
主摄 gc5025 500w:
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. MIPI – CSI 接线
- MCSI1_CLK_P, MCSI1_CLK_P ;
- MCSI1_DATA1_P,MCSI1_DATA1_N;
- MCSI1_DATA0_P,MCSI1_DATA0_N;
2. cam rst复位脚、 cam mclk 时钟脚、csm pwn 脚
- gpio45、gpio43、gpio47;
3. 供电部分
- VDD IO核心电,1.8V – VDDCAMIO;
- VDD IO数字电,1.2V – VDDCAMCORE;
- VDD AF马达电,2.8V – VDDCAMMOT;
- 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)像素
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. MIPI – CSI0 接线
- MCSI0_CLK_P,MCSI0_CLK_N
- MCSI0_DATA0_P,MCSI1_DATA0_N
2. cam rst复位脚、 cam mclk 时钟脚、csm pwn 脚
- gpio44、gpio42、gpio46
3. 供电部分
- VDD IO核心电1.8V – VDDCAMIO
- 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部分:
- lib 驱动参数配置部分和chromatix 效果参数配置部分
- 编译选项配置
不同于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
全刷验证。