USB攝像頭驅動思路
阿新 • • 發佈:2018-12-02
出入口函式註冊usb_driver
結構體,設定probe
,disconnect
,id_table
等引數,其中probe函式用於設定usb控制介面的資訊,設定video_device
結構體,設定它的release
, fops
,ioctl_ops
函式。並且註冊這個結構體
1.首先會呼叫myuvc_open
函式,
2.呼叫querycap表明它是個攝像頭,且開啟資料流傳輸,
3.列舉支援哪些的資料格式
4.返回當前所使用的格式
5.強制設定該格式,測試驅動是否支援這種格
6.APP呼叫該ioctl讓驅動程式分配若干個快取(作為整體一次性分配), APP將從這些快取中讀到視訊資料。
7.查詢快取狀態, 比如地址資訊(APP可以用mmap進行對映)
8.把緩衝區放入佇列, 底層的硬體操作函式將會把資料放入這個佇列的快取。APP傳入的v4l2_buf
佇列1: 供APP使用
- 當緩衝區沒有資料時,放入
mainqueue
佇列 - 當緩衝區有資料時, APP從
mainqueue
佇列中取出
佇列2: 供產生資料的函式使用 - 當採集到資料時,從
irqqueue
佇列中取出第1個緩衝區,存入資料
9.啟動傳輸
- 向USB攝像頭設定引數: 比如使用哪個format, 使用這個format下的哪個frame(解析度)
1.1 根據一個結構體uvc_streaming_control
設定資料包: 可以手工設定,也可以讀出後再修改
1.2 呼叫usb_control_msg
d. 設定VideoStreaming Interface所使用的setting
d.1 從myuvc_params
確定頻寬
d.2 根據setting的endpoint能傳輸的wMaxPacketSize
找到能滿足該頻寬的setting
2. 分配設定URB
3. 提交URB以接收資料
10.APP通過poll/select確定有資料後, 把快取從佇列中取出來
11.之前已經通過mmap映射了快取, APP可以直接讀資料
12.再次呼叫myuvc_vidioc_qbuf
把快取放入佇列
13.持續poll
14.停止,kill URB,free URB,設定VideoStreaming Interface為setting 0關閉USB介面