2. 开发环境搭建

说实话,做Camera驱动开发,环境搭建这一步要是没弄好,后面全是坑。我见过太多新手,SDK都没编译通过就开始改代码,最后连问题出在哪都搞不清楚。这一章,咱们就把地基打牢。

2.1 SDK下载与编译

瑞芯微的SDK,说白了就是一个完整的Linux工程。它包含了u-boot、内核、文件系统、以及各种工具链。你不需要从零开始,但得知道怎么把它跑起来。

核心步骤:

  1. 获取SDK: 从瑞芯微官方或客户提供的Repo仓库同步。我个人习惯用 repo init -u <仓库地址> -b <分支名> 拉取。
  2. 安装依赖: 别急着编译,先装好必要的库。Ubuntu 18.04/20.04 下,运行 sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler 等。
  3. 全自动编译脚本: 瑞芯微提供了 ./build.sh 脚本。你只需要指定板型和产品,比如 ./build.sh rk3588 evb1,它就会自动完成u-boot、内核、rootfs的编译。

这里有个坑,我曾经遇到过:SDK里的工具链版本和系统环境不匹配,编译到一半报错。我的建议是,严格按照SDK文档里的Ubuntu版本和依赖列表来装,别自作聪明用最新版。

2.2 内核配置

内核配置是Camera驱动的入口。你得让内核知道,你要用哪个Sensor,挂在哪个I2C总线上,用哪个CSI接口。

配置方法有两种:

方法 命令 适用场景
menuconfig make menuconfig 交互式图形界面,适合新手探索
直接修改defconfig 编辑 arch/arm64/configs/rockchip_defconfig 批量修改、版本管理,我更喜欢这种方式

对于Camera Sensor,你需要在内核中开启以下选项:

  • CONFIG_MEDIA_CONTROLLER=y —— 媒体控制器框架
  • CONFIG_V4L2_FWNODE=y —— V4L2 fwnode 支持
  • CONFIG_VIDEO_ROCKCHIP_CIF=y —— 瑞芯微的Camera接口驱动
  • CONFIG_VIDEO_ROCKCHIP_ISP1=y —— ISP驱动
  • CONFIG_VIDEO_<你的Sensor型号>=y —— 比如 CONFIG_VIDEO_IMX415=y

小技巧: 配置完记得运行 make savedefconfig,它会自动把当前配置精简并保存到 defconfig 文件里。这样下次编译就不用再手动选一遍了。

2.3 DTS设备树基础

设备树(Device Tree Source, DTS)是Linux内核用来描述硬件信息的一种数据结构。在Camera驱动里,DTS就是Sensor的“身份证”。

一个典型的Camera Sensor节点长这样:

// 在 rk3588-camera-sensor.dtsi 中
&i2c4 {
    status = "okay";
    imx415: imx415@1a {
        compatible = "sony,imx415";
        reg = <0x1a>;
        clocks = <&cru CLK_MIPI_CAMARAOUT_M4>;
        clock-names = "xvclk";
        power-domains = <&power RK3588_PD_VI>;
        pinctrl-names = "default";
        pinctrl-0 = <&mipiphy_pins>;
        rockchip,camera-module-index = <0>;
        rockchip,camera-module-facing = "back";
        rockchip,camera-module-name = "CMK-OT2022-P1";
        rockchip,camera-module-lens-name = "default";
        port {
            imx415_out: endpoint {
                remote-endpoint = <&csi2_dphy0_in>;
                data-lanes = <1 2 3 4>;
            };
        };
    };
};

我来解释一下几个关键字段:

  • compatible: 驱动匹配的关键字,必须和驱动里的 of_device_id 表一致。
  • reg: I2C设备地址,一般是0x1a或0x30,得看Sensor数据手册。
  • clocks: 提供给Sensor的主时钟,通常是24MHz或27MHz。
  • data-lanes: MIPI CSI使用的数据通道数,1/2/4 lanes 都有可能。

注意: DTS的缩进和语法非常严格。少一个分号,或者多一个逗号,内核在解析时就会报错,导致整个Camera节点无法识别。我曾经因为一个标点符号,排查了整整一个下午。

2.4 烧录与调试环境

代码写好了,怎么跑起来?烧录工具和调试手段得备齐。

瑞芯微平台常用的烧录方式:

  1. USB烧录(Loader模式): 按住板子上的 RECOVERY 键上电,电脑识别到设备后,用 RKDevTool 烧录。这是最常用的方式。
  2. SD卡烧录: 把编译好的镜像写到SD卡里,插到板子上启动。适合批量测试。
  3. 网络烧录(TFTP/NFS): 内核和文件系统放在服务器上,板子通过网络加载。调试驱动时我特别喜欢用这种方式,不用反复插拔USB。

调试环境方面,我建议你准备以下工具:

工具 用途 我的经验
串口(UART) 查看内核启动日志、驱动打印信息 必备,没有它你就像瞎子摸象
adb Android系统下调试,或Linux系统下文件传输 配合串口使用,效率翻倍
逻辑分析仪 抓取I2C、MIPI时钟和数据信号 硬件问题排查的终极武器
v4l2-ctl 用户态测试Camera设备节点 比如 v4l2-ctl --list-devices 查看设备

调试小技巧: 在驱动里多加点 dev_info() 或 dev_dbg() 打印。比如在probe函数里打印“Sensor detected!”,在stream on函数里打印“Start streaming...”。这样一旦出问题,你就能快速定位是哪个环节卡住了。

2.5 本章知识体系

为了让你更直观地理解整个开发环境的搭建流程,我画了一张图:

开发环境搭建流程 开发环境搭建知识体系 SDK下载与编译 内核配置 DTS设备树 烧录镜像 调试环境 串口日志 adb调试 逻辑分析仪 v4l2-ctl 环境搭建是基础 一步错,步步错

从这张图你可以看到,整个流程是环环相扣的。SDK是基础,内核配置和DTS是桥梁,烧录是手段,调试是保障。任何一个环节出了问题,Camera都点不亮。