This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM62A7-Q1:TIDSS:BT656、具有隔行扫描模式

Guru**** 2439710 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1529012/am62a7-q1-tidss-bt656-with-interlaced-mode

器件型号:AM62A7-Q1


工具/软件:

您好、

对于我们的工程、我们需要使用隔行扫描模式的 BT656 输出(我找到了在论坛上已经实现此功能的补丁集)。

我知道这目前不受支持、但在实施时是否可能获得一些支持?

无论是在 TI 实现、还是一些需要在驱动程序中修改内容以支持隔行扫描模式的支持/指针。

此致、

Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、
    通过实验、您可以尝试更改 AM62A7-Q1 中提到的寄存器:间距设置 以及此 补丁集、但我们无法确定它是否可行。 遗憾的是、我们目前还没有任何现成的参考/示例。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh Mittal

    我有你提到的补丁集已经工作了,并且它正在按预期工作。 我会看到我可以对您提到的线程中的寄存器更改执行哪些操作。

    感谢您的评分! 一旦我们让它起作用、我就会在这里发布用于 interlace 模式的修补程序集。

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在处理同一个项目、我想了解有关 BT.656 输出以及数据计时方式的一些信息。
    我们使用的是上述补丁、我的问题与逐行扫描模式无关
    根据 BT.656、一个像素由 2 个字 10 或 8 位组成。 这两个词是染色体和乳突部分。 如何在 DPI 接口的一个像素时钟周期内输出和计时这 2 个字?

    例如、我知道 DPI 的 VOUT0_PCLK 是像素时钟、我可以使用示波器看到。 它恰好是像素时钟。 在写入 TRM 中、在 BT.656 模式下使用 10 位 DPI。 像素时钟的一个时钟周期内如何输出 2 个 8 位或 10 位字(色度和亮度,我知道仅使用 8 位、2 LSB 不是实际数据)?

    因此、从 10 条 DPI 数据线中输出的数据必须采用双像素时钟以某种方式计时。 我的理解是否正确、我们如何获得用于输出 BT.656 数据或至少与更改同步的时钟来读取它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nikolay:
    我们必须在内部查看、然后由星期一回复您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、
    通常、对于 BT.656 模式、发出 1 个像素时钟周期需要 2 个像素时钟周期、因此分辨率受到限制。 每个像素时钟以 UYVY 格式传输 1 字节数据、2 个像素数据交错为 4 字节:

    在 8 位模式下、使用线路 D2 至 D9、而在 10 位模式下使用线路 D0 至 D9。
    建议浏览相关的 TRM 部分以获取更多信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh Mittal:

    非常感谢您的快速回应和解释! 我仍然无法理解。 我想问你一个问题,让我明白事情的真相。 让我们举个例子、因为我认为这样会更容易。 我知道使用 2 个像素时钟周期来发送 1 个像素。 因此,如果我们有一个分辨率 720x576 和不采取前/后门径,同步等简化。 在本例中、我们有一行 720 像素和 576。 根据我的说法、这意味着像素时钟将为 720*567=408240Hz

    但我们必须输出每行 720*2=1440 字节、因为每像素有 2 个字节。 这意味着我们需要 720*2*576=829440 字节才能输出整个帧。

    我想知道如何使用 408240Hz 时钟周期 829440 字节输出? 当然、如果是 DDR、这是可能的、但此处并非如此。

    如果我不得不以另一个问题问、8 位并行数据线中有多少 720 像素(即 1440 字节)在 720 个时钟周期内输出?
    我很抱歉,如果我要求太多,但这是我不理解的部分。 可能是因为我错过了一些东西、但我非常希望听到一些有关这方面的解释。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、
    如果忽略消隐期、则您的字节数为  720*2*576=829440 字节(如您正确提到的那样)。

    720*567=408240Hz

    此陈述不正确。

    您需要为此分辨率配置的所需像素时钟还取决于所需的 fps(假设 60fps):
    需要 像素时钟= 720*2*576*60 = 49766 kHz

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的,非常感谢解释!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们需要的视频格式:

    共 525 行:
    ⦁  1 至 19:V 型消隐数据
    ⦁  20 至 23:黑色视频数据
    ⦁  24 至 228:有效载荷视频数据(奇数字段)
    ⦁  229 至 263:黑色视频数据
    ⦁  264 至 282:V 型消隐数据
    ⦁  283 至 286:黑视频数据
    ⦁  287 至 491:有效载荷视频数据(偶数字段)
    ⦁  492 至 525:黑色视频数据

    每行 720 像素:
    ⦁  1 至 96:黑色视频数据
    ⦁  97 至 624:有效视频数据
    ⦁  625 至 720:黑色视频数据

    59.94Hz

    您能否给出一个简单的面板配置以及我们需要在 DSS 寄存器中配置的时序建议?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    目前我们正在使用这些修补程序:

    1 用于间距模式。 我想说这是开发补丁、需要一些清理。 当然、我仍然不确定它是否正确、但我们具有可被连接到电路板的设备识别的内框模式。

    From 31a32b56a86f2cb12ed24768e1fb757fed74e3a1 Mon Sep 17 00:00:00 2001
    From: Nikolay Nikolov <nikolay.nikolov@bench.com>
    Date: Wed, 18 Jun 2025 18:01:43 +0200
    Subject: [PATCH] Check interlaced support in tidss
    
    Signed-off-by: Nikolay Nikolov <nikolay.nikolov@bench.com>
    ---
     drivers/gpu/drm/drm_probe_helper.c    |  4 +++-
     drivers/gpu/drm/tidss/tidss_crtc.c    | 11 ++++++++---
     drivers/gpu/drm/tidss/tidss_dispc.c   |  6 ++++--
     drivers/gpu/drm/tidss/tidss_encoder.c |  2 ++
     4 files changed, 17 insertions(+), 6 deletions(-)
    
    diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
    index c90afb5d0898..aa2921277cbe 100644
    --- a/drivers/gpu/drm/drm_probe_helper.c
    +++ b/drivers/gpu/drm/drm_probe_helper.c
    @@ -71,8 +71,10 @@ drm_mode_validate_flag(const struct drm_display_mode *mode,
                           int flags)
     {
            if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&
    -           !(flags & DRM_MODE_FLAG_INTERLACE))
    +           !(flags & DRM_MODE_FLAG_INTERLACE)) {
    +               pr_warn("Interlace not supported, mode flags 0x%x, flags 0x%x\n", mode->flags, flags);
                    return MODE_NO_INTERLACE;
    +       }
     
            if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) &&
                !(flags & DRM_MODE_FLAG_DBLSCAN))
    diff --git a/drivers/gpu/drm/tidss/tidss_crtc.c b/drivers/gpu/drm/tidss/tidss_crtc.c
    index 14691f346f11..4e1db83259ca 100644
    --- a/drivers/gpu/drm/tidss/tidss_crtc.c
    +++ b/drivers/gpu/drm/tidss/tidss_crtc.c
    @@ -109,12 +109,12 @@ static int tidss_crtc_atomic_check(struct drm_crtc *crtc,
     
            ok = dispc_vp_mode_valid(dispc, hw_videoport, mode);
            if (ok != MODE_OK) {
    -               dev_dbg(ddev->dev, "%s: bad mode: %ux%u pclk %u kHz\n",
    +               dev_warn(ddev->dev, "%s: bad mode: %ux%u pclk %u kHz\n",
                            __func__, mode->hdisplay, mode->vdisplay, mode->clock);
                    return -EINVAL;
            }
     
    -       drm_mode_set_crtcinfo(&crtc_state->adjusted_mode, 0);
    +       drm_mode_set_crtcinfo(&crtc_state->adjusted_mode, mode->flags & DRM_MODE_FLAG_INTERLACE ? CRTC_INTERLACE_HALVE_V : 0);
            return dispc_vp_bus_check(dispc, hw_videoport, crtc_state);
     }
     
    @@ -393,7 +393,12 @@ enum drm_mode_status tidss_crtc_mode_valid(struct drm_crtc *crtc,
            struct drm_device *ddev = crtc->dev;
            struct tidss_device *tidss = to_tidss(ddev);
     
    -       return dispc_vp_mode_valid(tidss->dispc, tcrtc->hw_videoport, mode);
    +       enum drm_mode_status mode_status = dispc_vp_mode_valid(tidss->dispc, tcrtc->hw_videoport, mode);
    +       if (MODE_NO_INTERLACE == mode_status)
    +               dev_warn(ddev->dev, "%s: no interlace mode\n", __func__);
    +
    +       dev_warn(ddev->dev, "%s: mode_status %d\n", __func__, mode_status);
    +       return mode_status;
     }
     
     static const struct drm_crtc_helper_funcs tidss_crtc_helper_funcs = {
    diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c b/drivers/gpu/drm/tidss/tidss_dispc.c
    index 317ff8f420a6..4209a9ed97b3 100644
    --- a/drivers/gpu/drm/tidss/tidss_dispc.c
    +++ b/drivers/gpu/drm/tidss/tidss_dispc.c
    @@ -1399,8 +1399,10 @@ enum drm_mode_status dispc_vp_mode_valid(struct dispc_device *dispc,
                    return MODE_BAD;
     
            /* TODO: add interlace support */
    -       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
    -               return MODE_NO_INTERLACE;
    +       if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
    +               dev_warn(dispc->dev, "%s: No interlace support in tidss but continue as we need it\n", __func__);
    +               //return MODE_NO_INTERLACE;
    +       }
     
            /*
             * Enforce the output width is divisible by 2. Actually this
    diff --git a/drivers/gpu/drm/tidss/tidss_encoder.c b/drivers/gpu/drm/tidss/tidss_encoder.c
    index 17a86bed8054..6a61ad9dae91 100644
    --- a/drivers/gpu/drm/tidss/tidss_encoder.c
    +++ b/drivers/gpu/drm/tidss/tidss_encoder.c
    @@ -116,6 +116,8 @@ int tidss_encoder_create(struct tidss_device *tidss,
                    return PTR_ERR(connector);
            }
     
    +       connector->interlace_allowed = true;
    +
            ret = drm_connector_attach_encoder(connector, enc);
            if (ret) {
                    dev_err(tidss->dev, "attaching encoder to connector failed\n");
    -- 
    2.34.1
    

    2.面板贴片:

    From a24670ee474ff2dfa4c7d63094e22375371c9621 Mon Sep 17 00:00:00 2001
    From: Devarsh Thakkar <devarsht@ti.com>
    Date: Thu, 17 Apr 2025 19:20:52 +0530
    Subject: [PATCH 1/3] HACK: drm/panel: simple: Add dummy bt656 progressive
     display
    
    Add dummy panel with 720x480@60 Hz NTSC compatible timings.
    Pixel clock adjusted to match 60 Hz from tidss.
    
    Signed-off-by: Devarsh Thakkar <devarsht@ti.com>
    ---
     drivers/gpu/drm/panel/panel-simple.c | 31 ++++++++++++++++++++++++++++
     1 file changed, 31 insertions(+)
    
    diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
    index d8ca4c41d6a8..cd85069509ba 100644
    --- a/drivers/gpu/drm/panel/panel-simple.c
    +++ b/drivers/gpu/drm/panel/panel-simple.c
    @@ -1351,6 +1351,34 @@ static const struct panel_desc cdtech_s043wq26h_ct7 = {
            .bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
     };
     
    +/* S070PWS19HP-FC21 2017/04/22 */
    +static const struct drm_display_mode bt656_480p_mode = {
    +       .clock = 27000,
    +       .hdisplay = 720,
    +       .hsync_start = 720 + 20,
    +       .hsync_end = 720 + 20 + 20,
    +       .htotal = 720 + 20 + 20 + 98,
    +       .vdisplay = 487,
    +       .vsync_start = 487 + 13,
    +       .vsync_end = 487 + 13 + 10,
    +       .vtotal = 487 + 13 + 10 + 15,
    +       .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_INTERLACE,
    +};
    +
    +static const struct panel_desc bt656_480p = {
    +       .modes = &bt656_480p_mode,
    +       .num_modes = 1,
    +       .bpc = 8,
    +       .size = {
    +               .width = 129,
    +               .height = 86,
    +       },
    +       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
    +       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE |
    +                    DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
    +       .connector_type = DRM_MODE_CONNECTOR_DPI,
    +};
    +
     /* S070PWS19HP-FC21 2017/04/22 */
     static const struct drm_display_mode cdtech_s070pws19hp_fc21_mode = {
            .clock = 51200,
    @@ -4358,6 +4386,9 @@ static const struct of_device_id platform_of_match[] = {
            }, {
                    .compatible = "cdtech,s070pws19hp-fc21",
                    .data = &cdtech_s070pws19hp_fc21,
    +       }, {
    +               .compatible = "dummy,bt656-480p",
    +               .data = &bt656_480p,
            }, {
                    .compatible = "cdtech,s070swv29hg-dc44",
                    .data = &cdtech_s070swv29hg_dc44,
    -- 
    2.34.1
    

    这是您生成的补丁、我对其进行了修改、以便根据需要获得 27MHz 像素时钟。

    我设置的寄存器包括以下寄存器:

    wmem 0x3020B000
    0x3020b000 (+0x0)= 0x01500004

    rwmem 0x3020B050+12
    0x3020b050 (+0x0)= 0x00f382CF
    0x3020b054 (+0x4)= 0x00f0010b
    0x3020b058 (+0x8)= 0x01000201

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想我在寄存器中得到了正确的值:

    rwmem 0x3020B050+12
    0x3020b050 (+0x0)= 0x00f382CF
    0x3020b054 (+0x4)= 0x00f0010b
    0x3020b058 (+0x8)= 0x01000201


    rwmem 0x3020B000
    0x3020b000 (+0x0)= 0x01500004

    使用这些值、我可以获得无错误的分析仪图像。

    我还编辑了我上一篇文章、并更正了其中的值、因此这里没有错误的值来误导他人。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nikolay:
    想要确认您的问题是否已解决? 是否能够按预期看到所有输出? 如果是、发生了什么变化? 您当前和上一个寄存器转储是相同的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh:

    我们将更深入地检查这是否是我们需要的以及我们是否可以正确地从相机输出图片。
    此外、我们必须修改补丁并以某种方式从模式线设置驱动器中的寄存器值。

    我认为寄存器和其中一个是错误的、我编辑了帖子并进行了更正。 很抱歉误导你!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh:

    遗憾的是、隔行扫描模式仍然存在问题。 屏幕上显示了帧缓冲区的一半图片:

    此模式是以下命令的结果:

    rwmem 0x30208000=0x2

    阵列的底部缺失。

    我认为在我所做的 interlace 模式下,顶部和底部的字段不会从帧缓冲区中占据每第二行,但它们按顺序排列行,因为两个字段使用相同的行,所以行加倍。 这只是一个猜测,我将以某种方式证明。
    您能否检查是否需要其他东西来设置隔行扫描模式、以及我们如何使整个图片正确显示在屏幕上?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以尝试运行 kmstest 分享您在屏幕上看到的内容以及控制台吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经尝试过,我可以说 kmstest 覆盖寄存器,我正在设置和图片是超出我们必须输出的标准。 我会尝试使寄存器保持一致、尝试 kmstest 并告诉您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh:

    我将寄存器的值放入内核 tidss 驱动程序中、并在启动 kmstest 时获得以下图片:

    我有来自控制台上 kmstest 的这个输出:

    # kmstest
    [ 50.645920] tidss 30200000.dss:tidss_CRTC_MODE_VALID:MODE_STATUS 0
    连接器 0/@40:DPI-1
    [50.675869] CSC->m[CSS_CBR] ffffffda fld_val 7da0000
    CRTC 0/@38:720x487i@119.88 27.000 720/20/20/98/+ 487/13/10/15[50.681597]在 810042 写入 8
    /+ 120 (119.88) 0x15 0x48
    平面 0/@31:0.0-720x487
    FB 49[50.690270]将 c 写入 7da0019
    720x487-XR24
    [ 50.699032]在 7007b5 中写入 10
    [50.703535]在 7a20070 处写入 5c
    [50.706852]在 7ee 中写入 60
    [50.709823]在 0 处写入 64
    [50.712609]在 8000000 处写入 68
    [50.715929]在 40004000 处写入 6c
    按 ENTER 键退出

    我希望这是有用的。

    此致、
    尼古拉·尼科洛夫

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nikolov:
    您是否还可以尝试使用以下 3 个时序参数:

    如果“Input Parameters“设置不正确、请  根据您的用例使用此网页 tomverbeure.github.io/video_timings_calculator、然后对这些参数进行实验。

    此外、以前的 Bas 提到您有 525 条线、这是 NTSC 的标准线:720x480。 当您使用 480 而不是 487 时会发生什么情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh:

    感谢您的建议! 我会尝试一下。

    我认为、我已根据 SDI 要求正确设置了缝隙和同步。 至少我没有抱怨 SDI 分析仪。
    问题在于奇数字段和偶数字段具有相同的数据。 我做了一个工具,在帧缓冲区中绘制连续的白色和黑色线条。
    在这种情况下、在隔行扫描模式下、偶数字段应只有白线、奇数字段应只有黑线。 但事实并非如此。 我在奇偶两个领域都有连续的白线和黑线。 因此、奇数和偶数字段连续包含帧缓冲区中不正确的行。 这两个字段都应从帧缓冲区中选取每第二行。 我可以在 TRM 中看到一些定义此类行为的寄存器 —  DSS0_VID_ROW_INC 和 DSS0_VID_ROW_INC_UV。 其中的值为 0x1。 我在两个寄存器中都设置了值 0x2、但图片并未发生变化。 显然、由于某种原因没有考虑到这一点。

    如果您有关于此问题的更多信息、请告诉我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我认为它使用的是视频 Lite 流水线、我必须考虑如何将其设置为隔行扫描模式。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、
    我认为不涉及 VIDL (VideoLite) 管道。 请查看以下内容:

    您可能只需要修改 DSS_VID_xxx 寄存器、而不需要修改 DSS_VIDL1_xxx 寄存器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh:

    我设法使隔行扫描模式能够使用此处于开发状态的补丁、并且需要重新设计:

    diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
    index c90afb5d0898..aa2921277cbe 100644
    --- a/drivers/gpu/drm/drm_probe_helper.c
    +++ b/drivers/gpu/drm/drm_probe_helper.c
    @@ -71,8 +71,10 @@ drm_mode_validate_flag(const struct drm_display_mode *mode,
                           int flags)
     {
            if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&
    -           !(flags & DRM_MODE_FLAG_INTERLACE))
    +           !(flags & DRM_MODE_FLAG_INTERLACE)) {
    +               pr_warn("Interlace not supported, mode flags 0x%x, flags 0x%x\n", mode->flags, flags);
                    return MODE_NO_INTERLACE;
    +       }
     
            if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) &&
                !(flags & DRM_MODE_FLAG_DBLSCAN))
    diff --git a/drivers/gpu/drm/tidss/tidss_crtc.c b/drivers/gpu/drm/tidss/tidss_crtc.c
    index 14691f346f11..dc48dcddc397 100644
    --- a/drivers/gpu/drm/tidss/tidss_crtc.c
    +++ b/drivers/gpu/drm/tidss/tidss_crtc.c
    @@ -109,11 +109,12 @@ static int tidss_crtc_atomic_check(struct drm_crtc *crtc,
     
            ok = dispc_vp_mode_valid(dispc, hw_videoport, mode);
            if (ok != MODE_OK) {
    -               dev_dbg(ddev->dev, "%s: bad mode: %ux%u pclk %u kHz\n",
    +               dev_warn(ddev->dev, "%s: bad mode: %ux%u pclk %u kHz\n",
                            __func__, mode->hdisplay, mode->vdisplay, mode->clock);
                    return -EINVAL;
            }
     
    +       //drm_mode_set_crtcinfo(&crtc_state->adjusted_mode, mode->flags & DRM_MODE_FLAG_INTERLACE ? CRTC_INTERLACE_HALVE_V : 0);
            drm_mode_set_crtcinfo(&crtc_state->adjusted_mode, 0);
            return dispc_vp_bus_check(dispc, hw_videoport, crtc_state);
     }
    @@ -393,7 +394,7 @@ enum drm_mode_status tidss_crtc_mode_valid(struct drm_crtc *crtc,
     
            ok = dispc_vp_mode_valid(dispc, hw_videoport, mode);
            if (ok != MODE_OK) {
    -               dev_dbg(ddev->dev, "%s: bad mode: %ux%u pclk %u kHz\n",
    +               dev_warn(ddev->dev, "%s: bad mode: %ux%u pclk %u kHz\n",
                            __func__, mode->hdisplay, mode->vdisplay, mode->clock);
                    return -EINVAL;
            }
     
    +       //drm_mode_set_crtcinfo(&crtc_state->adjusted_mode, mode->flags & DRM_MODE_FLAG_INTERLACE ? CRTC_INTERLACE_HALVE_V : 0);
            drm_mode_set_crtcinfo(&crtc_state->adjusted_mode, 0);
            return dispc_vp_bus_check(dispc, hw_videoport, crtc_state);
     }
    @@ -393,7 +394,7 @@ enum drm_mode_status tidss_crtc_mode_valid(struct drm_crtc *crtc,
            struct drm_device *ddev = crtc->dev;
            struct tidss_device *tidss = to_tidss(ddev);
     
    -       return dispc_vp_mode_valid(tidss->dispc, tcrtc->hw_videoport, mode);
    +       return dispc_vp_mode_valid(tidss->dispc, tcrtc->hw_videoport, mode);
     }
     
     static const struct drm_crtc_helper_funcs tidss_crtc_helper_funcs = {
    diff --git a/drivers/gpu/drm/tidss/tidss_dispc.c b/drivers/gpu/drm/tidss/tidss_dispc.c
    index 317ff8f420a6..8211da90e7b5 100644
    --- a/drivers/gpu/drm/tidss/tidss_dispc.c
    +++ b/drivers/gpu/drm/tidss/tidss_dispc.c
    @@ -1399,8 +1399,10 @@ enum drm_mode_status dispc_vp_mode_valid(struct dispc_device *dispc,
                    return MODE_BAD;
     
            /* TODO: add interlace support */
    -       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
    -               return MODE_NO_INTERLACE;
    +       if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
    +               //dev_warn(dispc->dev, "%s: No interlace support in tidss but continue as we need it\n", __func__);
    +               //return MODE_NO_INTERLACE;
    +       }
     
            /*
             * Enforce the output width is divisible by 2. Actually this
    @@ -2294,10 +2296,11 @@ void dispc_plane_setup(struct dispc_device *dispc, u32 hw_plane,
     
            dispc_plane_set_pixel_format(dispc, hw_plane, fourcc);
     
    +       //dev_warn(dispc->dev, "hw_plane=%d, lite=%d, dma_addr=0x%llx, fourcc=0x%x, fb_width %d, cpp %d, yinc %d, xinc %d\n", hw_plane, lite, dma_addr, fourcc, fb_width, cpp, scale.yinc, scale.xinc);
            dispc_vid_write(dispc, hw_plane, DISPC_VID_BA_0, dma_addr & 0xffffffff);
            dispc_vid_write(dispc, hw_plane, DISPC_VID_BA_EXT_0, (u64)dma_addr >> 32);
    -       dispc_vid_write(dispc, hw_plane, DISPC_VID_BA_1, dma_addr & 0xffffffff);
    -       dispc_vid_write(dispc, hw_plane, DISPC_VID_BA_EXT_1, (u64)dma_addr >> 32);
    +       dispc_vid_write(dispc, hw_plane, DISPC_VID_BA_1, (dma_addr + fb_width*cpp) & 0xffffffff);
    +       dispc_vid_write(dispc, hw_plane, DISPC_VID_BA_EXT_1, (u64)(dma_addr + fb_width*cpp) >> 32);
     
            dispc_vid_write(dispc, hw_plane, DISPC_VID_PICTURE_SIZE,
                            (scale.in_w - 1) | ((scale.in_h - 1) << 16));
    @@ -2310,10 +2313,13 @@ void dispc_plane_setup(struct dispc_device *dispc, u32 hw_plane,
                    dispc_vid_write(dispc, hw_plane, DISPC_VID_PIXEL_INC,
                                    pixinc(scale.xinc, cpp));
     
    +       //dispc_vid_write(dispc, hw_plane, DISPC_VID_ROW_INC,
    +       //              pixinc(1 + (scale.yinc * fb_width -
    +       //                          scale.xinc * scale.in_w),
    +       //                     cpp));
    +       //dev_warn(dispc->dev, "inc one row with %d\n", pixinc(fb_width+1, cpp));
            dispc_vid_write(dispc, hw_plane, DISPC_VID_ROW_INC,
    -                       pixinc(1 + (scale.yinc * fb_width -
    -                                   scale.xinc * scale.in_w),
    -                              cpp));
    +                       pixinc(fb_width+1, cpp));
     
            if (state->fb->format->num_planes == 2) {
                    u16 cpp_uv = state->fb->format->cpp[1];
    diff --git a/drivers/gpu/drm/tidss/tidss_encoder.c b/drivers/gpu/drm/tidss/tidss_encoder.c
    index 17a86bed8054..4af343d4f16a 100644
    --- a/drivers/gpu/drm/tidss/tidss_encoder.c
    +++ b/drivers/gpu/drm/tidss/tidss_encoder.c
    @@ -116,6 +116,8 @@ int tidss_encoder_create(struct tidss_device *tidss,
                    return PTR_ERR(connector);
            }
     
    +       connector->interlace_allowed = true;
    +
            ret = drm_connector_attach_encoder(connector, enc);
            if (ret) {
                    dev_err(tidss->dev, "attaching encoder to connector failed\n");
    diff --git a/drivers/gpu/drm/tidss/tidss_kms.c b/drivers/gpu/drm/tidss/tidss_kms.c
    index a0e494c806a9..831f8165cded 100644
    --- a/drivers/gpu/drm/tidss/tidss_kms.c
    +++ b/drivers/gpu/drm/tidss/tidss_kms.c
    @@ -175,6 +175,8 @@ static int tidss_dispc_modeset_init(struct tidss_device *tidss)
                            }
                    }
     
    +               dev_warn(dev, "Bridge interlace_allowed %d\n", bridge->interlace_allowed);
    +               bridge->interlace_allowed = true;
                    pipes[num_pipes].hw_videoport = i;
                    pipes[num_pipes].bridge = bridge;
                    pipes[num_pipes].enc_type = enc_type;

    我将改进此补丁、因为我们刚刚做了一些事情来证明可以设置隔行扫描模式。 使用此补丁隔行扫描模式时、会进行硬编码、缩放可能会损坏。

    现在 kmstest 的图片如下所示:

    我可以假设使用 VIDL1 作为我的调试器、并且我还可以看到 VIDL1_ROW_INC 寄存器中的变化:

    rwmem 0x3020221c
    0x3020221c (+0x0)= 0x00000b41

    偶数字段中第一行的前 4 个像素有一些问题。 由于某种原因、4 个像素不断变化。 这个像素的行为是非常奇怪的,因为有时这些像素是正常的,但奇数字段第一行的 4 个像素是错误的。 我仍然不知道这种行为的根本原因是什么、为什么每次都不同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我有更好的补丁时、我会再次把它放在这里。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh Mittal

    是否可以为视频输出定义单独的平面?

    如果是、我将如何在上一篇文章中为活动视频数据创建平面?

    理想情况下、我会使用 kmssink 输出到单独的平面、并将其余部分自动设置为黑色。

    谢谢、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不确定我是否清楚了解您的用例、但请查看 https://software-dl.ti.com/processor-sdk-linux/esd/AM62AX/latest/exports/docs/linux/plane overlaying、网址为 Foundational_Components /Kernel/DSP/DSS7.html#testing-tidss-properties-with-modetest Kernel_Drivers 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh Mittal

    是的、这是合适的。 是否有办法从设备树或简单面板配置平面 41 的参数?

    基本上、我想更改宽度/高度并指定一个 x 和 y 作为基准面的开始位置。 平面 31 和平面 41 的 zpos 也可能相同。

    我知道这可以使用 modetest 来完成、但我更喜欢在器件树或驱动程序中进行静态配置。

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、
    modetest 是一个使用 DRM 框架使用 z 顺序和 α 混合的示例应用程序。 强烈建议您使用 DRM 框架进行此类配置。

    即便如此、如果您需要使用 dt/驱动器、请尝试 使用 以下寄存器:
    OVR1_ATTRIBUTES_0
    OVR1_ATTRIBUTES_1
    VID_Picture_Size
    VIDL1_Picture_Size

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh Mittal :

    我将 gstreamer 与 kmssink 插件一起输出到显示屏(它现在正在工作)。

    我已设置 kmssink 插件的渲染矩形参数 (x = 97、y = 8、宽度= 528、高度= 410)。 这有点工作(我看到的视频显示在该区域),但我看到重影在下面的区域.

    (这是一张屏幕图片,我希望可以看到重影)

    有什么想法可能导致这种情况? 看起来有些帧会在未主动写入的器件中重复。

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    无法查看/理解您尝试从 pic 显示的内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了消除应用程序代码中可能存在的任何错误源、您可以尝试运行以下 2 个示例:

    kmscube --device=/dev/dri/card0
    kmstest --device=/dev/dri/card0 --flip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉。 屏幕顶部显示了我的视频、底部有几行未被写入。 视频的顶部返回到未主动写入的屏幕部分。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我明天在办公室的时候就会回来。 我试图通过相机展示内容、但它没有显示我想要显示的内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nikolay:
    感谢您分享这些补丁。 它是否在您身边完全正常工作? 你跑了 kmstest--flip 在你的结尾吗? 似乎 kmstest 可能具有对隔行扫描模式的内置支持、您不需要为相同的模式创建单独的 FB。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    kmstest --flip 提供以下输出:

      Crtc 0/@38: 720x487i@119.88 27.000 720/1/15/122/- 487/2/16/20/- 120 (119.88) 0x1a 0x48
      Plane 0/@31: 0,0-720x487
        Fb 50 720x487-XR24
    press enter to exit
    Connector 0: fps 59.90, slowest 17.93 ms
    Connector 0: fps 59.94, slowest 16.82 ms
    Connector 0: fps 59.94, slowest 16.81 ms
    Connector 0: fps 59.94, slowest 16.79 ms
    Connector 0: fps 59.94, slowest 16.79 ms
    Connector 0: fps 59.94, slowest 16.82 ms
    Connector 0: fps 59.94, slowest 16.81 ms
    Connector 0: fps 59.94, slowest 16.78 ms
    Connector 0: fps 59.94, slowest 16.80 ms
    Connector 0: fps 59.94, slowest 16.78 ms
    Connector 0: fps 59.94, slowest 16.78 ms
    Connector 0: fps 59.94, slowest 16.79 ms
    Connector 0: fps 59.94, slowest 16.80 ms
    Connector 0: fps 59.94, slowest 16.80 ms

    我看到一个从左到右的跑步条、颜色为白色、红色、白色、绿色、白色、 蓝色、白色、浅灰色、白色、灰色、 白色、深灰色(从上到下)。

    我们仍然看到一些视频输出的颜色交换存在一些问题(全屏工作正常,但当我在视频框周围添加一个 gstreamer 红色和蓝色交换时)。

    我们仍在努力最后一个问题。 如果你有什么可能导致这种情况的想法,我们欢迎提示;)

    此致、

    Bas Vermeulen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bas。 到目前为止、不确定导致这种情况的原因是什么、如果弹出了一些内容、将与大家分享。 要确认、您没有看到 kmstest 的“重影效果“?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果我以低于实际分辨率的分辨率运行 kmstest、则会出现重影效应。

      Crtc 0/@38: 720x487i@119.88 27.000 720/1/15/122/- 487/2/16/20/- 120 (119.88) 0x1a 0x48
      Plane 0/@31: 0,10-720x400
        Fb 49 720x400-XR24
    press enter to exit
    Connector 0: fps 60.43, slowest 16.79 ms
    Connector 0: fps 59.94, slowest 16.73 ms
    Connector 0: fps 59.94, slowest 16.78 ms
    Connector 0: fps 59.94, slowest 16.78 ms
    Connector 0: fps 59.94, slowest 16.74 ms
    Connector 0: fps 59.94, slowest 16.82 ms
    Connector 0: fps 59.94, slowest 16.75 ms
    Connector 0: fps 59.94, slowest 16.93 ms

    在这种情况下,我看到彩色条在屏幕上从左到右运行,与腐败在屏幕上,我不是在积极写作。

    我只是不确定这是否正常。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不确定我是否完全理解。 我相信您使用某种串行器/示波器来查看帧、而不是实际的面板。 此假设是否正确? 屏幕的活动区域是您可以在真实面板上实际看到数据的区域、活动区域以外的所有伪影都不可见。 我想您看到的是活动区域以外的数据、因为您没有使用该分辨率的显示、而是模拟更大分辨率的显示。
    如果出现错误、请纠正我对您的设置的理解。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在使用显示器(720x487 隔行)。 上面的 kmstest 调用将帧缓冲区配置为小于实际显示大小的屏幕(从第 10 行开始、到第 410 行结束、每行宽度为 720)。

    e2e.ti.com/.../IMG_5F00_5260.MOV

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh:

    我们已经解释了问题 Bas、我们正在努力解决这个问题。 此外、在该主题中:

     关于:AM68A:Bt656 隔行扫描输出的 DSS 配置 

    Frank 报告说、他也使用了 iinterlace 模式。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我遇到了一些我不知道原因的更多问题:

    当使用 gstreamer 使用来自摄像机的流 (4K ->多刻度到全高清->多刻度到 720x486) 时、摄像机上的图片不流畅。 当我使用多标量除获得屏幕上我们需要的输出外,事情变得更慢(. 5 秒跳在计时器,我运行的手机上,我拍摄的视频).

    我已经运行了 gst_tracer、这使我能够实现 30fps 的帧速率、端到端延迟为 100ms

    我还注意到,如果不遇到 CPU 瓶颈,我不能同时启动带有 HEVC 编码和 kmssink 的管道。 不知道这是怎么回事。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    在 Nikolay 的补丁集中、您还应该注意  DSS0_OVR_ATTRIBUTESTES2_x 寄存器。 尤其是尺寸 Y。 它应该是归档输出的大小 — 帧缓冲区的一半 (dispc_j721e_ovr_set_plane)。 此外、缩放设置(在 dispc_plane_setup 中)的大小应该是原来的一半。 这已经消除了不使用原始显示输出大小时的损坏效应。

    此致、

    Frank

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你的提示弗兰克!

    我已经知道有一些尺寸,我忘了根据间距模式更新。 不同的寄存器大小、而不同的寄存器是不同的。 由于它在 TRM 中作为 MEMSIZEY 在 DSS0_FITLE_SIZE 寄存器中写入、我认为它用于整个映像的存储器。 但显然它不是、必须进行更新
    我在上面的帖子中更新了我的补丁。

    此致、
    尼古拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Frank!
    Nikolay、这是否有助于解决您的现有问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当缩小到较小的尺寸时、我们在颜色和图片方面仍有一些问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Divyansh:

    请查看此主题:

     AM62A7-Q1:tiovxmultiscaler 会导致颜色损坏

    看起来问题是由 tiovxmultiscaler gstreamer 元素引起的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该线程已分配给相关专家。 请等待他们的答复。