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.

[参考译文] TDA4VM:使用 V4L2接口时出现问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1408602/tda4vm-there-is-a-problem-using-v4l2-interface

器件型号:TDA4VM
主题中讨论的其他器件: TDA4VH

工具与软件:

您好、

对 ioctl (context_. fd、VIDIOC_QBUF、&buf)的调用成功、 ioctl (context_. fd、VIDIOC_DQBUF、&buf)无法检索数据。

可以检查编码器寄存器的哪个值、以查看编码器此时是否正常工作

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

    您好!  

    TDA4VM IMG-CODEC 驱动程序使用 Gstreamer 暴露与 V4L2交互以进行处理的控件。 GStreamer 在用户空间中用于跟踪缓冲区。 可以通过添加 gst_debug=4或类似于跟踪流水线如何处理帧的内容来打印有关这些缓冲区的信息。 更多有关这方面的信息、请参阅 GStreamer 文档、网址为: https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html?gi-language=c

    BR、
    Sarabesh S.

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

    由于 GStreamer 的 CPU 使用量太高、因此我们没有使用 GStreamer 对图像进行编码。 是否有任何其他方法可以解决此问题?

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

    你好  

    模块 H264Encoder.VXE384MP2是 Cortex-A72内部的还是外部的?  

    如果作为   Cortex-A72的外部器件、我该如何查看它的状态。

    对于上面提到的问题、我们分析这可能是由于 buf 队列的异常状态或者 H264Encoder.VXE384MP2模块的问题。

    我们如何确定究竟是谁的问题?

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

    您好!  

    [报价用户 id="517502" url="~/support/processors-group/processors/f/processors-forum/1408602/tda4vm-there-is-a-problem-using-v4l2-interface/5396440 #5396440"]

    模块 H264Encoder.VXE384MP2是 Cortex-A72内部的还是外部的?  

    [报价]

    TDA4VM IMG 编解码器内核不是 A72的一部分。 它是 IMG 自己的 IP。 不过、A72确实通过 GStreamer 和 V4L2驱动程序框架与编解码器进行交互。 您应该能够检查编码器缓冲器的状态、并通过在上述命令行流水线中添加调试标志来识别编码过程是否成功。

    我知道您需要读取编码器的寄存器信息...您能否分享说明您在中看到该寄存器信息的文档? 这是 TRM 还是数据表、我好像找不到这些信息了。

    BR、
    Sarabesh S.

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

    e2e.ti.com/.../J721E_5F00_registers2.pdf

    您好、 

    附件为寄存器手册。 具体章节:7个编码器寄存器。

    哪些寄存器指示 buf 和编码器的工作状态?

     VIDIOC_QUERYBUF 命令是否用于查询 buf 的状态?

    如果出现上述问题、我应该怎么做才能恢复编码器的运行?

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

    您好!  

    您在使用什么 SDK?

    这些位字段中的每一个都用于指定编码器中的不同故障类型。 如果您读取0x0420_0004处的寄存器、该寄存器中的哪些位被标记? 基于此、您可以进一步调查根本问题(即 MMU 故障、内核故障等)  

    此外、您是否在编写自己的驱动程序以使用编码器? 您能否提供您为什么不在 SDK 中使用 Linux 编解码器驱动程序的相关背景?

    此致!
    Sarabesh S.

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

    您好、 

    SDK 版本为8.6。

    由于此错误极难重现、是否有任何综合方法来确定此错误是由编码器模块卡住导致的? 什么原因会导致编码器卡住? 如何恢复呢?

    VXe384:视频编码器@4200000 {
    compatible ="img、vxe384";
    REG =<0x00 0x04200000 >、
    <0x00 0x100000>;
    电源域=<&K3_PDS 153 TI_SCI_PD_Exclusive>;
    中断= ;
    };

    我们使用这种编码器模型、、而不使用 dirver。

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

    您好!

    是否有任何综合方法可以确定这是否是编码器模块卡住导致的? 什么原因可能导致编码器卡住?

    我将查看一下、看看我是否能提出任何问题。 您是否在定制电路板上或您是否正在使用 EVM? 感谢您的耐心。  

    BR、

    Sarabesh S.

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

    您好!

    存在硬件问题。

    BR、

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

    您好!  

    您在 Linux 或 Vision Apps (Linux+RTOS)上使用哪些 HLOS? 您是否能够在 EVM 上重现此错误?

    在 TDA4VH 定制电路板的 Linux+RTOS SDK 上的不同情况(不同的编解码器 IP 和驱动程序)下、编解码器会在启动时产生超时错误。 这是通过将 MCU2_0 Board_init (boardCfg)执行延迟300ms 来解决的。 不确定这是否可以 解决您的编解码器问题、但可能值得尝试一下。

    BR、
    Sarabesh S.

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

    您好、 

    我们使用  Vision Apps (Linux+RTOS)。

    您提供的解决方案无法解决当前问题。 我们目前遇到的问题是、经过很长时间的工作、ioctl (context_.fd、VIDIOC_QBUF,&buf)成功、但 ioctl (context_.fd、 VIDIOC_DQBUF、&buf)始终返回 EAGAIN 错误。

    BR、

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

    您好!

    您是否能够在 EVM 上重现此错误?

    我很难理解你的问题,而不能复制。 您是否能够在 EVM 上重现此问题? 在您看到错误之前、"长时间"运行了哪种类型的进程?

    BR、
    Sarabesh S.

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

    您好、 Sarabesh  

    我们不会在 EVM 板上重现这个错误、这不仅是因为这个错误重现是极其困难的、而且也是因为将代码移植到 EVM 上需要大量的时间。

    现在提供了更多日志。 出现问题时、会读取缓冲区(buf)的状态。 日志如下:。  

    Fullscreen
    1
    2
    3
    4
    2024/09/12 21:07:12.760235 ECU1 EDR 539 Vide main error [EDR 819 v4l2 Driver: 0x0000ffff3bffe498 Card: 0x0000ffff3bffe4a8 Bus info: 0x0000ffff3bffe4c8 Capabilities: 2216706048 flag = 0 index = 0 ]
    2024/09/12 21:07:12.760261 ECU1 EDR 539 Vide main error [EDR 819 v4l2 Queue index : 0 Buffer index : 0 Status: Queued Length: 1 Offset: 1006626048 Flags: 16386 bytesused 0 ]
    2024/09/12 21:07:12.760275 ECU1 EDR 539 Vide main error [EDR 819 v4l2 Driver: 0x0000ffff3bffe498 Card: 0x0000ffff3bffe4a8 Bus info: 0x0000ffff3bffe4c8 Capabilities: 2216706048 flag = 0 index = 1 ]
    2024/09/12 21:07:12.760283 ECU1 EDR 539 Vide main error [EDR 819 v4l2 Queue index : 0 Buffer index : 1 Status: Queued Length: 1 Offset: 1006626048 Flags: 16386 bytesused 0 ]
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    相关代码如下:

    如果(ioctl (context_.fd、VIDIOC_DQBUF、&buf)< 0)

    if (EAGAIN == errno)

    waitTimes ++;
    用户睡眠(10000);
    Log_。 LogDebug()<<"output VIDIOC_DQBUF failed nv12 wait waitTimes ="<< waitTimes <<" errno ="<< errno <<"strErrno ="<< strerrerror (errno);
    if (waitTimes > 20)

    Log_。 LogError()<<"output VIDIOC_DQBUF failed nv12 wait waitTimes ="<< waitTimes <<" errno ="<< errno << strErrno ="<< strErrno ="<< strerrerror (errno);
    V4L2Test();
    休息;
    }
    }
    设计

    gLogEncoderErrCount ++;
    Log_。 LogError()<<"OUTPUT VIDIOC_DQBUF FAILED nv12 gLogEncoderErrCount ="<< gLogEncoderErrCount
    <<" errno ="<< errno <<" strErrno ="<< strerror (errno);
    休息;
    }
    }

    空 VideoOutputV4l2Encode::V4L2Test()

    uint32_t i = 0;

    对于(I = 0;I < MAX_OUTBUFS;I++)

    V4L2TestLog (0、i);
    }
    对于(I = 0;I < MAX_CAPBUFS;I++)

    V4L2TestLog (1、i);
    }
    }


    void VideoOutputV4l2Encode::V4L2TestLog (uint32_t flag、uint32_t index)

    //出现问题时候可以按照如下方式排查:
    使用/:VIDIOC_QUERYCAP
    struct v4l2_capacity cap ={0};
    memset (∩、0、sizeof (cap));

    if (ioctl (context_.fd、VIDIOC_QUERYCAP、∩)==-1){
    Log_。 LogError()<<"v4l2 VIDIOC_QUERYCAP"
    <<" flag ="<< flag <<" index ="<< index;
    //如果这里失败、可能是驱动程序问题或设备不可用
    其他{

    Log_。 LogError()<<"v4l2 Driver:"<< cap.driver
    <<"卡:"<< cap.card
    <<"总线信息:"<< CAP.BUS_INFO
    <<"能力:"<< cap.capabilities
    <<" flag ="<< flag <<" index ="<< index;

    //如果驱动还可用
    //使用 VIDIOC_QUERYBUF:
    struct v4l2_buffer buf;
    struct v4l2_plane buf_planes[MAX_planes];

    memset (&buf、0、sizeof (buf));

    buf.index =索引;
    buf.m.planes = buf_planes;
    buf.length = 1;
    buf.memory = V4L2_MEMORY_MMAP;//或 V4L2_MEMORY_DMABUF、取决于你的设置

    if (flag == 0)

    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
    #ifdef Using_V4L2_DMABUF
    buf.memory = V4L2_MEMORY_DMABUF;//或 V4L2_MEMORY_DMABUF、取决于你的设置
    #endif
    }
    设计

    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
    }

    if (ioctl (context_.fd、VIDIOC_QUERYBUF、&buf)==-1){
    Log_。 LogError()<<"v4l2 VIDIOC_QUERYBUF"
    <<"查询缓冲区索引失败="<<索引;
    其他{
    std::string strBufFlag ="none";

    //检查缓冲区状态
    如果(buf.flags 和 V4L2_BUF_FLAG_MAPPED)
    strBufFlag ="状态:已映射";
    if (buf.flags 和 V4L2_BUF_FLAG_QUEUED)
    strBufFlag ="状态:已排队";
    if (buf.flags 和 V4L2_BUF_FLAG_DONE)
    strBufFlag ="状态:完成";
    如果(buf.flags 和 V4L2_BUF_FLAG_ERROR)
    strBufFlag ="状态:错误";
    //如果 buf.bytesused 为0、通常表示缓冲区中没有数据。
    //如果 buf.flags 包含 V4L2_BUF_FLAG_QUEUed、表示缓冲区已经入队、等待被填充。
    //如果 buf.flags 包含 V4L2_BUF_FLAG_DONE、表示缓冲区已经被填充、准备好被处理。
    //如果 buf.flags 包含 v4L2_BUF_FLAG_ERROR、表示在处理这个缓冲区时发生了错误。

    Log_。 LogError()<<"v4l2"
    <<"队列索引:"<<标志
    <<" Buffer index:"<< index
    << strBufFlag
    <<"长度:"<< buf.length
    <<"偏移量:"<< buf.m.offset
    <<" Flags:"<< buf.flags
    <<" bytesused "<< buf.bytesused

    }
    }
    }

    那么、如何找出问题的原因呢?
    我推测可能有两个原因:
    1编码器的数据输入有问题,导致编码器卡住;
    编码器本身有错误、导致它卡住。  
    如何定位?
    BR、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    我将在8.6上使用编码器进行一些测试以进行确认。 您能否向我提供您正在测试的流用例(即分辨率、压缩格式、fps 等)。

    谢谢!
    Sarabesh S.

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

    您好、 Sarabesh

    编码器的输入是分频器模块的输出。

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

    谢谢刘先生、我将在第二天或第二天进行测试。 本周我几天不在办公室、因此请预计会有延迟。

    如何在不使用 Gstreamer 的情况下测试 dma-buf 的缓冲区共享是否正确完成?

    BR、
    Sarabesh S.

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

    您好、Sarabesh

    发生此问题时、我们读取寄存器 0x0420_0004、值为0x00000041

    根据 TRM、它是指  

    Δ V_INT_STAT_MMU_FAULT:4位、指示页面故障[事件产生的脉冲、由边沿检测逻辑保持]①CR。  此位是指由 TopazHP 内核或引起的故障
    DMAC。  底部4个请求者

    0:②CR INT_STAT_DMAC:1:DMAC 当前正在发出 IRQ

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

    您好!  

    我只能在我们自己的 EVM 上确认编码。 我将在下周早些时候为您提供这些结果。

    BR、
    Sarabesh S.  

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

    你好  

    附加值是发生故障时编码器的所有寄存器的值。

    BR、

    liue2e.ti.com/.../Encoder_5F00_register.txt

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

    谢谢、我会在内部讨论、看看我们是否可以提供进一步的支持。

    BR、
    Sarabesh S.

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

    Sarabesh、我们似乎需要通过 IMG 来解决这些错误位(例如 DMAC 缺少 IRQ 和页面故障)、并请求潜在的根导致或软件权变措施以继续。 客户正在上报此问题并等待修复交付件、并向 CAR OEM 说明、请优先考虑此问题。 非常感谢。   

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

    您好!  

    在内部讨论之后、我们需要一种方法在 EVM 上重现此问题。 在崩溃时提供所有寄存器的值不足以让我们调试根本原因。 否则、无论我们建议的是什么、我们都将无法测试。 我仍然不清楚如何在客户的定制电路板中实现编解码器驱动程序。 如果客户能够使用我们的 SDK 编解码器驱动程序在我们的 EVM 上模拟问题、那么我们可以在此处提供有效的支持。

    谢谢!
    Sarabesh S.

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

    在与客户团队进行沟通后、在真实的汽车路试中报告了此问题、概率极低、CPU 和 SoC 系统负载极高。 我没有办法通过简单的测试在 EVM 上产生相同的问题、因此理解 IMG 编码器的调用轨迹听起来非常重要、这样有助于指导我们的系统级调查或优化。 请提出相应建议。  

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

    您好、 

    我想知道当编码器出现问题时是否有方法可以复位编码器模块。

    BR、

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

    刘  

    您可以使用 modprobe -r vxe_enc、但它看起来与其他模块有许多依赖关系、您也必须删除并重新插入这些模块。 我还查看了/sys/bus/platform/drivers/img_enc 中的编码器的解除绑定情况、但在不重新启动设备的情况下无法重新绑定。 没有支持的方法可以通过使用驱动程序中的 v4l2控件来重新启动驱动程序、因为我们使用 gstreamer、这是通过发送中断(Ctrl+c)和重新启动流水线来完成的。

    谢谢!
    Sarabesh S.