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转换。