簡體   English   中英

Linux V4L驅動程序-輪詢攝像機輸入格式

[英]Linux V4L driver - Polling camera input format

我不熟悉Linux內核開發,但是我要負責更新內核驅動程序,以便它會返回狀態代碼,供應用程序讀取。 這將要求驅動程序每秒輪詢硬件兩次,以查看發送的相機格式(PAL,NTSC或無)。

但是,我不知道如何實現這一目標。 我了解驅動程序與硬件的通信方式,但不了解如何將這些數據傳遞給應用程序。 這種類型的行為是否需要使用ioctl()調用,或者這是讀文件操作? 另外,如果應用程序正在調用IOCTL或讀取函數,然后需要等待硬件響應,是否會導致性能問題?

另外,有關其他信息,我正在研究2.6版本的內核。 我正在通過“ Linux Device Drivers 3rd Ed”進行工作,但是在解決該特定問題方面沒有什么突出的。 LDD3聽起來像ioctl(),僅用於向驅動程序發送命令。 由於這是V4L驅動程序,我認為打開文件將返回圖像數據,而不是我想要的狀態信息。

我建議您查看linuxtv.org上托管的最新V4L2 API文檔: 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM