工具/软件:
您好、
对于我们的工程、我们需要使用隔行扫描模式的 BT656 输出(我找到了在论坛上已经实现此功能的补丁集)。
我知道这目前不受支持、但在实施时是否可能获得一些支持?
无论是在 TI 实现、还是一些需要在驱动程序中修改内容以支持隔行扫描模式的支持/指针。
此致、
Bas Vermeulen
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.
工具/软件:
您好、
对于我们的工程、我们需要使用隔行扫描模式的 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 数据或至少与更改同步的时钟来读取它?
尊敬的 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 个时钟周期内输出?
我很抱歉,如果我要求太多,但这是我不理解的部分。 可能是因为我错过了一些东西、但我非常希望听到一些有关这方面的解释。
我们需要的视频格式:
共 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
使用这些值、我可以获得无错误的分析仪图像。
我还编辑了我上一篇文章、并更正了其中的值、因此这里没有错误的值来误导他人。
尊敬的 Divyansh:
遗憾的是、隔行扫描模式仍然存在问题。 屏幕上显示了帧缓冲区的一半图片:

此模式是以下命令的结果:
rwmem 0x30208000=0x2
阵列的底部缺失。
尊敬的 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 键退出
我希望这是有用的。
此致、
尼古拉·尼科洛夫
尊敬的 Divyansh:
感谢您的建议! 我会尝试一下。
我认为、我已根据 SDI 要求正确设置了缝隙和同步。 至少我没有抱怨 SDI 分析仪。
问题在于奇数字段和偶数字段具有相同的数据。 我做了一个工具,在帧缓冲区中绘制连续的白色和黑色线条。
在这种情况下、在隔行扫描模式下、偶数字段应只有白线、奇数字段应只有黑线。 但事实并非如此。 我在奇偶两个领域都有连续的白线和黑线。 因此、奇数和偶数字段连续包含帧缓冲区中不正确的行。 这两个字段都应从帧缓冲区中选取每第二行。 我可以在 TRM 中看到一些定义此类行为的寄存器 — DSS0_VID_ROW_INC 和 DSS0_VID_ROW_INC_UV。 其中的值为 0x1。 我在两个寄存器中都设置了值 0x2、但图片并未发生变化。 显然、由于某种原因没有考虑到这一点。
如果您有关于此问题的更多信息、请告诉我。
尊敬的 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
尊敬的 Divyansh Mittal:
是的、这是合适的。 是否有办法从设备树或简单面板配置平面 41 的参数?
基本上、我想更改宽度/高度并指定一个 x 和 y 作为基准面的开始位置。 平面 31 和平面 41 的 zpos 也可能相同。
我知道这可以使用 modetest 来完成、但我更喜欢在器件树或驱动程序中进行静态配置。
此致、
Bas Vermeulen
尊敬的 Divyansh Mittal :
我将 gstreamer 与 kmssink 插件一起输出到显示屏(它现在正在工作)。
我已设置 kmssink 插件的渲染矩形参数 (x = 97、y = 8、宽度= 528、高度= 410)。 这有点工作(我看到的视频显示在该区域),但我看到重影在下面的区域.

(这是一张屏幕图片,我希望可以看到重影)
有什么想法可能导致这种情况? 看起来有些帧会在未主动写入的器件中重复。
此致、
Bas Vermeulen
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
如果我以低于实际分辨率的分辨率运行 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)。
尊敬的 Divyansh:
我们已经解释了问题 Bas、我们正在努力解决这个问题。 此外、在该主题中:
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
尊敬的 Divyansh:
请查看此主题:
AM62A7-Q1:tiovxmultiscaler 会导致颜色损坏
看起来问题是由 tiovxmultiscaler gstreamer 元素引起的。