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.

[参考译文] DRA744:连接 DSS DISP 覆盖层、VIP 和 VPE

Guru**** 2553520 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/782401/dra744-connecting-dss-disp-overlay-vip-and-vpe

器件型号:DRA744

你(们)好。

我有4个模拟摄像机、它们通过 TW2964视频解码器芯片连接到 DRA74 J6处理器的 VIP 3A 端口。 我的目标是使用 VIP (视频输入端口)来捕获图像帧、使用 VPE (视频处理引擎)来去除图像帧的间隙、最后使用 DSS 中的叠加子系统(显示子系统)将隔行图像帧放置在屏幕上的特定位置。 这里有两个非常关键的关键因素:1 -避免使用 CPU (A15内核)。 2-避免使用 X11或 Wayland 根本不使用 CPU (A15内核)。 简而言之、我希望管道包含 VIP -> VPE -> DSS。 为了实现这种方案、我已开始深入研究这些子系统的 Linux 内核器件驱动程序。 根据我的理解、这些器件驱动程序是根据 V4L2编写的、可以通过用户空间应用程序访问以设置每个单独的子系统。  

A -作为起点、我尝试从 DSS 的 DISPC 模块中的覆盖模块开始。 在 DSS 器件驱动程序中进行一些调整后、我能够通过在以下步骤中实现新的可加载内核模块(LKM)来创建覆盖:
1-只需使用  我新开发的 LKM 中的 kmalloc、dma_map_single、dma_sync_single_for_CPU 创建 DMA 缓冲区。
2 -创建"struct OMAP-overlay_info"(在 drivers/GPU/DRM/omapdrm/dss/omapdss.h 中定义)的实例、并在其中设置所需的覆盖特性。
3-创建一个"struct videomode"的实例(在 drivers/GPU/DRM/omapdrm/dss/omapdss.h 中定义)并设置我们针对 LCD 所需的特定时序。
4 -通过 传递项目2和3的实例来调用 dispc_ovl_setup (在 drivers/GPU/DRM/omapdrm/dss/dispc.c 中定义)。
5 -调用 dispc_ovl_enable (在 drivers/GPU/DRM/omapdrm/dss/dispc.c 中定义)。
6 -创建"struct_omap_overlay_manager_info"(在 drivers/GPU/DRM/omapdrm/dss/omapdss.h 中定义)的实例、并在其中设置所需的特性。
7-通过 传递项目6的实例来调用 dispc_mgr_setup (在 drivers/gpc/drm/omapdrm/dss/dispc.c 中定义)。
8 -调用 dispc_mgr_go (在 drivers/GPU/DRM/omapdrm/dss/dispc.c 中定义)。
9-调用 dispc_runtime _put (在 drivers/GPU/DRM/omapdrm/dss/dispc.c 中定义)。
这有助于我在屏幕上的特定位置成功地将预定义图形显示为矩形。
B -第二步、我开始开发一个简单的用户空间应用程序、以便通过 V4L2 ioctl 接口与 VIP 设备驱动程序交互。 我的应用程序只需在 drivers/media/platform/ti-vpe/vp.c 中调用这些函数系列、即可从摄像机捕获视频帧:vp_open、 vp_init_stream、 vp_init_port、 vp_enable_parser、 vp_calc_format_size、  vIP_querycap、 vIP_enuminput、 vIP_g_std、 vIP_g_input、 vIP_enum_fmt_vid_cap、  vIP_g_selection、 vIP_enum_framesizes、 vIP_enum_frameintervals、 vIP_s_fmt_vid_cap、 vIP_try_fmt_vid_cap、  vIP_calc_format_size、 vIP_g_parm、 vIP_s_parm、 vIP_queue_setup、 vIP_Buf_prepare、  vp_start_streaming、 vp_setup_scaler、 set_fmt_params、 vp_set_slice_path、vp_setup_parser、  vIP_set_crod_parser、 vIP_load_vpdma_list_fifo、 start_dma、 vIP_schedule_next 缓冲区、 vIP_enable_parser、  vIP_process_buffer_complete、 vIP_schedule_next 缓冲区....
基本上、VIP 器件驱动程序通过调用 vpdma_create 函数来创建 VPDAM 实例、然后设置实现 V4L2接口所需的所有步骤。 创建缓冲区后、它通过调用"vIP_start_streaming"来启动 VPDMA。 然后、它以这种方式工作: 在每个帧捕获结束时、调用 VIP_IRQ、并且在 ISR 内部设置下一个捕获。 这样、我可以看到 VIP 持续工作、CPU 负载小于%0.3。
C -第三步、我想让 VPE 发挥作用、并将 VIP VPDMA 地址的输出连接到它。 VPE 器件驱动程序也基于 V4L2、我可以通过用户空间应用与它进行交互。 但是、我不知道使其运行的命令系列的正确顺序。 正如我看到的、VPE 也在创建 VPDMA。 但是、由于它用作存储器到存储器、我确实需要知道如何设置其输入和输出 VPDMA 以连接到 VIP 和 DSS。
总结我的问题:
1-请向我提供 V4L2系列命令的列表,我应该运行这些命令以使 VPE 与 VIP 同步运行。 如何同步 VIP 和 VPE 的 ISR?
2-请告诉我如何将 VIP VPDMA 的指针地址分配给 VPE 中 VPDMA 的输入指针地址以及 VPDMA 到 DSS 的输出指针地址。 简单来说、我只需将 VIP 和 VPE 驱动程序中的地址设为全局地址、然后在 LKM 中将它们分配在一起即可。 这是正确的策略吗? 但是、由于 VPDMA 地址分配给了 V4L2缓冲器、这有点令人困惑、我需要您提供非常全面的提示来做正确的工作。
3 - VIP 需要至少三个 V4L2缓冲器来运行"START_DMA"函数。 问题是、这是否意味着它在一对一的对应中为每个 V4L2创建三个 VPDMA 缓冲器? 如果是、我是否需要在某个位置设置调度程序以交换这些缓冲区、或者 VIP 驱动程序自动执行此操作? 我不确定、但我想 V4L2 ioctl 接口(VIDIOC_DQBUF 和 VIDIOC_QBUF)应该这么做、但为了同步 VPE 和 VIP、我必须清楚地了解其下面的机制。 我是否还需要在 VPE 中恰好有三个缓冲器、或者 VPE 只需要连接到循环多路复用器中的其中一个缓冲器?
谢谢、此致、
Armin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在 Processor SDK Linux Automotive 中、我们已经有了可实现此目的的应用程序。

    请注意、您的用例非常典型、不应进行任何内核更改。 一个简单的用户空间应用程序将执行此任务。

    使用 captuprepedisplay 应用程序使用 DRM 执行捕获+去隔行+显示

    此致、

    Nikhil D

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

    您好、Nikhil、

    谢谢。 我安装了"ti-processor-sdk-linux-Automotive ra7xx-EVM-5.00.00.01-installer.bin"、但 无法在其中找到 captuprepedisplay 应用程序源代码。 从哪里可以获得  captuprepedisplay 应用程序的完整源代码及其所有依赖项?

    此致、

    Armin

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

    您可以在此处找到 capturevpedisplay 的来源:
    git.ti.com/.../omapdrmtest

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

    您好!

    正如 Yordan 指出的、您可以从 git.ti.com/.../omapdrmtest 获取源代码

    唯一的依赖关系是 libdrm、因为它使用 DRM API 进行显示。

    此致、

    Nikhil D