在調試一個雙UVC設備時,在linux下發現需要打開/dev/video0和/dev/video2,
而不是/dev/video0和/dev/video1, 即一個UVC設備實際生成了兩個/dev/video。通過搜索知道,因為一個UVC設備創建了兩個設備節點一個用于獲取流,一個用于獲取meta數據。
https://vanelst.site/2023/04/20/v4l2_create_two_video_device/
所以這里分享下如下修改代碼使得一個UVC設備只生成一個/dev/video設備。
如何在WSL下修改內核代碼進行調試參考:
WSL2中配置支持UVC
先查看/dev/video設備,有4個
qinyunti@qinyunti:~$ ls /dev/videovideo0 video1 video2 video

先dmesg查看內核log,可以看到如下信息
[ 547.038592] usb 1-1: new high-speed USB device number 2 using vhci_hcd[ 547.169054] usb 1-1: SetAddress Request (2) to port 0[ 547.198884] usb 1-1: Found UVC 1.00 device XXXX.UVC (1993:0101)[ 547.204401] usb 1-1: Found UVC 1.00 device XXXX.UVC (1993:0101)

那么就來搜索這個打印信息Found UVC

位于
drivers\media\usb\uvc\uvc_driver.c
uvc_probe函數內
dev/videox的x設備號由
devnode_find分配
看代碼可以看到如下調用路徑
uvc_register_chains->uvc_register_terms->uvc_meta_register

注釋掉drivers/media/usb/uvc/uvc_driver.c
static int uvc_register_terms(struct uvc_device *dev,
函數中調用
uvc_meta_register

此時看到只剩下一個UVC對應一個/dev/video設備。
qinyunti@qinyunti:~$ ls /dev/video
video0 video1

uvc_register_terms函數中注釋調用uvc_meta_register可以一個UVC設備只生成一個/dev/video節點。