流式接口驅動程序就是系統提供了一組相同的接口,并導出一組相同的函數,通過修改這些函數達到底層硬件的驅動,稱為流式驅動(個人定義歡迎拍磚)。以下描述均已I/O驅動為例說明。
建立流式驅動需要在BSP的\Src\Drivers目錄下建立一個文件夾存放4個文件,它們分別是.cpp文件、.def文件、Makefile(無擴展名)文件、source(無擴展名)文件。其中.cpp文件主要實現:驅動程序地址空間的分配、動態鏈接庫的入口設置、12個外部入口函數的設置等;.def文件主要是聲明需要輸出的接口函數;Makefile和source是為仿造wince下的driver架構而建立的文件。各個具體函數功能請參看代碼注釋。在建立以上文件后,還需在Platform.reg文件中注冊這個驅動的信息。內容如下
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\GPIODriver]
"Prefix"="GIO" //聲明驅動名稱
"Index"=dword:1
"Dll"="GPIODriver.dll" //動態鏈接庫文件
到此驅動函數基本上完成了,之后的工作就是VS2005創建一些控制界面以及調用這些函數而已。那么對于一些習慣性寫單片機程序的人,可能會有些疑問,在操作I/O時應該需要修改一些寄存器,為什么以上函數代碼均沒有做這方面的工作呢?其實寄存器的地址,以及地址映射在BSP中的.inc文件均有定義。在wince是不用知道這些底層硬件的具體內容,它們對于wince來說就相當一個文件而已。但本質上來說跟編寫單片機程序操作I/O的原理是一樣的,都是將I/O口控制為輸出,在對數據寄存器賦值,只是wince下編程有人給我們做了一部分工作而已,其實就驅動而言,自己直接操作物理地址實現驅動會更易于理解和簡單。
接下來在VS2005建立工程文件,添加相應的按鈕。在按鈕單擊事件函數中添加如下代碼
HANDLE gpiodriver;
gpiodriver=CreateFile(L"GIO1:",GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL );
CDC *pDC = new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_1_OFF,NULL,0,NULL,0,NULL,NULL);
brush.CreateSolidBrush(RGB(0,0,0));
CBrush *pOldBrush = pDC->SelectObject(&brush);
pDC->Ellipse(50,80,70,100);
pDC->SelectObject(pOldBrush);
delete pDC;
各個函數的原型及功能均可以在網上收索到,在此不做解釋(可以在工程文件中看到說明,但由于SDK的不同可能在其他的VS2005的編譯器下加載不成功,或者編譯不成功)接著就是編譯運行了,到此大功告成!