wince驱动编程经典教程.docx
《wince驱动编程经典教程.docx》由会员分享,可在线阅读,更多相关《wince驱动编程经典教程.docx(15页珍藏版)》请在冰豆网上搜索。
![wince驱动编程经典教程.docx](https://file1.bdocx.com/fileroot1/2023-1/4/97e00f3e-b221-4862-ad03-327543591612/97e00f3e-b221-4862-ad03-3275435916121.gif)
wince驱动编程经典教程
mydriver.def中加入:
LIBRARYmydriver
EXPORTS
XXX_Close
XXX_Deinit
XXX_Init
XXX_IOControl
XXX_Open
XXX_PowerDown
XXX_PowerUp
XXX_Read
XXX_Seek
XXX_Write
XXX:
必须是三个字母
Platform.bib文件中加入:
mydriver.dll$(_FLATRELEASEDIR)\mydriver.dllNKSHK
Platform.reg文件中加入:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\mydriver]
"Prefix"="XXX"
"Dll"="mydriver.dll"
"Order"="200"
驱动文件CPP中必须实现以下函数:
以读取按键IO为例
#include
#include
#include
#include"pmplatform.h"
#include"Pkfuncs.h"
#include"s2440.h"
volatileIOPreg*s2440IOP=(IOPreg*)IOP_BASE;
volatileINTreg*s2440INT=(INTreg*)INT_BASE;
voidVirtual_Alloc();//Virtualallocation
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
voidVirtual_Alloc()
{
//GPIOVirtualalloc
s2440IOP=(volatileIOPreg*)VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE,PAGE_NOACCESS);
if(s2440IOP==NULL)
{
RETAILMSG(1,(TEXT("Fors2440IOP:
VirtualAllocfaiLED!
\r\n")));
}
else
{
if(!
VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE|PAGE_NOCACHE))
{
RETAILMSG(1,(TEXT("Fors2440IOP:
VirtualCopyfaiLED!
\r\n")));
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOLWINAPI
DllEntry(HANDLEhinstDLL,
DWORDdwReason,
LPVOID/*lpvReserved*/)
{
switch(dwReason)
{
caseDLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
returnTRUE;
caseDLL_THREAD_ATTACH:
break;
caseDLL_THREAD_DETACH:
break;
caseDLL_PROCESS_DETACH:
break;
#ifdefUNDER_CE
caseDLL_PROCESS_EXITING:
break;
caseDLL_SYSTEM_STARTED:
break;
#endif
}
returnTRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOLKIO_Deinit(DWORDhDeviceContext)
{
RETAILMSG(1,(TEXT("USERLED:
LED_Deinit\r\n")));
returnTRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOLKIOGpioInit()
{
s2440IOP->rGPGCON=(s2440IOP->rGPGCON&0xfffffffc);//GPG0==输入
s2440IOP->rGPGCON=(s2440IOP->rGPGCON&0xffffff3f);//GPG3==输入s2440IOP->rGPGCON=(s2440IOP->rGPGCON&0xfffff3ff);//GPG5==输入s2440IOP->rGPGCON=(s2440IOP->rGPGCON&0xffffcfff);//GPG6==输入
returnTRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORDKIO_Init(DWORDdwContext)
{
RETAILMSG(1,(TEXT("LED_Init----\r\n")));
//1.VirtualAlloc
Virtual_Alloc();
KIOGpioInit();
returnTRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOLKIO_IOControl(DWORDhOpenContext,
DWORDdwCode,
PBYTEpBufIn,
DWORDdwLenIn,
PBYTEpBufOut,
DWORDdwLenOut,
PDWORDpdwActualOut)
{
RETAILMSG(1,(TEXT("LED:
Ioctlcode=0x%x\r\n"),dwCode));
returnTRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORDKIO_Open(DWORDhDeviceContext,DWORDAccessCode,DWORDShareMode)
{
RETAILMSG(1,(TEXT("USERLED:
LED_Open\r\n")));
returnTRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOLKIO_Close(DWORDhOpenContext)
{
RETAILMSG(1,(TEXT("USERLED:
LED_Close\r\n")));
returnTRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
voidKIO_PowerDown(DWORDhDeviceContext)
{
RETAILMSG(1,(TEXT("USERLED:
LED_PowerDown\r\n")));
}
voidKIO_PowerUp(DWORDhDeviceContext)
{
RETAILMSG(1,(TEXT("USERLED:
LED_PowerUp\r\n")));
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORDKIO_Read(DWORDhOpenContext,LPVOIDpBuffer,DWORDCount)
{
if(Count<4||pBuffer==NULL)
{
returnFALSE;
}
constcharIndex[]={0,3,5,6,};
for(inti=0;i<4;i++)
{
intbit_index=Index[i];
booldown=!
(s2440IOP->rGPGDAT&(1<KeyValues[i]=down;
RETAILMSG(0,(L"%s",down?
L"1":
L"0"));
}
memcpy(pBuffer,KeyValues,4);
RETAILMSG(1,(TEXT("USERLED:
LED_Read\r\n")));
returnTRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORDKIO_Seek(DWORDhOpenContext,longAmount,DWORDType)
{
RETAILMSG(1,(TEXT("USERLED:
LED_Seek\r\n")));
return0;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORDKIO_Write(DWORDhOpenContext,LPCVOIDpSourceBytes,DWORDNumberOfBytes)
{
RETAILMSG(1,(TEXT("USERLED:
LED_Write\r\n")));
return0;
}
接下来如何在上位机中调用这些函数操作硬件呢?
这里以一个读取按键的上位机程序为例!
结合上面的按键驱动。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Runtime.InteropServices;//重要引入名字空间
namespaceminiKey
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
privateinthKey=-1;//定义按键的句柄
privateconstuintGENERIC_READ=0x80000000;//不重要
privateconstuintGENERIC_WRITE=0x40000000;
privateconstintOPEN_EXISTING=3;
privateconstintINVALID_HANDLE_VALUE=-1;
//导入win32的库函数
[DllImport("coredll.dll")]
privatestaticexternintCreateFile(
stringlpFileName,//要打开的串口名称
uintdwDesiredAccess,//指定串口的访问方式,一般设置为可读可写方式
intdwShareMode,//指定串口的共享模式,串口不能共享,所以设置为0
intlpSecurityAttributes,//设置串口的安全属性,WIN9X下不支持,应设为NULL
intdwCreationDisposition,//对于串口通信,创建方式只能为OPEN_EXISTING
intdwFlagsAndAttributes,//指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信
inthTemplateFile//对于串口通信必须设置为NULL
);
[DllImport("coredll.dll")]
publicstaticexternboolReadFile(
inthFile,//端口句柄
byte[]lpBuffer,//接收缓冲的指针
uintnNumberOfBytesToRead,//要读取的字节长度
refintlpNumberOfBytesRead,//Pointertothenumberofbytesread
IntPtrlpOverlapped
);//不支持
[DllImport("coredll.dll")]
privatestaticexternboolCloseHandle(
inthObject//handletoobject
);
privatevoidForm1_Load(objectsender,EventArgse)
{
btnCloseDevice.Enabled=false;
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
boolret=true;
uintcount=4;
byte[]pBuffer={1,1,1,1};//定义4个按键的缓存
intNumberOfBytesRead=0;
//读取按键的值
ret=ReadFile(hKey,pBuffer,count,refNumberOfBytesRead,IntPtr.Zero);
if(!
ret)
{
MessageBox.Show("ReadKeyValueFailed!
");
return;
}
//打印按键的值
this.textBox1.Text=pBuffer[0].ToString()+pBuffer[1].ToString()+pBuffer[2].ToString()+pBuffer[3].ToString();
}
privatevoidbtnOpenDevice_Click(objectsender,EventArgse)
{
//打开按键设备,注意第一个参数写法”XXX1:
”XXX表示流驱动的名称,数字1表示流驱动的号数(可能有多个),另外必须加冒号
hKey=CreateFile("KIO1:
",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(hKey==INVALID_HANDLE_VALUE)
{
MessageBox.Show("打开按键设备驱动失败");
return;
}
btnOpenDevice.Enabled=false;
btnCloseDevice.Enabled=true;
}
privatevoidbtnCloseDevice_Click(objectsender,EventArgse)
{
boolret=true;
ret=CloseHandle(hKey);
if(ret==false)
{
MessageBox.Show("关闭按键设备驱动失败");
return;
}
btnOpenDevice.Enabled=true;
btnCloseDevice.Enabled=false;
}
}
}