1. 程式人生 > >攝像頭驅動3_虛擬驅動vivi徹底分析

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

1、上一節測試的攝像頭驅動程式的缺陷

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


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


(3)sudo modprobe vivi  

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

(4)把核心自帶的vivi去掉,安裝上我們編譯出來的vivi.ko,用自己的編譯程式是因為

我們以後做實驗的時候要用到自己編譯的程式碼

2、根據虛擬驅動vivi的使用過程徹底分析攝像頭驅動

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

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

接下來分析xawtv.log

(3)開啟xawtv.log檔案,搜尋關鍵詞“/dev/video0”,結合核心版本的vivi.c來分析

// 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                // 設定標準(制式), 不是必需的

// v4l2_nextframe > v4l2_waiton   
18. v4l2_queue_all
    v4l2_waiton   
        for ()
        {
            select(5, [4], NULL, NULL, {5, 0})      = 1 (in [4], left {4, 985979}) //查詢到有沒有資料,驅動程式有資料後,把應用程式喚醒,喚醒後應用程式呼叫DQBUF獲得buffer資訊,然後處理它,處理完後再次放入佇列裡面
            ioctl(4, VIDIOC_DQBUF                // de-queue, 把緩衝區從佇列中取出
            // 處理, 之以已經通過mmap獲得了緩衝區的地址, 就可以直接訪問資料       
            ioctl(4, VIDIOC_QBUF                 // 把緩衝區放入佇列
        }

(4)xawtv的幾大函式: 1. v4l2_open
2. v4l2_read_attr/v4l2_write_attr    //讀寫屬性
3. v4l2_start_streaming   //啟動流
4. v4l2_nextframe/v4l2_waiton   //

3、一邊修改vivi.c一邊測試

(1)執行xawtv

出現以下畫面

(2)點選畫面右鍵出現屬性選單



 

相關推薦

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

1、上一節測試的攝像頭驅動程式的缺陷 (1)依次裝載驅動程式,出現錯誤如下 (2)用dmesg命令檢視詳細輸出(某些函式沒有識別),可見我們的vivi.ko還依賴於其他驅動程式,上一節直接使用這些命令沒有問題,是因為在做虛擬攝像頭vivi之前。我們先接上USB攝像頭,ub

LINUX攝像驅動二:虛擬驅動VIVI測試及徹底分析

LInux Kernel:3.4.2 gcc version: 4.3.2 測試虛擬驅動vivi 準備工作:安裝xawtv sudo apt-get install xawtv 在這個網站建立新的sources.list http://rep

攝像頭驅動(二)————V4L2 虛擬攝像頭驅動vivi深入分析

本文基於:linux3.5   前面一篇文章中,簡單分析了 V4L2 大框架,本文藉助核心中的虛擬攝像頭驅動 vivi 來分析一個完整的攝像頭驅動程式。vivi 相對於後面要分析的 usb 攝像頭驅動程式,它沒有真正的硬體相關層的操作,也就是說拋開了複雜的 us

linux設備驅動之misc驅動框架源碼分析(一)

linux驅動開發misc設備驅動 1、misc設備驅動框架源碼部分是由內核開發者實現提供的,主要是創建misc類和為驅動開發者提供misc_register函數,來進行創建misc設備。 這部分的源碼在/drvier/char/misc.c裏,代碼如下:/* * linux/drivers/c

linux設備驅動之misc驅動框架源碼分析(二)

linux驅動開發misc設備驅動1、misc_open函數分析 該函數在driver/char/misc.c中,misc.c是驅動框架實現的,這裏面的misc_Open函數是misc驅動框架為應用層提供的一個打開misc設備的一個接口。 1、首先我們要知道在misc.c中的misc_init函數

Linux裝置驅動-platform虛擬匯流排dya02

參考書:<linux裝置驅動開發詳解>宋寶華 上一篇介紹了platform的基本構成與原始碼,本篇用例項來說明platform的實現. 參考書中介紹了一個名為globalfifo的驅動,以他為例,來說明作為platfrom裝置如何實現驅動和裝置的匹配

android 電容屏(三):驅動除錯之驅動程式分析

關鍵詞:android  電容屏 tp 工作佇列 中斷 坐點計算  電容屏主要引數 平臺資訊: 核心:linux2.6/linux3.0 系統:android/android4.0  平臺:S5PV310(samsung exynos 4210)  作者:xubin3417

網絡卡驅動之02驅動原始碼分析

0 環境 核心:經過xilinx基於zynq平臺定製的4.4.0系核心; 硬體:zynq晶片,其中mac contorller是使用Cadence的IP核,phy晶片使用提marvell的1116R晶

嵌入式Linux驅動初探 虛擬串列埠裝置驅動編寫

文章目錄 1.說明 所謂虛擬串列埠裝置意為這個串列埠是虛擬的,不能用來實現與下位機的串列埠收發。但是他可以將從使用者那兒收到的資料,原封不動的回傳給使用者。相當於一個迴環。 這一功能的實現主要是在驅動中實現一個FIFO。驅動接收到使用者資料後,先將之放入FIFO

win7 x64部署和串列埠除錯虛擬驅動toaster

    WDK7600自帶的toaster驅動是個很好的學習驅動的案例,從匯流排驅動到App層,Class-install/Co-install都有涉及。本文主要涉及驅動部署和除錯。1.先說說除錯的準備工作。一般除錯驅動都是在虛擬機器中進行的,這裡也不例外,用windbg+

Linux I2C裝置驅動編寫(三)-例項分析AM3359

TI-AM3359 I2C介面卡例項分析 I2C Spec簡述 特性: 相容飛利浦I2C 2.1版本規格支援標準模式(100K bits/s)和快速模式(400K bits/s)多路接收、傳送模式支援7bit、10bit裝置地址模式32位元組FIFO緩衝區可程式設計時鐘發生

嵌入式Linux——nand flash 驅動(三):原始碼分析

再次宣告:本文是看過一些文章後寫的,如果與你的文章有相同的地方,敬請告知,如果對你有幫助,是我的榮幸。 接下來的這篇文章我們將要分析一下nand flash在S3C2440中的驅動函式。下面我們以一張圖來引入:         從上圖可以看出,MTD裝置層與原始裝置層

Linux驅動虛擬網絡卡

寫網絡卡驅動之前我總結一下個人的一些觀點:其實寫驅動並不是大家想想的那麼難,這裡我客觀評價一下核心層和應用層的區別: 底層: 工作在核心層的朋友應該有這種感覺,才開始學的時候真的很難,也就是說上手難,我就拿Linux驅動來說吧,寫一個完整的驅動,你得裝一個虛

android 電容屏:驅動除錯之驅動程式分析

以goodix的gt8105為例 一、總體架構 硬體部分:先看一個總體的圖吧,其實觸控式螢幕原理也比較簡單,觸控式螢幕和主控晶片間的聯絡,如下主要有三部分: 1、IIC部分,初始化gt8105的資料和傳回主控制的座標位置資訊就是通過IIC這條線傳輸的; 2、I

字元裝置驅動(globalmem-全域性記憶體)分析之一

globalmem相信學驅動的入門的時候都見過吧 熟悉了模組程式設計的基本框架後,我們就可以試著分析一個簡單的字元裝置驅動。 下面以《裝置驅動開發詳解》一書中的程式碼6.17為例來分析這個字元裝置驅動的程式碼。 我們現在對於對前文中hello,kernel核心模組進行稍微

網絡卡驅動虛擬網絡卡驅動編寫

#include <Linux/module.h> #include <linux/errno.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/k

虛擬機】WIN8.1系統虛擬機完全徹底刪除

idt 虛擬機安裝 虛擬機網卡 返回 cnblogs 任務管理器 img 結束 vmware虛擬機 一、首先刪除註冊表 用管理員身份打開CMD,輸入F:\>VMware-workstation-full-12.5.5-5234757.exe/clean,根據自己的虛擬

屬性驅動 and 模型驅動

參數 ces over upd 實例 str ring new div //1.創建一個UserBean public class User { private String username; private String pwd; publi

Android Bitmap加載內存占用徹底分析

android width rem alloc display may esp actor 緊急 背景 在某個版本應用上線後,偶然測得首頁占用的內存非常的大而且一直不能回收掉,經過一輪的排查後最終確定是3張圖片引起的!當時每張圖片占用了將近20m內存。當時緊急處理好後還一直

nova創建虛擬機源碼分析系列之七 傳入參數轉換成內部id

接口 函數 device 博文 nat build 消息 通過 rop 上一篇博文將nova創建虛機的流程推進到了/compute/api.py中的create()函數,接下來就繼續分析。 在分析之前簡單介紹nova組件源碼的架構。以conductor組件為例: 每個組件