




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、63/63 HYPERLINK WinCE第三方驅(qū)動安裝之二CAB安裝包制作Microsoft Windows CE是緊湊的,高效的操作系統(tǒng),它被廣泛的應(yīng)用在從手持電腦到專門的工業(yè)控制器或消費用電子產(chǎn)品等各種嵌入工業(yè)產(chǎn)品中。英創(chuàng)公司ARM9系列工控主板預(yù)裝了正版Windows CE5.0操作系統(tǒng),并對板上所有硬件資源提供了完備的驅(qū)動支持。隨著WinCE操作系統(tǒng)的廣泛應(yīng)用,越來越多的在PC上使用的硬件設(shè)備提供了對 WinCE系統(tǒng)的支持,如3G模塊,Wi-Fi等。第三方驅(qū)動一般以兩種形式提供,一是動態(tài)鏈接庫(*.dll)加對應(yīng)的注冊表文件(*.reg),另一種是可直接安裝的CAB文件(*.cab)
2、。與動態(tài)鏈接庫加注冊表文件形式的驅(qū)動相比,CAB文件安裝十分方便,不需要了解繁雜的 WinCE INF文件格式或REG文件格式。本文介紹通過WinCE CAB Manager工具將以動態(tài)鏈接庫usbser.dll和注冊表文件usbser.reg形式提供的USB轉(zhuǎn)串口驅(qū)動程序壓縮為可直接在英創(chuàng)主板上安裝的 CAB壓縮包的方法。1、打開WinCE CAB Manager,選擇File-New,運行New Cabinet wizard(CAB新建向?qū)?,選擇“next”直至完成如圖1。 2、在CAB Information上點擊右鍵,選擇Properties(屬性)選項(如圖2),打開CAB包屬性設(shè)
3、置對話框,如圖3。 3、在CAB Properties對話框中(如圖3),填寫Company Name(公司名稱)和Application Name(CAB包名稱)。4、切換至CAB Properties-Installation Directory對話框,設(shè)置CAB包默認安裝路徑,此處設(shè)置為NandFlashUSBDriverDll目錄,如圖4。 5、切換至CAB Properties-Cabinet對話框,設(shè)置處理器類型,Processor可直接選擇為ALL/CEF,如圖5。 6、切換至CAB Properties-Operating System對話框,設(shè)置操作系統(tǒng)版本,設(shè)置為支持CE4
4、.0CE5.0,如圖6。設(shè)置完成后選擇確認完成CAB包屬性設(shè)置。 7、為CAB包增加DLL文件,如圖7,在File標簽上點擊右鍵,選擇Add添加USB轉(zhuǎn)串口驅(qū)動的動態(tài)鏈接庫文件usbser.dll。 8、修改usbser.dll的安裝路徑,在圖8中所示USBSER.DLL上點右鍵,選擇Properties,在彈出的 USBSER.DLL Properties對話框中設(shè)置usbser.dll的安裝路徑,如圖9,選擇%InstallDir%表示使用在第4點中設(shè)置的默認安裝路徑,即將 usbser.dll安裝到NandFlashUSBDriverDll目錄。 9、選擇File-Import-Impo
5、rt form RGE.導(dǎo)入USB轉(zhuǎn)串口驅(qū)動程序?qū)?yīng)的注冊表文件usbser.reg。在導(dǎo)入注冊表時需要注意,第三方驅(qū)動默認安裝目錄往往是windows目錄,因此需要在注冊表文件中將動態(tài)鏈接庫安裝目錄修改為在第4點中指定的目錄NandFlashUSBDriverDll 。圖10是注冊表修改前后的對比。 將上面的工作保存后,一個可在英創(chuàng)主板上安裝的CAB包PL2303_Driver.CAB就制作完成了,下面結(jié)合英創(chuàng)工控主板EM9161,介紹PL2303_Driver.CAB的安裝方法。1、在EM9161的Nandflash目錄下新建UsbDriverDll文件夾。2、將制作好的CAB安裝包PL2
6、303_Driver.CAB拷貝到EM9161 Nandflash,雙擊運行,如圖11,點擊OK完成驅(qū)動程序的安裝。 對于英創(chuàng)公司其它沒有WinCE標準顯示界面的嵌入式主板EM9160、EM9260、EM9360可通過WinCE遠程桌面實現(xiàn)CAB包安裝,安裝過程與EM9161一致。 HYPERLINK o posted 2011-07-25 17:06 Maintell 閱讀(65) 評論(0) HYPERLINK 編輯 HYPERLINK wince下USB設(shè)備驅(qū)動程序隨著USB設(shè)備的不斷增加,我們這些開發(fā)人員也就多了對USB設(shè)備進行驅(qū)動程序開發(fā)的工作。但是對于很多初學(xué)者來說,存在以下三個困
7、難: 一是對WinCE的驅(qū)動程序結(jié)構(gòu)了解得太少,沒辦法得心應(yīng)手的專注于驅(qū)動程序的開發(fā)工作; 二是對WinCE自帶的USB驅(qū)動程序的例子沒有弄懂,看到一大堆文件夾結(jié)構(gòu)和源程序思維混亂; 三是幾乎沒有什么中文的參考資料,不知如何下手。 第三條是很多開發(fā)人員都遇到的,我也一樣,很多朋友問我有沒有什么資料,我也只能說抱歉,因為我也同樣有這個問題,一切都靠自己的黑暗中摸索,因此本文不談第三條。 第一條是可以找到資料的,如Windows CE .NET系統(tǒng)分析與實驗教程,因此本文也不打算在此花費大量筆墨。 這樣,本文的著重點就在第二條上面了,通過本文,我希望能讓更多的朋友理解Windows CE下對USB
8、設(shè)備的驅(qū)動模型與樣例程序中的實現(xiàn)過程,以樣例代碼為基礎(chǔ)理順USB設(shè)備驅(qū)動程序的開發(fā)思路。同樣,本文的讀者對象預(yù)期是入門者和準備著手 USB驅(qū)動開發(fā)的人員,驅(qū)動開發(fā)高手自然就當(dāng)一笑吧。同時寫本文的目的也是履行我半年前答應(yīng)很多朋友的諾言,并向我的慵懶致歉。 好了,在看樣例程序之前,我們還有些東西需要了解,我們就先來看下圖: 在此圖中,我們可以非常清晰的看到主機和物理外設(shè)之間的結(jié)構(gòu)方式,在主機端,通過USBD模塊和HCD模塊使用默認的PIPE訪問一個通用的邏輯設(shè)備,實際上就是說USBD和HCD是一組抽象出來的訪問所有USB設(shè)備的邏輯接口,它們負責(zé)管理所有USB設(shè)備的連接、加載、移除、數(shù)據(jù)傳輸和通用的
9、配置。其中 HCD是主機控制驅(qū)動,是為USBD提供底層的功能訪問服務(wù),USBD是USB總線驅(qū)動,位于HCD的上層,利用HCD的服務(wù)提供較高層次抽象的功能。 由于HCD和USBD都是面向的一致的邏輯設(shè)備接口,那么對于各種各樣的物理設(shè)備,就需要有唯一對應(yīng)的設(shè)備驅(qū)動程序,這就是上圖中最上層的特殊的PIPE所連接的物理設(shè)備和USB設(shè)備驅(qū)動程序。 有了對這個結(jié)構(gòu)的認識,我們可以明確的是我們要寫的就是最上端的USB設(shè)備驅(qū)動程序,在WINCE的樣例程序中也稱為USB Client Driver,它是工作于USBD之上,所以實際上我們的工作就變成了利用USBD提供的接口針對特定的物理設(shè)備來完成USB設(shè)備驅(qū)動程
10、序,而暫時與其他的部分無關(guān)。 好了,先到這,接下來就準備看一些具體的東西吧! 接下來,我們就來分析一下CE中的樣例程序,我用的是4.2版本的,所以下面的內(nèi)容是4.2版本中的程序。這里的程序是通過文件夾的形式組織在一起的,所以我們還是像以前學(xué)習(xí)CE的時候那樣,先來了解與此相關(guān)的文件夾結(jié)構(gòu),如下圖。 在USB文件夾下,分成了CLASS,CLIENTS,COMMON,HCD,INC,USBD幾個文件夾,其中INC和COMMON里面有一個 lock.c的程序,這個程序很明顯是將要被其他USB有關(guān)的驅(qū)動程序所使用的一個鎖,代碼很簡單,只是一個類似臨界區(qū)的封裝體,可以保護多線程對同一內(nèi)存區(qū)域的讀寫訪問,可
11、以先不去管它。CLIENTS文件夾可能最初微軟的開發(fā)人員是用來放置設(shè)備驅(qū)動程序的,但是后來沒有放,而發(fā)布的時候也沒有刪除,所以遺留了下來,里面是個空的文件夾,所以沒用實際用處。USBD和HCD是前述的底層驅(qū)動,里面含有很多子文件夾和程序,由于我們只針對USB設(shè)備驅(qū)動,因此對這兩部分不做分析,不興趣的朋友可以自己去了解。 重點就在CLASS文件夾了,展開來看,里面又包含了COMMON、HID、PRINTER、STORAGE幾個文件夾,同樣,COMMON里面存放的源程序是為HID、PRINTER、STORAGE所共有的。HID是USB輸入設(shè)備如鍵盤/鼠標的樣例驅(qū)動程序,PRINTER是USB打印機
12、的樣例驅(qū)動程序,STORAGE是USB存儲設(shè)備如U盤的樣例程序。 我們此次以USB存儲設(shè)備為例,所以再來展開STORAGE文件夾,其中的INC文件夾里面是頭文件,CLASS是USB存儲設(shè)備的驅(qū)動程序,DISK是磁盤驅(qū)動程序。這里為什么有兩個驅(qū)動程序呢,我來簡要解釋一下。 驅(qū)動程序工作在硬件與操作系統(tǒng)之間,它有兩個功能,一個是 將操作系統(tǒng)轉(zhuǎn)發(fā)來的操作以符合指定硬件設(shè)備的形式控制硬件設(shè)備,另一個是向操作系統(tǒng)提供這個訪問接口。比如說U盤,一方面驅(qū)動程序要把操作系統(tǒng)對U盤的識別、讀、寫等操作轉(zhuǎn)換成U盤的動作,另一方面又告訴操作系統(tǒng)這是個U盤,可以當(dāng)成一個文件夾或文件系統(tǒng)來用,能夠接受標準的文件操作命令
13、。所以此處存在兩個驅(qū)動。 另外還有一個文件夾,WINCE420PUBLICCOMMONDDKINC,這里面是與設(shè)備驅(qū)動有關(guān)的頭文件,對于USB設(shè)備,相關(guān)的文件有 USB100.H, USBTYPES.H, USBDI.H,這里面前兩個里面關(guān)于USB的定義是完全符合USB規(guī)范的,不是隨便定義出來的,而USBDI.H文件里的內(nèi)容就是USBD總線驅(qū)動程序向USB設(shè)備驅(qū)動程序提供的接口描述,在開發(fā)USB設(shè)備驅(qū)動時必須要包含此頭文件,這樣才可以得到USBD接口的原型。 此前,我們共同了解了USB驅(qū)動在CE中的位置結(jié)構(gòu),也了解了樣例驅(qū)動程序的文件夾結(jié)構(gòu),接下來,我們就要了解一下USBD為我們提供了哪些接口
14、來實現(xiàn)設(shè)備訪問以與驅(qū)動程序管理的功能。找到USBDI.H,不要告訴我你找不到吧,不管你用什么編輯器,記事本也好,PB也好,VC/EVC或者VS都行,打開它,我們一起來了解一下USBD為我們提供了什么。 我們首先看到的一個大的結(jié)構(gòu)體就是_USB_DRIVER_SETTINGS,注意這個結(jié)構(gòu)體不是USB規(guī)范中的USB設(shè)備描述,而是為了CE設(shè)備管理器加載USB設(shè)備驅(qū)動程序方便而建立的。該結(jié)構(gòu)體中對供應(yīng)商描述、設(shè)備描述和Interface的描述是用來匹配注冊表中對USB設(shè)備驅(qū)動的注冊表鍵,當(dāng)設(shè)備管理器發(fā)現(xiàn)你設(shè)備的這些值與注冊表中的這些值相符時,就會加載你的驅(qū)動。也就是說它是與你的設(shè)備唯一對應(yīng)的東西,是
15、一種標識。該結(jié)構(gòu)體的供應(yīng)商部分的描述需要根據(jù)你的設(shè)備的供應(yīng)商信息來填,設(shè)備描述的設(shè)備類、子類、協(xié)議等可以在USB規(guī)范中找到,在USB100.H頭文件中也有一部分,在后面的樣例程序中也定義了一部分。 在接下來有三個函數(shù)是必須由USB設(shè)備驅(qū)動程序?qū)崿F(xiàn)的,這也就是我們在MSDN里或其他CE的文檔里所看到的,這幾個函數(shù)就是: USBDeviceAttach:設(shè)備加載的時候由系統(tǒng)調(diào)用 USBInstallDriver:設(shè)備第一次加載的時候由系統(tǒng)調(diào)用,用來安裝注冊表配置以便搜索設(shè)備 USBUnInstallDriver:設(shè)備移除后清理由上一個函數(shù)寫入的注冊表配置 這樣在我們的驅(qū)動程序中就一定要按照這三個函
16、數(shù)的原型來實現(xiàn),否則就不能為設(shè)備管理器所識別。其實除了這三個,個我覺得第四個也是必須的,這就是一個函數(shù)指針所指向的函數(shù): *LPDEVICE_NOTIFY_ROUTINE這個指針所指向的函數(shù)是用來接收通知消息的,既然微軟說任何USB設(shè)備必須實現(xiàn)USB_CLOSE_DEVICE消息的響應(yīng),那么這個指針所指向的函數(shù)自然也就是必須要實現(xiàn)的了。 繼續(xù)向下看,是一組函數(shù)的原型,這些函數(shù)就是USBD向設(shè)備驅(qū)動程序提供的服務(wù)接口,有些函數(shù)是可以任意調(diào)用的,用來完成版本信息讀取、注冊表操作和設(shè)備驅(qū)動程序注冊,這些函數(shù)有:GetUSBDVersion RegisterClientDriverID UnRegis
17、terClientDriverID RegisterClientSettingsUnRegisterClientSettings OpenClientRegistryKey 還有大量的函數(shù)是必須通過指針調(diào)用的,通常只允許在驅(qū)動程序中調(diào)用,為了方例使用,在這里給出一個_USB_FUNCS的結(jié)構(gòu)體,每一個結(jié)構(gòu)體成員對應(yīng)了一個函數(shù)指針,這樣在驅(qū)動程序中要想使用USBD函數(shù)只能通過一個結(jié)構(gòu)體變量來進行了,在這里我們要記住這個結(jié)構(gòu)體的名字,并且微軟還對這個結(jié)構(gòu)體變量進行了以下的類型定義:typedef struct _USB_FUNCS USB_FUNCS, * PUSB_FUNCS, * LPUSB_
18、FUNCS;typedef struct _USB_FUNCS const * PCUSB_FUNCS;typedef struct _USB_FUNCS const * LPCUSB_FUNCS; 好了,到此我們發(fā)現(xiàn),大部分的USB工作都已經(jīng)被USBD完成了,我們?yōu)榱藢崿F(xiàn)自己的設(shè)備驅(qū)動,只需要利用這些指針或函數(shù),來實現(xiàn)四個我們自己的函數(shù),然后在其中匹配上我們自己的設(shè)備就可以了。是不是忒簡單,沒錯,總不能剛開始就把自己嚇得不行,那樣后面可就沒法做了。在上次了解了所有 USBD接口函數(shù)以后,我們已經(jīng)有了很多基礎(chǔ)知識了,回顧USB樣例的文件夾結(jié)構(gòu),我們還能記得USBCLASSCOMMON這個文件夾
19、下是存放所公共部分的源程序,它是微軟專門抽象出來的能為大多數(shù)USB設(shè)備驅(qū)動程序服務(wù)的一些結(jié)構(gòu)體以與函數(shù)的封裝,我們這次再來概略的了解一下這里面的源程序。 這里面包含了三個程序,分別是: remlock usbclient utils 下面我們分別來了解一下這三個程序的功能和接口,很顯然,USB設(shè)備驅(qū)動程序肯定是會用到這其中的一部分函數(shù)的,因此我們不一定需要讀懂這其中的每一行,但至少要對這些函數(shù)有個印象,不至于在讀驅(qū)動程序時不知道函數(shù)的來源。 remlock程序是一個移除設(shè)備的鎖,利用這個結(jié)構(gòu)體 typedef struct _REMOVE_LOCK BOOL Removed; LONG IoC
20、ount; HANDLE RemoveEvent; REMOVE_LOCK, *PREMOVE_LOCK來實現(xiàn)在設(shè)備移除時進行的同步控制。其中Removed成員是對設(shè)備是否已經(jīng)移除的標識,IoCount成員是對設(shè)備進行訪問的數(shù)量,這也是驅(qū)動程序中常用的行為,就像此前我們看到的那個Lock程序一樣,RemoveEvent是一個內(nèi)核事件,熟悉WIN32編程的應(yīng)該都很清楚,它是內(nèi)核通知應(yīng)用程序的一種方式,也是線程這間并發(fā)控制的一種手段,如果不熟悉,還是像我在以前文章中提到的那樣,一定要找WINDOWS高級編程之類的書把它學(xué)明白,否則就很難控制驅(qū)動程序了。 利用它實現(xiàn)的那幾個函數(shù)就不說了,與臨界區(qū)的用
21、法是一樣的。另外提一句,在此程序中有類似InterlockedIncrement這樣的函數(shù),這種函數(shù)是WIN32 API函數(shù),專門用來提供多線程對同一變量的同步訪問的,可以通過MSDN查到詳細用法。 usbclient程序是對USBD進行包裝以供USB設(shè)備驅(qū)動程序使用的函數(shù)接口,通過usbclient.h我們可以發(fā)現(xiàn)里面是關(guān)于數(shù)據(jù)傳輸、屬性設(shè)置、狀態(tài)描述和復(fù)位的一組函數(shù)原形的定義,我們再看usbclient.c文件,這些函數(shù)大部分都擁有一個LPCUSB_FUNCS類型的參數(shù),回顧上次我們對USBD的了解可知,正是通過這一參數(shù)才能訪問USBD提供的服務(wù)功能,瀏覽一下函數(shù)的實現(xiàn)發(fā)現(xiàn),確實每個函數(shù)都
22、是通過這個參數(shù)調(diào)用了USBD的函數(shù),然后處理調(diào)用后的結(jié)果,所以這里只是多了一層封裝,使得驅(qū)動程序的編寫更加清晰易于維護。 另外,這里我們要留意一下IssueBulkTransfer()、IssueInterruptTransfer()、 IssueVendorTransfer() 這三個函數(shù),它們實現(xiàn)了通用的Bulk傳輸、中斷傳輸和自定義的傳輸方式,在驅(qū)動程序中要用得到。 utils程序很簡單,是對注冊表操作的封裝,利用_REG_VALUE_DESCR這個結(jié)構(gòu)體和GetSetKeyValues()函數(shù)可以方便的訪問注冊表,在驅(qū)動程序的安裝中會用得較多。 又說了這么多東西,雖然沒有看多少程序,但
23、我們又離驅(qū)動程序近了一層,至少知道了很多函數(shù)是要在驅(qū)動程序中用到的,如果有興趣,可以具體閱讀每一個函數(shù)的實現(xiàn)方法,但我覺得這并不影響對驅(qū)動程序的開發(fā)。如果是我寫驅(qū)動,在沒有特別的情況下,我會把這些公用的源程序照搬過來,這可是能極大的縮短開發(fā)周期的事哦!正如所料,接下來我們就進入到DRIVERSUSBCLASSSTORAGECLASS文件夾下,接觸USB設(shè)備驅(qū)動程序。 我們先來了解兩個頭文件,分別是STORAGEINCusbmsc.h和STORAGECLASSusbmscp.h,其中前者是USB存儲設(shè)備公用的頭文件,后者是需要按照自己的設(shè)備更改的頭文件。我們先來看前者。 在usbmsc.h這個頭
24、文件中,前邊定義了很多常量,包括子類和協(xié)議的常量,這是從哪里來的呢?前文我們已經(jīng)提到過,這些量值是依據(jù)USB設(shè)備規(guī)范得來的,在規(guī)范上都作了定義,所以此處的值必須與USB規(guī)范中的相一致。再向下的命令塊結(jié)構(gòu)體和數(shù)據(jù)塊結(jié)構(gòu)體是用來與USB設(shè)備通訊用的,可以通過這兩個結(jié)構(gòu)體的實例與USB設(shè)備傳輸數(shù)據(jù)。 下面的函數(shù)原型就不說了,前文提到過,在這里只記得有這幾個函數(shù)就行了。 再來看usbmscp.h這個頭文件,這個頭文件是要按照自己的需要和USB設(shè)備來進行修改的,比如DRIVER_NAME_SZ是驅(qū)動程序的名字,RESET_TIMEOUT 是一個超時的默認值。還有很重要的一個就是USBMSC_DRIVER
25、_SETTINGS的設(shè)置,這個設(shè)置是與USBDI.H中的 USB_DRIVER_SETTINGS結(jié)構(gòu)體一一對應(yīng)的,為了符合我自己的設(shè)備,通常要把dwVendorId和dwProductId等設(shè)置成設(shè)備的對應(yīng)值,比如我的U盤的VendorID是0 x058F,ProductID是0 x9321,那我就會把這兩個值對應(yīng)的寫在相應(yīng)的位置上。同時在系統(tǒng)注冊表中也會利用這兩個值修改注冊表的鍵以便設(shè)備管理器可以順利的找到我的設(shè)備驅(qū)動。 下面還有一個_USBMSC_DEVICE結(jié)構(gòu)體,它是用來描述你自己的USB存儲設(shè)備的,是封裝了USBD函數(shù)表指針、磁盤設(shè)備指針、管道和配置項的最重要的數(shù)據(jù)結(jié)構(gòu),在驅(qū)動程序?qū)?/p>
26、現(xiàn)上此數(shù)據(jù)結(jié)構(gòu)就是重點的參數(shù),鑒于樣例程序?qū)γ恳粋€結(jié)構(gòu)體元素都作了明確的注釋,此處我就不一一描述了,它就像C+中的類一樣,是最后把一些小類組合起來的可以最終使用的結(jié)構(gòu)。 好了,對這兩個頭文件有所了解以后,我們就進入最關(guān)鍵的部分,源程序。我們接下來來看usbmsc.c這個文件。為什么要先看這個文件而不是同一文件夾下的其他幾個文件呢?我來解釋一下。在這個文件夾中有一個usbmsc.def的文件,大家都知道它是定義了導(dǎo)出函數(shù)的,通常與它同名的程序文件都會含有 DllEntry的入口,既然入口在這,那我們自然就先來看這個文件了。如果用到了其他的文件,再看不遲。 這可是一個有1000多行的源程序,但不要
27、害怕,我們只看最主要的,別的函數(shù)的實現(xiàn)你可以自己去研究。首先看到文件的DllEntry入口之前有5個函數(shù)原型的定義,從函數(shù)名上就可以知道這個函數(shù)的功能了,很顯然這幾個函數(shù)是程序?qū)崿F(xiàn)過程中被調(diào)用的,所以目前知道功能就行了,不用了解實現(xiàn)方法。忘了說一句,這個程序中包含了bot.h和cbit.h兩個頭文件,可見程序中是要用到它們的功能的,不過先不管它,繼續(xù)往下看。 DllEntry入口函數(shù)的下面,就是USBInstallDriver()這個函數(shù)了,它的作用是進行與USB設(shè)備相關(guān)的注冊表操作,主要的語句是:bRc = RegisterClientDriverID( wsUsbDeviceID );bR
28、c = RegisterClientSettings( szDriverLibFile, wsUsbDeviceID, NULL, &usbDriverSettings );即先注冊設(shè)備類別,然后是設(shè)備細節(jié)。 同樣,USBUnInstallDriver()函數(shù)是以相反的順序解除注冊信息的。 這幾個與注冊有關(guān)的函數(shù)在前面我們提到過,是由USBD接口提供的,這里我們可以看到USBD對設(shè)備驅(qū)動程序的重要性。 在繼續(xù)向下看,我們發(fā)現(xiàn)了USBDeviceAttach()函數(shù),這可是最重要的地方了,當(dāng)有USB設(shè)備插入插口以后,操作系統(tǒng)是如何識別它的呢,如何將其做為一個文件夾加以訪問的呢?我們就來解開這里的
29、謎團。 為了我們方便說明,我將此程序簡化如下: 后面的程序?qū)⒁源诵刑栠M行說明。 我們來看程序的第4行,這里有一個判斷語句,它是在判斷插入的設(shè)備是否是USBMSC_INTERFACE_CLASS類型的,這個常量是在usbmsc.h文件中定義的,也就是說如果設(shè)備不是USB存儲設(shè)備,那么就結(jié)束這個函數(shù),也就是此驅(qū)動只能處理USB存儲設(shè)備。 當(dāng)發(fā)現(xiàn)設(shè)備符合此驅(qū)動程序的要求后,就通過函數(shù)ParseUsbDescriptors()來解析這個設(shè)備,這個函數(shù)在下面的程序中將被實現(xiàn),我們可以看一下該函數(shù)的函數(shù)體,很顯然,它是在為設(shè)備進行各種配置,這就不多說它了。 再往下,分配內(nèi)存,設(shè)置標志,從注冊表中讀取信息。
30、注意,這里讀取到的注冊表信息是DriversUSBClientDrivers Mass_Storage_Class和bInterfaceSubClass變量組合成的注冊表鍵下的值,具體可參閱源程序,這個注冊表鍵下放置的內(nèi)容是HKEY_LOCAL_MACHINEDriversUSBClientDriversMass_Storage_Class6DLL=USBDISK6.DLLPrefix=DSKFolder=USB DiskIOCTL=dword:4IClass=A4E7EDDA-E575-4252-9D6B-4195D48BB865由此可以看出,通過此處的注冊表讀取,驅(qū)動程序可以知道這個設(shè)備將
31、通過哪種形式以與哪個DLL向操作系統(tǒng)提供接口。同時也為后續(xù)的操作進行了準備。 最關(guān)鍵的部分就在接下來的LoadDriver()那句,加載了另一個驅(qū)動程序的DLL文件,就是上述注冊表中的USBDISK6.DLL文件,計數(shù)器增一,取到該文件中UsbDiskAttach函數(shù)與UsbDiskDetach函數(shù)的地址,注冊事件通知處理函數(shù),然后調(diào)用了該DLL文件中的 UsbDiskAttach函數(shù)。 由此可見,USB設(shè)備驅(qū)動程序有兩層功能,一方面是識別出指定的設(shè)備并進行配置,另一方面按照要求調(diào)用更高層的驅(qū)動程序來向操作系統(tǒng)提供接口。當(dāng)調(diào)用了 USBDISK6.DLL后,操作系統(tǒng)就會按該文件中的程序以一個磁
32、盤的形式或文件夾的形式進行處理,通過文件系統(tǒng)的操作,就可以對其進行讀寫控制了。我們也可以看一下HID設(shè)備的這個函數(shù),它也是通過這種方式讓操作系統(tǒng)知道把USB設(shè)備識別成鼠標設(shè)備的。 前文我們說過還有一個通知消息的回調(diào)函數(shù),我們在剛才的程序體中已經(jīng)發(fā)現(xiàn)通過:UsbFuncs-lpRegisterNotificationRoutine( hDevice, UsbDeviceNotify, pUsbDevice );語句已經(jīng)對這個函數(shù)進行了設(shè)置。我們再向下來看一下這個函數(shù)的函數(shù)體。這個函數(shù)很簡單,只要對USB_CLOSE_DEVICE消息進行處理,既然是要關(guān)閉 USB設(shè)備,那么調(diào)用USBDISK6.D
33、LL中的Detach函數(shù)是必須的,讓上層的驅(qū)動程序進行釋放,然后將引用計數(shù)減一,如果不再有設(shè)備引用此驅(qū)動程序,則FreeLibrary(),僅此而已。 其余的函數(shù)可以再仔細研究一下,在此就不詳細描述了,接下來我們要弄明白的就是到底操作系統(tǒng)是如何通過抽象的DISK讀寫具體的設(shè)備呢? 帶著上次留下的疑問,我們繼續(xù)來學(xué)習(xí)操作系統(tǒng)如何通過USBDISK讀寫USB設(shè)備的。我們先看USBCLASSSTORAGEDISK SCSI2usbdisk6.def文件。在這個文件中可以看到,該DLL一共導(dǎo)出了14個函數(shù),其中兩個是上次內(nèi)容當(dāng)中被設(shè)備驅(qū)動程序調(diào)用的 UsbDiskAttach和UsbDiskDetac
34、h,余下的是一組以DSK開頭的流驅(qū)動接口,易見,USBDISK是以流驅(qū)動的形式向操作系統(tǒng)提供服務(wù)的。 為了清晰起見,以下大量的程序我們并不學(xué)習(xí),而只關(guān)心設(shè)備讀寫,因此我們來看DISK.C這個程序文件。找到DSK_Read和DSK_Write兩個函數(shù),令我們大失所望,因為這兩個函數(shù)都是形如UNREFERENCED_PARAMETER(pDevice);UNREFERENCED_PARAMETER(pBuffer);UNREFERENCED_PARAMETER(BufferLength);DEBUGMSG(ZONE_ERR,(TEXT(DSK_Readn);SetLastError(ERROR_I
35、NVALID_FUNCTION);return 0;這樣的實現(xiàn),也就是說用戶無法通過常規(guī)的Read函數(shù)使用這個設(shè)備,那怎么辦?是否意味著這個DISK無法讀寫呢?當(dāng)然不是,我們應(yīng)該馬上想到DSK_IOControl()這個函數(shù),當(dāng)遇到某些設(shè)備無法用常規(guī)的文件操作函數(shù)操作時,我們有DeviceIoControl()用戶函數(shù)可以使用,而這個函數(shù)就會調(diào)用到驅(qū)動程序中的DSK_IOControl函數(shù)。 在這個函數(shù)中,我們找到了對IOCTL_DISK_READ等命令的處理程序,其中最關(guān)鍵的一句就是ScsiRWSG(pDevice, pSgReq, pDevice-Lun, bRead),即調(diào)用了一個Scs
36、iRWSG的函數(shù)。 在Scsi2.c這個程序中,我們找到了這個函數(shù),其中SG指的是一種讀寫緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu),實際上就是帶有緩沖區(qū)與長度的一個結(jié)構(gòu)體,是CE下磁盤設(shè)備通用的讀寫數(shù)據(jù)結(jié)構(gòu),可以在diskio.h中找到它的定義。在這個函數(shù)中我們發(fā)現(xiàn)它再次調(diào)用了ScsiReadWrite()這個函數(shù)進行讀寫操作,找到這個函數(shù),里面有我們最重要的一行調(diào)用,即調(diào)用了UsbsDataTransfer()函數(shù),還記得這個函數(shù)在哪見過嗎?沒錯,就是在USB設(shè)備的驅(qū)動程序當(dāng)中。 通過這一過程我們發(fā)現(xiàn),那些Scsi的函數(shù)都只是在準備一些緩沖區(qū)、數(shù)據(jù)結(jié)構(gòu)等,并沒有對硬件進行操作,真正要操作硬件設(shè)備的還是由驅(qū)動程序來完
37、成的,可見,設(shè)備驅(qū)動程序是有著很強層次結(jié)構(gòu)的,下層是專門針對物理設(shè)備的,上層是針對操作系統(tǒng)的抽象設(shè)備的,下層是U盤等物理實體,上層是文件夾,二者通過一定的通信或調(diào)用機制完成了設(shè)備在操作系統(tǒng)下的正常工作。 回到usbmsc.c程序中來,找到UsbsDataTransfer函數(shù),這個函數(shù)很簡單,根據(jù)傳輸協(xié)議調(diào)用CBIT_DataTransfer()或BOT_DataTransfer() 即可。 HYPERLINK o hive/2009/03/04/1403463.htmlposted 2011-07-25 17:05 Maintell 閱讀(55) 評論(0) HYPERLINK 編輯 HYPE
38、RLINK 利用EVC快速開發(fā)WINCE5.0的流驅(qū)動(轉(zhuǎn)載)WinCE5.0提供了一個標準的流驅(qū)動格式,大大方便了設(shè)備驅(qū)動程序的開發(fā)工作。但是傳統(tǒng)的開發(fā)方式往往效率很低。方法如下: 1.在Platform Builder下建立一個流驅(qū)動的dll工程。 2.為流驅(qū)動增加注冊表項。如: HKEY_LOCAL_MACHINEDriversBuiltinIRControl Prefix=IRC Dll=irc.dll Order=dword:66 Index=dword:1 3.修改platform.bib文件,將流驅(qū)動的dll文件打包到NK.bin. 4.MakeImg,生成包含流驅(qū)動的NK.BI
39、N. 整個過程煩瑣,而且只要稍加修改,就要重先makeImg,大概要浪費3-5分鐘.這種開發(fā)效率是很低的. 下面2種介紹在EVC下快速開發(fā)WINCE流驅(qū)動的方法,是我自己親身經(jīng)驗,拿出來與大家分享,也希望和各高手相互學(xué)習(xí)和探討. WINCE 的驅(qū)動,不象桌面windows驅(qū)動開發(fā)那樣煩瑣,windows驅(qū)動開發(fā)分好幾種,如wdm啦,VXD啦,等等,開發(fā)這些驅(qū)動需要專門的開發(fā)環(huán)境和工 具,給開發(fā)者帶來比較高的技術(shù)門檻.所幸的是,WinCE的驅(qū)動開發(fā),沒有這么多的限制和門檻.而且應(yīng)用程序可以直接和底層硬件打交道的(注:盡管這樣,筆者還是不建議大家直接用應(yīng)用程序訪問底層硬件,這種做法是不安全的),甚
40、至中斷初始化,中斷線程都可以在用戶級的應(yīng)用程序完成.所以給驅(qū)動開發(fā)帶來了不少的便利. 依我自己的經(jīng)驗來看,具體有以下2種方法. 1.利用EVC生成驅(qū)動的DLL. 1).新建一個evc的dll工程,將流驅(qū)動代碼移植到evc代碼中。 2).編寫導(dǎo)出文件*.def,將流驅(qū)動的10個標準函數(shù)導(dǎo)出.并在ProjectSettingLinkProject options里面標注,如:/def:IR.DEF .(這一步如果不做,生成的驅(qū)動將不可用) 3).編譯代碼,這個時候一般會出現(xiàn)一些錯誤,如找不到頭文件或庫文件等錯誤,請在wince的安裝目錄下找到相應(yīng)的頭文件和庫文件,在 ToolsoptionsDir
41、ectories中指明頭文件和庫文件的路徑。在 ProjectSettinglink中指定相應(yīng)的*.obj文件(具體文件視源代碼調(diào)用了哪些驅(qū)動和庫,到wince的目 錄下找到這些obj文件鏈接進來即可) 4).編寫一個應(yīng)用程序來調(diào)試驅(qū)動.利用RegisterDevice/DeRegisterDevice動態(tài)加載/卸載流驅(qū)動,模擬WinCE設(shè)備管理程序的功能. 以上這種方法,完全脫離了Platform Builder的開發(fā)環(huán)境,使驅(qū)動的開發(fā)和調(diào)試工作象開發(fā)應(yīng)用程序一樣輕松和快捷.可以在驅(qū)動程序中利用RETAILMSG函數(shù)從UART口輸出調(diào)試信息. 2.利用EVC將驅(qū)動程序?qū)懗蒭xe,直接象調(diào)試應(yīng)
42、用程序一樣調(diào)試驅(qū)動. 最后將調(diào)試好的源代碼移植到驅(qū)動程序的dll工程中去.具 體方法和第一種方法類似,不同之處在于,前者是新建一個純DLL工程(帶導(dǎo)出函數(shù)),后者是新建一個MFC的exe工程而已.編譯的頭文件和庫文件方法2 者雷同.這種方法的好處是可以直接編譯成evc的debug工程,可以在源代碼中進行單步跟蹤調(diào)試和設(shè)置斷點,大大的提高了驅(qū)動程序的調(diào)試效率. HYPERLINK o posted 2011-07-25 17:04 Maintell 閱讀(19) 評論(0) HYPERLINK 編輯 HYPERLINK WinCE流驅(qū)動加載的控制 (轉(zhuǎn)載)前段時間整理了 HYPERLINK Wi
43、nCE下調(diào)試串口的動態(tài)復(fù)用,基本實現(xiàn)了調(diào)試串口與普通功能串口之間的動態(tài)切換。其中實現(xiàn)的方法有點欠缺,在重新燒錄或者升級系統(tǒng)后,導(dǎo)致系統(tǒng)無法正常啟動。這算是個BUG。該功能加上才幾天,就陸續(xù)有好幾個同事碰到。本來想著使用方便的,沒想到反而增添了一些麻煩。 這個問題在實現(xiàn)時曾考慮到,發(fā)布版本的日志里也加了說明,如果啟用了調(diào)試串口,那么在燒錄或者升級系統(tǒng)前,須禁用調(diào)試串口。說實在的,確實有點麻煩,不小心就忘了做這個工作。而問題的根源是實現(xiàn)機制不太合理。調(diào)試串口的配置被分散在兩處,一處是存儲在NAND Flash的特定區(qū)域,另一處是注冊表中。系統(tǒng)啟動時,OAL根據(jù)Flash中保存的狀態(tài),確定是否啟用調(diào)
44、試串口,而驅(qū)動加載時又根據(jù)注冊表的狀態(tài),確定是否加載調(diào)試串口的驅(qū)動。兩處保存的狀態(tài)不同步時,問題就出現(xiàn)了。問題分析清楚了,解決方法自然就有了,保證兩處的狀態(tài)一致即可。 調(diào)試串口的配置由存儲在NAND Flash中的參數(shù)決定,系統(tǒng)啟動時根據(jù)該值,動態(tài)修改調(diào)試串口對應(yīng)的注冊表配置,確保在啟用調(diào)試串口時,不再加載它所對應(yīng)的驅(qū)動,也就不會產(chǎn)生沖突,導(dǎo)致系統(tǒng)無法正常啟動了。 在驅(qū)動注冊表中,F(xiàn)lags是用于控制流驅(qū)動的加載行為的。其中DEVFLAGS_NOLOAD即表示不要加載該驅(qū)動。所以,在合適的地方添加如下代碼,即可控制調(diào)試串口驅(qū)動的加載。 HYPERLINK l viewSource o view
45、 source view source HYPERLINK l printSource o print print HYPERLINK l about o ? ?void DisableDebugSerial(BOOL bDisable) HKEY Key; DWORD Status; DWORD Disposition; DWORD Value; DWORD Flags; Status = RegCreateKeyEx(HKEY_LOCAL_MACHINE, LDriversBuiltInSerial3, 0, NULL, 0, 0, NULL, &Key, &Disposition); i
46、f (Status = ERROR_SUCCESS) Value = bDisable ? DEVFLAGS_NONE : DEVFLAGS_NOLOAD; RegSetValueEx(Key, DEVLOAD_FLAGS_VALNAME, 0, DEVLOAD_FLAGS_VALTYPE, (PBYTE)&Value, sizeof(Value); RegCloseKey(Key); 如果禁用了調(diào)試串口,則將Flag是設(shè)置為DEVFLAGS_NONE,設(shè)備管理器將正常加載驅(qū)動。如果沒有禁用調(diào)試串口,則將Flags設(shè)置為DEVFLAGS_NOLOAD,設(shè)備管理器就不會加載該驅(qū)動。 通過以上方法
47、的改進,調(diào)試串口的動態(tài)復(fù)用就更方便了。 HYPERLINK o posted 2011-07-25 16:35 Maintell 閱讀(18) 評論(0) HYPERLINK 編輯 HYPERLINK WinCE6添加對MFC的支持 轉(zhuǎn)載WinCE6默認情況下不支持MFC,在PB里面也沒有與其有關(guān)的組件可以添加。要想讓W(xué)inCE6支持MFC,就要手動拷貝一些DLL,然后修改bib文件,把這些需要的DLL打包進NK。 需要的DLL在Program FilesMicrosoft Visual Studio 8VCceDllarmv4i下可以找到。下面是我打包進NK的DLL。 在bib文件中添加:
48、MFC80ENU.DLL $(_FLATRELEASEDIR)MFC80ENU.DLL NK SH atl80.dll $(_FLATRELEASEDIR)atl80.dll NK SH MFC80CHS.DLL $(_FLATRELEASEDIR)MFC80CHS.DLL NK SH msvcr80d.dll $(_FLATRELEASEDIR)msvcr80d.dll NK SH msvcr80.dll $(_FLATRELEASEDIR)msvcr80.dll NK SH MFC80UD.DLL $(_FLATRELEASEDIR)MFC80UD.DLL NK SH MFC80U.DLL
49、 $(_FLATRELEASEDIR)MFC80U.DLL NK SH 轉(zhuǎn)自: HYPERLINK o posted 2011-07-25 16:30 Maintell 閱讀(10) 評論(0) HYPERLINK 編輯 HYPERLINK o Day Archive 2011年7月24日 HYPERLINK Wince初級篇(轉(zhuǎn)載)一、初級問答1、wince驅(qū)動它以什么形式存在呢?dll2、怎么把它加到wince內(nèi)核中呢?platform.bib3、如何在開機時自動加載內(nèi)核里面的驅(qū)動呢?platform.reg4、XIP是什么?Execute in place (XIP),即本地執(zhí)行。本地執(zhí)
50、行區(qū)域中,程序可以在ROM中執(zhí)行,而不用復(fù)制到RAM中,節(jié)省了系統(tǒng)資源。5、訪問寄存器1、#define rRTCCON (*(volatile unsigned char *)0 x57000043) /RTC control這有點類似absacc.h中XBYTE的定義2、define XBYTE (unsigned char volatile xdata *) 0) 其中volatile英文愿意為易變的,此處為易變量,是可能指由外部因素改變的變量,如外部設(shè)備的寄存器(volatile unsigned char *)0 x57000043這個表達式是強制轉(zhuǎn)換0 x57000043為易變的無
51、符號指針類型,將其作為地址來使用。相當(dāng)于volatile unsigned char *p;p = 0 x57000043;然后對p進行引用*(volatile unsigned char *)0 x57000043也就是指向了寄存器絕對地址為0 x57000043,然后按照定義宏的習(xí)慣,將之用括號小心的包起來。然后就可以對寄存器進行讀寫啦。二、中級問答1、如何快速編譯Wince系統(tǒng)呢?命令行編譯:build -c 命令buildrel 命令makeimg 命令 or 點擊build按鈕2、驅(qū)動相關(guān)CEC特性目錄集合文件定義定義要將哪些特性集成到開發(fā)環(huán)境中,并加入到操作系統(tǒng)鏡像中CEC文件簡單
52、的說,就是把自己編寫的應(yīng)用程序、驅(qū)動程序、第三方驅(qū)動加載到W特性目錄中,使建立平臺時可以像添加自帶特性一樣添加自己的特性。而不是每建一個平臺都要在Project.bib,Project.reg,Project.dat中重復(fù)寫很多東西。 BIB文件 二進制鏡像編譯文件加入定義哪些模塊與文件,如何包含在操作系統(tǒng)的鏡像中。 REG文件 注冊文件系統(tǒng)冷啟動時建立注冊鍵與變量(注冊表)流接口驅(qū)動程序流接口函數(shù)使得應(yīng)用程序可以通過文件系統(tǒng)訪問這些驅(qū)動程序。流接口驅(qū)動程序幾乎支持任何類型的可以連接到基于WINCE的平臺的外部設(shè)備。我理解為通過該驅(qū)動使得應(yīng)用程序訪問到任何ARM外的設(shè)備,比如一個IO,讓燈亮。
53、驅(qū)動分為:本機驅(qū)動:WINCE專用驅(qū)動(如電源和LED),由GWES管理流接口驅(qū)動:一般的設(shè)備驅(qū)動程序,以DLL的形式出現(xiàn)單片驅(qū)動分層驅(qū)動:上層是MDD,模塊設(shè)備驅(qū)動程序model device driver下層是PDD,平臺設(shè)備驅(qū)動程序Platform Dependent Driver 中斷處理函數(shù)armint.c中斷使能cfw.c 包含硬件訪問地址的注冊表項platform.regposted 2011-07-24 16:32 Maintell 閱讀(41) 評論(0) HYPERLINK 編輯 HYPERLINK Windows CE的嵌入式系統(tǒng)的結(jié)構(gòu)要進行嵌入式系統(tǒng)的應(yīng)用開發(fā),必須先建
54、立一個開發(fā)平臺。一個基于Windows CE 的平臺由Windows CE 操作系統(tǒng)核組件、OEM 適配層(OEM Adaptation Layer ,OAL) 和設(shè)備驅(qū)動程序以與組成系統(tǒng)的硬件設(shè)備組成,圖1為基于Windows CE平臺的層次結(jié)構(gòu)。 從圖1中可以看出,一個基于Windows CE 的嵌入式系統(tǒng)可分為四個層次,從底層到上層分別是硬件層、OEM層、操作系統(tǒng)層和應(yīng)用程序?qū)印S布邮窍到y(tǒng)的硬件,包括微處理器和各種周邊設(shè)備。OEM層是一個硬件抽象層,它提供了硬件和操作系統(tǒng)之間的接口,操作系統(tǒng)要訪問具體的硬件就可以通過OEM層提供的API 進行訪問,而不必直接與硬件打交道。操作系統(tǒng)層中有
55、Windows CE 的組件,用戶可以根據(jù)自己的系統(tǒng)的需要進行定制,選擇需要的組件,去掉不必要的組件,這樣可以減小內(nèi)存需求,使系統(tǒng)性能達到最佳。應(yīng)用程序?qū)邮怯脩魹樘囟ǖ那度胧较到y(tǒng)開發(fā)的應(yīng)用程序。 在操作系統(tǒng)層中,設(shè)備管理器提供對可安裝設(shè)備的支持,允許在系統(tǒng)中安裝諸如PC 卡存儲器和調(diào)制解調(diào)器之類的設(shè)備已擴充功能,內(nèi)核提供最基本的操作系統(tǒng)功能,例如進程調(diào)度、內(nèi)存管理、進程通信等。圖形、窗口事件處理模塊將用戶的擊鍵、鼠標移動和控件選擇轉(zhuǎn)換為消息,傳送給應(yīng)用程序和操作系統(tǒng)來處理用戶的輸入。對象存儲、文件系統(tǒng)、數(shù)據(jù)庫和注理用戶的輸入。對象存儲、文件系統(tǒng)、數(shù)據(jù)庫和注冊表提供存儲數(shù)據(jù)的能力。附加技術(shù)模塊指
56、由CE操作系統(tǒng)提供的一些可選擇的專用功能模塊,如Java語言支持模塊、手寫體輸入識別模塊等。用戶界面模塊為系統(tǒng)提供一個與PC 電腦上的視窗操作系統(tǒng)類似的圖形化操作界面。對系統(tǒng)設(shè)計者而言,需要自行開發(fā)的是應(yīng)用程序和直接與硬件有關(guān)的部分,包括硬件系統(tǒng)本身、OAL 、設(shè)備驅(qū)動程序。其中,OAL 是指建立在硬件設(shè)備與系統(tǒng)內(nèi)核之間的一層代碼,主要任務(wù)是為內(nèi)核管理具體的硬件設(shè)備時鐘、中斷和實施電源管理提供支持。設(shè)備驅(qū)動程序負責(zé)支持操作系統(tǒng)對目標硬件的訪問。OAL 和驅(qū)動程序都要針對具體的硬件設(shè)備編寫。 一般硬件設(shè)備制造商會為設(shè)備提供驅(qū)動軟件支持,如果有專門為CE 系統(tǒng)編寫的驅(qū)動程序,只需將其加入到操作系統(tǒng)
57、的相應(yīng)模塊中就可用了。如果沒有,則應(yīng)根據(jù)廠商提供的驅(qū)動程序開發(fā)包編寫。通常這些開發(fā)包總已經(jīng)包含了完成各種硬件操作的標準代碼,開發(fā)者的工作只是將其與相應(yīng)的CE 系統(tǒng)API函數(shù)對應(yīng)起來。在CE 系統(tǒng)中,所有涉與硬件的操作都通過調(diào)用相應(yīng)的API 接口函數(shù)來完成,而OAL 和驅(qū)動程序就是要為這些API 函數(shù)提供支持,將其翻譯為直接對目標硬件進行底層操作。通過這種方式,CE 系統(tǒng)將應(yīng)用程序與具體的硬件設(shè)備進行了隔離,應(yīng)用程序只需調(diào)用API 函數(shù)就可以實現(xiàn)對硬件的訪問。這樣,程序員在開發(fā)應(yīng)用程序時就沒有必要編寫任何直接針對硬件的代碼,因此不必考慮具體的硬件特性,而應(yīng)用程序也具有了不依賴于具體硬件設(shè)備的獨立
58、性。 posted 2011-07-24 16:30 Maintell 閱讀(12) 評論(0) HYPERLINK 編輯 HYPERLINK Windows CE驅(qū)動分類Windows CE提供了許多用于開發(fā)設(shè)備驅(qū)動的模型,這些驅(qū)動程序模型使得Windows CE 能適應(yīng)大部分的內(nèi)部和外圍設(shè)備。因此,在深入探討Windows CE矩陣鍵盤驅(qū)動程序之前,先了解在WinCE平臺上使用的兩種設(shè)備:內(nèi)建設(shè)備和可安裝設(shè)備。因此,從驅(qū)動加載方式來看WinCE可分為本機設(shè)備驅(qū)動(Built-In Driver)、可加載驅(qū)動(Loadable Driver)。 本機設(shè)備驅(qū)動即Native Device Dr
59、ivers,WinCE設(shè)計成可直接使用內(nèi)建設(shè)備,這些設(shè)備由本機驅(qū)動過程控制。本機驅(qū)動程序是與WinCE的核心組件緊密相連,這些驅(qū)動對應(yīng)的設(shè)備通常在系統(tǒng)啟動時,在GWES的進程空間內(nèi)被加載,因此它們不是以獨立的DLL形式存在??杉虞d設(shè)備是指可與平臺連接和分離的第三方接口設(shè)備,可由用戶隨時安裝和卸載這些驅(qū)動,可以在系統(tǒng)啟動時或者和啟動后的任何時候由設(shè)備管理器動態(tài)加載。通常這類驅(qū)動是以DLL動態(tài)鏈接庫的形式存在,系統(tǒng)加載后這些驅(qū)動程序是以用戶態(tài)的角色運行,這種外圍設(shè)備的驅(qū)動也被稱為流驅(qū)動。 兩者的差別在于它們提供的編程接口不同:本地設(shè)備驅(qū)動可以根據(jù)具體設(shè)備的需求提供本機的相應(yīng)接口;而流接口驅(qū)動則是提
60、供一組通用接口即流接口函數(shù),應(yīng)用程序可以通過流接口提供的接口函數(shù)來訪問外圍設(shè)備。posted 2011-07-24 16:22 Maintell 閱讀(39) 評論(0) HYPERLINK 編輯 HYPERLINK WinCE USB驅(qū)動開發(fā)的簡介與內(nèi)容隨著USB2.0設(shè)備的不斷增加,USB設(shè)備驅(qū)動開發(fā)在嵌入式開發(fā)中變的越來越重要。Windows CE支持USB 2.0更是對這一波新技術(shù)浪潮產(chǎn)生巨大的推動。本文的作者分析了自己進行USE驅(qū)動開發(fā)的經(jīng)歷,希望可以讓讀者少走一些彎路。 隨著USB2.0設(shè)備的不斷增加,USB設(shè)備驅(qū)動開發(fā)在嵌入式開發(fā)中變的越來越重要。Windows CE支持USB
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鞋子工廠供貨合同范本
- 合伙生意協(xié)議合同范本
- 合作研發(fā)合同范本
- 合伙投資工地協(xié)議合同范本
- 變更工商合同范本
- 合同范本結(jié)婚
- 合同范本此致
- 合同范本鄭州
- 出口材料貿(mào)易合同范本
- 使用物質(zhì)合同范例
- 2025年買賣雙方合同模板
- 最專業(yè)的企業(yè)介紹模板課件
- 2025國家電投集團資本控股限公司本部招聘11人高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2025年湖南中醫(yī)藥高等專科學(xué)校高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2024新版人教PEP英語(2025春)七年級下冊教學(xué)課件:Unit2 Reading Plus
- 2025年山東司法警官職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2024年05月湖南招商銀行長沙分行長期社會招考筆試歷年參考題庫附帶答案詳解
- 鐵路信號基礎(chǔ)設(shè)備維護(第二版) 課件 項目一 信號繼電器檢修
- 2025新人教版英語七年級下單詞英譯漢默寫表(小學(xué)部分)
- 江蘇省南京市2024年中考英語試題(含解析)
- 2025年匯成集團招聘筆試參考題庫含答案解析
評論
0/150
提交評論