建立流式驱动需要在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的编译器下加载不成功,或者编译不成功)接着就是编译运行了,到此大功告成!