RK3576 MIPI-CSI 接收YUV420

RK的主控平台MIPI-CSI接口一般都是只有支持YUV422与RGB888的格式,RK3576的平台上,RK对其有所优化,RK3576 MIPI-CSI也可以支持接收YUV420-8bit的图像数据。并且支持接收YUV420的格式后再将其转换成NV12等格式,给后级模块使用。

RK3588理论也能接收YUV420格式,但是VICAP模块无法将其转换格式为NV12,需要在HAL层使用GPU或者CPU进行转换。

1.RK3576 VICAP特性

从RK3576的规格书可以看出,RK3576的VICAP模块支持接收YUV420-8bit,以及YUV420-8bit legacy的格式。

对于部分HDMI-IN的转接芯片,只能支持HDMI1.4的版本,但是又需要4K60的分辨率,则可以添加YUV420的支持,RK3576可以支持接收。

2.YUV420 图像排列

RK3576支持两种YUV420图像格式输入,分别是YUV420 8bit以及YUV420 8bit legacy格式,分别看下这两种格式是如何排列的。如需使用该格式的情况,转接芯片的MIPI-CSI也要支持输出该两种格式之一。

2.1 YUV420 8bit

YUV420 8bit的图像排列如下所示,可以看到该排列方式,奇数行都是Y,偶数行则是Y与UV像素穿插排列。每4个Y分量对应一个UV分量,每个像素只占用1.5个字节。

2.2 legacy YUV420 8bit

YUV420 8bit legacy格式图像排列如下所示,奇数行是U与Y分量穿插排列,偶数行是V分量与Y分量穿插排列。

3.驱动调试

我们以LT6911UXE作为调试转接芯片,因为LT6911UXE支持YUV420 8bit legacy的格式输出,故我们这里以legacy为例进行介绍。

3.1 驱动增加格式支持

YUV420 legacy对应的格式为:MEDIA_BUS_FMT_UV8_1X8

YUV420对应的为:MEDIA_BUS_FMT_YUV8_1X24

需要在驱动是YUV420的场景下设置上述格式,通知VICAP的驱动。

	if (lt6911uxe->bus_fmt == YUV420_8Bit) {
		lt6911uxe->mbus_fmt_code = MEDIA_BUS_FMT_UV8_1X8;
	} else {
		if (lt6911uxe->rgb_out)
			lt6911uxe->mbus_fmt_code = MEDIA_BUS_FMT_BGR888_1X24;
		else
			lt6911uxe->mbus_fmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
	}

在需要在set_fmt的接口增加支持:

static int lt6911uxe_set_fmt(struct v4l2_subdev *sd,
			struct v4l2_subdev_state *sd_state,
			struct v4l2_subdev_format *format)
{
	struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
	const struct lt6911uxe_mode *mode;

	/* is overwritten by get_fmt */
	u32 code = format->format.code;
	int ret = lt6911uxe_get_fmt(sd, sd_state, format);

	format->format.code = code;

	if (ret)
		return ret;

	switch (code) {
	case MEDIA_BUS_FMT_UYVY8_2X8:
		if (lt6911uxe->mbus_fmt_code == MEDIA_BUS_FMT_UYVY8_2X8)
			break;
		return -EINVAL;
	case MEDIA_BUS_FMT_BGR888_1X24:
		if (lt6911uxe->mbus_fmt_code == MEDIA_BUS_FMT_BGR888_1X24)
			break;
		return -EINVAL;
	case MEDIA_BUS_FMT_UV8_1X8:
		if (lt6911uxe->mbus_fmt_code == MEDIA_BUS_FMT_UV8_1X8)
			break;
		return -EINVAL;
	default:
		return -EINVAL;
	}

	if (format->which == V4L2_SUBDEV_FORMAT_TRY)
		return 0;

	lt6911uxe->mbus_fmt_code = format->format.code;
	mode = lt6911uxe_find_best_fit(lt6911uxe);
	lt6911uxe->cur_mode = mode;

	enable_stream(sd, false);

	return 0;
}

3.2 调试命令

V4L2抓图命令可以直接抓取NV12的图像格式,RK3576会默认将其转换成NV12 格式。

v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=3 --stream-skip=4 --stream-to=/data/1920x1080p60_nv12.yuv --stream-count=5 --stream-poll

4.总结

RK3576增加了YUV420的格式,可以有效解决在HDMI1.4的场景下,只能通过YUV420来支持4K60场景,或者在部分的场景,YUV420格式,若是采用YUV422输出,则会有上采样的问题,可能会有色偏的影响。增加YUV420则有效解决这些问题。

RK3588其实也可以支持YUV420的格式,但是会比较麻烦,需要修改驱动代码,且后级需要CPU转换。

全志R16平台 parrotv1.1(Android4.4.2) /* * Store information about the video data format. */ static struct sensor_format_struct { __u8 *desc; //__u32 pixelformat; enum v4l2_mbus_pixelcode mbus_code;//linux-3.0 struct regval_list *regs; int regs_size; int bpp; /* Bytes per pixel */ } sensor_formats[] = { //{ // .desc = "YUYV 4:2:2", // .mbus_code = V4L2_MBUS_FMT_YUYV8_2X8,//linux-3.0 // .regs = sensor_fmt_yuv422_yuyv, // .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_yuyv), // .bpp = 2, //}, //{ // .desc = "YVYU 4:2:2", // .mbus_code = V4L2_MBUS_FMT_YVYU8_2X8,//linux-3.0 // .regs = sensor_fmt_yuv422_yvyu, // .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_yvyu), // .bpp = 2, //}, { .desc = "UYVY 4:2:2", .mbus_code = V4L2_MBUS_FMT_UYVY8_2X8,//linux-3.0 .regs = sensor_fmt_yuv422_uyvy, .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_uyvy), .bpp = 2, }, //{ // .desc = "VYUY 4:2:2", // .mbus_code = V4L2_MBUS_FMT_VYUY8_2X8,//linux-3.0 // .regs = sensor_fmt_yuv422_vyuy, // .regs_size = ARRAY_SIZE(sensor_fmt_yuv422_vyuy), // .bpp = 2, //}, //{ // .desc = "Raw RGB Bayer", // .mbus_code = V4L2_MBUS_FMT_SBGGR8_1X8,//linux-3.0 // .regs = sensor_fmt_raw, // .regs_size = ARRAY_SIZE(sensor_fmt_raw), // .bpp = 1 //}, }; #define N_FMTS ARRAY_SIZE(sensor_formats) /* * Then there is the issue of window sizes. Try to capture the info here. */ static struct sensor_win_size sensor_win_sizes[] = { // /* UXGA */ // { // .width = UXGA_WIDTH, // .height = UXGA_HEIGHT, // .hoffset = 0, // .voffset = 0, // .regs = sensor_uxga_regs, // .regs_size = ARRAY_SIZE(sensor_uxga_regs), // .set_size = NULL, // }, //// /* 720p */ //// { //// .width = HD720_WIDTH, //// .height = HD720_HEIGHT, //// .hoffset = 0, //// .voffset = 0, //// .regs = Gc2015_sensor_hd720_regs, //// .regs_size = ARRAY_SIZE(Gc2015_sensor_hd720_regs), //// .set_size = NULL, //// }, // /* SVGA */ // { // .width = SVGA_WIDTH, // .height = SVGA_HEIGHT, // .hoffset = 0, // .voffset = 0, // .regs = sensor_svga_regs, // .regs_size = ARRAY_SIZE(sensor_svga_regs), // .set_size = NULL, // }, // /* VGA */ // { // .width = VGA_WIDTH, // .height = VGA_HEIGHT, // .hoffset = 0, // .voffset = 0, // .regs = sensor_vga_regs, // .regs_size = ARRAY_SIZE(sensor_vga_regs), // .set_size = NULL, // }, /* VGA */ { .width = VGA_WIDTH, .height = VGA_HEIGHT, .hoffset = 0, .voffset = 0, .regs = sensor_default_regs, .regs_size = ARRAY_SIZE(sensor_default_regs), .set_size = NULL, }, };
<think>好的,用户现在想了解关于rkcif驱动程序的日志信息及其工作原理,特别是rkcif mipi-lvds driver的部分。首先,我需要回忆一下之前提供的参考内容,其中提到了RK平台的硬件数据流路径,比如sensor通过MIPI CSI-2连接到rkcif_mipi_lvds1,然后到rkisp_vir0。同时,用户还提到了MIPI-DSI和LVDS的相关信息,这可能与数据传输协议有关。 接下来,我需要确定rkcif驱动在Rockchip平台中的作用。通常,CIF代表Camera Interface,负责处理摄像头数据的输入。结合参考中的路径,rkcif可能负责从MIPI或LVDS接口接收图像数据,并传递给后续的处理模块,比如ISP(图像信号处理器)。 然后,关于日志信息,用户可能遇到调试问题,需要理解驱动日志中的关键信息。常见的日志可能包括硬件注册状态、中断处理、DMA缓冲区管理、数据流控制等。需要解释这些日志条目对应的驱动行为,比如初始化步骤、错误检测、数据传输状态等。 工作原理方面,需要分步骤解释数据流:从sensor通过MIPI或LVDS传输到rkcif驱动驱动如何配置硬件寄存器,管理DMA搬运数据,处理中断,以及如何将数据传递到下一处理模块(如rkisp_vir0)。同时,可能涉及时钟配置、电源管理、错误处理机制等。 另外,用户提到的mipi-lvds可能涉及到MIPI CSI-2到LVDS的转换,需要确认Rockchip芯片是否支持这种转换,或者是否在硬件链路中有桥接芯片。这部分可能需要查阅Rockchip的文档,但根据提供的参考,数据流经过rkcif_mipi_lvds1,说明驱动可能集成了对MIPI和LVDS接口的支持。 最后,生成相关问题时要围绕驱动日志分析、工作原理、调试方法、硬件配置等方面,确保用户能进一步深入理解或解决问题。</think>[系统级回答] ### rkcif mipi-lvds驱动日志解析 在Rockchip平台的摄像头接口驱动(rkcif)中,mipi-lvds相关日志主要包含以下关键信息: 1. **硬件链路初始化**:记录CSI-2控制器与LVDS接口的绑定状态,例如: ```log rkcif_mipi_lvds1: Linked as csi2_dphy0->rkcif_mipi_lvds1 ``` 表明MIPI DPHY物理层到CIF模块的链路建立完成[^1] 2. **中断事件报告**: ```log CIF_ERR: frame lost (intr: 0x00010000) ``` 表示发生帧丢失事件,可能由DMA超时或传感器时钟失步引起 3. **数据流控制**: ```log cif_mipi_lvds: YUV422 1920x1080@30fps configured ``` 显示当前视频流的格式、分辨率和帧率参数 ### 工作原理 数据流遵循硬件链路:`sensor -> MIPI CSI-2 -> DPHY -> rkcif_mipi_lvds -> rkisp_vir0` 1. **物理层配置** - 通过`v4l2_subdev`框架配置MIPI DPHY的时钟率和通道数 - 设置LVDS差分信号的电平阈值 2. **DMA引擎控制** ```c struct rkcif_dma_buffer { dma_addr_t dma_addr; struct list_head queue; }; ``` 驱动维护DMA缓冲区队列,使用`VD_CORE`中断触发帧数据传输 3. **格式转换** 对MIPI CSI-2的RAW数据执行:YUV格式打包 -> 水平镜像处理 -> 自动裁剪(通过`CIF_VI_CROP`寄存器) 4. **ISP桥接** 通过`media-ctl`建立管道: ```bash media-ctl -l "'rkcif_mipi_lvds1':1 -> 'rkisp_vir0':0" ``` 实现CIF输出到ISP虚拟设备的连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生苦短,菜的抠脚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值