拿到OV13850摄像头模组和RK3399开发板后,第一步要做的就是对照原理图确认硬件连接。我习惯用红色马克笔在打印出来的原理图上标注关键信号,这样能避免遗漏。OV13850作为13MP的MIPI摄像头,需要重点关注以下六类信号:
提示:建议用万用表二极管档位检查所有电源引脚对地阻抗,避免短路情况。正常情况DVDD对地阻值约300Ω,AVDD约1KΩ。
设备树配置是驱动移植的核心环节,我结合官方文档和实际调试经验,总结出以下关键配置步骤:
在rk3399-android.dtsi中找到mipi_dphy_tx1rx1节点,需要修改三处关键参数:
dts复制&mipi_dphy_tx1rx1 {
status = "okay";
clocks = <&cru SCLK_MIPIDPHY_REF>, <&cru PCLK_MIPI_DSI1>;
clock-names = "ref", "pclk";
ports {
port@1 {
dphy_tx1rx1_out: endpoint@0 {
data-lanes = <1 2 3 4>; // 启用4 lane模式
remote-endpoint = <&isp1_mipi_in>;
};
};
};
};
RK3399的ISP(图像信号处理器)需要与V4L2框架配合工作,主要配置两个节点:
dts复制&isp1 {
status = "okay";
port {
isp1_mipi_in: endpoint@0 {
remote-endpoint = <&dphy_tx1rx1_out>;
};
};
};
&isp1_mmu {
status = "okay"; // 必须开启IOMMU
};
这是最复杂的部分,需要精确匹配硬件参数。特别注意pinctrl配置要与原理图一致:
dts复制&i2c4 {
ov13850: ov13850@10 {
compatible = "ovti,ov13850";
reg = <0x10>; // I2C地址
clocks = <&cru SCLK_CIF_OUT>;
clock-names = "xvclk";
reset-gpios = <&gpio2 RK_PD2 GPIO_ACTIVE_HIGH>;
pwdn-gpios = <&gpio1 RK_PC7 GPIO_ACTIVE_HIGH>;
rockchip,camera-module-index = <1>;
rockchip,camera-module-facing = "front";
rockchip,camera-module-name = "CMK-CT0116";
rockchip,camera-module-lens-name = "Largan-50013A1";
port {
ucam_out0: endpoint {
remote-endpoint = <&mipi_in_ucam0>;
data-lanes = <1 2 3 4>;
};
};
};
};
驱动加载成功后,真正的挑战才开始。以下是验证摄像头工作的完整流程:
使用dmesg查看驱动加载情况,重点关注以下日志:
bash复制$ adb shell dmesg | grep -E "ov13850|mipi|v4l2"
[ 5.671234] ov13850 4-0010: Detected OV13850 sensor
[ 5.712345] mipi_dphy_rx1: lanes 4, freq 1008 Mbps
[ 5.745678] rkisp1: Registered all subdevs
如果看到"probe succeeded"但没视频节点,可能是media controller链接问题。我遇到过因为dphy和isp的remote-endpoint不匹配导致的问题。
成功加载后应该出现以下设备节点:
code复制/dev/video13 # ISP输出节点
/dev/v4l-subdev0 # 传感器子设备
/dev/media1 # media controller接口
用v4l2-ctl检查格式支持:
bash复制$ adb shell v4l2-ctl -d /dev/video13 --list-formats
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'NV12' (Y/CbCr 4:2:0)
[1]: 'YUYV' (YUYV 4:2:2)
使用v4l2-ctl抓取测试图像:
bash复制$ adb shell v4l2-ctl -d /dev/video13 \
--set-fmt-video=width=1280,height=720,pixelformat=NV12 \
--stream-mmap=3 \
--stream-to=/sdcard/test.yuv \
--stream-count=10
抓取的YUV文件可以用YUView工具查看。如果图像颜色异常,可能是格式配置错误,OV13850默认输出的是BGGR格式的RAW数据。
在实际项目中,我遇到过各种奇葩问题,这里分享几个典型案例:
现象:预览图像旋转了90度。检查发现是camera3_profiles_rk3399.xml中配置了错误的sensor方向:
xml复制<!-- 错误配置 -->
<sensor.orientation value="90"/>
<!-- 正确配置 -->
<sensor.orientation value="0"/>
报错日志显示"cannot find IQ file",这是因为没有正确拷贝ISP调优文件。解决方法是在camera_etc.mk中添加:
makefile复制PRODUCT_COPY_FILES += \
$(call find-copy-subdir-files,*,$(CUR_PATH)/camera/rkisp1/,$(TARGET_COPY_OUT_VENDOR)/etc/camera/rkisp1/)
这种情况通常是MIPI信号完整性问题,可以通过以下步骤排查:
Android 11加强了摄像头权限管理,需要在privapp-permissions-platform.xml中添加:
xml复制<privapp-permissions package="com.android.camera2">
<permission name="android.permission.SYSTEM_CAMERA"/>
</privapp-permissions>
完成基本功能后,还需要对图像质量进行优化。OV13850的IQ调优主要涉及以下文件:
我常用的调优方法:
调试过程中可以用这个命令实时查看ISP统计信息:
bash复制$ adb shell cat /proc/rkisp1-vir0