linux uvc深刻理解(三)

上一篇講到usb_register將uvc_driver.driver註冊進去,今天咱們來梳理下uvc_driver.driver中最重要的函數probe(即uvc_probe)。
uvc_probe會傳入2組參數,分別是struct usb_interface *intf和const struct usb_device_id *id。
經過intf咱們能夠獲取usb最重要的結構體struct usb_device,經過id咱們能夠獲得掛載uvc驅動的usb設備的PID和VID。
在uvc_probe中主要是構建了struct uvc_deviceide

struct uvc_device {
struct usb_device *udev;
struct usb_interface *intf;
unsigned long warnings;
__u32 quirks;
int intfnum;
char name[32];

enum uvc_device_state state;
struct list_head list;
atomic_t users;

/* Video control interface */
__u16 uvc_version;
__u32 clock_frequency;

struct list_head entities;
struct list_head chains;

/* Video Streaming interfaces */
struct list_head streams;
atomic_t nstreams;

/* Status Interrupt Endpoint */
struct usb_host_endpoint *int_ep;
struct urb *int_urb;
__u8 *status;
struct input_dev *input;
char input_phys[64];
};

下面咱們介紹下幾個在probe函數中比較重要的函數函數

uvc_parse_control

主要做用是解析uvc設備的usb描述符ui

uvc_ctrl_init_device

將以前uvc_drive中controls隊列中的uvc控制參數添加到struct uvc_device的entities隊列裏,最後atom

list_add_tail(&dev->list, &uvc_driver.devices);

將uvc_device掛接到uvc_drive中,實現設備和驅動的掛載過程spa

uvc_scan_device&uvc_register_terms

將video設備註冊到uvc鏈中,最後經過uvc_register_video將全部video設備都註冊成支持v4l2接口的uvc設備
讓咱們看下v4l2的ops結構體內容code

const struct v4l2_file_operations uvc_fops = {
.owner = THIS_MODULE,
.open = uvc_v4l2_open,
.release = uvc_v4l2_release,
.ioctl = uvc_v4l2_ioctl,
.read = uvc_v4l2_read,
.mmap = uvc_v4l2_mmap,
.poll = uvc_v4l2_poll,
};

經過這種方式咱們的uvc設備就能提供給上層v4l2的接口了接口

uvc_status_init

若是你的uvc設備還支持input的話,就須要單獨爲它註冊input device節點(input_register_device),除此以外該函數還初始化中了中斷urb,當你進行中斷傳輸完成時會待用uvc_status_complete返回urb的提交狀態,咱們通常看到Non-zero status (-71) in status completion handler這種錯誤就是在這個函數返回的。隊列

相關文章
相關標籤/搜索