适用对象刚开始做 Rockchip / RK 平台摄像头驱动的嵌入式工程师。示例平台RV1126B IMX335。适用思路RK3568、RK3588、RV1106、RV1126B 等 Rockchip Linux 平台都可以参考具体节点名称以 SDK 里的 DTS 和内核版本为准。1. 先理解摄像头“点亮”到底是什么意思很多新手把“点亮摄像头”理解成“屏幕上看到正常画面”。这不完全准确。在 RK 平台上摄像头点亮可以分成 5 个层级层级状态判断标准说明Level 0硬件具备工作条件MCLK、电源、RESET/PWDN、I2C 总线正常这是所有调试的前提Level 1Sensor 被识别驱动 probe 成功能读到 Chip ID说明 I2C、上电时序基本没问题Level 2Media 拓扑正确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-endpoint、data-lanes、camera-module-index、电源 GPIO 配对改正确。3. 调试前必须准备的资料在真正写驱动之前先准备这几类资料。3.1 主控平台规格需要确认当前 RK 平台支持最高输入分辨率MIPI CSI-2 接口数量每个 DPHY 支持的 lane 数每 lane 最大速率当前 SDK 使用的是 RKISP、RKCIF、VICAP 还是其他 VI 架构内核版本例如 RV1126B 常见是 Linux 6.1RK356x 常见是 Linux 4.19 / 5.10RK3588 常见是 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、GBRGMIPI 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/优先选择参考驱动的原则同一个 sensor 型号最好同厂家、相近规格优先同样是 RAW Bayer MIPI CSI-2 sensor已经在当前 SDK 里能正常工作的驱动优先。例如做 IMX335可以先搜索find kernel/drivers/media/i2c -name *imx* grep -R imx335 -n kernel/drivers/media/i2c如果 SDK 已经有imx335.c优先在原驱动基础上改 DTS、mode 和寄存器。如果没有可以参考imx415.c、imx219.c、sc200ai.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_rate7.1 概念区别参数含义常见误区MCLK / XVCLK主控给 sensor 的外部参考时钟例如 24MHz不是 MIPI 速率MIPI data rate每 lane 的数据速率例如 720Mbps/lane不是 link_freqlink_freqMIPI clock lane 频率通常是 data rate 的一半不是 MCLKpixel_rate每秒输出多少像素用于曝光和帧率计算和 link_freq、lane、bpp 有关7.2 常用公式如果厂家给的是每 lane 速率link_freq lane_data_rate / 2因为 MIPI CSI-2 是 DDR 双边沿传输一个 clock 周期传 2 bit。如果已知 link_freqpixel_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 点不要漏掉 page select / bank select 类寄存器不要把 stream-on 寄存器混进初始化数组初始化数组里的 HTS / VTS 要和supported_modes里的hts_def / vts_def对上如果驱动支持 HDRlinear 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_codeset_fmt()能匹配到正确 modes_stream(1)能写初始化寄存器并启动 sensors_stream(0)能停止 sensorget_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: imx3351a { 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; >DPHY / CSI / ISP 端也要连上csi2_dphy0 { status okay; ports { #address-cells 1; #size-cells 0; port0 { reg 0; csi_dphy_input0: endpoint { remote-endpoint imx335_out; >注意不同 RK 平台节点名称可能不一样比如csi2_dphy0、rockchip-csi2-dphy0、mipi_csi2、rkisp_vir0、rkcif_mipi_lvds等必须以当前 SDK 的.dtsi为准。第十一步编译内核和设备树常见流程# 配置内核 make ARCHarm64 menuconfig # 确认打开驱动 CONFIG_VIDEO_IMX335y # 或 CONFIG_VIDEO_IMX335m # 编译内核和 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_freq5.5 抓 RAW 或 YUV 数据如果走 ISP YUV 输出v4l2-ctl --verbose \ -d /dev/video0 \ --set-fmt-videowidth1920,height1080,pixelformatNV12 \ --stream-mmap4 \ --stream-count100 \ --stream-to/tmp/out.yuvPC 上查看ffplay -f rawvideo -pixel_format nv12 -video_size 1920x1080 out.yuv如果抓 RAWv4l2-ctl --verbose \ -d /dev/video0 \ --set-fmt-videowidth2592,height1944,pixelformatRG10 \ --stream-mmap4 \ --stream-count100 \ --stream-to/tmp/imx335.rawRAW 文件直接打开可能看起来黑、灰、花这是正常的因为 RAW Bayer 还没有经过 ISP demosaic、AWB、CCM、Gamma 等处理。6. 怎么判断“已经点亮”给你一套验收标准可以按下面表格逐项打勾。检查项命令 / 方法通过标准MCLK示波器测量频率正确幅度正常电源万用表 / 示波器AVDD、DOVDD、DVDD 正常Reset/PWDN示波器 / gpio debug时序满足 datasheetI2Cdmesg / 驱动 log能读到 Chip IDProbedmesgsensor probe successMedia 拓扑media-ctl -psensor、dphy、isp 链路存在并 enabledFormatmedia-ctl -p/v4l2-ctl --all分辨率、mbus code、fps 正确出流v4l2-ctl --stream-mmap能连续抓 100 帧以上错误日志dmesg无 timeout、CRC、ECC、FIFO overflow图像ffplay / camera appRAW 有数据或 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.>重点看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.>快速验证方法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 为例新手建议先做一个最小闭环目标一只点亮 2592x194430fps 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 系列等。
新手如何在 RK 平台移植并点亮一颗 Camera Sensor?
发布时间:2026/5/25 21:08:04
适用对象刚开始做 Rockchip / RK 平台摄像头驱动的嵌入式工程师。示例平台RV1126B IMX335。适用思路RK3568、RK3588、RV1106、RV1126B 等 Rockchip Linux 平台都可以参考具体节点名称以 SDK 里的 DTS 和内核版本为准。1. 先理解摄像头“点亮”到底是什么意思很多新手把“点亮摄像头”理解成“屏幕上看到正常画面”。这不完全准确。在 RK 平台上摄像头点亮可以分成 5 个层级层级状态判断标准说明Level 0硬件具备工作条件MCLK、电源、RESET/PWDN、I2C 总线正常这是所有调试的前提Level 1Sensor 被识别驱动 probe 成功能读到 Chip ID说明 I2C、上电时序基本没问题Level 2Media 拓扑正确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-endpoint、data-lanes、camera-module-index、电源 GPIO 配对改正确。3. 调试前必须准备的资料在真正写驱动之前先准备这几类资料。3.1 主控平台规格需要确认当前 RK 平台支持最高输入分辨率MIPI CSI-2 接口数量每个 DPHY 支持的 lane 数每 lane 最大速率当前 SDK 使用的是 RKISP、RKCIF、VICAP 还是其他 VI 架构内核版本例如 RV1126B 常见是 Linux 6.1RK356x 常见是 Linux 4.19 / 5.10RK3588 常见是 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、GBRGMIPI 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/优先选择参考驱动的原则同一个 sensor 型号最好同厂家、相近规格优先同样是 RAW Bayer MIPI CSI-2 sensor已经在当前 SDK 里能正常工作的驱动优先。例如做 IMX335可以先搜索find kernel/drivers/media/i2c -name *imx* grep -R imx335 -n kernel/drivers/media/i2c如果 SDK 已经有imx335.c优先在原驱动基础上改 DTS、mode 和寄存器。如果没有可以参考imx415.c、imx219.c、sc200ai.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_rate7.1 概念区别参数含义常见误区MCLK / XVCLK主控给 sensor 的外部参考时钟例如 24MHz不是 MIPI 速率MIPI data rate每 lane 的数据速率例如 720Mbps/lane不是 link_freqlink_freqMIPI clock lane 频率通常是 data rate 的一半不是 MCLKpixel_rate每秒输出多少像素用于曝光和帧率计算和 link_freq、lane、bpp 有关7.2 常用公式如果厂家给的是每 lane 速率link_freq lane_data_rate / 2因为 MIPI CSI-2 是 DDR 双边沿传输一个 clock 周期传 2 bit。如果已知 link_freqpixel_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 点不要漏掉 page select / bank select 类寄存器不要把 stream-on 寄存器混进初始化数组初始化数组里的 HTS / VTS 要和supported_modes里的hts_def / vts_def对上如果驱动支持 HDRlinear 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_codeset_fmt()能匹配到正确 modes_stream(1)能写初始化寄存器并启动 sensors_stream(0)能停止 sensorget_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: imx3351a { 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; >DPHY / CSI / ISP 端也要连上csi2_dphy0 { status okay; ports { #address-cells 1; #size-cells 0; port0 { reg 0; csi_dphy_input0: endpoint { remote-endpoint imx335_out; >注意不同 RK 平台节点名称可能不一样比如csi2_dphy0、rockchip-csi2-dphy0、mipi_csi2、rkisp_vir0、rkcif_mipi_lvds等必须以当前 SDK 的.dtsi为准。第十一步编译内核和设备树常见流程# 配置内核 make ARCHarm64 menuconfig # 确认打开驱动 CONFIG_VIDEO_IMX335y # 或 CONFIG_VIDEO_IMX335m # 编译内核和 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_freq5.5 抓 RAW 或 YUV 数据如果走 ISP YUV 输出v4l2-ctl --verbose \ -d /dev/video0 \ --set-fmt-videowidth1920,height1080,pixelformatNV12 \ --stream-mmap4 \ --stream-count100 \ --stream-to/tmp/out.yuvPC 上查看ffplay -f rawvideo -pixel_format nv12 -video_size 1920x1080 out.yuv如果抓 RAWv4l2-ctl --verbose \ -d /dev/video0 \ --set-fmt-videowidth2592,height1944,pixelformatRG10 \ --stream-mmap4 \ --stream-count100 \ --stream-to/tmp/imx335.rawRAW 文件直接打开可能看起来黑、灰、花这是正常的因为 RAW Bayer 还没有经过 ISP demosaic、AWB、CCM、Gamma 等处理。6. 怎么判断“已经点亮”给你一套验收标准可以按下面表格逐项打勾。检查项命令 / 方法通过标准MCLK示波器测量频率正确幅度正常电源万用表 / 示波器AVDD、DOVDD、DVDD 正常Reset/PWDN示波器 / gpio debug时序满足 datasheetI2Cdmesg / 驱动 log能读到 Chip IDProbedmesgsensor probe successMedia 拓扑media-ctl -psensor、dphy、isp 链路存在并 enabledFormatmedia-ctl -p/v4l2-ctl --all分辨率、mbus code、fps 正确出流v4l2-ctl --stream-mmap能连续抓 100 帧以上错误日志dmesg无 timeout、CRC、ECC、FIFO overflow图像ffplay / camera appRAW 有数据或 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.>重点看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.>快速验证方法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 为例新手建议先做一个最小闭环目标一只点亮 2592x194430fps 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 系列等。