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.

[参考译文] PROCESSOR-SDK-J722S:Deinterlace 是 l7998x 视频流

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1522951/processor-sdk-j722s-deinterlace-isl7998x-video-stream

器件型号:PROCESSOR-SDK-J722S

工具/软件:

我想对来自 ti、j721e-csi2rx 驱动程序的“渐进“视频流进行解码。

isl7998x 会报告标志 V4L2_FIELD_SEQ_BT 和 V4L2_FIELD_SEQ_TB 、但 TI CSI 驱动程序会将其覆盖为渐进 (V4L2_FIELD_NONE)

这会导致图像有两个副本而不是隔行。

我希望帮助执行以下任一操作:

设置 M2M-deinterlace 设备以解码视频流。

  在设置这些标志时、修补 ti、j721e-csi2rx、可能的 ti_csi2rx_start_dma 以发出两个小型交错式 DMA(类似于 M2M-deinterlace)(更新 TI 的驱动程序以支持这两个特定的现场顺序)

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

    尊敬的 Evan:

    [引述 userid=“367881" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1522951/processor-sdk-j722s-deinterlace-isl7998x-video-stream

    设置 M2M-deinterlace 设备以解码视频流。

    [/报价]

    看看  M2M-deinterlace、它需要 dmaengine 设置 DMA_INTERLEAVE CAP。 bcdma 和 pktdma 驱动程序没有设置 DMA_INTERLEAVE CAP、因此 M2M-DEINTERLACE 将不起作用。

    Patch  ti、j721e-csi2rx、可能  ti_csi2rx_start_dma 在设置这些标志时发出两个小型交错式 DMA(类似于 M2M-deinterlace)(更新 TI 的驱动程序以支持这两个特定的现场订单)

    我不确定 bcdma 引擎是否支持交错、但我会询问我们的 DMA 专家。

    此致、
    Jared

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

    尊敬的 Evan:

    BCDMA 引擎不支持交错。 您可能必须为奇数行和偶数行启动两次 2D 传输。

    这是可能的、但需要付出努力。

    此致、
    Jared

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

    谢谢 Jared! 我将尝试配置它。

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

    听起来不错、如果您有任何问题、请告诉我。

    此致、
    Jared

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

    您好 Jared、

    我将开始直接复制存储器而不发出 DMA、但同时、我想指出、M2M-deinterlace 看起来类似于您所展示的第二个 2D mem to mem 传输。 但是、这些是交错副本。 但是由于我们不能执行交错 DMA、也许我们需要为每条线发出一个连续的 DMA、那么每一帧需要 480 而不是 2 个?

    M2M-deinterlace 将此调用两次、就像您在上面所示:


    但是、deinterlace_issue_dma 会发出我们不支持的交错 DMA。


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

    尊敬的 Evan:

    BCDMA 引擎确实支持 2D DMA 传输。 交错 DMA 是指如下内容:

    BCDMA 引擎不支持此功能。

    此致、
    Jared

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

    您好 Jared、

    感谢您指出这一差异。
    您知道我需要设置哪些函数或标志来发出 2D MEM 到 MEM 传输吗?
     例如、我期望有类似 dmaengine_prep_slave_single 的操作系统。

    顺便说一句,我能够 kalloc 和 memcpy 到 vbuf 的 dma 完成,发现我可以使图像显示正确. 但是、它在中断上下文中咀嚼了 30%的 CPU 周期、因此显然只是一个测试。

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

    尊敬的 Evan:

    您知道我需要设置哪些函数或标志来发出 2D MEM 到 MEM 传输吗?
    [/报价]

    我需要更深入地查看、但可能是 k3-UDMA-common.c 驱动程序中的 UDMA_PREP_SLAVE_SG_tr。

    此致、
    Jared

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

    您好 Jared、

    我在 PXA_camera.c 中找到了一个使用 dmaengine_prep_slave_sg 的示例。
    我看到它创建了一个散点集合列表、它由使用 SG_split 的通道/平面的裸体化器分割。

    也许这种模式会起作用?

    我发现 dmaENGINE_PREP_SLAVE_SG 指向 UDMA_PREP_SLAVE_SG。   

    运行一个简单的测试(不转换数据)
    我无法使用 SG 方法复制数据。 它完全是绿色的。 下面的平面 0 可能不正确?

    结构 SG_table *Sgt = VB2_DMA_SG_PLANE_DESC (VB、0);
    DESC = dmaengine_prep_slave_sg (ctx->dma.chanSgt->sgl、Sgt->nents、dma_dev_to_MEM、dma_prep_interrupt  | dma_CTRL_ACK);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Evan:

     j721e-csi2rx.c 驱动程序使用 dmaengine_prep_slave_single、后者又调用 dmaengine_prep_slave_sg。

    dmaengine_prep_slave_sg 使用平面 1、因此我假设您需要使用平面 1。

    此致、
    Jared

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

    您好 Jared、

    使用索引 1 会导致 CPU 异常(可能是因为我们使用的是索引 0、平面 1、所以 (VB、0) 是正确的。

    可能需要手动填充散点集表/列表。
    使用平面 0 时、它从  VB2_DMA_SG_PLANE_DESC 空返回。 Nents 为 0

    我 还注意到、我们正在使用 contig_memops(而非 sg_memops)设置队列

      q->mem_ops =&VB2_dma_contig_memops;

     而使用 SG 的驱动器则设置为 sg_memops

      vq->mem_ops =&vb2_dma_sg_memops;

    我使用 VB2_DMA_SG_Memops 重新编译、现在可以进行一个简单的复制。  Sgt->nents=4.

    我制作了 480 行 Sgt、每行映射一个 DMA ... 它几乎可以正常工作。 它不会复制所有数据、其他帧都是绿色的。

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

    尊敬的 Evan:

    您可以发送编辑后的源代码吗?

    此致、
    Jared

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

    您好 Jared、

    是的、明天我会发送。  
    但是我看到了我的问题。 我正在重新映射 VB2 的 sgl、它将返回多个块。

    这是原来的。 注意尺寸:
    转储具有 4 个条目的 SG_TABLE
    SG[0] DMA=0x88e600000 len = 524288 offset = 0
    SG[1] DMA=0x88c420000 len = 131072 offset = 0
    SG[2] DMA=0x8874a0000 len = 32768 offset = 0
    SG[3] DMA=0x88c76c000 len=4096 偏移=0

    这是新的一个。 我过去的地址  0x88e600000 + 524288 损坏了存储器并丢失了信息。
    转储具有 480 个条目的 SG_TABLE
    SG[0] DMA=0x88e600000 len = 1440 offset = 0
    SG[1] DMA=0x88e654600 len = 1440 offset = 0
    ...
    SG[478] DMA=0x88e654060 len = 1440 offset = 0
    SG[479] DMA= 0x88e6a8660 len=1440 offset=0(大于 0x88e680000)

    4 个 sgl 条目可能是因为没有它们就无法有效地分配内存。
    因为这些块不能被 1440 整除,也许我可以使它过度分配,这样这个逻辑才有效。 也许我可以设置分配标志?

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

    尊敬的 Evan:

    1440 从何而来?

    此致、
    Jared

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

    您好 Jared、

    1440 是图像宽度 (720) 乘以每像素字节数 (2)。

    请找到附件。
    它针对几个帧正确显示图像、然后存储器损坏并导致各种 CPU 异常。

    e2e.ti.com/.../j721e_2D00_csi2rx_5F00_deinterlace.c

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

    如果您对其中的差异最感兴趣、请查看下面的补丁文件。
    e2e.ti.com/.../j721e_2D00_csi2rx_5F00_deinterlace.txt

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

    我现在一直在正确地绘制图像。
    通过测试、我可以看出大约有 3 个缓冲区充满了数据。
    我已经使它最多运行 30 秒、然后再达到例外情况。

    有时我会看到:
    GET_SWAP_DEVICE:错误的交换文件条目 5000200008000005

    有时:
    无法处理虚拟地址 0000000000000018 处的内核 NULL 指针解除引用

    通常:
    无法处理虚拟地址 00000009f1200668 处的内核分页请求

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

    尊敬的 Evan:

     VB2_dma_contig_planee_dma_addr 是否应替换为 VB2_dma_sg_planee_desc ?

    此致、
    Jared

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

    您好 Jared、

    您可能是对的。

    这就是我最初尝试的方法、但为了让 VB2_DMA_SG_PLANE_DESC  返回数据、我需要  在 ti_csi2rx_init_vb2q 中使用 VB2_DMA_SG_Memops。 这会导致为 VB2 缓冲区分配散点收集表、但它不在单个页面中。 当我使用 VB2_DMA_contig_memops(就像今天一样)时、它会将数据更可靠地复制到缓冲区中。 也许它更可靠、因为它通常是连续的、但并不总是这样、所以这就是腐败/异常的来源。 我无法使 对 VB2_DMA_SG_PLANE_DESC 的响应中列出的 DMA 地址可靠地工作。

    我的下一个想法是使用 VB2_PLANE_vaddr (VB、0)、然后使用 sg_set_buf 和 dma_map_sg 重新编译 Sgt 。

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

    尊敬的 Evan:

    我明白了、这是合理的。 考虑到通常的页面大小为 4096 字节、我不希望所有信道都能放在单个页面上。

    此致、
    Jared

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

    您好 Jared、

    我找到了我的主要问题。 我在 sgl 上使用普通的 for 循环、但 SG_MAX_SINGLE_ALLOC (256) 会创建一个 sgl 链。

    我使用  for_each_sg、现在它在停止流之前是稳定的。

    我将关闭此 TT、因为隔行功能现在正在运行。
    我将在另一张票中打开一些稳定性问题。