攝像頭驅動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 // 把緩衝區放入佇列
}
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組件為例: 每個組件