新手如何在 RK 平台移植并点亮一颗 Camera Sensor?

适用对象:刚开始做 Rockchip / RK 平台摄像头驱动的嵌入式工程师。
示例平台:RV1126B + IMX335。
适用思路:RK3568、RK3588、RV1106、RV1126B 等 Rockchip Linux 平台都可以参考,具体节点名称以 SDK 里的 DTS 和内核版本为准。


1. 先理解:摄像头“点亮”到底是什么意思?

很多新手把“点亮摄像头”理解成“屏幕上看到正常画面”。这不完全准确。

在 RK 平台上,摄像头点亮可以分成 5 个层级:

层级

状态

判断标准

说明

Level 0

硬件具备工作条件

MCLK、电源、RESET/PWDN、I2C 总线正常

这是所有调试的前提

Level 1

Sensor 被识别

驱动 probe 成功,能读到 Chip ID

说明 I2C、上电时序基本没问题

Level 2

Media 拓扑正确

media-ctl -p

 能看到 sensor、csi/dphy、isp/cif 链路

说明设备树和 V4L2 subdev 注册基本正确

Level 3

可以稳定出流

v4l2-ctl --stream-mmap

 能抓到帧,不 timeout,不报 CRC/ECC

这才算底层意义上的“点亮”

Level 4

画面可用

亮度、颜色、帧率、方向、3A、IQ 基本正常

这是产品调试阶段,不只是驱动移植

工程判断标准:

如果是 IMX335 这类 RAW Bayer Sensor,只要底层能够稳定输出 RAW 帧,并且 MIPI / CSI / ISP 不报错,就可以认为“底层驱动已经点亮”。如果 Android 相机预览仍然黑、偏色、过曝、欠曝,可能是 IQ 文件、3A、Bayer 顺序、曝光增益、HAL 配置的问题,不一定是 sensor 驱动没有点亮。


2. RK 摄像头数据链路总览

RK 平台摄像头链路一般可以理解为:

Sensor(IMX335)
    ↓  I2C 控制寄存器 / MCLK 时钟 / 电源 GPIO
MIPI CSI-2 D-PHY
    ↓
CSI2 / VICAP / RKCIF
    ↓
RKISP / ISP virtual device
    ↓
/dev/videoX
    ↓
V4L2 / GStreamer / Camera HAL / RKAIQ

其中:

  • Sensor 驱动:负责上电、读 Chip ID、写初始化寄存器、控制曝光/增益/翻转/帧率、启动/停止数据流。

  • DTS 设备树:负责描述 sensor 挂在哪个 I2C、使用哪个 MCLK、哪些 GPIO、电源、MIPI lane、和哪个 DPHY/ISP 相连。

  • MIPI DPHY / CSI / CIF / ISP 驱动:负责接收 sensor 输出的数据流。

  • V4L2 / Media Controller:负责把 sensor、dphy、isp、video node 串成 pipeline。

新手最容易错的地方是:只改了 sensor 驱动,没有把 DTS 的 remote-endpointdata-lanescamera-module-index、电源 GPIO 配对改正确。


3. 调试前必须准备的资料

在真正写驱动之前,先准备这几类资料。

3.1 主控平台规格

需要确认当前 RK 平台支持:

  • 最高输入分辨率;

  • MIPI CSI-2 接口数量;

  • 每个 DPHY 支持的 lane 数;

  • 每 lane 最大速率;

  • 当前 SDK 使用的是 RKISP、RKCIF、VICAP 还是其他 VI 架构;

  • 内核版本,例如 RV1126B 常见是 Linux 6.1,RK356x 常见是 Linux 4.19 / 5.10,RK3588 常见是 Linux 5.10。

3.2 Sensor DataSheet

至少要从 datasheet 中确认:

  • I2C 7-bit 地址;

  • Chip ID 寄存器地址和期望值;

  • AVDD / DOVDD / DVDD 电压;

  • MCLK 频率,例如 24MHz、27MHz、37.125MHz 等;

  • RESET / PWDN 上下电时序;

  • 支持的 RAW8 / RAW10 / RAW12 / RAW16 输出格式;

  • Bayer 顺序:RGGB、BGGR、GRBG、GBRG;

  • MIPI lane 数,例如 2lane / 4lane;

  • 每 lane 速率,或者 PLL / link frequency 配置;

  • HTS、VTS、曝光、增益寄存器;

  • Test Pattern 是否支持;

  • Mirror / Flip 寄存器;

  • 是否支持 HDR、DOL、WDR、Slave 同步模式。

3.3 Sensor 初始化寄存器列表

向模组厂或 sensor 原厂要寄存器初始化序列,最好要求他们明确写出:

Sensor: IMX335
MCLK: 24MHz / 27MHz / 37.125MHz
Resolution: 2592x1944 / 1920x1080 / ...
FPS: 30fps / 60fps
MIPI lane: 2lane / 4lane
MIPI data rate per lane: xxx Mbps/lane
Output format: RAW10 / RAW12
Bayer order: RGGB / BGGR / GRBG / GBRG
HTS / VTS: xxx / xxx
HDR mode: Linear / HDR_X2 / HDR_X3

注意:不要直接把 stream-on 寄存器放进初始化数组里。建议初始化寄存器只配置模式参数,最后在驱动的 s_stream() 或 start_stream() 中单独写 stream-on 寄存器。


4. 新手移植 Camera Sensor 的完整流程

下面按真实工程顺序来做。


第一步:找一个接近的参考驱动

RK 平台 sensor 驱动一般在:

kernel/drivers/media/i2c/

优先选择参考驱动的原则:

  1. 同一个 sensor 型号最好;

  2. 同厂家、相近规格优先;

  3. 同样是 RAW Bayer MIPI CSI-2 sensor;

  4. 已经在当前 SDK 里能正常工作的驱动优先。

例如做 IMX335,可以先搜索:

find kernel/drivers/media/i2c -name '*imx*'
grep -R "imx335" -n kernel/drivers/media/i2c

如果 SDK 已经有 imx335.c,优先在原驱动基础上改 DTS、mode 和寄存器。如果没有,可以参考 imx415.cimx219.csc200ai.c 等结构相近的 MIPI RAW sensor 驱动。


第二步:添加 Makefile 和 Kconfig

假设新增驱动文件:

kernel/drivers/media/i2c/imx335.c

修改:

kernel/drivers/media/i2c/Makefile

增加:

obj-$(CONFIG_VIDEO_IMX335) += imx335.o

修改:

kernel/drivers/media/i2c/Kconfig

增加:

config VIDEO_IMX335
    tristate "Sony IMX335 sensor support"
    depends on I2C && VIDEO_V4L2
    select MEDIA_CONTROLLER
    select VIDEO_V4L2_SUBDEV_API
    select V4L2_FWNODE
    help
      This is a Video4Linux2 sensor driver for the Sony IMX335 camera sensor.

第三步:实现 I2C 设备驱动框架

一个标准 sensor 驱动至少要有:

static const struct of_device_id imx335_of_match[] = {
    { .compatible = "sony,imx335" },
    {},
};
MODULE_DEVICE_TABLE(of, imx335_of_match);

static const struct i2c_device_id imx335_match_id[] = {
    { "sony,imx335", 0 },
    { },
};

static struct i2c_driver imx335_i2c_driver = {
    .driver = {
        .name = "imx335",
        .pm = &imx335_pm_ops,
        .of_match_table = of_match_ptr(imx335_of_match),
    },
    .probe = imx335_probe,
    .remove = imx335_remove,
    .id_table = imx335_match_id,
};

compatible 必须和 DTS 中保持一致。


第四步:实现上电时序

上电时序是 sensor 是否能被识别的第一关键点。

典型上电流程:

1. 配置 pinctrl / iomux
2. 打开 MCLK
3. 打开 AVDD / DOVDD / DVDD
4. 控制 RESET / PWDN GPIO
5. 按 datasheet 要求延时
6. 通过 I2C 读取 Chip ID

常见代码结构:

static int __imx335_power_on(struct imx335 *imx335)
{
    int ret;

    ret = clk_set_rate(imx335->xvclk, IMX335_XVCLK_FREQ);
    if (ret < 0)
        return ret;

    ret = clk_prepare_enable(imx335->xvclk);
    if (ret < 0)
        return ret;

    ret = regulator_bulk_enable(IMX335_NUM_SUPPLIES, imx335->supplies);
    if (ret < 0)
        goto disable_clk;

    gpiod_set_value_cansleep(imx335->reset_gpio, 0);
    usleep_range(5000, 10000);

    gpiod_set_value_cansleep(imx335->pwdn_gpio, 0);
    usleep_range(10000, 20000);

    return 0;

disable_clk:
    clk_disable_unprepare(imx335->xvclk);
    return ret;
}

注意:GPIO 高低有效要以原理图和 datasheet 为准,不能照抄。

调试 MCLK 和电源时,可以临时注释 power_off() 里的下电操作,让电压和时钟保持输出,方便示波器测量。


第五步:读 Chip ID,确认 I2C 和上电没问题

在 probe() 中,一般会:

ret = imx335_check_sensor_id(imx335, client);
if (ret)
    return ret;

如果读 ID 失败,优先排查:

1. DTS 中 reg 是否写的是 7-bit I2C 地址,而不是 8-bit 地址;
2. I2C bus 是否选错;
3. MCLK 是否有输出;
4. AVDD / DOVDD / DVDD 是否正常;
5. RESET / PWDN 电平是否正确;
6. 上电延时是否满足 datasheet;
7. pinctrl 是否把 MCLK / GPIO 复用正确;
8. 模组排线、座子、焊接是否可靠。

这里有一个非常重要的判断:

如果 Chip ID 都读不到,问题基本还在 sensor 自己、I2C、电源、MCLK、GPIO、地址、焊接这些地方,和 RKISP / RKCIF 基本没有关系。


第六步:定义 sensor mode 参数

每一种分辨率、帧率、HDR 模式都应该对应一个 mode。

典型结构如下:

struct imx335_mode {
    u32 bus_fmt;                 // MEDIA_BUS_FMT_SRGGB10_1X10 等
    u32 width;                   // 有效宽度
    u32 height;                  // 有效高度
    struct v4l2_fract max_fps;   // 最大帧率
    u32 hts_def;                 // 默认 HTS
    u32 vts_def;                 // 默认 VTS
    u32 exp_def;                 // 默认曝光
    u32 mipi_freq_idx;           // link_freq_menu_items 的索引
    u32 bpp;                     // RAW10 就是 10
    const struct regval *reg_list;
    u32 hdr_mode;
};

例子:

static const struct imx335_mode supported_modes[] = {
    {
        .width = 2592,
        .height = 1944,
        .max_fps = {
            .numerator = 10000,
            .denominator = 300000, // 30fps
        },
        .bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
        .hts_def = 0xXXXX,
        .vts_def = 0xXXXX,
        .exp_def = 0x0100,
        .bpp = 10,
        .mipi_freq_idx = 0,
        .reg_list = imx335_linear_10_2592x1944_30fps_regs,
        .hdr_mode = NO_HDR,
    },
};

这里最容易出错的是:

  • bus_fmt 和真实 Bayer 顺序不一致,导致偏色;

  • width / height 和 sensor 实际输出不一致,导致收图异常;

  • hts_def / vts_def 写错,导致帧率、曝光异常;

  • bpp 写错,导致 pixel_rate 计算错误;

  • mipi_freq_idx 对不上 link_freq_menu_items,导致 MIPI 收图失败。


第七步:计算 link_freq 和 pixel_rate

7.1 概念区别

参数

含义

常见误区

MCLK / XVCLK

主控给 sensor 的外部参考时钟,例如 24MHz

不是 MIPI 速率

MIPI data rate

每 lane 的数据速率,例如 720Mbps/lane

不是 link_freq

link_freq

MIPI clock lane 频率,通常是 data rate 的一半

不是 MCLK

pixel_rate

每秒输出多少像素,用于曝光和帧率计算

和 link_freq、lane、bpp 有关

7.2 常用公式

如果厂家给的是每 lane 速率:

link_freq = lane_data_rate / 2

因为 MIPI CSI-2 是 DDR 双边沿传输,一个 clock 周期传 2 bit。

如果已知 link_freq:

pixel_rate = link_freq * 2 * lanes / bits_per_sample

如果完全不知道 link_freq,可以先用有效图像数据估一个理论下限:

link_freq_min = width * height * fps * bits_per_pixel / lanes / 2

但是工程上要注意:这个公式只按有效像素估算,没有完整考虑 blanking、MIPI packet overhead、PLL 取整和 sensor 内部时序,所以它只能作为理论下限,最终还是以原厂寄存器序列、datasheet 或示波器测量为准。

7.3 举例

假设:

1920x1080
30fps
RAW10
2lane
厂家给出每 lane data rate = 720Mbps/lane

那么:

link_freq = 720Mbps / 2 = 360MHz
pixel_rate = 360MHz * 2 * 2 / 10 = 144MPixel/s

驱动中可以写:

static const s64 link_freq_menu_items[] = {
    360000000,
};

pixel_rate = link_freq_menu_items[mode->mipi_freq_idx] * 2 * lane_num / mode->bpp;

第八步:整理初始化寄存器数组

寄存器数组一般长这样:

static const struct regval imx335_linear_10_2592x1944_30fps_regs[] = {
    {0x3000, 0x01},
    {0x3002, 0x00},
    {0xXXXX, 0xXX},
    // ...
    {REG_NULL, 0x00},
};

新手要注意 4 点:

  1. 不要漏掉 page select / bank select 类寄存器;

  2. 不要把 stream-on 寄存器混进初始化数组;

  3. 初始化数组里的 HTS / VTS 要和 supported_modes 里的 hts_def / vts_def 对上;

  4. 如果驱动支持 HDR,linear mode 和 HDR mode 要分开维护,不要混用 VC 配置。


第九步:实现 V4L2 subdev 回调

RK 平台 sensor 驱动不是单纯的 I2C 字符设备,它要注册成 V4L2 subdev。

常见回调包括:

static const struct v4l2_subdev_core_ops imx335_core_ops = {
    .ioctl = imx335_ioctl,
#ifdef CONFIG_COMPAT
    .compat_ioctl32 = imx335_compat_ioctl32,
#endif
};

static const struct v4l2_subdev_video_ops imx335_video_ops = {
    .s_stream = imx335_s_stream,
    .g_frame_interval = imx335_g_frame_interval,
};

static const struct v4l2_subdev_pad_ops imx335_pad_ops = {
    .enum_mbus_code = imx335_enum_mbus_code,
    .enum_frame_size = imx335_enum_frame_sizes,
    .enum_frame_interval = imx335_enum_frame_interval,
    .get_fmt = imx335_get_fmt,
    .set_fmt = imx335_set_fmt,
    .get_mbus_config = imx335_g_mbus_config,
};

static const struct v4l2_subdev_ops imx335_subdev_ops = {
    .core = &imx335_core_ops,
    .video = &imx335_video_ops,
    .pad = &imx335_pad_ops,
};

新手最少要保证:

  • get_fmt() 能返回正确分辨率和 mbus_code

  • set_fmt() 能匹配到正确 mode;

  • s_stream(1) 能写初始化寄存器并启动 sensor;

  • s_stream(0) 能停止 sensor;

  • get_mbus_config() 能返回正确 MIPI lane 和 clock 模式;

  • V4L2_CID_PIXEL_RATE / V4L2_CID_LINK_FREQ 返回正确;

  • V4L2_CID_EXPOSURE / V4L2_CID_ANALOGUE_GAIN / V4L2_CID_VBLANK 基本可用。

Linux 6.1 中部分接口参数从 struct v4l2_subdev_pad_config *cfg 变为 struct v4l2_subdev_state *sd_state,从老驱动移植到 RV1126B Linux 6.1 时要特别注意。


第十步:修改设备树 DTS

设备树是点亮过程中最容易犯错的地方。下面给一个模板,节点名要根据你的 SDK 实际修改。

&i2c4 {
    status = "okay";

    imx335: imx335@1a {
        status = "okay";
        compatible = "sony,imx335";
        reg = <0x1a>;                    // 7-bit I2C 地址,不能写 8-bit 地址

        clocks = <&cru CLK_CIF_OUT>;
        clock-names = "xvclk";
        pinctrl-names = "default";
        pinctrl-0 = <&cif_clk>;

        avdd-supply = <&vcc2v8_cam>;
        dovdd-supply = <&vcc1v8_cam>;
        dvdd-supply = <&vcc1v2_cam>;

        reset-gpios = <&gpioX RK_PBX GPIO_ACTIVE_LOW>;
        pwdn-gpios  = <&gpioX RK_PBY GPIO_ACTIVE_HIGH>;

        rockchip,camera-module-index = <0>;
        rockchip,camera-module-facing = "back";
        rockchip,camera-module-name = "IMX335";
        rockchip,camera-module-lens-name = "default";

        port {
            imx335_out: endpoint {
                remote-endpoint = <&csi_dphy_input0>;
                data-lanes = <1 2 3 4>;  // 根据实际硬件写 2lane 或 4lane
            };
        };
    };
};

DPHY / CSI / ISP 端也要连上:

&csi2_dphy0 {
    status = "okay";

    ports {
        #address-cells = <1>;
        #size-cells = <0>;

        port@0 {
            reg = <0>;
            csi_dphy_input0: endpoint {
                remote-endpoint = <&imx335_out>;
                data-lanes = <1 2 3 4>;
            };
        };

        port@1 {
            reg = <1>;
            csi_dphy_output0: endpoint {
                remote-endpoint = <&isp0_in>;
            };
        };
    };
};

&rkisp0 {
    status = "okay";
};

&rkisp0_vir0 {
    status = "okay";

    port {
        #address-cells = <1>;
        #size-cells = <0>;

        isp0_in: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&csi_dphy_output0>;
        };
    };
};

注意:不同 RK 平台节点名称可能不一样,比如 csi2_dphy0rockchip-csi2-dphy0mipi_csi2rkisp_vir0rkcif_mipi_lvds 等,必须以当前 SDK 的 .dtsi 为准。


第十一步:编译内核和设备树

常见流程:

# 配置内核
make ARCH=arm64 menuconfig

# 确认打开驱动
CONFIG_VIDEO_IMX335=y
# 或
CONFIG_VIDEO_IMX335=m

# 编译内核和 dtb,具体命令以 SDK build.sh 为准
./build.sh kernel
./build.sh modules
./build.sh dtb

烧录后重启开发板。


5. 点亮后的标准验证命令

5.1 看驱动是否 probe 成功

dmesg | grep -i imx335
dmesg | grep -i sensor
dmesg | grep -i rkisp
dmesg | grep -i rkcif

正常情况应该看到类似:

imx335 4-001a: detected imx335 sensor
imx335 4-001a: driver version ...

如果看到:

chip id mismatch
read id failed
probe failed

优先回到电源、MCLK、GPIO、I2C 地址排查。


5.2 看 media 拓扑

media-ctl -p -d /dev/media0

你应该能看到类似链路:

entity: m00_b_imx335 4-001a
    pad0: Source
        [fmt:SRGGB10_1X10/2592x1944]
        -> "rockchip-csi2-dphy0":0 [ENABLED]

entity: rockchip-csi2-dphy0
    pad0: Sink
        <- "m00_b_imx335 4-001a":0 [ENABLED]
    pad1: Source
        -> "rkisp-isp-subdev":0 [ENABLED]

如果 media 拓扑里没有 sensor entity,说明 sensor subdev 没注册成功,或者 DTS 没匹配上。


5.3 找到 video 节点

media-ctl -d /dev/media0 -e "rkisp_mainpath"
media-ctl -d /dev/media0 -e "rkisp_selfpath"
media-ctl -d /dev/media0 -e "stream_cif"

不同平台 entity 名称不一样,可以先用:

media-ctl -p -d /dev/media0

查看所有 entity 名称。


5.4 查看 video 能力

v4l2-ctl -d /dev/video0 --all
v4l2-ctl -d /dev/video0 --list-formats-ext
v4l2-ctl -d /dev/v4l-subdev2 --list-ctrls

重点看:

Width/Height 是否正确
Pixel Format 是否正确
Controls 里是否有 exposure / analogue_gain / hblank / vblank / pixel_rate / link_freq

5.5 抓 RAW 或 YUV 数据

如果走 ISP YUV 输出:

v4l2-ctl --verbose \
    -d /dev/video0 \
    --set-fmt-video=width=1920,height=1080,pixelformat='NV12' \
    --stream-mmap=4 \
    --stream-count=100 \
    --stream-to=/tmp/out.yuv

PC 上查看:

ffplay -f rawvideo -pixel_format nv12 -video_size 1920x1080 out.yuv

如果抓 RAW:

v4l2-ctl --verbose \
    -d /dev/video0 \
    --set-fmt-video=width=2592,height=1944,pixelformat='RG10' \
    --stream-mmap=4 \
    --stream-count=100 \
    --stream-to=/tmp/imx335.raw

RAW 文件直接打开可能看起来黑、灰、花,这是正常的,因为 RAW Bayer 还没有经过 ISP demosaic、AWB、CCM、Gamma 等处理。


6. 怎么判断“已经点亮”?给你一套验收标准

可以按下面表格逐项打勾。

检查项

命令 / 方法

通过标准

MCLK

示波器测量

频率正确,幅度正常

电源

万用表 / 示波器

AVDD、DOVDD、DVDD 正常

Reset/PWDN

示波器 / gpio debug

时序满足 datasheet

I2C

dmesg / 驱动 log

能读到 Chip ID

Probe

dmesg

sensor probe success

Media 拓扑

media-ctl -p

sensor、dphy、isp 链路存在并 enabled

Format

media-ctl -p

 / v4l2-ctl --all

分辨率、mbus code、fps 正确

出流

v4l2-ctl --stream-mmap

能连续抓 100 帧以上

错误日志

dmesg

无 timeout、CRC、ECC、FIFO overflow

图像

ffplay / camera app

RAW 有数据或 YUV 可预览

底层点亮的最低标准:

1. 能读到 sensor id;
2. media-ctl 能看到 sensor entity;
3. v4l2-ctl 能抓到连续帧;
4. dmesg 没有 MIPI CRC / ECC / timeout;
5. 抓到的数据大小和分辨率、格式基本匹配。

产品可用的标准:

1. 图像亮度正常;
2. 颜色正常,无明显偏色;
3. 帧率稳定;
4. 曝光、增益可控;
5. 镜像、翻转方向正确;
6. 低照、高温、长时间运行稳定;
7. Android / Linux 应用能正常打开;
8. IQ、3A、RKAIQ 配置完整。

7. 常见问题排查

7.1 Sensor 不识别,probe 失败

优先排查:

1. I2C 地址是不是 7-bit 地址;
2. MCLK 是否输出;
3. AVDD / DOVDD / DVDD 是否正确;
4. RESET / PWDN 是否拉对;
5. 上电延时是否够;
6. I2C bus 是否写错;
7. pinctrl 是否冲突;
8. 模组排线是否接反或接触不良;
9. sensor 是否进入 standby / reset;
10. 驱动 compatible 是否和 DTS 一致。

7.2 能 probe,但 media-ctl 看不到链路

重点看:

1. port / endpoint 是否写对;
2. remote-endpoint 是否互相引用;
3. data-lanes 是否两端一致;
4. csi/dphy/isp 节点 status 是否 okay;
5. camera-module-index 是否冲突;
6. sensor subdev 是否完成 async register。

7.3 能看到链路,但 v4l2-ctl 抓图 timeout

重点看:

1. s_stream 是否真正写了 stream-on;
2. 初始化寄存器是否写完整;
3. MIPI lane 数是否和 sensor 输出一致;
4. link_freq / pixel_rate 是否正确;
5. bus_fmt / bpp 是否正确;
6. DPHY 节点是否接对;
7. sensor 是否真的输出 MIPI 数据;
8. 是否需要开启 test pattern 验证。

7.4 报 CRC / ECC / FIFO / MIPI 错误

常见原因:

1. MIPI 速率过高,信号质量差;
2. FPC 排线太长或阻抗不连续;
3. lane 顺序或 lane 极性错误;
4. data-lanes 配置和硬件不一致;
5. sensor 输出 VC 和接收端 VC 不一致;
6. HTS / VTS / pixel clock 配错;
7. 供电噪声大;
8. MCLK 抖动过大;
9. PCB layout 差分线不满足规范。

快速验证方法:

1. 降低分辨率;
2. 降低帧率;
3. 降低 MIPI data rate;
4. 从 4lane 改 2lane 或从 2lane 改 1lane 测试;
5. 开启 sensor test pattern;
6. 更换短排线或高质量排线;
7. 用示波器检查 MCLK、电源、MIPI 眼图。

7.5 图像偏色

重点看:

1. Bayer 顺序是否写错:RGGB / BGGR / GRBG / GBRG;
2. media bus format 是否和 sensor 输出一致;
3. IQ 文件是否匹配 sensor 和镜头;
4. AWB / CCM 是否正常;
5. 是否开了 mirror / flip 后 Bayer 顺序需要调整。

7.6 图像全黑或过暗

重点看:

1. 曝光寄存器是否写对;
2. 增益寄存器是否写对;
3. exp_def 是否小于 vts_def;
4. V4L2_CID_EXPOSURE 是否生效;
5. 是否没有启动 RKAIQ / 3A;
6. 镜头盖、光圈、红外滤光片是否影响进光。

8. 新手最推荐的调试顺序

不要一上来就打开 Android Camera APP。建议按这个顺序:

1. 只确认硬件:电源、MCLK、RESET、PWDN
2. 只确认 I2C:读 Chip ID
3. 只确认驱动:probe success
4. 只确认拓扑:media-ctl -p
5. 只确认出流:v4l2-ctl 抓 RAW/YUV
6. 再确认控制:曝光、增益、vblank、test pattern
7. 再确认画质:Bayer、IQ、3A、方向、颜色
8. 最后接入应用:Linux 预览 / Android Camera / 业务程序

调试要一层一层做,不能把硬件、电源、DTS、驱动、ISP、HAL、IQ 全混在一起查。


9. RV1126B + IMX335 项目实操建议

以 RV1126B + IMX335 为例,新手建议先做一个最小闭环:

目标一:只点亮 2592x1944@30fps RAW10 Linear
目标二:只用一个摄像头,不上多摄同步
目标三:先不做 HDR,不做快启,不做 AOV
目标四:先抓 RAW,再接 RKISP / RKAIQ
目标五:先确认底层稳定,再调画质

建议第一版驱动只实现:

1. power_on / power_off
2. check_sensor_id
3. supported_modes 一个模式
4. write_array 初始化寄存器
5. s_stream 开关流
6. get_fmt / set_fmt
7. enum_mbus_code / enum_frame_size
8. link_freq / pixel_rate
9. exposure / analogue_gain / vblank

等底层稳定后,再加:

1. 多分辨率切换
2. HDR / DOL
3. mirror / flip
4. test pattern
5. quick stream
6. standby / AOV
7. 多摄同步
8. 更完整的 IQ 和 3A 调试

10. 一句话总结

RK 平台移植摄像头驱动,不是“把寄存器数组复制进去”这么简单,而是要把 硬件上电、I2C 识别、V4L2 subdev、DTS endpoint、MIPI lane、link_freq、pixel_rate、media pipeline、v4l2 抓帧、ISP/IQ 这一整条链路全部打通。

真正算点亮,不是只看到驱动加载,而是:

能读 ID → media 拓扑正确 → 能 stream on → 能连续抓帧 → 无 MIPI/CSI 错误 → 图像数据符合格式

做到这一步,才算真正具备独立移植 camera sensor 的能力。


课程海报:摄像头驱动点亮实操课程(RV1126B + IMX335)

🎯 课程2:摄像头驱动点亮实操课程(RV1126B + IMX335)

从 0 到 1 手把手点亮一颗真实摄像头 Sensor
适合想系统掌握 RK 平台 Camera Sensor 驱动移植、底层调试、V4L2 框架、MIPI CSI 链路和成像基础的嵌入式工程师。


💰 课程价格

799 元


💻 硬件说明

本课程为纯硬件实操课程,课程费用 不包含开发板及摄像头模组
学员需要自行准备:

1. RV1126B 开发板
2. IMX335 摄像头模组
3. 对应排线 / 转接板 / 电源 / 调试串口
4. Linux 编译环境

📘 课程简介

本课程以 RV1126B 主控 + IMX335 摄像头 为硬件载体,围绕真实项目中的摄像头底层点亮流程,手把手讲解:

1. 摄像头硬件连接与上电时序
2. IMX335 datasheet 关键参数解读
3. I2C 地址、Chip ID、MCLK、电源、RESET/PWDN 调试
4. RK 平台 Sensor 设备树配置
5. Camera Sensor 驱动移植方法
6. supported_modes、HTS、VTS、link_freq、pixel_rate 配置
7. MIPI CSI-2、DPHY、RKISP / RKCIF 链路打通
8. media-ctl / v4l2-ctl 抓图调试
9. RAW / YUV 数据保存与验证
10. 常见问题定位:probe 失败、I2C 不通、无图、CRC/ECC、偏色、黑屏
11. V4L2 框架和 Sensor subdev 基础
12. 成像基础调试:曝光、增益、帧率、Bayer 顺序、镜像翻转

🚀 学完你能掌握什么?

学完后,你将能够独立完成:

✅ 新摄像头模组硬件连接确认
✅ RK 平台 Camera 设备树适配
✅ Sensor 驱动移植和编译
✅ I2C / MCLK / 电源 / GPIO 调试
✅ V4L2 subdev 注册和 media pipeline 排查
✅ 使用 media-ctl / v4l2-ctl 抓图验证
✅ 定位无图、黑图、花屏、CRC/ECC 等问题
✅ 独立完成各类 Camera Sensor 底层驱动适配和项目调试

👨‍💻 适合人群

1. 想学习 RK 平台 Camera 驱动的嵌入式工程师
2. 想从应用层转到底层驱动的音视频工程师
3. 正在做 RV1126B / RV1106 / RK3568 / RK3588 摄像头项目的人
4. 对 V4L2、MIPI CSI、RKISP、Sensor 驱动感兴趣的新手
5. 项目中遇到摄像头点不亮、无图、偏色、CRC/ECC 错误的人

🔥 课程亮点

纯实操,不空讲理论
围绕真实开发板和真实 IMX335 模组
从硬件到驱动到抓图完整闭环
覆盖新手最容易踩坑的位置
用工程师视角讲清楚“为什么点不亮”
不仅教你照着做,还教你独立排查问题

📌 课程目标

让你不再只会复制驱动,而是真正理解 RK 平台 Camera Sensor 从硬件到软件的完整点亮链路。

学完这门课,你可以把 RV1126B + IMX335 的经验迁移到其他 RK 平台和其他 Sensor 上,例如 SC 系列、OV 系列、GC 系列、Sony IMX 系列等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值