• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            玩心未泯

            卡爾斯希普拉斯

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              19 Posts :: 0 Stories :: 98 Comments :: 0 Trackbacks
                之前公司由于項(xiàng)目需要讓我研究PDA上的WinCE系統(tǒng)下的USB外設(shè)驅(qū)動(dòng)開(kāi)發(fā),剛剛有點(diǎn)入門(mén)的感覺(jué)結(jié)果又終止了這個(gè)計(jì)劃,我也一直在郁悶這個(gè)事情,不想現(xiàn)如今,機(jī)會(huì)又來(lái)了。我又開(kāi)始了驅(qū)動(dòng)開(kāi)發(fā)的研究學(xué)習(xí)之旅,這里將繼續(xù)記錄我的心得體會(huì)。
                之前的入門(mén)記錄(二)已經(jīng)講到了USBDeviceAttach函數(shù),原形這里再列一下:

            BOOL USBDeviceAttach(USB_HANDLE hDevice, LPCUSB_FUNCS lpUsbFuncs,
                                 LPCUSB_INTERFACE lpInterface, LPCWSTR szUniqueDriverId,
                                 LPBOOL fAcceptControl,
                                 LPCUSB_DRIVER_SETTINGS lpDriverSettings, DWORD dwUnused);

            不過(guò)(二)只談到了它的第一個(gè)參數(shù)hDevice,調(diào)用一句:  LPCUSB_DEVICE lpUsbDev = (lpUsbFuncs->lpGetDeviceInfo)(hDevice); 
            就能夠獲得一個(gè)USB_DEVICE的指針,然后順藤摸瓜可以看到這個(gè)設(shè)備的許多信息,被命名為Descriptor的,PC上有一個(gè)軟件叫USBView的可以看到接到USB口上的設(shè)備信息,讀取的應(yīng)該就是這個(gè)結(jié)構(gòu)。我當(dāng)時(shí)傻乎乎的,自己寫(xiě)打印函數(shù),在驅(qū)動(dòng)程序加載的時(shí)候把這些信息MessageBox顯示出來(lái):P,所以呢,今天這篇先討論一下關(guān)于這個(gè)驅(qū)動(dòng)的調(diào)試問(wèn)題。在MSDN上有關(guān)于wince驅(qū)動(dòng)程序調(diào)試的專(zhuān)題,大體是介紹使用PB開(kāi)發(fā)驅(qū)動(dòng)的情況下測(cè)試、調(diào)試驅(qū)動(dòng)程序的,而我是用EVC4開(kāi)發(fā)的,沒(méi)有那個(gè)什么(名字忘記了:P),沒(méi)法調(diào)試。當(dāng)研究一些驅(qū)動(dòng)的源代碼的時(shí)候,最開(kāi)始看到的那些 DEBUGMSG、DEBUGZONE還有個(gè)叫什么什么tail的那些宏,其實(shí)都是在PB的調(diào)試環(huán)境下用的, 功能應(yīng)該是類(lèi)似TRACE之類(lèi)的,打印一些信息到Output窗口的,因?yàn)闆](méi)有那個(gè)調(diào)試環(huán)境,所以這些東東都沒(méi)法用了,因此要看我的驅(qū)動(dòng)加載過(guò)程中的一些信息,要么就是打印到文件,要么就是用MessageBox了,我選擇用MessageBox直觀的顯示,呵呵,笨笨的辦法還是很好用的,跟設(shè)斷點(diǎn)似的。
                 下面繼續(xù)說(shuō)USBDeviceAttach函數(shù),其第二個(gè)參數(shù)lpUsbFuncs,這個(gè)是一個(gè)函數(shù)指針數(shù)組,有點(diǎn)vtable的味道,具體的看看USB_FUNCS這個(gè)結(jié)構(gòu)的聲明就差不多了,在MSDN中也能夠通過(guò)這個(gè)結(jié)構(gòu)查看其所有指向的函數(shù)的調(diào)用方法及用途。在驅(qū)動(dòng)程序中,往往要用到這個(gè)vtable中的很多函數(shù),所以我們需要把這個(gè)vtable保存下來(lái)備用,如何保存和備用我會(huì)在下篇中寫(xiě)明白,在Attach過(guò)程中還需要保存很多有用的東東。
                 那么繼續(xù)往下,lpInterface,一個(gè)指向USB_INTERFACE的指針,我一直對(duì)這個(gè)參數(shù)沒(méi)太弄明白,我在這個(gè)函數(shù)里面得到的這個(gè)指針是一個(gè)空指針,而看別人的代碼中間,當(dāng)這個(gè)指針為空的時(shí)候attach是返回FALSE的,顯然對(duì)我這種情況是不適用的,我后來(lái)想想,覺(jué)得大概是因?yàn)槲业耐庠O(shè)Interface的class、subclass、protocol都是0,所以才出現(xiàn)這種情況吧(準(zhǔn)確的說(shuō)是因?yàn)槲以赨SBInstallDriver函數(shù)中,RegisterClientDriverID調(diào)用給的參數(shù)USB_DRIVER_SETTINGS結(jié)構(gòu)體中關(guān)于Interface的幾個(gè)變量值我全給的USB_NO_INFO,我后來(lái)嘗試賦值為0,結(jié)果就得到了非空的Interface指針)。那么對(duì)于我這種情況,interface是個(gè)空指針該怎么辦呢?可以用USB_FUNCS中的lpFindInterface來(lái)“找出”合適的Interface指針,具體的用法還是看官自己研究MSDN吧。
                 其實(shí)猛地一下蹦出一個(gè)Interface的概念,估計(jì)初次接觸的都會(huì)有點(diǎn)糊涂,我當(dāng)時(shí)也很糊涂,Interface在現(xiàn)如今含義太多了,不過(guò)可以肯定這里的不是COM中的Interface~:),在查閱資料的時(shí)候,我找到了它的確切定義:
             USB peripheral devices consist of one or more logical components that implement the abilities of the devices. These components are called interfaces.Each interface typically provides some useful grouping of functionality, but exactly what constitutes an interface is an implementation detail. For example, a USB mouse device could present one interface for horizontal and vertical movement information and a separate interface for left and right button information. As another option, the device could present a single interface containing all of the information. Both are valid approaches, but each approach has implications for how the device driver must operate.
            這段話我就不翻譯了,本來(lái)英文就不怎么地,翻譯過(guò)來(lái)有誤導(dǎo)之嫌,還是留給大家原汁原味的比較好。
                其實(shí)研究wince的驅(qū)動(dòng),或者單純的講USB驅(qū)動(dòng),還是應(yīng)該了解一下wince下USB的驅(qū)動(dòng)模型的,貌似很簡(jiǎn)單的一個(gè)模型,但是好像還沒(méi)有能夠找到比較精辟的闡述講解,看著MSDN能夠讓你看睡著了也不知所云,只能是邊研究邊體會(huì),我很想在我的文章里對(duì)這個(gè)模型進(jìn)行一番講解,但是發(fā)現(xiàn)自己也沒(méi)有理解到能夠給別人講解的地步。
                好了,不廢話了,繼續(xù)就Interface這個(gè)指針繼續(xù)往下談,我看了PB下的USB Printer的驅(qū)動(dòng)源碼,在這個(gè)階段它調(diào)用了SetInterface這個(gè)函數(shù),我也依葫蘆畫(huà)瓢,調(diào)用了,但卻阻塞在這個(gè)調(diào)用上不能繼續(xù),至今我仍不知道是什么原因。這也可以說(shuō)是我目前的疑問(wèn)點(diǎn)之一,文中我用特殊顏色標(biāo)記出來(lái),有朋友能夠解疑釋惑的可以和我聯(lián)系,我自己研究出來(lái)了,以后也會(huì)在后記中加上其答案。
                其它的似乎就沒(méi)有太多好說(shuō)的了,直接在MSDN中間都能夠看懂是干什么,今天就先寫(xiě)到這里,下次再寫(xiě)的內(nèi)容就和我的外設(shè)有很直接的關(guān)系了,只能是根據(jù)我外設(shè)的具體情況介紹我探索驅(qū)動(dòng)開(kāi)發(fā)的經(jīng)歷。我的外設(shè)還算比較簡(jiǎn)單的,只有兩個(gè)BULK的EndPoint,什么是EndPoint?呵呵~~留給看官自己研究下吧~

            BTW:經(jīng)過(guò)幾天的摸索,我終于完成了我的外設(shè)的驅(qū)動(dòng)開(kāi)發(fā),看著測(cè)試程序成功的打開(kāi)設(shè)備,寫(xiě)數(shù)據(jù)又讀數(shù)據(jù),心中無(wú)比欣慰~~不過(guò)由于寫(xiě)程序的時(shí)候是摸著石頭過(guò)河,而且到后來(lái)才如愿以?xún)數(shù)目吹搅薖B下USBPrinter的源代碼,才發(fā)現(xiàn)自己的程序結(jié)果實(shí)在有點(diǎn)混亂。這兩天再調(diào)整調(diào)整,USBPrinter的源代碼中果然還是有不少可以借鑒的東西。

            2007.8.6后記:“好”日子差不多又要到頭了,這次驅(qū)動(dòng)開(kāi)發(fā)的成果在我看來(lái)才只是剛剛可用而已,已經(jīng)調(diào)配我做別的事情了,這方面的研究又要被停止下來(lái)了。之后一段時(shí)間估計(jì)很難抽出時(shí)間自己繼續(xù)深入研究了,回頭看看自己寫(xiě)的東西居然沒(méi)有介紹LPBOOL fAcceptControl這個(gè)參數(shù),不過(guò)好在介紹這個(gè)參數(shù)的文章也比較多,簡(jiǎn)單來(lái)說(shuō),它是一個(gè)輸出參數(shù)。當(dāng)把它指向的那個(gè)變量賦值為真的時(shí)候,我們的設(shè)備驅(qū)動(dòng)程序就取得了設(shè)備的控制權(quán)了,系統(tǒng)也就不會(huì)再繼續(xù)為之尋找匹配的驅(qū)動(dòng)了(我的理解是這樣,不知是否有錯(cuò)誤)。這里小小的后記補(bǔ)充一下。入門(mén)記錄(四)可能會(huì)在更晚的時(shí)候,抽時(shí)間紀(jì)錄下來(lái),希望到時(shí)我還記得我要寫(xiě)些什么~:)
            posted on 2007-08-01 15:20 SuperPlayeR 閱讀(3737) 評(píng)論(7)  編輯 收藏 引用 所屬分類(lèi): WinCE/Mobile應(yīng)用開(kāi)發(fā)

            評(píng)論

            # re: WinCE下驅(qū)動(dòng)開(kāi)發(fā)入門(mén)記錄(三) 2007-08-02 09:37 SuperPlayeR
            昨晚上睡覺(jué)之前順手把一本買(mǎi)了很久卻一直沒(méi)看的書(shū)拿起來(lái)翻了翻,linux設(shè)備驅(qū)動(dòng)程序,看了看關(guān)于usb驅(qū)動(dòng)的章節(jié),發(fā)現(xiàn)當(dāng)初如果剛開(kāi)始研究的時(shí)候就看看這個(gè),可能會(huì)少走不少?gòu)澛?,至少什么是Configuration,什么是Interface,什么是EndPoint它都介紹清楚了~:P
            今天如果有時(shí)間,我繼續(xù)寫(xiě)(四),介紹一下。  回復(fù)  更多評(píng)論
              

            # re: WinCE下驅(qū)動(dòng)開(kāi)發(fā)入門(mén)記錄(三) 2007-08-08 16:08 internetcai
            轉(zhuǎn)發(fā)了你的文章.........
            謝謝你分享經(jīng)驗(yàn)..


            轉(zhuǎn)到www.arm9bbs.com  回復(fù)  更多評(píng)論
              

            # re: WinCE下驅(qū)動(dòng)開(kāi)發(fā)入門(mén)記錄(三) 2007-08-18 21:48 nonono
            期待4......
            謝謝!  回復(fù)  更多評(píng)論
              

            # re: WinCE下驅(qū)動(dòng)開(kāi)發(fā)入門(mén)記錄(三) 2007-08-28 17:23 raul
            多謝樓主的分享  回復(fù)  更多評(píng)論
              

            # re: WinCE下驅(qū)動(dòng)開(kāi)發(fā)入門(mén)記錄(三)[未登錄](méi) 2007-11-20 11:15 hh
            SetInterface被阻塞的原因是因?yàn)槟愕脑O(shè)備不支持這個(gè)函數(shù)的實(shí)現(xiàn),一般來(lái)說(shuō),你不用設(shè)置Interface就可以使用USB設(shè)備了,SetInterface是在設(shè)備有多個(gè)接口的情況下,需要設(shè)置,但是絕大部分設(shè)備都是一個(gè)接口,因此不用設(shè)置。
              回復(fù)  更多評(píng)論
              

            # re: WinCE下驅(qū)動(dòng)開(kāi)發(fā)入門(mén)記錄(三)[未登錄](méi) 2007-11-30 15:31 Ken
            樓上說(shuō)得沒(méi)錯(cuò),還有,CE下面很多類(lèi)似的函數(shù)不必調(diào)用的。
            對(duì)這個(gè)SetInterface來(lái)說(shuō),只需要填充其pipes信息,
            指定傳輸類(lèi)型等參數(shù),再用lpUsbFuncs里面的open打開(kāi)pipes
            就好。  回復(fù)  更多評(píng)論
              

            # re: WinCE下驅(qū)動(dòng)開(kāi)發(fā)入門(mén)記錄(三) 2008-09-25 15:45 lannier
            我馬上也要在手持設(shè)備上開(kāi)發(fā)USB驅(qū)動(dòng),并要實(shí)現(xiàn)USB口和RS232之間的轉(zhuǎn)換。剛?cè)腴T(mén)理不清頭緒希望大俠給點(diǎn)建議
            看了你的文章有點(diǎn)小感悟  回復(fù)  更多評(píng)論
              

            国产精品久久久天天影视| 伊人色综合久久天天人手人婷| 久久久久久久女国产乱让韩| 国产日韩久久免费影院| 久久精品国产福利国产秒| 久久午夜电影网| 久久美女网站免费| 久久香蕉一级毛片| 久久av免费天堂小草播放| 九九久久精品国产| 久久亚洲国产成人影院网站| 久久天天躁狠狠躁夜夜不卡| 香蕉久久影院| 丁香色欲久久久久久综合网| 久久香蕉国产线看观看精品yw| 日产精品久久久一区二区| 久久99精品久久久久久久久久 | 久久99国产精品成人欧美| 久久se精品一区精品二区国产| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 老色鬼久久亚洲AV综合| 欧洲成人午夜精品无码区久久| www久久久天天com| 国产A级毛片久久久精品毛片| 午夜精品久久影院蜜桃| 无码人妻精品一区二区三区久久久| 久久精品国产亚洲AV无码偷窥| 久久人妻无码中文字幕| 久久综合亚洲欧美成人| 国产99精品久久| 午夜精品久久久久久| 久久99精品久久久久久动态图| 三级片免费观看久久| 99国产精品久久| 久久99这里只有精品国产| 久久久久免费视频| 久久亚洲私人国产精品vA| 久久丝袜精品中文字幕| 婷婷伊人久久大香线蕉AV | 亚洲伊人久久成综合人影院| 99久久99久久精品免费看蜜桃|