1. 项目背景与需求分析
2023年初,Rockchip发布了基于Android 14的BSP更新包,这对嵌入式开发者来说是个重要消息。我手头的飞凌OK3588-C开发板原本运行的是Android 12系统,客户新需求是要升级到Android 14并确保OV5645摄像头模组正常工作。这个任务看似简单,实则暗藏玄机。
OK3588-C采用的是Rockchip RK3588旗舰级处理器,其CAM3接口专门用于连接MIPI摄像头。OV5645作为经典的500万像素图像传感器,在工业领域应用广泛。但在Android 14的新Camera HAL3架构下,原有的驱动适配方式发生了重大变化。最棘手的是,飞凌提供的BSP并未包含OV5645的完整支持,需要从Rockchip原厂代码中提取相关组件进行手动适配。
2. 环境准备与源码获取
2.1 基础开发环境搭建
首先需要配置符合Android 14要求的编译环境。与早期版本不同,Android 14要求Ubuntu 20.04 LTS及以上系统,且JDK版本必须为17。我的配置如下:
bash复制sudo apt install git-core gnupg flex bison build-essential zip curl zlib1g-dev \
libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \
lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python3
2.2 源码获取与版本选择
Rockchip官方提供了两种源码获取方式:
- 通过repo工具同步完整代码(约150GB)
- 下载基线包+补丁的方式
考虑到网络状况,我选择第二种方案。关键版本信息:
- 基线版本:RK3588_ANDROID14_BETA_V1.0
- 补丁版本:RK3588_ANDROID14_CAMERA_HAL_V1.2
- 内核版本:5.10.66
下载后需要特别注意校验md5值,我曾遇到过因文件损坏导致编译失败的情况:
bash复制md5sum -c rk3588_android14.tar.gz.md5
3. 摄像头硬件接口分析
3.1 OK3588-C的摄像头接口定义
飞凌OK3588-C开发板的CAM3接口采用2-lane MIPI CSI-2标准,引脚定义如下:
| 引脚号 | 信号名称 | 说明 |
|---|---|---|
| 1 | MIPI_D0+ | 数据通道0正极 |
| 2 | MIPI_D0- | 数据通道0负极 |
| 3 | MIPI_CLK+ | 时钟正极 |
| ... | ... | ... |
| 15 | CAM_PWDN | 电源控制 |
OV5645模组需要3.3V供电,特别注意PWDN引脚需要保持低电平才能正常工作。
3.2 信号质量检测
在硬件连接阶段,建议先用示波器检查以下信号:
- MIPI时钟频率(预期297MHz)
- 数据通道眼图质量
- I2C通信波形(SCL频率应≤400KHz)
我曾遇到因阻抗匹配不良导致图像出现横纹的问题,最终通过调整PCB端接电阻解决。
4. 内核驱动适配
4.1 设备树配置
关键是在rk3588-evb.dtsi中添加OV5645节点:
dts复制&i2c4 {
status = "okay";
ov5645: ov5645@3c {
compatible = "ovti,ov5645";
reg = <0x3c>;
clocks = <&cru CLK_CIF_OUT>;
clock-names = "xvclk";
powerdown-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
reset-gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = "back";
rockchip,camera-module-name = "default";
rockchip,camera-module-lens-name = "default";
port {
ov5645_out: endpoint {
remote-endpoint = <&mipi_in_ucam0>;
data-lanes = <1 2>;
};
};
};
};
特别注意:
- I2C地址0x3c需要与摄像头模组上的电阻配置一致
- data-lanes参数必须与实际物理连接对应
4.2 内核配置选项
需要确保以下配置项启用:
code复制CONFIG_VIDEO_OV5645=y
CONFIG_MEDIA_CONTROLLER=y
CONFIG_VIDEO_ROCKCHIP_CIF=y
CONFIG_VIDEO_ROCKCHIP_ISP1=y
常见陷阱:
- 忘记启用CONFIG_MEDIA_CONTROLLER会导致v4l2子系统初始化失败
- ISP1驱动必须与内核版本严格匹配
5. HAL层适配
5.1 Camera3 HAL配置
Android 14采用了全新的Camera Provider HAL服务。需要修改device/rockchip/rk3588/camera3_profiles.xml:
xml复制<CameraSettings>
<Sensor name="ov5645" focalLength="3.5" maxJpegSize="2592x1944">
<SupportedStreamConfig width="2592" height="1944" format="YCbCr_420_888" minFrameDuration="33333333"/>
<SupportedStreamConfig width="1920" height="1080" format="IMPLEMENTATION_DEFINED" minFrameDuration="16666666"/>
</Sensor>
</CameraSettings>
5.2 分辨率与帧率调试
OV5645在不同分辨率下的最大帧率:
- 2592x1944: 15fps
- 1920x1080: 30fps
- 1280x720: 60fps
需要在media_profiles.xml中正确配置,否则会出现帧率不匹配问题:
xml复制<EncoderProfile quality="high" fileFormat="mp4" duration="30">
<Video codec="h264" bitRate="8000000" width="1920" height="1080" frameRate="30"/>
</EncoderProfile>
6. 问题排查与性能优化
6.1 常见启动问题
-
I2C通信失败:
- 检查dmesg | grep i2c输出
- 确认上拉电阻值(通常4.7KΩ)
- 测量SCL/SDA电压(应≥2.7V)
-
图像色彩异常:
- 检查ISP输入格式(应为BGGR)
- 验证v4l2-ctl --get-fmt-video输出
-
帧率不稳定:
- 调整ion内存分配大小
- 检查CPU频率调节策略
6.2 V4L2调试技巧
使用以下命令进行快速验证:
bash复制v4l2-ctl --list-devices
v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=NV12
v4l2-ctl --stream-mmap=3 --stream-count=100 --stream-to=/tmp/frame.raw
可以通过gstreamer测试流水线:
bash复制gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=1920,height=1080 ! waylandsink
7. 系统集成与测试
7.1 CTS/VTS验证
Android 14对Camera的兼容性要求更加严格,必须通过:
- Camera ITS测试
- HAL接口一致性测试
关键检查点:
bash复制atest CameraITS
run vts -m VtsHalCameraProviderV2_4Target
7.2 功耗优化
通过powertop工具监测发现,OV5645在待机时仍有约20mA电流消耗。最终通过修改驱动代码实现:
c复制static int ov5645_suspend(struct device *dev)
{
gpiod_set_value_cansleep(priv->pwdn_gpio, 1);
return 0;
}
8. 最终效果与经验总结
经过两周的调试,最终实现了:
- 1920x1080@30fps稳定输出
- 自动曝光/白平衡功能正常
- 功耗控制在预期范围内
几个关键经验:
- Rockchip的ISP驱动对时钟精度极其敏感,必须确保24MHz主时钟偏差<100ppm
- Android 14的Camera HAL3要求严格的metadata上报格式
- 建议在kernel-5.10.y分支上开发,避免主线内核的兼容性问题
调试过程中最耗时的部分是帧率不稳定问题,最终发现是DDR频率调节策略与ISP内存访问存在冲突。通过锁定DDR频率为最低800MHz解决了该问题。
