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.

[参考译文] Linux/AM5718:具有 VIDIOC_QBUF 命令的队列缓冲器失败:无效参数

Guru**** 2595805 points
Other Parts Discussed in Thread: AM5718

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/587442/linux-am5718-queue-buffer-with-vidioc_qbuf-command-fail-invalid-argument

器件型号:AM5718

工具/软件:Linux

尊敬的 TI 专家:

我的硬件板是 AM5718 IDK、它在 RT Linux SDK 上运行、以获得最新版本。

我已经使用实现了一个简单的摄像头应用、与双摄像头示例类似。

 在我的测试过程中、摄像机通过了以下赞扬:

VIDIOC_QUERYCAP

VIDIOC_ENUM_FMT

VIDIOC_G_FMT

VIDIOC_S_FMT

它还应用了缓冲器:

VIDIOC_REQBUFS

但在 VIDIOC_QBUF 命令期间失败、它抛出无效参数错误。  示例代码的一部分如下所示:

Int Init_Camsart (int Width、int hight)
{
printf ("Nemo Init Camicy\n");
//打开设备
FD =打开(file_video、O_RDWR);
if (-1 == FD)
{
perror ("打开视频设备失败");
printf ("Nemo open video device fail\n");
返回-1;
}
//检查设备是否能够流式传输
if (ioctl (fd、VIDIOC_QUERYCAP、∩)< 0)
{
Perror ("Nemo VIDIOC_QUERYCAP");
返回-1;
}
其他
{
printf ("Nemo VIDIOC_QUERYCAP ok \n");
printf ("驱动程序:\t%s\n"、cap.driver);
printf ("卡:\t%s\n"、cap.card);
printf ("bus_info:\t%s\n"、cap.bus_info);
printf ("版本:\t%d\n"、cap.version);
printf ("功能:\t%x\n"、cap.capabilities);

if ((cap.capabilities & V4L2_CAP_VIDEO 捕捉)== V4L2_CAP_VIDEO 捕捉)
{
printf ("Nemo 设备%s:支持捕获。\n",file_video);
}

if ((cap.capabilities 和 V4L2_CAP_STREGUSDICE_STREGUSDICE_= V4L2_CAP_STREGUSE_STREGUSE_IF)
{
printf ("Nemo 设备%s:支持流式传输。\n",file_video);
}
}

//emu 都支持 fmt
fmtdesc.index=0;
fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
printf ("支持格式:\n");
while (ioctl (fd、VIDIOC_ENUM_FMT、&fmtdesc)!=1)
{
printf ("Nemo \t%d.%s\n"、fmtdesc.index+1,fmtdesc.description);
fmtdesc.index++;
}
FMT.TYPE = V4L2_BUF_TYPE_VIDEO 捕捉;

if (ioctl (FD、VIDIOC_G_FMT、&fmt)==1)
{
printf ("无法获取格式\n");
返回-1;
}
其他
{
printf ("Nemo 启用以获取格式\n");
}
fmt.fmt.pix.pixelformat = FourCC_STR ("YUYV");
FMT.TYPE = V4L2_BUF_TYPE_VIDEO 捕捉;
fmt.fmt.pix.height = IMAGEHEIGHT;
fmt.fmt.pix.width = IMAGEWIDTH;
//fmt.fmt.pix.field = V4L2_field_interlosed;
if (ioctl (FD、VIDIOC_S_FMT、&fmt)==1)
{
printf ("无法设置格式\n");
返回-1;
}

{
printf ("fmt.type:\t\t%d\n"、fmt.type);
printf ("pix.pixelformat:\t%c%c%c%c%c\n"、fmt.fmt.pix.pixelformat & 0xFF、(fmt.fmt.pix.pix.pixelformat >> 8)& 0xFF、(fmt.fmt.pix.pix.pixelformat >> 16)& 0xFF、 (fmt.fmt.pix.pixelformat >> 24)和0xFF);
printf ("pix.height:\t\t%d\n"、fmt.fmt.pix.height);
printf ("pix.width:\t\t%d\n"、fmt.fmt.pix.width);
printf ("pix.field:\t\t%d\n"、fmt.fmt.pix.field);
}
//set fps
setfps.type = V4L2_BUF_TY_VIDEO_CAPTURE;
setfps.parm.capture.timeperframe.numerator = 10;
setfps.parm.capture.timeperframe.denominator = 10;

printf ("init %s \t[OK]\n"、file_video);

int i;int i
内部转台;

//应用缓冲区
//3.
struct v4l2_requestbuffers requestbuffer;
requestbuffer.count = count;
requestbuffer.type = V4L2_BUF_TYPE_VIDEO 捕捉;
requestbuffer.memory = V4L2_MEMORY_DMABUF;

RET = ioctl (FD、VIDIOC_REQBUFS、&requestbuffer);
if (ret!= 0)
{
perror ("请求缓冲区失败");
返回-3;}

其他
{
printf ("Nemo VIDIOC_REQBUFS ok ");
}


//querybuffer
struct v4l2_buffer querybuffer;
querybuffer.type = V4L2_BUF_TYPE_VIDEO 捕捉;
querybuffer.memory = V4L2_memory_DMABUF;

struct v4l2_buffer queuebuffer;
queuebuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
queuebuffer.memory = V4L2_MEMORY_DMABUF;
for (i = 0;i < count;i++)
{
querybuffer.index = I;

RET = ioctl (FD、VIDIOC_QUERYBUF、&querybuffer);
if (ret!= 0)
{
perror ("查询缓冲区失败");
返回-4;
}
其他
{
printf ("助记符 VIDIOC_QUERYBUF ok \n");
}

printf (“索引:%d 长度:%d 偏移:%d \n”,
querybuffer.index、querybuffer.length、querybuffer.m.offset);
length = querybuffer.length;

//内存映射
yuV[i]= mmap (0、querybuffer.length、PROT_read | PROT_write、map_shared、fd、querybuffer.m.offset);


//队列
queuebuffer.index = I;
RET = ioctl (FD、VIDIOC_QBUF、&queuebuffer);
if (ret!= 0)
{
perror ("queuebuffer fail");
返回-5;
}
}
//init 队列
enqueue.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
dequeue.type = V4L2_BUF_TYPE_视频_捕捉;
enqueue.memory = V4L2_MEMORY_DMABUF;
dequeue.memory = V4L2_memory_DMABUF;

返回0;
} 

 

 

日志如下所示:

root@am57xx-EVM:~#./cameram
Nemo Init Camin院
Nemo VIDIOC_QUERYCAP 正常
驱动程序: VIP
卡: VIP
BUS_INFO: 平台:VIP
版本: 263200
功能:85200001
Nemo 器件/dev/video1:支持捕捉。
Nemo 器件/dev/video1:支持流。
支持格式:
Nemo 1.Y/CbCr 4:2:0
Nemo 2.UYVY 4:2:2
Nemo 3.YUYV 4:2:2
Nemo 4.VYUY 4:2:2
Nemo 5.YVYU 4:2:2
Nemo 6.24位 RGB 8-8.
Nemo 7.32位 A/XRGB 8-8.
Nemo 8.24位 BGR 8-8.
Nemo 9.32位 BGRA/X 8-8-8.
Nemo 10.8位 Bayer BGBG/GRGR
Nemo 使能以获取格式
FMT.TYPE: 1
PIx.pixelformat: YUYV
PIX 高度: 240
PIX.width (PIX.宽度): 320
PIX 射野: 1
初始化/dev/video1 [确定]
Nemo VIDIOC_REQBUFS OK
Nemo VIDIOC_QUERYBUF OK
索引:0长度:153600偏移:0
queuebuffer 失败:参数无效
root@am57xx-EVM:~#./cameram
Nemo Init Camin院
Nemo VIDIOC_QUERYCAP 正常
驱动程序: VIP
卡: VIP
BUS_INFO: 平台:VIP
版本: 263200
功能:85200001
Nemo 器件/dev/video1:支持捕捉。
Nemo 器件/dev/video1:支持流。
支持格式:
Nemo 1.Y/CbCr 4:2:0
Nemo 2.UYVY 4:2:2
Nemo 3.YUYV 4:2:2
Nemo 4.VYUY 4:2:2
Nemo 5.YVYU 4:2:2
Nemo 6.24位 RGB 8-8.
Nemo 7.32位 A/XRGB 8-8.
Nemo 8.24位 BGR 8-8.
Nemo 9.32位 BGRA/X 8-8-8.
Nemo 10.8位 Bayer BGBG/GRGR
Nemo 使能以获取格式
FMT.TYPE: 1
PIx.pixelformat: YUYV
PIX 高度: 240
PIX.width (PIX.宽度): 320
PIX 射野: 1
初始化/dev/video1 [确定]
Nemo VIDIOC_REQBUFS OK
Nemo VIDIOC_QUERYBUF OK
索引:0长度:153600偏移:0
queuebuffer 失败:参数无效 

 

这里的问题是什么? 非常感谢!

此致、

Nemo