Ошибка Video4Linux ioctl (# 25) при попытке прочитать информацию об устройстве из / dev / video0 - PullRequest
0 голосов
/ 01 июня 2018

В настоящее время я пытаюсь получить информацию об устройстве для встроенной веб-камеры, используя следующий код:

#include <fcntl.h>
#include <unistd.h>
#include <linux/media.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main(int argc, char **argv) {
   int fd = open("/dev/video0", O_RDONLY, 0);
   if (fd > 0) {
       struct media_device_info *device_data = (struct media_device_info *) malloc (sizeof(struct media_device_info) * 1);

       if (ioctl(fd, MEDIA_IOC_DEVICE_INFO, device_data) ==  0)
            printf("Media Version: %u\nDriver: %s\nVersion: %d\nSerial: %s\n", (unsigned int) device_data->media_version, device_data->driver, (int) device_data->driver_version, device_data->serial);
        else {
               fprintf(stderr, "Couldn't get device info: %d: %s\n", errno, strerror(errno));
       }

       close(fd);
       free(device_data);
    }

    return 0;
}

Когда код выполняется, вводится блок else, что дает следующее:

Couldn't get device info: 25: Inappropriate ioctl for device

Из этого может показаться, что устройство открывается неправильно, так что ioctl не может использовать дескриптор файла.Я должен что-то упустить;Может ли кто-нибудь здесь помочь мне с открытием устройства / dev / video0?

Спасибо!

ps Если на этот вопрос уже было дано ответ, прежде чем, пожалуйста, дайте мне знать.Если этот вопрос в любом случае неверен, примите мои извинения.

1 Ответ

0 голосов
/ 28 сентября 2018

Похоже, что устройства /dev/video* могут быть связаны с отдельными /dev/media* устройствами, и вам необходимо выдать MEDIA_IOC_DEVICE_INFO ioctl против соответствующего устройства /dev/media* для вашего устройства /dev/video*.

Что касается того, как найти соответствующий идентификатор устройства, лучшее, что я придумал, - это поиск media* файлов в каталоге /sys/class/video4linux/video{N}/device.

Например, для данного устройства /dev/video0 вмоя система (ядро 4.15.0-34-generic), для поиска media* файлов в /sys/class/video4linux/video0/device обнаружена media10, которую я затем смог использовать для восстановления серийного номера (открыть /dev/media10, выполнить ioctlкоманда).

Я не знаю, совместим ли этот метод поиска соответствующих медиаустройств в дистрибутивах / версиях / ядрах / и т. д.

...