主题中讨论的其他器件: TDA4VH
工具与软件:
您好、
对 ioctl (context_. fd、VIDIOC_QBUF、&buf)的调用成功、 ioctl (context_. fd、VIDIOC_DQBUF、&buf)无法检索数据。
可以检查编码器寄存器的哪个值、以查看编码器此时是否正常工作

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 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.
您好!
[报价用户 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
您好、 Sarabesh
附件为寄存器手册。 具体章节:7个编码器寄存器。
哪些寄存器指示 buf 和编码器的工作状态?
VIDIOC_QUERYBUF 命令是否用于查询 buf 的状态?
如果出现上述问题、我应该怎么做才能恢复编码器的运行?
您好!
您在使用什么 SDK?
这些位字段中的每一个都用于指定编码器中的不同故障类型。 如果您读取0x0420_0004处的寄存器、该寄存器中的哪些位被标记? 基于此、您可以进一步调查根本问题(即 MMU 故障、内核故障等)
此外、您是否在编写自己的驱动程序以使用编码器? 您能否提供您为什么不在 SDK 中使用 Linux 编解码器驱动程序的相关背景?
此致!
Sarabesh S.
您好、 Sarabesh
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.
您好!
您在 Linux 或 Vision Apps (Linux+RTOS)上使用哪些 HLOS? 您是否能够在 EVM 上重现此错误?
在 TDA4VH 定制电路板的 Linux+RTOS SDK 上的不同情况(不同的编解码器 IP 和驱动程序)下、编解码器会在启动时产生超时错误。 这是通过将 MCU2_0 Board_init (boardCfg)执行延迟300ms 来解决的。 不确定这是否可以 解决您的编解码器问题、但可能值得尝试一下。
BR、
Sarabesh S.
您好!
您是否能够在 EVM 上重现此错误?
我很难理解你的问题,而不能复制。 您是否能够在 EVM 上重现此问题? 在您看到错误之前、"长时间"运行了哪种类型的进程?
BR、
Sarabesh S.
您好、 Sarabesh
我们不会在 EVM 板上重现这个错误、这不仅是因为这个错误重现是极其困难的、而且也是因为将代码移植到 EVM 上需要大量的时间。
现在提供了更多日志。 出现问题时、会读取缓冲区(buf)的状态。 日志如下:。
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 ]相关代码如下:
如果(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
;
}
}
}
您好、Sarabesh
发生此问题时、我们读取寄存器 0x0420_0004、值为0x00000041
根据 TRM、它是指
Δ V_INT_STAT_MMU_FAULT:4位、指示页面故障[事件产生的脉冲、由边沿检测逻辑保持]①CR。 此位是指由 TopazHP 内核或引起的故障
DMAC。 底部4个请求者
0:②CR INT_STAT_DMAC:1:DMAC 当前正在发出 IRQ


您好!
在内部讨论之后、我们需要一种方法在 EVM 上重现此问题。 在崩溃时提供所有寄存器的值不足以让我们调试根本原因。 否则、无论我们建议的是什么、我们都将无法测试。 我仍然不清楚如何在客户的定制电路板中实现编解码器驱动程序。 如果客户能够使用我们的 SDK 编解码器驱动程序在我们的 EVM 上模拟问题、那么我们可以在此处提供有效的支持。
谢谢!
Sarabesh S.
刘
您可以使用 modprobe -r vxe_enc、但它看起来与其他模块有许多依赖关系、您也必须删除并重新插入这些模块。 我还查看了/sys/bus/platform/drivers/img_enc 中的编码器的解除绑定情况、但在不重新启动设备的情况下无法重新绑定。 没有支持的方法可以通过使用驱动程序中的 v4l2控件来重新启动驱动程序、因为我们使用 gstreamer、这是通过发送中断(Ctrl+c)和重新启动流水线来完成的。
谢谢!
Sarabesh S.