linux攝像頭虛擬驅動vivi徹底分析3

2021-10-01 16:12:44 字數 3719 閱讀 4813

(1)依次裝載驅動程式,出現錯誤如下

(2)用dmesg命令檢視詳細輸出(某些函式沒有識別),可見我們的vivi.ko還依賴於其他驅動程式,上一節直接使用這些命令沒有問題,是因為在做虛擬攝像頭vivi之前。我們先接上usb攝像頭,ubuntu裡面自動給我們安裝了其他驅動程式。所以在使用vivi的時候,沒有出現問題。

這是安裝ubuntu裡面自帶的vivi驅動程式,把它依賴的其他驅動程式也一起安裝進來

(4)使用ls  /dev/v* 命令進行查詢  如果出現兩個/dev/video0  /dev/video1  兩個,第乙個是usb 的。可以使用

命令 sudo    rmmod  uvcvideo   去掉usb,可以去掉核心自帶的虛擬裝置驅動程式,sudo   rmmod    vivi,

(5)把核心自帶的vivi去掉,安裝上我們編譯出來的vivi.ko,使用命令sudo insmod    vivi.ko  ,使用命令ls/dev/v* 進行檢視

/dev/video0我們以後做實驗的時候要用到自己編譯的**,

(1)分析使用過程,通過應用程式原始碼xawtv分析,建立sourceinsight工程

(2)快捷了解xawtv所涉及的呼叫,用strace工具獲得所涉及的呼叫。把xawtv所涉及的系統呼叫記錄在xawtv.log檔案裡面

接下來分析xawtv.log

// 1~7都是在v4l2_open裡呼叫

1. open  //驅動控制代碼「4」

2. ioctl(4, vidioc_querycap

// 3~7 都是在get_device_capabilities(獲得相關屬性)裡呼叫

3. for()

ioctl(4, vidioc_enuminput   // 列舉輸入源,vidioc_enuminput/vidioc_g_input/vidioc_s_input不是必需的

4. for()

ioctl(4, vidioc_enumstd  // 列舉標準(制式), 不是必需的

5. for()       

ioctl(4, vidioc_enum_fmt // 列舉格式

6. ioctl(4, vidioc_g_parm

7. for()

ioctl(4, vidioc_queryctrl    // 查詢屬性(比如說亮度值最小值、最大值、預設值)

// 8~10都是通過v4l2_read_attr來呼叫的

8. ioctl(4, vidioc_g_std            // 獲得當前使用的標準(制式), 不是必需的

9. ioctl(4, vidioc_g_input         //獲得輸入

10. ioctl(4, vidioc_g_ctrl           // 獲得當前屬性, 比如亮度是多少

11. ioctl(4, vidioc_try_fmt          // 試試能否支援某種格式

12. ioctl(4, vidioc_s_fmt            // 設定攝像頭使用某種格式

// 13~16在v4l2_start_streaming

13. ioctl(4, vidioc_reqbufs          // 請求系統分配緩衝區

14. for()

ioctl(4, vidioc_querybuf         // 查詢所分配的緩衝區

mmap          //對於每乙個緩衝區都得到位址、大小等資訊,利用mmap來對映位址,讓應用程式知道以後去哪個位址訪問緩衝區

15. for ()

ioctl(4, vidioc_qbuf             // 把緩衝區放入驅動程式的佇列       

16. ioctl(4, vidioc_streamon             // 啟動攝像頭

// 17裡都是通過v4l2_write_attr來呼叫的

17. for ()

ioctl(4, vidioc_s_ctrl           // 設定屬性

ioctl(4, vidioc_s_input              // 設定輸入源

ioctl(4, vidioc_s_std                // 設定標準(制式), 不是必需的

//表示它是乙個攝像頭裝置

.vidioc_querycap      = vidioc_querycap,

/*用於列舉,獲得,測試,設定攝像頭的資料格式這是必須的*/

.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,

.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,

.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,

.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,

/*緩衝區操作:申請/查詢/放入佇列/取出佇列這些也是必須的*/

.vidioc_reqbufs       = vidioc_reqbufs,

.vidioc_querybuf      = vidioc_querybuf,

.vidioc_qbuf          = vidioc_qbuf,

.vidioc_dqbuf         = vidioc_dqbuf,

/*攝像頭的啟動和關閉*/

.vidioc_streamon      = vidioc_streamon,

.vidioc_streamoff     = vidioc_streamoff,

Linux攝像頭驅動 vivid

攝像頭驅動1 vivid more v4l2可以支援多種裝置,它可以有以下幾種介面 radio inte ce 收音機介面 處理從am或fm高頻頭裝置接收來的音訊流 這裡目的先載入vivid驅動,然後執行應用程式呼叫vivid驅動,初步體驗效果。先在ubuntu16.04上輸入uname a,可以得...

DirectShow驅動攝像頭

對於小攝像頭的驅動有幾種方法,通過使用directshow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流!用directshow來使用攝像頭,一般要求攝像頭的驅動是wdm格式的,當然,一些比較老的驅動格式directshow也可支援。direct...

第1 5節 攝像頭驅動 USB攝像頭驅動框架

1.寫乙個usb攝像頭驅動程式 當我們把usb裝置接到電腦或板子上去時,如果這個裝置能夠被usb driver所支援 id table吻合 probe函式就會被呼叫,在probe函式裡面就可以做我們想做的事了 對於攝像頭驅動程式來說,是1.分配乙個video device結構體 2.設定這個結構體 ...