Понимание драйверов устройств для веб-камеры Linux

11

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

В случае веб-камеры USB ответственным драйвером является UVC, который поддерживает любое устройство, совместимое с UVC. Это означает, что позволяет ОС или другой компьютерной программе получать доступ к аппаратным функциям без необходимости знать точные детали используемого оборудования.

По этой причине я установил драйвер устройства UVC Linux, выполнив:

opkg install kernel-module-uvcvideo

Веб - камера была признана ядром Linux: dev/video0. Однако я все еще не мог выполнять потоковое видео с FFmpeg, так как мне не хватало V4L2 API. Я установил V4L2, настроив ядро.

Мои запросы:

  • Как драйвер UVC и V4L2 связаны друг с другом?
  • Какова цель API V4L2?
  • Если бы я сначала не установил UVC, он будет установлен с V4L2?

LinuxTV ссылается: Реализация драйвера uvcvideo относится только к API V4L2 . Это означает, что UVC является частью V4L2 API?

dempap
источник

Ответы:

7

USB-видео класс (UVC) - это спецификация , которой должны соответствовать веб-камеры USB и т. Д. Таким образом, их можно использовать в любой системе, в которой реализована поддержка устройств, совместимых с UVC.

V4L2 - это видеоподсистема ядра Linux, от которой зависит реализация Linux Linux UVC. Другими словами, в ядре поддержка UVC требует V4L2, но не наоборот.

API V4L2 относится к пользовательскому интерфейсу программирования , описанному здесь .

лютик золотистый
источник
Если я понял, ядро ​​без V4L2 не может поддерживать устройства, совместимые с UVC, даже если установлен драйвер uvc.
Демпап
2
Да. Драйверы являются частью ядра; хотя они могут быть скомпилированы как отдельные модули, они скомпилированы с использованием исходного кода ядра. Если это не та же исходная версия, что и у вашего работающего ядра, они не будут работать, и если они не скомпилированы из одной и той же конфигурации, могут быть значительные несоответствия. Например, если у вас нет встроенного в ядро ​​звукового ядра (ALSA) (или доступно в виде модуля), то модульный драйвер для звуковой карты бесполезен.
Златовласка
13

Удивительно , как много документации вы можете найти для Video4Linux2 - и ни один из них на самом деле не объясняет , что Video4Linux есть .

Во-первых, Video4Linux2 - это каркас драйвера для Linux . Драйверы платформы на самом деле не контролируют устройства напрямую. Вместо этого они предоставляют абстрактную модель некоторого класса устройств, в данном случае это видеоустройства для приложений. Платформы драйверов предоставляют три основных преимущества:

  1. Предоставить унифицированный API для приложений, которые можно использовать с очень широким спектром физических устройств, независимо от того, подключены ли они через USB, PCIe, MIPI, Ethernet или другой тип шины передачи данных
  2. В ядре платформы содержат тип кода, который требуется почти во всех драйверах устройств определенного класса, что значительно сокращает объем разрозненного кода.
  3. В ядре фреймворки обеспечивают план написания новых драйверов более низкого уровня, которые фактически управляют оборудованием, тем самым упрощая разработку драйверов.

Таким образом, драйвер V4L2 является драйвером высокого уровня, который управляет драйвером UVC, который управляет драйвером USB, который может управлять драйвером даже более низкого уровня.

Эта модель Matryoshka очень распространена в дереве драйверов ядра Linux. V4L2 является одним из более сложных примеров, потому что некоторые устройства камеры требуют доступа к большим группам вспомогательных устройств в нескольких слоях, которые управляют камерой и направляют вывод камеры между различными компонентами, такими как процессоры изображений.

Вы по-прежнему можете обращаться к драйверу UVC напрямую из пространства пользователя, используя файл устройства и системные вызовы «ioctl», не обращаясь к драйверу V4L2, и вы по-прежнему можете обращаться к базовому драйверу USB напрямую из пространства пользователя, используя его файл устройства и файлы «ioctl».

Являясь общей структурой, предоставляющей функциональные возможности, общие для широкого спектра устройств, V4L2 не предоставляет вам всех функциональных возможностей, которые может предоставить драйвер UVC (при условии, что ваше устройство фактически обеспечивает больше функциональных возможностей UVC, чем требуется для поддержки V4L2) ,

Таким образом, если бы у вас было устройство UVC, обеспечивающее все функции, указанные в спецификации UVC, то для фактического использования некоторых из этих функций вам потребуется прямой доступ к драйверу UVC через файл устройства и систему «ioctl». вызывает, предполагая, что драйвер ядра ядра Linux на самом деле поддерживает все спецификации UVC.

Однако значение

Реализация драйвера uvcvideo относится только к API V4L2

в том, что в текущем ядре Linux драйвер UVC фактически не обеспечивает больше поддержки функций UVC, чем необходимо для V4L2.

Поддержка V4L2 в ядре сама по себе не обеспечивает поддержку UVC или USB или аппаратную поддержку USB более низкого уровня.

Джонатан Бен-Авраам
источник