Sprd平台Camera驱动移植实战:从SL8521E硬件连接到Android 4.4系统适配
1. 硬件平台与系统环境准备在开始SL8521E平台的Camera驱动移植前我们需要先了解硬件和软件的基本情况。SL8521E是展讯推出的一款中低端智能手机平台搭载Android 4.4系统。这个组合在现在的开发环境中算是比较老旧的配置但在一些特定场景下仍然有应用需求。我最近接手了一个项目需要在这个平台上适配GC5025主摄和sp0a09z前摄。刚开始时也踩了不少坑后来慢慢摸索出一套可行的方案。下面就把我的实战经验分享给大家希望能帮助到有类似需求的开发者。首先来看硬件配置主摄GC5025500万像素MIPI CSI-2接口2 lane前摄sp0a09z30万像素MIPI CSI-2接口1 lane支持功能自动对焦、持续对焦、HDR、录像等软件环境方面需要注意Android 4.4的系统框架与新版有很大不同内核版本较老很多新特性不支持开发工具链需要特别注意兼容性建议在开始前准备好以下工具和环境完整的代码仓库包括kernel和vendor部分硬件原理图这个非常重要传感器规格书和数据手册交叉编译工具链调试串口连接2. 硬件原理图分析与引脚配置2.1 主摄硬件连接解析拿到硬件原理图后首先要确认Camera模组的连接方式。以GC5025主摄为例我们需要关注以下几个关键点MIPI接口部分数据线对MCSI1_DATA0_P/N、MCSI1_DATA1_P/N时钟线对MCSI1_CLK_P/N注意检查是否有共模电感这在原理图上通常显示为串联的小方块控制信号部分复位脚(RST)GPIO45电源使能脚(PWDN)GPIO47主时钟(MCLK)GPIO43供电部分需要特别关注VDDCAMIO1.8V给IO供电VDDCAMCORE1.2V数字核心电压VDDCAMA2.8V模拟电压VDDCAMMOT2.8V马达驱动电压在实际项目中最容易出问题的是供电时序。建议用示波器测量各电压的上电顺序是否符合传感器规格书的要求。我遇到过因为供电时序不对导致传感器无法初始化的情况调试了很久才发现是电源管理芯片的配置问题。2.2 前摄硬件连接解析前摄sp0a09z的连接相对简单一些MIPI接口数据线对MCSI0_DATA0_P/N时钟线对MCSI0_CLK_P/N控制信号复位脚GPIO44电源使能脚GPIO46主时钟GPIO42供电部分VDDCAMIO1.8VVDDCAMA2.8V前摄不需要自动对焦功能所以没有马达驱动电压。这里要注意的是前摄的像素只有30万在配置参数时不要照搬主摄的设置。3. 内核设备树(DTS)配置3.1 主摄设备树节点配置设备树配置是Camera驱动移植的关键环节。在SL8521E平台中我们需要修改两个主要部分I2C节点和MIPI CSI节点。主摄的I2C节点配置示例i2c0 { status okay; clock-frequency 400000; sensor_main: sensor-main37 { 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; }; }; }; };几个关键参数说明reg传感器的I2C地址必须与硬件一致clock-names和clocks时钟配置展讯平台有特定的命名规则vdd*开头的supply对应各个供电轨gpios复位和使能脚配置host指定连接的DCAM控制器MIPI CSI PHY节点配置mipi_csi_phy1 { status okay; sprd,phyid 1; sprd,csi csi0; port { phy1_out: endpoint { remote-endpoint sensor_main_0; }; }; };3.2 前摄设备树节点配置前摄的配置与主摄类似但参数有所不同i2c0 { sensor_sub: sensor-sub3d { 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; 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; }; }; }; }; mipi_csi_phy0_m { status okay; sprd,phyid 2; sprd,csi csi1; port { phy0_m_out: endpoint { remote-endpoint sensor_sub_0; }; }; };注意前摄使用的是不同的DCAM控制器和PHY接口。在实际项目中最容易出错的是remote-endpoint的连接关系一定要确保传感器节点和PHY节点的endpoint名称对应正确。4. Vendor层驱动集成4.1 添加lib和chromatix文件展讯平台的Camera驱动主要放在vendor目录下包括lib驱动和chromatix参数文件。我们需要为GC5025添加以下文件lib驱动文件路径vendor/sprd/modules/libcamera/sensor/sensor_drv/classic/Galaxycore/gc5025/ ├── sensor_gc5025_mipi_raw.c └── sensor_gc5025_mipi_raw.hchromatix参数文件路径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如果传感器厂商没有提供这些文件通常的做法是找一个相近的传感器驱动进行修改。比如GC5025可以参考GC5035的驱动但要注意修改以下关键参数寄存器初始化序列分辨率设置时钟配置数据格式(RGGB、BGGR等)4.2 驱动入口函数注册添加完驱动文件后需要在sensor_cfg.c中注册驱动入口// 声明 #ifdef GC5025 extern SENSOR_INFO_T g_sensor_gc5025_mipi_raw_info; #endif // 添加到主摄数组 const SENSOR_MATCH_T back_sensor_infor_tab[] { ... #ifdef GC5025 { MODULE_SUNNY, gc5025, g_sensor_gc5025_mipi_raw_info, {dw9714_drv_entry, 0}, NULL }, #endif ... };对于前摄sp0a09z也需要类似的注册过程但要添加到front_sensor_infor_tab数组中。4.3 自动对焦(AF)驱动配置GC5025使用了DW9714自动对焦马达需要额外配置AF驱动首先在BoardConfig.mk中启用AF功能# 持续对焦 TARGET_BOARD_CAMERA_CAF : true # 自动对焦 TARGET_BOARD_CAMERA_AUTOFOCUS : true # VCM驱动 TARGET_BOARD_AF_VCM_DW9714 : true添加AF驱动文件到vendor/sprd/modules/libcamera/sensor/af_drv/dw9714/ ├── dw9714.c └── dw9714.h在sensor_cfg.c中关联AF驱动extern struct sns_af_drv_entry dw9714_drv_entry; { MODULE_SUNNY, gc5025, g_sensor_gc5025_mipi_raw_info, {dw9714_drv_entry, 0}, NULL },在实际调试中AF功能经常会出现问题。建议先确保基本成像功能正常后再调试AF可以通过以下步骤验证检查马达供电是否正常确认I2C通信是否成功查看AF校准数据是否正确加载5. 系统配置与编译选项5.1 BoardConfig.mk关键配置在device目录下的BoardConfig.mk中需要配置Camera相关参数# 摄像头分辨率配置 CAMERA_SUPPORT_SIZE : 5M FRONT_CAMERA_SUPPORT_SIZE : 0M3 # 传感器类型 CAMERA_SENSOR_TYPE_BACK : gc5025,gc5035 CAMERA_SENSOR_TYPE_FRONT : sp0a09z # 前摄存在标志 TARGET_BOARD_NO_FRONT_SENSOR : false # 对焦功能 TARGET_BOARD_CAMERA_CAF : true TARGET_BOARD_CAMERA_AUTOFOCUS : true这些配置必须与实际硬件一致否则会导致驱动加载失败。我曾经遇到过因为FRONT_CAMERA_SUPPORT_SIZE配置错误导致前摄无法正常工作的情况。5.2 编译选项调整展讯平台的Camera驱动通过多个宏控来管理功能模块需要特别注意在SprdCtrl.mk中ifeq ($(strip $(TARGET_BOARD_CAMERA_CAF)),true) LOCAL_CFLAGS -DCONFIG_CAMERA_CAF endif ifneq ($(strip $(TARGET_BOARD_CAMERA_AUTOFOCUS)),true) LOCAL_CFLAGS -DCONFIG_CAMERA_AUTOFOCUS_NOT_SUPPORT endif这些宏控逻辑有点绕简单来说CAF功能true时定义CONFIG_CAMERA_CAFAF功能false时定义CONFIG_CAMERA_AUTOFOCUS_NOT_SUPPORT也就是说AF功能默认是开启的只有当显式设置为false时才会关闭。6. 调试技巧与常见问题在实际移植过程中我总结了一些实用的调试技巧内核日志过滤adb shell dmesg | grep -E camera|sensor|mipi检查传感器是否被识别adb shell cat /proc/device-tree/i2c*/*/compatible验证I2C通信adb shell i2cdetect -y 0 # 检查I2C0总线上的设备常见问题及解决方案传感器无法初始化检查供电电压和时序确认MCLK时钟是否正常验证复位信号是否正确图像显示异常检查MIPI数据线是否接反确认数据格式配置是否正确查看chromatix参数是否匹配AF功能失效检查马达供电验证I2C通信是否正常确认AF校准数据是否正确加载最后提醒一点展讯平台的代码结构经常会变动不同版本之间可能有差异。如果遇到问题最好查阅对应版本的开发文档或咨询原厂支持。