Memahami driver perangkat Linux webcam

11

Sejauh yang saya tahu, driver perangkat adalah bagian dari SW yang dapat berkomunikasi dengan jenis perangkat tertentu yang terpasang pada komputer.

Dalam hal webcam USB, driver yang bertanggung jawab adalah UVC yang mendukung semua perangkat yang sesuai dengan UVC. Ini berarti bahwa memungkinkan OS atau program komputer lainnya untuk mengakses fungsi perangkat keras tanpa perlu mengetahui detail perangkat keras yang digunakan.

Untuk alasan ini, saya menginstal driver perangkat UVC Linux dengan menjalankan:

opkg install kernel-module-uvcvideo

Webcam telah diakui oleh kernel Linux: dev/video0. Namun, saya masih tidak dapat melakukan streaming video dengan FFmpeg, karena saya kehilangan API V4L2. Saya menginstal V4L2, dengan mengkonfigurasi kernel.

Pertanyaan saya adalah:

  • Bagaimana driver UVC dan V4L2 dihubungkan bersama?
  • Apa tujuan dari V4L2 API?
  • Jika saya belum menginstal UVC dulu, itu akan diinstal dengan V4L2?

LinuxTV merujuk: Implementasi driver uvcvideo hanya mematuhi API V4L2 . Ini berarti bahwa UVC adalah bagian dari V4L2 API?

dempap
sumber

Jawaban:

7

Kelas video USB (UVC) adalah spesifikasi yang sesuai dengan webcam USB, dll. Dengan cara ini, mereka dapat digunakan pada sistem apa pun yang mengimplementasikan dukungan untuk perangkat yang sesuai dengan UVC.

V4L2 adalah subsistem video kernel linux yang menjadi dasar implementasi UVC linux. Dengan kata lain, dalam dukungan kernel UVC membutuhkan V4L2, tetapi tidak sebaliknya.

V4L2 API mengacu pada antarmuka pemrograman userspace , yang didokumentasikan di sini .

goldilocks
sumber
Jika saya mengerti, kernel tanpa V4L2, tidak dapat mendukung perangkat yang sesuai dengan UVC, bahkan jika driver uvc diinstal.
dempap
2
Iya. Driver adalah bagian dari kernel; walaupun mereka dikompilasi sebagai modul terpisah, ini dikompilasi menggunakan sumber kernel. Jika itu bukan versi sumber yang sama dengan kernel Anda yang berjalan, mereka tidak akan berfungsi, dan jika mereka tidak dikompilasi dari konfigurasi yang sama, mungkin ada ketidakkonsistenan yang signifikan. Misalnya, jika Anda tidak memiliki inti suara (ALSA) yang tertanam di dalam kernel (atau tersedia sebagai modul), maka driver perangkat keras modular untuk kartu suara tidak berguna.
goldilocks
13

Sungguh menakjubkan betapa banyak dokumentasi Anda dapat menemukan untuk Video4Linux2 - dan tidak ada yang benar-benar menjelaskan apa Video4Linux adalah .

Pertama, Video4Linux2 adalah kerangka kerja driver Linux . Driver framework sebenarnya tidak mengontrol perangkat secara langsung. Sebagai gantinya, mereka menyediakan model abstrak dari beberapa kelas perangkat, dalam hal ini perangkat video untuk digunakan aplikasi. Kerangka kerja pengemudi memberikan tiga manfaat utama:

  1. Menyediakan API terpadu untuk aplikasi yang dapat digunakan dengan berbagai perangkat fisik, baik yang terhubung dengan USB, PCIe, MIPI, Ethernet atau jenis bus transportasi data lainnya
  2. Dalam kernel, frameworks berisi jenis kode yang dibutuhkan di hampir semua driver perangkat dari kelas tertentu, sehingga sangat mengurangi volume kode yang berbeda.
  3. Di kernel, frameworks menyediakan cetak biru untuk menulis driver level bawah baru yang sebenarnya mengendalikan perangkat keras, sehingga menyederhanakan pengembangan driver.

Jadi, driver V4L2 adalah driver tingkat tinggi yang menggerakkan driver UVC, yang menggerakkan driver USB yang mungkin mengendarai driver perangkat keras yang bahkan lebih rendah.

Model Matryoshka ini sangat umum di pohon driver kernel Linux. V4L2 adalah salah satu contoh yang lebih kompleks karena beberapa perangkat kamera memerlukan akses kelompok besar sub-perangkat dalam beberapa lapisan yang mengontrol kamera dan merutekan output kamera di antara berbagai komponen seperti pengolah gambar.

Anda masih dapat mengakses driver UVC langsung dari userspace menggunakan file perangkat dan panggilan sistem "ioctl", tanpa melalui driver V4L2, dan Anda masih dapat mengakses driver USB yang mendasarinya langsung dari userspace menggunakan file perangkat itu dan "ioctl".

Menjadi kerangka kerja umum yang menyediakan fungsionalitas yang umum untuk berbagai perangkat, V4L2 tidak memberi Anda semua fungsionalitas yang dapat disediakan oleh driver UVC (dengan asumsi bahwa perangkat Anda benar-benar menyediakan fungsionalitas UVC lebih banyak daripada yang diperlukan untuk mendukung V4L2) .

Jadi jika Anda memiliki perangkat UVC yang menyediakan semua fungsi yang ditentukan dalam spesifikasi UVC, maka untuk benar-benar menggunakan beberapa fungsi ini, Anda perlu mengakses driver UVC langsung melalui file perangkat dan sistem "ioctl" panggilan, dengan asumsi bahwa driver UVC kernel Linux sebenarnya mendukung semua spesifikasi UVC.

Namun, arti dari

Implementasi driver uvcvideo hanya mematuhi API V4L2

adalah bahwa dalam driver Linux kernel UVC saat ini sebenarnya tidak memberikan dukungan fungsi UVC lebih dari yang diperlukan untuk V4L2.

Dukungan V4L2 di kernel tidak dengan sendirinya memberikan dukungan UVC atau USB atau dukungan perangkat keras USB tingkat rendah.

Jonathan Ben-Avraham
sumber