Skip to main content

OS08A20 / OV16880 MIPI 摄像头使用指南

适用范围:本文档针对os08a20(800万像素)、ov16880(1600万像素)两款MIPI摄像头模块,详细说明在RV1126BP、RK3576、RK3588硬件平台上的接线、驱动验证、图像捕获等流程。

1. 模组介绍

在开始操作前,请务必确认一下基础信息,避免硬件损坏或功能异常:

摄像头型号分辨率接口类型资料
os08a20800万像素30Pin 0.5mm 间距 FPC 插座os08a20 资料
ov168801600万像素30Pin 0.5mm 间距 FPC 插座ov16880 资料

需要购买配件的话,可以从这里下单:点击购买

2. 硬件连接

注意

  • 摄像头FPC接口有严格正反方向,接反会短路烧坏模组,必须按下文"接线图"所示方向接入主板。
  • 不可带电拔插摄像头,避免带电操作导致短路。

2.1. RV1126系列

LKB1126BP

2.2. RK3576系列

LKD3576

LKB3576

2.3. RK3588系列

LKD3588

3. 使用GStreamer采集视频

这里以LKD3576接入os08a20和ov16880摄像头为例

使用v4l2-ctl --list-devices命令查看摄像头节点,如下所示:

neardi@LKD3588:~$ v4l2-ctl --list-devices

rkisp_mainpath (platform:rkisp-vir0):
/dev/video33 # os08a20视频采集节点
/dev/video34
/dev/video35
/dev/video36
/dev/video37
/dev/video38
/dev/video41
/dev/media3

rkisp_mainpath (platform:rkisp-vir1):
/dev/video42 # ov16880视频采集节点
/dev/video43
/dev/video44
/dev/video45
/dev/video46
/dev/video47
/dev/video50
/dev/media4

rkisp_mainpath (platform:rkisp-vir2):
/dev/video51
/dev/video52
/dev/video53
/dev/video54
/dev/video55
/dev/video56
/dev/video59
/dev/media5

找到mainpath下的第一个节点作为视频采集节点,分别是/dev/video33/dev/video42/dev/video51

使用GStreamer打开videoX

gst-launch-1.0 v4l2src device=/dev/videoX ! \
video/x-raw,format=NV12,width=1280,height=720, framerate=30/1 ! \
fpsdisplaysink

打开状态如图所示:

4. 使用v4l2-ctl工具抓图

4.1. 抓图

抓取输出的 1 帧 NV12 数据保存到/tmp/output.yuv,分辨率为 1920x1080。在保存数据前,先 丢弃前面 3 帧(即前面 3 帧虽然返回给 userspace,但不保存到文件)。

v4l2-ctl -d /dev/videoX --set-fmt-video=width=1920,height=1080,pixelformat=NV12 --stream-mmap=3 --stream-skip=3 --stream-to=/tmp/output.yuv --stream-count=1 --stream-poll
  • -d,指定操作对象为/dev/videoX设备。
  • –set-fmt-video,指定了宽高及pxielformat(用FourCC表示)。 NV12即用 FourCC 表示的 pixelformat。
  • –stream-mmap,指定 buffer 的类型为 mmap,即由 kernel 分配的物理连续的或经过iommu 映射的buffer。
  • –stream-skip,指定丢弃(不保存到文件)前 3 帧。
  • –stream-to,指定帧数据保存的文件路径。
  • –stream-count,指定抓取的帧数,不包括–stream-skip 丢弃的数量。
  • –stream-poll,该选项指示 v4l2-ctl 采用异步 IO,即在 dqbuf 前先用 select 等等帧数据完成,从而保证 dqbuf 不阻塞。否则 dqbuf 将会阻塞直到有数据帧到来。

抓图正常返回结果:

<<<<

抓图异常返回结果:

could not open /camera.out for writing
VIDIOC_STREAMON returned -1 (Operation not permitted)
  • 检查FPC线是否接反。
  • 检查FPC线是否松动。
  • 检查摄像头是否接好。
  • 更换FPC线或摄像头。

4.2 查看图像

4.2.1. 使用ffmpeg命令查看摄像头图像

  • 使用ffmpeg命令查看摄像头图像,如下所示:
$ ffmpeg -pix_fmt nv12 -s 1920x1080 -i output.yuv result.jpg

格式要匹配,否则无法正常成像

可以使用ffmpeg -pix_fmts命令查看ffmpeg支持的格式

  • 直接播放图像:
$ ffplay -f rawvideo -pix_fmt nv12 -s 1920x1080 ./output.yuv

4.2.2. 在Windows下查看摄像头图像

在Windows下查看摄像头图像,可以使用7yuv软件 http://datahammer.de/

打开软件后,点击File->Open,选择output.yuv文件打开。设置Formatyvu420Width1920Height1080。此时,就可以看到摄像头图像了。

4.3. 查看节点支持的格式

不同节点支持的分辨率、像素格式不同,需先查询再配置:

v4l2-ctl -d /dev/videoX --list-formats-ext

正常输出示例:

ioctl: VIDIOC_ENUM_FMT
Type: Video Capture Multiplanar

[0]: 'UYVY' (UYVY 4:2:2)
Size: Stepwise 32x32 - 4224x3136 with step 8/8
[1]: 'NV16' (Y/UV 4:2:2)
Size: Stepwise 32x32 - 4224x3136 with step 8/8
[2]: 'NV61' (Y/VU 4:2:2)
Size: Stepwise 32x32 - 4224x3136 with step 8/8
[3]: 'NV21' (Y/VU 4:2:0)
Size: Stepwise 32x32 - 4224x3136 with step 8/8
[4]: 'NV12' (Y/UV 4:2:0)
Size: Stepwise 32x32 - 4224x3136 with step 8/8
[5]: 'NM21' (Y/VU 4:2:0 (N-C))
Size: Stepwise 32x32 - 4224x3136 with step 8/8
[6]: 'NM12' (Y/UV 4:2:0 (N-C))
Size: Stepwise 32x32 - 4224x3136 with step 8/8

记录参数:抓图等操作需使用上述支持的分辨率(如1920x1080)和像素格式(如NV12)。

5. 摄像头启动流程

5.1 驱动加载

摄像头正常工作依赖内核驱动正确加载,驱动加载是一个复杂的硬件初始化过程,这里大致列出以下10个步骤:

  1. 提供时钟(MCLK):驱动首先控制时钟控制器(Clock Controller)为传感器提供主时钟mclk(也称为xvclk)。

  2. 电源上电(Power On):驱动通过控制GPIO或电源管理芯片(PMIC)控制,依次为传感器模组的各个电源引脚上电:

    • avdd(模拟电压)
    • dovdd(数字IO电压)
    • dvdd(数字核心电压)
  3. 复位:电源稳定后,驱动操作传感器的reset引脚,使其解除复位状态,进入正常工作状态。

  4. I2C通信:SOC 通过 I2C 总线与传感器通信,读取其芯片 ID(例如0x36),以确认传感器正确连接并识别。

  5. 关键延时:最后按 camera 时序要求,delay 8192 个 MCLK 的周期之后,上电完成,逻辑电路就绪。

当硬件上电时序完成且camera id被成功读取后,驱动probe函数成功返回。

  1. 初始化寄存器:驱动会通过I2C总线配置传感器,设置图像输出尺寸、帧率、像素格式、增益、曝光等参数。
  2. 配置MIPI CSI:驱动与MIPI CSI-2接收器协同工作,配置PHY时序、数据通道数、传感器速率等。
  3. 注册V4L2子设备:驱动将自己注册为Linux内核中的一个v4l2_subdev设备(例如/dev/v4l-subdev1)。这标志这它成为Media Controller框架中的一个实体(Entity),可以被用户空间工具(如media-ctl)查询和配置。
  4. 建立Media拓扑链路:系统或驱动会根据设备树(Device Tree)中的描述,在Media Controller框架中创建并启用传感器(Source)与MIPI CSI接收器(Sink)之间的数据流链路。
  5. 生成video设备节点:ISP处理管道会生成最终视频设备节点(如/dev/video0),用户空间的应用程序(如GStreamer、V4L2工具)将通过这个节点来捕获处理好的图像数据。

5.2 驱动加载状态检查

5.2.1. 检查传感器驱动日志

系统启动后,首先通过以下命令验证驱动是否正常加载,这是后续操作的前提。

  • 验证 os08a20 驱动:

    $root@LKD3576:~#$ dmesg | grep os08a20

    正常输出示例:

    [ 4.383024] platform csi2-dcphy0: Fixed dependency cycle(s) with /i2c@2ac60000/os08a20@36
    [ 4.635530] os08a20 3-0036-1: driver version: 00.01.00
    [ 4.635582] os08a20 3-0036-1: Failed to get power-gpios, maybe no use
    [ 4.635955] os08a20 3-0036-1: supply dovdd not found, using dummy regulator
    [ 4.636037] os08a20 3-0036-1: supply dvdd not found, using dummy regulator
    [ 4.636074] os08a20 3-0036-1: lane_num(4) pixel_rate(480000000)
    [ 4.636093] os08a20 3-0036-1: could not get default pinstate
    [ 4.636101] os08a20 3-0036-1: could not get sleep pinstate
    [ 4.650076] os08a20 3-0036-1: Detected OV530841 sensor
    [ 4.776313] os08a20 3-0036-1: Consider updating driver os08a20 to match on endpoints
    [ 4.776334] rockchip-csi2-dphy csi2-dcphy0: dphy0 matches m00_b_os08a20 3-0036-1:bus type 5
  • 验证 ov16880 驱动:

    root@LKD3576:~# dmesg | grep ov16880

    正常输出示例:

    [ 4.384124] platform csi2-dphy3: Fixed dependency cycle(s) with /i2c@2ac70000/ov16880@36
    [ 4.721493] ov16880 4-0036: driver version: 00.01.01
    [ 4.721507] ov16880 4-0036: Get hdr mode failed! no hdr default
    [ 4.721529] ov16880 4-0036: Failed to get power-gpios, maybe no use
    [ 4.721671] ov16880 4-0036: supply dovdd not found, using dummy regulator
    [ 4.721728] ov16880 4-0036: supply dvdd not found, using dummy regulator
    [ 4.721759] ov16880 4-0036: could not get default pinstate
    [ 4.721766] ov16880 4-0036: could not get sleep pinstate
    [ 4.732240] ov16880 4-0036: Detected OV016880 sensor
    [ 4.777401] ov16880 4-0036: Consider updating driver ov16880 to match on endpoints
    [ 4.777418] rockchip-csi2-dphy csi2-dphy3: dphy3 matches m02_b_ov16880 4-0036:bus type 5

📝 注意:如果没有任何输出或提示Unexpected sensor id(000000), ret(-5),则代表驱动加载失败,通过以下步骤进一步确定原因。

5.2.2. 硬件连接验证

传感器通过I2C总线与主板通信,若I2C总线上无设备,需检查接线或硬件:

  • 扫描I2C总线

    执行以下命令,查看i2cX总线下的从设备地址:

    neardi@LKD3576:~$ sudo i2cdetect -y X

    输出结果如下:

    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- UU -- -- -- -- -- -- -- -- -- # 关键:0x36地址有设备
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --

    异常处理:若无"UU",需重新检查 FPC 接线是否接反、松动,或更换摄像头模块测试。

  • 内核驱动编译验证

    通过以下命令检查内核是否编译对应驱动:

    neardi@LKD3576:~$ zcat /proc/config.gz | grep -i "os08a20\|ov16880"

    正常输出:

    CONFIG_VIDEO_OS08A20=y
    CONFIG_VIDEO_OV16880=y

6. Media拓扑结构查看

Linux 系统通过 "Media Controller 框架" 管理摄像头数据流(传感器→MIPI→ISP),查看拓扑结果可确认数据链路是否通畅。

关键信息解释

  • Entity:每个功能模块(如传感器、MIPI 接收器、ISP)在系统中的标识;
  • Pads:实体的输入/输出接口(pad0通常为输入,pad1/pad11等为输出);
  • Links:连接两个pads的数据链路,<-为输入,->为输出。[ENABLED]表示链路已激活,[DISABLED]表示未激活。
  • Format:当前通道的图像参数(分辨率、像素格式,如3840x2160、SBGGR10)。

6.1. 查看拓扑结构

执行以下命令,打印指定media设备的拓扑图:

neardi@LKD3576:~$ media-ctl -p -d /dev/media0
neardi@LKD3576:~$ media-ctl -p -d /dev/media3

** os08a20 正常拓扑示例 **

media0:负责摄像头前端采集链路

neardi@LKD3576:~$ media-ctl -p -d /dev/media0
Media controller API version 6.1.118

Media device information
------------------------
driver rkcif
model rkcif-mipi-lvds
serial
bus info platform:rkcif-mipi-lvds
hw revision 0x0
driver version 6.1.118

Device topology
# 4.RKCIF模块对接CSI控制器,输出原始数据
- entity 41: rkcif_tools_id2 (1 pad, 11 links)
type Node subtype V4L flags 0
device node name /dev/video10
pad0: Sink
<- "rockchip-mipi-csi2":1 []
<- "rockchip-mipi-csi2":2 []
<- "rockchip-mipi-csi2":3 []
<- "rockchip-mipi-csi2":4 []
<- "rockchip-mipi-csi2":5 []
<- "rockchip-mipi-csi2":6 []
<- "rockchip-mipi-csi2":7 []
<- "rockchip-mipi-csi2":8 []
<- "rockchip-mipi-csi2":9 []
<- "rockchip-mipi-csi2":10 []
<- "rockchip-mipi-csi2":11 [ENABLED]

# 3.MIPI-CSI2控制器(协议层,解析MIPI数据)
- entity 45: rockchip-mipi-csi2 (12 pads, 122 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
pad0: Sink
[fmt:SBGGR10_1X10/3840x2160 field:none
crop.bounds:(0,0)/3840x2160
crop:(0,0)/3840x2160]
<- "rockchip-csi2-dphy0":1 [ENABLED]
pad11: Source
-> "stream_cif_mipi_id0":0 []
-> "stream_cif_mipi_id1":0 []
-> "stream_cif_mipi_id2":0 []
-> "stream_cif_mipi_id3":0 []
-> "rkcif_scale_ch0":0 []
-> "rkcif_scale_ch1":0 []
-> "rkcif_scale_ch2":0 []
-> "rkcif_scale_ch3":0 []
-> "rkcif_tools_id0":0 []
-> "rkcif_tools_id1":0 []
-> "rkcif_tools_id2":0 [ENABLED]

# 2.MIPI-DPHY物理层(负责接收传感器的MIPI信号)
- entity 58: rockchip-csi2-dphy0 (2 pads, 2 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev2
pad0: Sink
[fmt:SBGGR10_1X10/3840x2160@10000/300000 field:none]
<- "m00_b_os08a20 3-0036-1":0 [ENABLED]
pad1: Source
-> "rockchip-mipi-csi2":0 [ENABLED]

# 1.os08a20 摄像头传感器(图像采集源头)
- entity 63: m00_b_os08a20 3-0036-1 (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev3
pad0: Source
[fmt:SBGGR10_1X10/3840x2160@10000/300000 field:none]
-> "rockchip-csi2-dphy0":0 [ENABLED]

media3:负责图像后端处理链路

neardi@LKD3576:~$ media-ctl -p -d /dev/media3
Media controller API version 6.1.118

Media device information
------------------------
driver rkisp-vir0
model rkisp0
serial
bus info platform:rkisp-vir0
hw revision 0x0
driver version 6.1.118

Device topology
# 6.RKISP:负责降噪、自动对焦等图像处理
- entity 1: rkisp-isp-subdev (4 pads, 10 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev4
pad0: Sink
[fmt:SBGGR10_1X10/3840x2160 field:none
crop.bounds:(0,0)/3840x2160
crop:(0,0)/3840x2160]
<- "rkisp_rawrd0_m":0 []
<- "rkisp_rawrd2_s":0 [ENABLED]
<- "rkcif-mipi-lvds":0 [ENABLED]
pad1: Sink
<- "rkisp-input-params":0 [ENABLED]
pad2: Source
[fmt:YUYV8_2X8/3840x2160 field:none colorspace:smpte170m quantization:full-range
crop.bounds:(0,0)/3840x2160
crop:(0,0)/3840x2160]
-> "rkisp_mainpath":0 [ENABLED]
-> "rkisp_selfpath":0 [ENABLED]
-> "rkisp_ldcpath":0 []
-> "rkisp_iqtool":0 [ENABLED]
pad3: Source
-> "rkisp-statistics":0 [ENABLED]
-> "rkisp-pdaf":0 [ENABLED]

# 7.ISP的主输出节点,提供处理后的图像数据供应用程序使用
- entity 6: rkisp_mainpath (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video33
pad0: Sink
<- "rkisp-isp-subdev":2 [ENABLED]

# 5.CIF 模块的输出端,接收 media0 传来的原始图像
- entity 60: rkcif-mipi-lvds (1 pad, 1 link)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev5
pad0: Source
[fmt:SBGGR10_1X10/3840x2160@10000/300000 field:none]
-> "rkisp-isp-subdev":0 [ENABLED]

可以看到os08a20的rkisp_mainpath拓扑路线为:

当摄像头被识别后,我们就可以通过节点进行抓取视频流以及抓图

7. 常见问题排查

7.1. 图像异常(绿屏、花屏、全黑)

需进行以下步骤检查

  1. 检查3A服务:图像信号处理(ISP)需要3A算法服务才能输出正常图像。
neardi@LKD3576:~$ ps -aux | grep rkaiq_3A_server
neardi 3884 0.0 0.0 9104 2028 pts/0 S+ 10:32 0:00 grep --color=auto rkaip_3A_server
  1. 若进程不存在,请手动启动它:
/usr/bin/rkaiq_3A_server &

如果启动失败:请检查/etc/iqfiles/目录下是否存在对应传感器型号的.xmlIQ调优文件,此文件用于ISP的3A效果校正;也可联系我们公司的技术人员进行处理;