2. 开发环境搭建
说实话,做Camera驱动开发,环境搭建这一步要是没弄好,后面全是坑。我见过太多新手,SDK都没编译通过就开始改代码,最后连问题出在哪都搞不清楚。这一章,咱们就把地基打牢。
2.1 SDK下载与编译
瑞芯微的SDK,说白了就是一个完整的Linux工程。它包含了u-boot、内核、文件系统、以及各种工具链。你不需要从零开始,但得知道怎么把它跑起来。
核心步骤:
- 获取SDK: 从瑞芯微官方或客户提供的Repo仓库同步。我个人习惯用
repo init -u <仓库地址> -b <分支名>拉取。 - 安装依赖: 别急着编译,先装好必要的库。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等。 - 全自动编译脚本: 瑞芯微提供了
./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 烧录与调试环境
代码写好了,怎么跑起来?烧录工具和调试手段得备齐。
瑞芯微平台常用的烧录方式:
- USB烧录(Loader模式): 按住板子上的
RECOVERY键上电,电脑识别到设备后,用RKDevTool烧录。这是最常用的方式。 - SD卡烧录: 把编译好的镜像写到SD卡里,插到板子上启动。适合批量测试。
- 网络烧录(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是桥梁,烧录是手段,调试是保障。任何一个环节出了问题,Camera都点不亮。