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.

[参考译文] AM4378:在屏幕上显示图像

Guru**** 2589265 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581238/am4378-displaying-images-on-screen

器件型号:AM4378

尊敬的香榭丽舍

我将使用 AM437x GP EVM、该 EVM 连接了 HDMI 监视器并使用 Linux PSDK。

我想编写一个用户空间应用程序、并能够将存储在 DDR 中的原始视频帧(零拷贝)发送到显示屏。 我不熟悉从 Linux 中使用显示屏、因此希望我能在这里获得一些帮助。

我有几个问题:

  1. 我应该使用 libdrm 还是应该使用其他方法?
  2. 是否有任何简单的示例说明如何执行此操作?
  3. 我能否对帧执行零拷贝、基本上为驱动程序提供一个指向我的帧的指针?
  4. 如何将其与显示帧边界同步?

基本上、我在 DDR 中有大量图像、我想在显示帧速率时逐个显示这些图像、而无需执行帧复制。

谢谢

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

    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Brad Caldwell "]我应该使用 libdrm 还是应该使用其他一些方法?

    是的

    [引用 user="Brad Caldwell "]是否有任何有关如何执行此操作的简单示例?

    您可以参考双摄像头演示应用。 它作为源代码打包在 PLSDK 中的示例应用下。  查看 loopback.c 文件,该文件内部引用了 alloc_buffer()、 DRM_init_device()、 DRM_init_dss ()和 process_frame()函数。  

    [引用 user="Brad Caldwell "]我是否可以对帧进行零拷贝,基本上为驱动程序提供指向我的帧的指针?

    DDR 中的视频帧如何? 您需要显示多少帧。  除非帧位于某个支持 dmabuf 的驱动程序的视频缓冲区的一部分、否则无法执行零复制。 如果另一个驱动程序支持 DSS 驱动程序可以从中导入缓冲区的 dmabuf 导出、则 DSS 驱动程序可以接受来自其他驱动程序的缓冲区(零复制)。 在此 git repo 中、在 loopback .c 文件内的 use_cmem_BUF 宏下查找代码- git.ti.com/.../master

     [引用 user="Brad Caldwell "]如何将其与显示帧边界同步?

    Page_flip_handler()回调模块和宽度、高度等的帧缓冲区设置应该负责同步。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您提供的信息、非常有用。 我将看一下双摄像头演示。

    关于 DDR 中的帧、我们想要解码一个短视频片段并将每个解码的帧存储到 DDR 中。 然后、我们要以循环的方式回放该序列的图像到显示屏上。 我们需要以零复制的方式执行此操作、否则我们最终只使用80%的 CPU 来执行内存复制。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    检查 viddec3test 示例应用。 它与显示驱动程序共享视频缓冲区。 如果您能够分配解码视频中的缓冲区数量、则解码完成后可以进行零复制显示。 解码器缓冲器来自平铺存储器、其大小限制为128 MB、并且由于平铺缓冲器结构、您可能无法获得128 MB 的完整存储器。

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

    如果要将图像的 memcpy 执行到显示缓冲区、则 memcpy 将非常慢、因为 omapdrm 的缓冲区没有启用读取缓存、因此它是非缓存读取。 为了处理此问题、您可以从 cmem 驱动程序中分配内存、该驱动程序在其分配的缓冲区上支持高速缓存功能。 目前、cmem 驱动程序未与 AM437x PLSDK 一起打包、但它附带在 AM57x PLSDK 中。 我们计划在2017年第2季度将 CMEM 驱动程序包含在 AM437x PLSDK 中。  

    您可以 在完成以下步骤后将 CMEM 驱动器集成到 AM437x PLSDK 中-

    • 安装 Proc SDK 437x 安装程序。 (注:需要使用 setup.sh 来设置文件系统)
    • 从 PROC SDK 57xx 安装程序复制 CMEM 代码:
    • 复制整个目录 board-support/ex-drivers/cmem-mod-*
    • 将附加的 CMEM 段内容(从 cmem_top_level_make.txt)添加到主顶层"Makefile" e2e.ti.com/.../cmem_5F00_top_5F00_level_5F00_make.txt
    • 从顶级 makefile 构建 cmem-mod、cmem
    • 制作 cmem-mod
    • 制作 cmem
    • 使用 cmem-mod_install 和 cmem_install 将所需的 CMEM 模块和 CMEM 库安装到文件系统中。

    完成上述步骤后、您可以从下面的 git repo 查看双摄像头演示示示源代码中的 loopback .c 文件。 查看#ifdef USE_CMEM_BUF 宏、以使用 CMEM 进行显示缓冲区分配。

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

    我使用了上述步骤并在 AM437x SDK 中添加了对 CMEM 模块的支持、但在引用 loopback .c 文件时、我发现对于 CMEM 缓冲区分配、它引用了"cmem_buf.h"、而 CMEM 模块本身未包含该文件。 从哪里可以获得该头文件?

    此外、AM57xx SDK 中提供的双摄像头示例在其下完全包含不同的 loopback.c 文件。 我是否支持参考该文件以在 AM437x SDK 中添加 CMEM 支持?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请参阅此处的双摄像头演示源代码-
    git.ti.com/.../master

    cmem_buf.h 是双摄像头演示示示示示例应用源文件的一部分、也可以在相同的 git repo 中找到。