程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 初試驅動---OV511+攝像頭驅動開發

初試驅動---OV511+攝像頭驅動開發

編輯:關於VC++

本篇適合沒有接觸過驅動或者初學驅動的朋友。運行本程序以及源代碼都請先看 ReadMe.txt 文件。

在本文中闡述的驅動是用windriver做出來的,沒有采用DDK或DriverStudio,可能看起 來並不像是一個”很正式“的驅動,而且本文中的驅動程序不可以用於 DirectShow接口。對於DDK和DriverStudio我也了解了一些內容,在剛開始的時候我是滿 懷激情的想用DDK或DriverStudio的,很快我的激情之火就被無情的熄滅了,對於一個完 全沒有接觸過驅動開發的人來說(在這之前我都不知道系統是如何找到某個設備驅動的), 我個人覺得DDK或DriverStudio有點難了,當你對DDK或DriverStudio有些了解的時候,當 你有了想編一點代碼的欲望時候,你會發現結果是多麼的殘酷,要麼運行出錯,要麼黑屏 重啟,最後你無處下手,特別是編一個硬件設備不是自己做的,對於一些產商命令都不熟 悉的時候,對於初學者來說,DDK或DriverStudio顯得特別難,剛開始我就是這個樣子。 但在我個人看來在了解了一些驅動的知識後,在用DDK或DriverStudio遇到困難的時候, 不妨試試windriver,你會興奮的發現這個工具居然不用做什麼工作就可以和你的硬件通 信了,這時候你會對windriver有更好把握,因為對象始終是同一個設備,共同之處還是 有的。

雖然在用windriver時,你只是開發了一個看起來只是開發了一個位於應用層的軟件, 其實它相當於把一部分驅動程序功能提到應用程序來做了(注意:只是一部分),當然這 需要windriver的api支持(所以會影響速度),其實我想這也就是windriver的開發思路 吧。而且我想如果在windriver下做通的話,再用DDK或DriverStudio難度也會下降不少吧 ,特別是對於USB驅動來說,搞清楚URB後應該就比較容易了。好了,不多說了,下面就步 入正題吧。

1、准備--知己知彼,百戰不殆

對於像我這樣的驅動文盲來說,了解一些驅動相關的知識是必需的。我們應該對驅動 有個概念性的把握,像驅動是什麼,驅動的作用是什麼,硬件是如何找到對應的驅動的, 應用程序又是如何與硬件通信的,驅動最終產生文件是什麼,開發驅動都有什麼方式等。 在這個過程中,我們可以隨便找些驅動開發的書看看,積累一些概念性的知識。

2、工具--欲先攻其事,必先利其器

說到開發,當然需要一個開發工具了,在這裡VC是離不開的,但開發驅動,必需還有 另外一個工具要我們選擇。其實也就是用什麼方式來產生驅動的框架,就象VC下的應用程 序可以自動產生一個初始的框架一樣。在這裡,我們有三種方式可以選擇:

從DDK自帶的例子(此時許包含DDK的編譯工具),如usbintel出發編寫,這種方式編 出來的驅動質量應該是最好的,但同時難度也是最大的;

用DriverStudio(此時許包含DDK的編譯工具),其實DriverStudio就是對DDK進行了 封裝,其難度雖然有所下降,但對於我這樣的初學者還是困難重重,有個比喻打的很好, DriverStudio與DDK的關系,就像VC與SDK的關系;

用windriver,正如前面所說,windriver其實帶了一個它自身的驅動(普通模式下), 所以它可以直接與你的硬件通信,當然你需要對你的硬件進行一些設置,如一些產商命令 的發送,也就是是一些寄存器的設置。然而,硬件往往都有很多的寄存器,所以要自己手 動一個個設置顯得很繁瑣,如果你的硬件已經有現成的驅動(如攝像頭),我們就可以借 助像bushound工具跟蹤驅動加載的整個過程,然後自己寫個程序將結果轉換為代碼,再加 上自己需要的特殊設置就可以了,我就是這樣的做的,不過這樣的代碼風格可能顯得很差 。由於在這個過程中你需要對產商命令加以了解,所以看硬件的datasheet是必需的,這 也是我選擇ov511+芯片的攝像頭的原因,它的datasheet是公開的。

3、看linux下源代碼--它山之石,可以攻玉

由於linux是開源項目,所以在windows下沒有的源代碼,在linux往往可以找到對應的 源代碼,攝像頭驅動就是這麼一種情況。攝像頭圖像數據是很不好分析的,就算是ov511+ 攝像頭的未壓縮數據也不好分析,但通過linux的源代碼我們可以發現(320*240, yuv420) :它是通過塊來進行處理的的,一塊384 bytes,256 bytes y,64 bytes u,64 bytes v ,可以發現其一幀數據是不是標准的yuv420格式。所以圖象處理基本流程應為ov511+的 yuv420->標准yuv420->rgb24。如果是對於壓縮的數據,那還要先進行一個解碼的 工作,這也是比較繁瑣的,有耐心的話可以繼續看linux的源代碼,不過我就沒做了。

總結——乘風破浪會有時,直掛雲帆濟滄海

在這次學習的過程,我得出一個經驗是:知識是需要一個積累的過程的,心態要放平 衡,不要急於求成。由於剛開始的時候起點太高(剛開始的時候是想編個通用驅動的),對 難易程度把握不准,自己又沒有基礎,所以很郁悶,但慢慢的,隨著對攝像頭驅動的了解 ,意識到通用其實是很困難的,你需要對各個攝像頭芯片都進行編程,然後集成到一個代 碼裡(個人理解),但有些產商是不公開datasheet,如zc301,這使得開發驅動顯得尤其困 難,所以現在只是選擇了一款芯片:ov511,也是只對其未壓縮數據進行處理了,但總算 是能看到攝像頭的圖象了,雖然這離初始的目標還很遙遠。

下載源代碼:http://www.vckbase.com/code/downcode.asp?id=2909

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved