1. 课程导入

各位同学,咱们今天正式开始聊瑞萨R-Car平台。说实话,我第一次接触R-Car是在一个车载360环视项目上,当时甲方要求一周内点亮四路摄像头,我对着数据手册熬了三个通宵。嗯,从那以后我对这个平台算是刻骨铭心。

这一章咱们先搭好地基——搞清楚R-Car SoC家族有哪些成员、摄像头是怎么通过CSI-2和MIPI连进来的、以及开发环境怎么快速跑起来。后面29章的所有调试和优化,都建立在这三个基础上。

1.1 R-Car SoC系列:你该选哪一颗?

R-Car是瑞萨面向车载领域的主力SoC系列,覆盖从入门仪表到高端自动驾驶。我个人习惯按应用场景把它们分成三档:

系列 典型型号 摄像头路数 典型场景
入门级 R-Car D3 / E3 2路CSI-2 仪表盘、AVM环视
中端 R-Car M3 / M3N 4路CSI-2 ADAS、电子后视镜
高端 R-Car H3 / H3N 8路CSI-2 自动驾驶、多传感器融合

我在项目中踩过最大的坑,就是选型时没仔细看CSI-2通道数。有个客户非要在一颗E3上挂4路摄像头,结果硬件设计改了三版才勉强能用。你想想看,一颗SoC的摄像头接口能力,直接决定了你的系统架构能不能走得通。

核心要点:R-Car H3支持最多8路MIPI CSI-2输入,但每路带宽只有1.5Gbps/lane。如果你要接4K@60fps的摄像头,单路就得占4条lane,这时候通道数再多也没用——带宽才是瓶颈。

1.2 摄像头接口硬件原理:CSI-2和MIPI到底在传什么?

说白了,摄像头和SoC之间就干一件事:把像素数据从传感器搬到内存里。MIPI CSI-2是这条路上的传输协议,而物理层走的是D-PHY。

我刚开始做驱动时,总觉得MIPI很玄乎。后来自己画了张图才明白,其实就是这么回事:

MIPI CSI-2 数据传输链路 摄像头传感器 RAW10 / YUV / JPEG D-PHY TX 4条Data Lane + 1条Clock MIPI 传输通道 差分信号对 (D+/D-) HS模式: 80Mbps~1.5Gbps LP模式: 控制指令 ECC + CRC 校验 R-Car SoC CSI-2 接收控制器 DDR 内存 V4L2 buffer queue 💡 关键时序参数 • 每帧数据: VSYNC → 多行HSYNC+像素数据 → VSYNC • 每行数据: HSYNC → 像素字节(按DT格式) → 行尾 • 数据包格式: 32-bit同步码 + 8-bit DI + 16-bit WC + 数据负载 + 16-bit CRC

这张图我建议你存下来。每次调试摄像头不通的时候,对着它一级一级查——传感器有没有输出、D-PHY有没有锁相、SoC有没有收到同步信号。我曾经有一个案子,折腾了两天发现是CSI-2的时钟极性配反了,就一个寄存器位的事。

MIPI CSI-2 的关键概念

  • Data Lane:数据通道,每个lane是一对差分线。4条lane可以同时传,带宽叠加。
  • Clock Lane:时钟通道,DDR模式下双边沿采样。
  • HS模式:高速模式,真正传像素数据的时候用。速率从80Mbps到1.5Gbps不等。
  • LP模式:低功耗模式,传控制指令、总线状态切换用。
  • Data Type (DT):8位标识符,告诉接收端这包数据是RAW10、YUV422还是JPEG。

我的经验:调试MIPI信号时,先用示波器看Clock Lane有没有稳定的时钟。如果时钟都没有,后面全是白费功夫。我习惯在硬件打样回来后,第一件事就是测D-PHY的共模电压——标准是200mV,偏差超过±20%就得查PCB走线。

1.3 开发板环境搭建:从拆箱到跑通第一个摄像头

好,理论说完了,咱们动手。我以R-Car H3 Starter Kit为例,带你走一遍环境搭建流程。这套步骤我在不同板子上重复了不下20次,每一步都有血泪教训。

硬件准备清单

组件 型号/规格 备注
开发板 R-Car H3 SK (Salvator-X) 确认版本为Rev 2.0以上
摄像头模组 OV10635 / AR0231 推荐OV10635,驱动成熟
FPC排线 0.5mm间距,15cm以内 超过15cm信号衰减严重
串口线 USB转UART (3.3V) 波特率115200
电源 12V/3A DC适配器 不要用USB供电,带不动

软件环境搭建步骤

  1. 下载BSP:从瑞萨官网获取R-Car BSP v3.21以上版本。我建议用Yocto构建,虽然编译时间长,但依赖关系最干净。
  2. 配置内核:
    make ARCH=arm64 defconfig
    make ARCH=arm64 menuconfig
    # 确保开启:
    # CONFIG_VIDEO_RCAR_CSI2=y
    # CONFIG_VIDEO_RCAR_VIN=y
    # CONFIG_I2C_RCAR=y
  3. 编译设备树:在设备树中使能CSI-2节点和摄像头节点。我见过有人忘了加status = "okay",排查了一整天。
  4. 烧录启动:用minicom连接串口,设置启动参数为root=/dev/nfs nfsroot=...,方便调试时快速更新内核。
  5. 验证摄像头:
    # 检查I2C设备是否枚举
    i2cdetect -y 2
    # 查看V4L2设备节点
    ls -l /dev/video*
    # 抓取一帧测试
    v4l2-ctl --device=/dev/video0 --set-fmt-video=width=1280,height=720 --stream-mmap --stream-to=test.raw

⚠️ 我曾经踩过的坑:第一次烧录时,板子死活起不来。查了半天发现是bootloader里CSI-2的IO电压配置成了1.8V,但摄像头模组需要3.3V。这个电压不匹配,轻则信号异常,重则烧坏传感器。所以硬件连接前,一定先看原理图确认电压域。

快速验证清单

环境搭好后,我建议你按这个清单快速过一遍,确保每个环节都通:

  • ✅ 串口能打印内核日志
  • ✅ I2C总线能检测到摄像头地址(通常是0x30或0x60)
  • ✅ /dev/video0 节点存在
  • ✅ v4l2-ctl --all 能读到摄像头格式信息
  • ✅ 抓到的raw文件用工具打开能看到图像(哪怕全是噪点也算通)

如果以上都通过了,恭喜你,环境搭建成功。如果卡在哪一步,别急——后面每一章都会针对具体问题展开讲。我个人觉得,环境搭建阶段最忌讳的就是「差不多就行」。电源纹波、排线长度、时钟精度,任何一个细节没到位,后面调试起来都是噩梦。

嗯,这一章就到这里。记住三个核心:选对SoC型号、理解MIPI链路、搭稳开发环境。后面咱们再一步步深入驱动代码和调试技巧。