适用对象:刚开始做 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-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.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/优先选择参考驱动的原则:
同一个 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_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 点:
不要漏掉 page select / bank select 类寄存器;
不要把 stream-on 寄存器混进初始化数组;
初始化数组里的 HTS / VTS 要和
supported_modes里的hts_def / vts_def对上;如果驱动支持 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_dphy0、rockchip-csi2-dphy0、mipi_csi2、rkisp_vir0、rkcif_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_freq5.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.yuvPC 上查看:
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.rawRAW 文件直接打开可能看起来黑、灰、花,这是正常的,因为 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 / | 分辨率、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 系列等。

904

被折叠的 条评论
为什么被折叠?



