2015-11-13 50 views
0

我不熟悉Linux内核开发,但我负责更新内核驱动程序,以便它将返回可由应用程序读取的状态码。这将要求驱动程序每秒轮询硬件几次以查看发送的相机格式(PAL,NTSC或无)。Linux V4L驱动程序 - 轮询摄像头输入格式

但是,我对如何实现这一点感到茫然。我了解驱动程序如何与硬件进行通信,但我不明白如何将这些数据传递给应用程序。这种类型的行为是否需要使用ioctl()调用,或者这是一种读取文件操作?此外,如果应用程序正在调用IOCTL或读取函数,然后需要等待硬件响应,这是否会造成性能问题?

另外对于更多的信息,我正在研究2.6版本的内核。我正在按照“Linux设备驱动程序第三版”的方式工作,但没有任何关于如何解决此特定问题的突出内容。 LDD3使它听起来像ioctl(),仅用于向驱动程序发送命令。由于这是一个V4L驱动程序,打开的文件将返回图像数据,而不是我想要的状态信息,我想。

回答

1

我建议您查看最新的V4L2 API文档,托管在linuxtv.org:http://linuxtv.org/downloads/v4l-dvb-apis/

用户空间的应用程序可以调用IOCTL查询当前的输入格式。下面的用户空间代码可以用来查询内核驱动程序的当前视频标准:

(报价http://www.linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/spec-single/v4l2.html#standard

Example 1.5. Information about the current video standard 

v4l2_std_id std_id; 
struct v4l2_standard standard; 

if (-1 == ioctl (fd, VIDIOC_G_STD, &std_id)) { 
    /* Note when VIDIOC_ENUMSTD always returns EINVAL this 
     is no video device or it falls under the USB exception, 
     and VIDIOC_G_STD returning EINVAL is no error. */ 

    perror ("VIDIOC_G_STD"); 
    exit (EXIT_FAILURE); 
} 

memset (&standard, 0, sizeof (standard)); 
standard.index = 0; 

while (0 == ioctl (fd, VIDIOC_ENUMSTD, &standard)) { 
    if (standard.id & std_id) { 
      printf ("Current video standard: %s\n", standard.name); 
      exit (EXIT_SUCCESS); 
    } 

    standard.index++; 
} 

/* EINVAL indicates the end of the enumeration, which cannot be 
    empty unless this device falls under the USB exception. */ 

if (errno == EINVAL || standard.index == 0) { 
    perror ("VIDIOC_ENUMSTD"); 
    exit (EXIT_FAILURE); 
}