0

我不熟悉 Linux 内核开发,但我的任务是更新内核驱动程序,以便它返回一个应用程序可以读取的状态代码。这将要求驱动程序每秒轮询硬件几次,以查看正在发送的相机格式(PAL、NTSC 或无)。

但是,我不知道如何实现这一点。我了解驱动程序如何与硬件通信,但我不了解如何将此数据传递给应用程序。这种行为是否需要使用 ioctl() 调用或者这是一个读取文件操作?此外,如果应用程序正在调用 IOCTL 或读取函数,然后需要等待硬件响应,这是否会产生性能问题?

另外为了补充信息,我正在开发 2.6 版本的内核。我正在研究“Linux Device Drivers 3rd Ed”,但在如何解决这个特定问题方面没有什么突出的。LDD3 使它听起来像 ioctl() 仅用于向驱动程序发送命令。由于这是一个 V4L 驱动程序,我认为打开文件将返回图像数据,而不是我想要的状态信息。

4

1 回答 1

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);
}
于 2015-11-19T21:04:47.167 回答