WinCE下驅動開發入門記錄 三

2021-04-22 10:57:20 字數 2868 閱讀 9629

之前公司由於專案需要讓我研究pda上的wince系統下的usb外設驅動開發,剛剛有點入門的感覺結果又終止了這個計畫,我也一直在鬱悶這個事情,不想現如今,機會又來了。我又開始了驅動開發的研究學習之旅,這裡將繼續記錄我的心得體會。

之前的入門記錄(二)已經講到了usbdeviceattach函式,原形這裡再列一下:

bool usbdeviceattach(usb_handle hdevice, lpcusb_funcs lpusbfuncs,

lpcusb_inte***ce lpinte***ce, lpcwstr szuniquedriverid,

lpbool facceptcontrol,

lpcusb_driver_settings lpdriversettings, dword dwunused);

不過(二)只談到了它的第乙個引數hdevice,呼叫一句: lpcusb_device lpusbdev = (lpusbfuncs->lpgetdeviceinfo)(hdevice);

就能夠獲得乙個usb_device的指標,然後順藤摸瓜可以看到這個裝置的許多資訊,被命名為descriptor的,pc上有乙個軟體叫 usbview的可以看到接到usb口上的裝置資訊,讀取的應該就是這個結構。我當時傻乎乎的,自己寫列印函式,在驅動程式載入的時候把這些資訊 messagebox顯示出來:p,所以呢,今天這篇先討論一下關於這個驅動的除錯問題。在msdn上有關於wince驅動程式除錯的專題,大體是介紹使 用pb開發驅動的情況下測試、除錯驅動程式的,而我是用evc4開發的,沒有那個什麼(名字忘記了:p),沒法除錯。當研究一些驅動的源**的時候,最開 始看到的那些 debugmsg、debugzone還有個叫什麼什麼tail的那些巨集,其實都是在pb的除錯環境下用的, 功能應該是類似trace之類的,列印一些資訊到output視窗的,因為沒有那個除錯環境,所以這些東東都沒法用了,因此要看我的驅動載入過程中的一些 資訊,要麼就是列印到檔案,要麼就是用messagebox了,我選擇用messagebox直觀的顯示,呵呵,笨笨的辦法還是很好用的,跟設斷點似的。

下面繼續說usbdeviceattach函式,其第二個引數lpusbfuncs,這個是乙個函式指標陣列,有點vtable的味道,具體的看看 usb_funcs這個結構的宣告就差不多了,在msdn中也能夠通過這個結構檢視其所有指向的函式的呼叫方法及用途。在驅動程式中,往往要用到這個 vtable中的很多函式,所以我們需要把這個vtable儲存下來備用,如何儲存和備用我會在下篇中寫明白,在attach過程中還需要儲存很多有用的 東東。

那麼繼續往下,lpinte***ce,乙個指向usb_inte***ce的指標,我一直對這個引數沒太弄明白,我在這個函式裡面得到的這個指標是乙個 空指標,而看別人的**中間,當這個指標為空的時候attach是返回false的,顯然對我這種情況是不適用的,我後來想想,覺得大概是因為我的外設 inte***ce的class、subclass、protocol都是0,所以才出現這種情況吧(

準 確的說是因為我在usbinstalldriver函式中,registerclientdriverid呼叫給的引數 usb_driver_settings結構體中關於inte***ce的幾個變數值我全給的usb_no_info,我後來嘗試賦值為0,結果就得到了 非空的inte***ce指標)。那麼對於我這種情況,inte***ce是個空指標該怎麼辦呢?可以用usb_funcs中的lpfindinte***ce來「找出」合適的inte***ce指標,具體的用法還是看官自己研究msdn吧。

其實猛地一下蹦出乙個inte***ce的概念,估計初次接觸的都會有點糊塗,我當時也很糊塗,inte***ce在現如今含義太多了,不過可以肯定這裡的不是com中的inte***ce~:),在查閱資料的時候,我找到了它的確切定義:

這段話我就不翻譯了,本來英文就不怎麼地,翻譯過來有誤導之嫌,還是留給大家原汁原味的比較好。

其實研究wince的驅動,或者單純的講usb驅動,還是應該了解一下wince下usb的驅動模型的,貌似很簡單的乙個模型,但是好像還沒有能夠找到比 較精闢的闡述講解,看著msdn能夠讓你看睡著了也不知所云,只能是邊研究邊體會,我很想在我的文章裡對這個模型進行一番講解,但是發現自己也沒有理解到 能夠給別人講解的地步。

好了,不廢話了,繼續就inte***ce這個指標繼續往下談,

我看了pb下的usb printer的驅動原始碼,在這個階段它呼叫了setinte***ce這個函式,我也依葫蘆畫瓢,呼叫了,但卻阻塞在這個呼叫上不能繼續,至今我仍不知道是什麼原因。這也可以說是我目前的疑問點之一,文中我用特殊顏色標記出來,有朋友能夠解疑釋惑的可以和我聯絡,我自己研究出來了,以後也會在後記中加上其答案。

其它的似乎就沒有太多好說的了,直接在msdn中間都能夠看懂是幹什麼,今天就先寫到這裡,下次再寫的內容就和我的外設有很直接的關係了,只能是根據我外 設的具體情況介紹我探索驅動開發的經歷。我的外設還算比較簡單的,只有兩個bulk的endpoint,什麼是endpoint?呵呵~~留給看官自己研 究下吧~

btw:經過幾天的摸索,我終於完成了我的外設的驅動開發,看著測試程式成功的開啟裝置,寫資料又讀資料,心中無比欣慰~~不過由於寫程式的時候是摸著石 頭過河,而且到後來才如願以償的看到了pb下usbprinter的源**,才發現自己的程式結果實在有點混亂。這兩天再調整調整,usbprinter 的源**中果然還是有不少可以借鑑的東西。

2007.8.6後記:「好」日子差不多又要到頭了,這次驅動開發的成果在我看來才只是剛剛可用而已,已經調配我做別的事情了,這方面的研究又要被停止下 來了。之後一段時間估計很難抽出時間自己繼續深入研究了,回頭看看自己寫的東西居然沒有介紹lpbool facceptcontrol這個引數,不過好在介紹這個引數的文章也比較多,簡單來說,它是乙個輸出引數。當把它指向的那個變數賦值為真的時候,我們的 裝置驅動程式就取得了裝置的控制權了,系統也就不會再繼續為之尋找匹配的驅動了(我的理解是這樣,不知是否有錯誤)。這裡小小的後記補充一下。入門記錄 (四)可能會在更晚的時候,抽時間紀錄下來,希望到時我還記得我要寫些什麼~:)

WinCE下驅動開發入門記錄 一

這兩天時間完全泡在ce的驅動開發中,學習學習,感覺就是資料不好找,難入門難上手,象我這樣僅僅只有evc4的更是沒法除錯沒法跟蹤,困難還是挺多的。學習了兩天,現在感覺有那麼點意思了,記錄一下與大家分享。首先說明一下,我可能仍然是個門外漢,因為以前基本沒做過和硬體相關的東西,這方面知識缺乏的要命,現在公...

WINCE下的USB驅動開發

首先usb載入式流介面驅動要點分析 為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。1 usb系統結構分析 wince下usb系統軟體由兩層組成...

WINCE下的USB驅動開發

首先usb載入式流介面驅動要點分析 為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。1 usb系統結構分析 wince下usb系統軟體由兩層組成...