1、基礎知識:
1)系統呼叫是作業系統核心和應用程式之間的介面,裝置驅動程式是作業系統核心和機器硬體之間的介面。裝置驅動程式為應用程式遮蔽了硬體細節,在應用程式看來硬體只是乙個裝置檔案,應用程式可以像操作普通檔案一樣對硬體裝置進行操作。裝置驅動是核心的一部分。
2)驅動程式完成以下功能:
——對裝置初始化和釋放;
——把資料從核心傳送到硬體和從硬體讀取資料;
——讀取應用程式傳送給裝置檔案的資料和回送應用程式請求的資料;
——檢測和處理裝置出現的錯誤。
3)上層應用程式執行在使用者模式(非特權模式,ring 3),**被嚴格約束執行。如不能執行硬體io指令。所有的這些被阻止的操作如果想執行必須通過陷阱門來請求作業系統核心。
4)作業系統核心執行在核心模式(特權模式,ring 0),可以執行所有有效的cpu指令。包括io操作,可訪問任何記憶體區。
5)整個硬體系統資源在驅動程式面前是赤裸裸的,驅動可以使用所有系統資源,編寫驅動程式時我們必須格外小心驅動**的邊界條件,確保它們不會損壞整個作業系統。
2、windows支援的驅動:
1)虛擬裝置驅動程式(virtual device driver):windows3.1(windows95/98/me)
2)核心模式驅動程式(kernel mode driver):windows nt
3)win32驅動程式模型(win32 driver mode):從windows98開始使用。
其中wdm是目前主流,然而在wince系統中,由於硬體資源有限和嵌入式系統的特點,對其的支援非常有限。
3、wince系統驅動簡介:
1)wince畢竟是乙個嵌入式系統,有其自身的特殊性,為了提高執行效率,所有驅動皆為動態鏈結庫,驅動實現中可以呼叫所有標準的api。而在其他windows系統中可能的驅動檔案還有.vxd, .sys和動態鏈結庫。
2)wince驅動從結構上講分為本地驅動(native driver)和流介面驅動(stream driver)。
——本地驅動主要用於低階、內建的裝置。實現它們的介面並不統一,而是針對不同型別的裝置相應設計。因此開發過程相對複雜,沒有固定的模式,一般做法是通過移植、定製現有的驅動樣例來實現。
——流介面驅動是最基本的一種驅動結構,它的介面是一組固定的流介面函式,具有很高的通用性,wince的所有驅動程式都可以通過這種方式來實現。流介面驅動程式通過檔案系統呼叫從裝置管理器和應用程式接收命令。該驅動程式封裝了將這些命令轉換為它所控制的裝置上的適當操作所需的全部資訊。
流介面驅動是動態鏈結庫,由乙個叫做裝置管理程式的特殊應用程式載入、管理和解除安裝。與本地驅動程式相比,所有流介面驅動程式使用同一組介面函式集,包括實現函式:***_init、***_deinit、***_open、***_close、***_read、***_write、***_powerup、***_powerdown、***_seek、***_iocontrol,這些函式與硬體打交道。使用者函式:createfile、deviceiocontrol、 readfile、 writefile,這些函式方便使用者使用驅動程式。
3)wince下驅動的載入方式:
——通過gwes(graphics, windowing, and events subsystem):主要載入與顯示和輸入有關的驅動,如滑鼠、鍵盤驅動等。這些驅動一般為本地驅動。
——通過裝置管理器:兩種結構的驅動都載入,載入的本地驅動主要由pcmcia host controller,usb host controller driver,主要是匯流排類的驅動;流介面驅動主要有音訊驅動,串並口驅動。
——動態載入:前兩者都是系統啟動時載入的,動態載入則允許裝置掛載上系統時將驅動調入核心,主要有外接板卡驅動,usb裝置驅動等。
4、流介面驅動函式介紹:
1)dword ***_init(lpctstr pcontext, lpcvoid lpvbuscontext);
pcontext:指向乙個字串,包含登錄檔中該流接**動鍵值的路徑
lpvbuscontext:
該函式是驅動掛載後第乙個被執行的。主要負責完成對裝置的初始化操作和驅動的安全性檢查。由activedeviceex通過裝置管理器呼叫。其返回值一般是乙個資料結構指標,作為函式引數傳遞給其他流介面函式。
2)bool ***_deinit(dword hdevicecontext);
hdevicecontext:***_init的返回值。
整個驅動中最後執行。用來停止和解除安裝裝置。由deactivatedevice觸發裝置管理器呼叫。成功返回true。
3)dword ***_open(dword hdevicecontext, dword accesscode , dword sharemode);
hdevicecontext:***_init的返回值。
accesscode:訪問模式標誌,讀、寫或其他。
sharemode:驅動的共享方式標誌。
開啟裝置,為後面的操作初始化資料就夠,準備相應的資源。應用程式通過createfile函式間接呼叫之。返回乙個結構指標,用於區分哪個應用程式呼叫了驅動,這個值還作為引數傳遞給其他介面函式***_read、***_write、***_seek、***_iocontrol。
4)bool ***_close(dword hopencontext);
hopencontext:***_open返回值。
關閉裝置,釋放資源。由closehandle函式間接呼叫。
5)dword ***_read(dword hopencontext, lpvoid pbuffer, dword count);
hopencontext:***_open返回值。
pbuffer:緩衝區指標,接收資料。
count:緩衝區長度。
由readfile函式間接呼叫,用來讀取裝置上的資料。返回讀取的實際資料位元組數。
6)dword ***_write(dword hopencontext, lpcvoid pbuffer, dword count);
hopencontext:***_open返回值。
pbuffer:緩衝區指標,接收資料。
count:緩衝區長度。
由writefile函式間接呼叫,把資料寫到裝置上,返回實際寫入的資料數。
7)bool ***_iocontrol(dword hopencontext, dword dwcode, pbyte pbufin, dword dwlenin, pbyte pbufout, dword dwlenout, pdword pdwactualout);
hopencontext:***_open返回值。
dwcode:控制命令字。
pdwactualout:實際輸出資料長度。
用於向裝置傳送命令,應用程式通過deviceiocontrol呼叫來實現該功能。要呼叫這個介面還需要在應用層和驅動之間建立一套相同的命令,通過巨集定義ctl_code(devicetype, function, method, access來實現。如:
#define ioctl_init_ports \ ctl_code(file_device_unknown,0x801,method_buffered,file_any_access)
8)void ***_powerdown(dword hdevicecontext);
hdevicecontext:***_init的返回值。
負責裝置的上電控制。
9)void ***_powerup(dword hdevicecontext);
hdevicecontext:***_init的返回值。
負責裝置的斷電控制
10) dword ioc_seek(dword hopencontext, long amount, word type)
hopencontext:***_open返回值。
amount:指標的偏移量。
type:指標的偏移方式。
將裝置的資料指標指向特定的位置,應用程式通過setfilepointer函式間接呼叫。不是所有裝置的屬性上都支援這項功能。
5、流介面驅動的載入和登錄檔設定:
系統啟動時啟動裝置管理程式,裝置管理程式讀取hkey_local_machine\drivers\builtin鍵的內容並載入已列出的流介面驅動程式。因此登錄檔對於驅動的載入有著關鍵作用。下面是乙個例子:
【hkey_local_machine\drivers\builti\iocontroler】
「prefix」=」***」
「dll」=」drivername.dll」
其中,「prefix」=「***」中的***要和***_init等函式中的一樣。createfile建立的驅動名字首也必須和它們一致。
1)首先必須在pb相應平台的的driver目錄下建立要建立的驅動所在的目錄。如在x:\wince420\platform\smdk2410\drivers目錄下建立乙個ioctrol目錄。
2)修改drivers目錄下的dirs檔案。
3)建立驅動原始檔***.c,在該檔案中實現上述流介面函式。並且加入dll入口函式:
bool dllentry(hinstance hinstdll, /*@parm instance pointer. */
dword dwreason, /*@parm reason routine is called. */
lpvoid lpreserved /*@parm system parameter. */
) 4)建立makefile和sources和.def檔案,控制編譯。
5)使用cec editor修改cec檔案,編譯新增的新特性。
6)複製新生成的4個檔案到release目錄下,修改登錄檔檔案platform.reg和platform.bib檔案。
7)make image。
8)download image。
WinCE驅動編寫小結
原文 1 基礎知識 1 系統呼叫是作業系統核心和應用程式之間的介面,裝置驅動程式是作業系統核心和機器硬體之間的介面。裝置驅動程式為應用程式遮蔽了硬體細節,在應用程式看來硬體只是乙個裝置檔案,應用程式可以像操作普通檔案一樣對硬體裝置進行操作。裝置驅動是核心的一部分。2 驅動程式完成以下功能 對裝置初始...
wince下裝驅動
前邊說了如何在開發版上裝wince.現在我手上有乙個usb的攝像頭,為了要他能在開發板上使用,我得給他裝上驅動.產家提供了dll和需要修改登錄檔的說明.下邊說下步驟,開啟之前做wince核心定製燒寫的工程,把驅動檔案,假設叫a.dll,拷貝到工程目錄下,d wince420 public wince...
wince 驅動練習
wince 驅動練習 寫乙個 led 的驅動 準備放到流驅動中 c wince600 platform smdk2440a src drivers gpio 資料夾 複製到當前目錄並改名為 led 並修改 drivers 資料夾下dir 檔案 新增 led c wince600 platform s...