Does TX2NX CSI support YUV420 input?

Question: Does TX2NX CSI support YUV420 input?
Specific question regarding this issue:

  1. How to configure CSI input format as YUV420 in the kernel DTS configuration, for example, in one of the modes:
mode1 { // E2832_3840x2160
    mclk_khz = "24000";
    num_lanes = "4";
    tegra_sinterface = "serial_a";
    phy_mode = "DPHY";
    discontinuous_clk = "yes";
    dpcm_enable = "false";
    cil_settletime = "0";
    active_w = "3840";
    active_h = "2160";
    mode_type = "rgb";
    pixel_phase = "rgb888";
    csi_pixel_bit_depth = "24";
}

How should mode_type, pixel_phase, and csi_pixel_bit_depth be configured for YUV420 input?
I traced the kernel code and found the following code in kernel/nvidia/drivers/media/platform/tegra/camera/sensor_common.c:

static int extract_pixel_format(
    const char *pixel_t, u32 *format)
{
    size_t size = strnlen(pixel_t, OF_MAX_STR_LEN);
    if (strncmp(pixel_t, "bayer_bggr10", size) == 0)
        *format = V4L2_PIX_FMT_SBGGR10;
    else if (strncmp(pixel_t, "bayer_rggb10", size) == 0)
        *format = V4L2_PIX_FMT_SRGGB10;
    else if (strncmp(pixel_t, "bayer_grbg10", size) == 0)
        *format = V4L2_PIX_FMT_SGRBG10;
    else if (strncmp(pixel_t, "bayer_gbrg10", size) == 0)
        *format = V4L2_PIX_FMT_SGBRG10;
    else if (strncmp(pixel_t, "bayer_bggr12", size) == 0)
        *format = V4L2_PIX_FMT_SBGGR12;
    else if (strncmp(pixel_t, "bayer_rggb12", size) == 0)
        *format = V4L2_PIX_FMT_SRGGB12;
    else if (strncmp(pixel_t, "bayer_gbrg12", size) == 0)
        *format = V4L2_PIX_FMT_SGBRG12;
    else if (strncmp(pixel_t, "bayer_grbg12", size) == 0)
        *format = V4L2_PIX_FMT_SGRBG12;
    else if (strncmp(pixel_t, "rgb_rgb88824", size) == 0)
        *format = V4L2_PIX_FMT_RGB24;
    else if (strncmp(pixel_t, "bayer_wdr_pwl_rggb12", size) == 0)
        *format = V4L2_PIX_FMT_SRGGB12;
    else if (strncmp(pixel_t, "bayer_wdr_pwl_gbrg12", size) == 0)
        *format = V4L2_PIX_FMT_SGBRG12;
    else if (strncmp(pixel_t, "bayer_wdr_pwl_grbg12", size) == 0)
        *format = V4L2_PIX_FMT_SGRBG12;
    else if (strncmp(pixel_t, "bayer_wdr_dol_rggb10", size) == 0)
        *format = V4L2_PIX_FMT_SRGGB10;
    else if (strncmp(pixel_t, "bayer_xbggr10p", size) == 0)
        *format = V4L2_PIX_FMT_XBGGR10P;
    else if (strncmp(pixel_t, "bayer_xrggb10p", size) == 0)
        *format = V4L2_PIX_FMT_XRGGB10P;
    else if (strncmp(pixel_t, "yuv_yuyv16", size) == 0)
        *format = V4L2_PIX_FMT_YUYV;
    else if (strncmp(pixel_t, "yuv_yvyu16", size) == 0)
        *format = V4L2_PIX_FMT_YVYU;
    else if (strncmp(pixel_t, "yuv_uyvy16", size) == 0)
        *format = V4L2_PIX_FMT_UYVY;
    else if (strncmp(pixel_t, "yuv_vyuy16", size) == 0)
        *format = V4L2_PIX_FMT_VYUY;
    else {
        pr_err("%s: Need to extend format%s\n", __func__, pixel_t);
        return -EINVAL;
    }
    return 0;
}

However, it does not include the YUV420 format, only yuyv16 but not yuyv12.

  1. In the application layer:

fd = open(“/dev/video0”, O_RDWR);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = w;
fmt.fmt.pix.height = h;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_ARGB32;
fmt.fmt.pix.field = V4L2_FIELD_NONE;
if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0)

What should be filled in for `fmt.fmt.pix.pixelformat` when using YUV420?

Current only support YUV422.

Thanks

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.