RK3588平台IMX766摄像头适配Patch全解析:驱动架构+软硬件数据流深度拆解

电子说

1.4w人已加入

描述

RK3588 作为国产高端 64 位 ARM 主控,凭借强大的 ISP 图像处理能力、丰富的 MIPI 接口,如今广泛应用于工业视觉、AI 视觉、边缘相机、车载影像等场景。索尼 IMX766 是消费与工业领域主流的高规格图像传感器,具备大底、高动态、10bit RAW 输出等特性。

本文基于一份完整的 Linux 内核适配 Patch,从设备树配置、编译脚本、驱动源码架构、上电时序、全链路数据流、核心功能六大维度,逐行拆解 RK3588 + IMX766 的相机适配逻辑。内容兼顾嵌入式 Linux 入门开发者与相机驱动工程师,带你吃透 Linux V4L2 图像传感器驱动的完整实现思路。

一、Patch 整体变更总览

本次适配一共修改 / 新增4 个内核文件,覆盖硬件描述、编译配置、驱动代码三大环节,整体变更逻辑清晰:替换原有 OV50C40 摄像头,适配索尼 IMX766 传感器,并完成 MIPI 物理层、外设资源的配套配置。

文件路径 变更类型 核心作用
rk3588-evb7-v11-imx415.dtsi 设备树修改 关闭原有摄像头 / 对焦马达,新增 IMX766 I2C 设备节点,配置电源、时钟、GPIO、MIPI 链路
rk3588-evb7-v11.dtsi 设备树修改 使能 MIPI D-PHY 物理层,为 IMX766 提供 MIPI 传输通道
drivers/media/i2c/Makefile 编译脚本修改 将 IMX766 驱动编译进内核镜像
imx766.c 新增文件 IMX766 完整 V4L2 传感器驱动(2629 行核心代码)

下文将按从硬件描述到软件驱动的顺序,逐层拆解每一部分的设计逻辑。

二、设备树 (DTS) 配置深度解析

Linux 内核通过设备树 (DTS) 描述板级硬件资源,驱动通过解析 DTS 节点获取时钟、电源、GPIO、总线地址等信息。本次两处 DTS 修改是硬件与软件的 “桥梁”。

2.1 相机外设树:rk3588-evb7-v11-imx415.dtsi

该文件是 I2C 总线下相机外设的专属配置,核心改动分为关闭旧设备新增 IMX766 节点两部分:

1. 禁用原有硬件外设

 

aw8601: aw8601@c {    compatible = "awinic,aw8601";-   status = "okay";+   status = "disabled";  // 关闭VCM对焦马达,本次适配未使用自动对焦};// 注释+禁用原有OV50C40摄像头- ov50c40: ov50c40@36 {+ /*ov50c40: ov50c40@36 {    compatible = "ovti,ov50c40";-   status = "okay";+   status = "disabled";    ...+ };*/

 

•aw8601:摄像头 VCM 对焦马达,本次 IMX766 模组未搭载对焦机构,直接禁用;

•ov50c40:原板载 OV50C40 图像传感器,通过注释 + status=disabled彻底关闭,避免设备冲突。

2. 新增 IMX766 标准 I2C 设备节点

 

imx766: imx766@29 {    compatible = "sony,imx766";  // 驱动匹配标识,与驱动of_device_id一一对应    status = "okay";              // 启用该设备    reg = <0x29>;                 // IMX766 I2C从设备地址(硬件固定)
    clocks = <&cru CLK_MIPI_CAMARAOUT_M1>;    clock-names = "xvclk";        // 传感器24MHz参考时钟
    power-domains = <&power RK3588_PD_VI>;  // 绑定RK3588 VI视频图像电源域    pinctrl-names = "default";    pinctrl-0 = <&mipim0_camera1_clk>;      // 引脚电气配置
    reset-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_LOW>; // 复位GPIO:低电平有效    //pwdn-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>;  // 掉电控制引脚(可选)    // 三路核心供电(IMX766标准供电方案)    dovdd-supply = <&vcc_1v8_cam_s0>;  // IO电源 1.8V    avdd-supply = <&vcc_2v8_cam_s0>;   // 模拟电源 2.8V    dvdd-supply = <&avdd_1v2_cam_s0>;  // 内核电源 1.2V    // RK平台相机模组自定义属性    rockchip,camera-module-index = <0>;    rockchip,camera-module-facing = "back"; // 后置摄像头    rockchip,camera-module-name = "CMK-OT2022-PX1";    rockchip,camera-module-lens-name = "IR0147-50IRC-8M-F20";    // MIPI CSI-2 端点:绑定RK3588 MIPI D-PHY0,4路数据lane    port {        imx415_out0: endpoint {            remote-endpoint = <&mipidphy0_in_ucam0>;            data-lanes = <1 2 3 4>; // 4 Lane MIPI高速传输        };    };};

 

关键参数解读

1.reg=0x29:IMX766 出厂默认 I2C 地址,硬件修改地址后需同步更新;

2.三路供电dovdd/avdd/dvdd是 IMX766 工作的必要条件,电压不匹配会直接导致传感器黑屏、花屏;

3.data-lanes = <1 2 3 4>:使用 4 Lane MIPI,满足高分辨率、高帧率的带宽需求;

4.末尾port节点:完成传感器 MIPI 输出端RK3588 MIPI D-PHY 输入端的拓扑绑定。

2.2 板级总设备树:rk3588-evb7-v11.dtsi

仅一行核心修改,启用 MIPI 物理层

 

&mipi_dcphy0 {-   status = "disabled";+   status = "okay";};

 

mipi_dcphy0是 RK3588 的 MIPI D-PHY 硬件控制器,负责 MIPI 差分信号的解码、时序同步。传感器 MIPI 数据必须经过 D-PHY 才能被 ISP 识别,因此必须显式使能。

2.3 内核编译配置:Makefile

 

obj-y  += imx766.o

 

•obj-y:将imx766.c静态编译进内核镜像,系统开机即加载驱动;

•若改为obj-m则编译为内核模块,需要手动insmod加载,适合调试场景。

三、IMX766 驱动整体架构解析

imx766.c是整套适配的核心,基于Linux 标准 I2C 驱动 + V4L2/Media 图像子系统 + 瑞芯微 RK 相机扩展框架三层架构开发,是典型的 Linux 图像传感器 Subdev(子设备)驱动。

3.1 驱动分层总览

Linux 相机体系自上而下分为应用层→ V4L2 框架 → Media 子系统 → 传感器 Subdev 驱动 → 硬件总线,本驱动位于V4L2 Subdev 层,完整分层如下:

1.驱动入口层:I2C 驱动注册、内核加载入口;

2.设备探测层 (Probe):解析设备树、申请硬件资源、硬件 ID 校验、子设备注册;

3.电源管理层:Runtime PM 动态休眠 / 唤醒,管理传感器上下电;

4.硬件操作层:I2C 寄存器单读 / 单写、批量写入;

5.V4L2 回调层:流启停、格式配置、总线参数、帧信息等标准接口;

6.控制管理层:曝光、增益、测试图等 V4L2 控制器;

7.平台扩展层:RK 自定义 IOCTL、OTP 出厂校准、QSC 色彩校准。

3.2 核心数据结构体 struct imx766

这是驱动的全局状态容器,存储传感器所有硬件资源、运行状态、V4L2 对象,贯穿整个驱动逻辑:

 

struct imx766 {    // 1. 硬件总线&外设资源    struct i2c_client    *client;        // I2C客户端句柄    struct clk           *xvclk;         // 24MHz参考时钟    struct gpio_desc     *reset_gpio;    // 复位引脚    struct gpio_desc     *pwdn_gpio;     // 掉电控制引脚    struct regulator_bulk_data supplies[3]; // 三路稳压电源
    // 2. 引脚&电源管理    struct pinctrl       *pinctrl;    struct pinctrl_state *pins_default;  // 工作态引脚    struct pinctrl_state *pins_sleep;    // 休眠态引脚    // 3. V4L2 & Media 核心对象    struct v4l2_subdev   subdev;         // V4L2子设备实例    struct media_pad     pad;            // Media媒体节点    struct v4l2_ctrl_handler ctrl_handler; // 控制句柄(曝光/增益等)    // 4. 运行状态标记    bool                 streaming;      // 是否正在输出图像流    bool                 power_on;       // 电源是否开启    const struct imx766_mode *cur_mode;  // 当前生效的分辨率模式    // 5. RK平台模组&校准信息    const char           *module_name;    const char           *len_name;    struct otp_info      *otp;           // OTP出厂校准数据指针};

 

所有硬件操作、状态切换、参数配置,都围绕该结构体展开。

3.3 驱动加载与设备匹配

1.驱动入口

 

device_initcall_sync(sensor_mod_init);

 

device_initcall_sync表示驱动在内核启动阶段同步加载,开机自动执行。

2.I2C 驱动注册
标准 Linux I2C 驱动模型,通过of_device_id匹配设备树中compatible = "sony,imx766"节点,匹配成功后执行probe探测函数。

3.Probe 探测核心流程

a.从设备树解析时钟、GPIO、电源、模组名称等资源;

b.初始化struct imx766结构体,申请内存;

c.上电并读取 IMX766 芯片 ID(0x0766),校验硬件是否正常;

d.解析传感器 OTP 出厂校准数据;

e.注册 V4L2 子设备、Media 媒体节点、Runtime PM 电源管理;

f.驱动初始化完成,等待上层应用调用。

四、核心时序:IMX766 上电 & 下电流程

图像传感器对上电顺序、延时、电平逻辑要求极高,时序错误会直接导致传感器不启动、I2C 通信失败。驱动中__imx766_power_on和__imx766_power_off定义了标准时序。

4.1 上电流程(__imx766_power_on

 

// 1. 使能外部电源GPIO,延时等待电源稳定gpiod_set_value_cansleep(imx766->power_gpio, 1);usleep_range(10000, 12000);  // 10~12ms延时// 2. 切换引脚为工作模式pinctrl_select_state(imx766->pinctrl, imx766->pins_default);// 3. 配置并使能24MHz参考时钟XVCLKclk_set_rate(imx766->xvclk, IMX766_XVCLK_FREQ); // 固定24MHzclk_prepare_enable(imx766->xvclk);// 4. 复位引脚拉高,硬件预复位gpiod_set_value(imx766->reset_gpio, 1);usleep_range(10000, 12000);// 5. 使能三路稳压电源(dovdd/avdd/dvdd)regulator_bulk_enable(IMX766_NUM_SUPPLIES, imx766->supplies);// 6. 完整硬件复位:拉低→延时→拉高init_gpio_pin(imx766->greset_gpio, "cam_reset_pin", 0); usleep_range(300, 5000);init_gpio_pin(imx766->greset_gpio, "cam_reset_pin", 1); usleep_range(10000, 12000);// 7. 拉高PWDN引脚,传感器退出掉电模式gpiod_set_value_cansleep(imx766->pwdn_gpio, 1);// 8. 等待I2C通信就绪(8192个时钟周期)delay_us = imx766_cal_delay(8192);usleep_range(delay_us, delay_us * 2);

 

时序要点:电源→ 时钟 → 复位 → 稳压电源 → 掉电解除,每一步都搭配毫秒级延时,保证硬件电平稳定。

4.2 下电流程(__imx766_power_off

为上电逆序执行:关闭 PWDN → 关闭时钟 → 拉低复位引脚 → 切换引脚为休眠态 → 关闭三路稳压电源,实现传感器低功耗待机。

五、驱动核心功能模块拆解

5.1 I2C 寄存器读写模块

IMX766 所有配置(分辨率、帧率、曝光、增益)都通过I2C 读写寄存器实现,驱动封装了两类通用接口:

1.imx766_write_reg:单寄存器写入,支持 8/16/24 位数据,自带 5 次重试,提升 I2C 通信稳定性;

2.imx766_write_array:批量写入寄存器数组,用于传感器全局初始化、模式切换。

驱动内置多组寄存器表:

•imx766_global_regs:传感器全局初始化寄存器(上电必加载);

•imx766_4096x3072_regs:当前默认模式4096×3072 分辨率寄存器;

•注释区保留了3840×2160 4K 模式,可按需开启。

5.2 图像模式管理

通过struct imx766_mode定义传感器工作模式,supported_modes[]为模式列表:

 

static const struct imx766_mode supported_modes[] = {    {        .bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10, // 10bit RAW格式        .width = 4096, .height = 3072,        // 分辨率        .max_fps = {10000, 300000},           // 最大30fps        .reg_list = imx766_4096x3072_regs,    // 对应寄存器表    },};

 

驱动会根据上层应用请求的分辨率,自动匹配最优模式并加载对应寄存器。

5.3 V4L2 标准控制接口

驱动初始化了8 类常用图像控制项,用户可通过v4l2-ctl命令行、上层 APP 调节:

•曝光时间(Exposure)、模拟增益(Analogue Gain);

•行 / 场消隐(H/V Blank)、MIPI 链路频率、像素率;

•测试图案(Test Pattern):用于硬件通路调试。

5.4 RK 平台自定义 IOCTL 扩展

瑞芯微在标准 V4L2 之外,扩展了专属相机指令(imx766_ioctl),适配 RK ISP 与相机框架:

1.RKMODULE_SET_QUICK_STREAM:快速启停流,跳过冗余初始化,降低切换延迟;

2.RKMODULE_SET/GET_HDR_CFG:HDR 高动态模式配置;

3.RKMODULE_GET_MODULE_INFO:读取模组信息 + OTP 出厂校准数据(白平衡、镜头阴影、PDAF 对焦);

4.RKMODULE_GET_CHANNEL_INFO:读取 SPD/EBD 辅助数据通道(工业相机常用)。

5.5 OTP & QSC 出厂校准

这是成像效果优化的核心功能:

1.OTP:传感器内置一次性可编程存储器,存储出厂校准参数(白平衡 AWB、镜头阴影 LSC、对焦 PDAF),驱动自动读取并传递给 RK ISP,保证成像一致性;

2.QSC:色彩校准模块,从 OTP 的 LSC 数据加载参数,修正镜头边角色彩偏差。

六、全链路数据流分析

结合硬件物理链路软件内核链路,完整还原从“感光” 到 “上层应用预览” 的全流程。

6.1 硬件物理链路(信号流向)

RK3588

核心特点:MIPI 为高速差分信号,4 Lane 设计保障 4096×3072@30fps 的带宽需求;RK3588 内置 ISP 完成大部分图像处理,降低 CPU 负载。

6.2 软件内核数据流(数据流转)

RK3588

6.3 典型出流交互流程

1.应用打开/dev/video0 → V4L2 调用驱动open接口,初始化默认格式;

2.应用设置分辨率 / 帧率 → 驱动set_fmt匹配对应图像模式;

3.应用下发STREAMON启动流→ 驱动imx766_s_stream(1)加载寄存器、开启传感器 MIPI 输出;

4.数据持续传输→ DMA 循环搬运帧数据,应用实时预览 / 录像;

5.应用下发STREAMOFF停止流→ 驱动关闭传感器流,进入待机。

七、适配踩坑点与移植注意事项

基于本次 Patch 的实际移植经验,总结 RK3588 + IMX766 适配高频问题:

1.I2C 地址不匹配:DTS 中reg=0x29必须与硬件一致,地址错误会导致 I2C 读 ID 失败;

2.供电电压异常:dovdd (1.8V)、avdd (2.8V)、dvdd (1.2V) 三路电压偏差会造成传感器黑屏、花屏;

3.GPIO 极性错误:复位引脚GPIO_ACTIVE_LOW需和硬件电平逻辑匹配,复位失败则传感器无法启动;

4.MIPI 信号完整性:4 Lane 高速 MIPI 对 PCB 布线要求高,差分线不等长、阻抗不匹配会出现丢帧、横纹;

5.XVCLK 时钟:传感器固定使用 24MHz 参考时钟,时钟偏移会导致采样异常;

6.寄存器版本差异:不同批次 IMX766 寄存器配置略有区别,需对照原厂寄存器手册微调。

八、总结

这份 Patch 是瑞芯微 RK 平台 Linux 相机适配的标准范本,完整覆盖了「设备树硬件描述→ 内核编译 → I2C/V4L2 驱动开发 → 电源 / 时序 / 数据流」全链路。

1.设备树是硬件的“文字描述”,决定了驱动能拿到哪些外设资源;

2.IMX766 驱动严格遵循 Linux V4L2/Media 子系统规范,同时深度适配 RK 平台扩展能力,兼顾通用性与平台特性;

3.图像传感器驱动的核心是上电时序寄存器配置,时序错误是调试阶段最常见的问题;

4.OTP、QSC 等校准功能是专业相机与普通摄像头的分水岭,直接决定最终成像质量。

对于嵌入式视觉开发者而言,这份imx766.c驱动也是学习Linux V4L2 图像传感器驱动、RK 相机架构的优质实战代码。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • 热点推荐
  • RK3588

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分