1. 程式人生 > >USB攝像頭驅動思路

USB攝像頭驅動思路

出入口函式註冊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

可能有問題, 要做判斷。修改狀態 ,放入2個佇列

佇列1: 供APP使用

  • 當緩衝區沒有資料時,放入mainqueue佇列
  • 當緩衝區有資料時, APP從mainqueue佇列中取出



    佇列2: 供產生資料的函式使用
  • 當採集到資料時,從irqqueue佇列中取出第1個緩衝區,存入資料

    9.啟動傳輸
  1. 向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介面