wince驱动编程经典教程Word文件下载.docx
- 文档编号:19187637
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:15
- 大小:1.33MB
wince驱动编程经典教程Word文件下载.docx
《wince驱动编程经典教程Word文件下载.docx》由会员分享,可在线阅读,更多相关《wince驱动编程经典教程Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
XXX"
Dll"
mydriver.dll"
Order"
200"
驱动文件CPP中必须实现以下函数:
以读取按键IO为例
#include<
windows.h>
nkintr.h>
pm.h>
#include"
pmplatform.h"
Pkfuncs.h"
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("
VirtualCopyfaiLED!
}
}
BOOLWINAPI
DllEntry(HANDLEhinstDLL,
DWORDdwReason,
LPVOID/*lpvReserved*/)
switch(dwReason)
caseDLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
returnTRUE;
caseDLL_THREAD_ATTACH:
break;
caseDLL_THREAD_DETACH:
caseDLL_PROCESS_DETACH:
#ifdefUNDER_CE
caseDLL_PROCESS_EXITING:
caseDLL_SYSTEM_STARTED:
#endif
returnTRUE;
BOOLKIO_Deinit(DWORDhDeviceContext)
RETAILMSG(1,(TEXT("
USERLED:
LED_Deinit\r\n"
}
BOOLKIOGpioInit()
s2440IOP->
rGPGCON=(s2440IOP->
rGPGCON&
0xfffffffc);
//GPG0==输入
0xffffff3f);
//GPG3==输入s2440IOP->
0xfffff3ff);
//GPG5==输入s2440IOP->
0xffffcfff);
//GPG6==输入
DWORDKIO_Init(DWORDdwContext)
LED_Init----\r\n"
//1.VirtualAlloc
Virtual_Alloc();
KIOGpioInit();
BOOLKIO_IOControl(DWORDhOpenContext,
DWORDdwCode,
PBYTEpBufIn,
DWORDdwLenIn,
PBYTEpBufOut,
DWORDdwLenOut,
PDWORDpdwActualOut)
LED:
Ioctlcode=0x%x\r\n"
),dwCode));
DWORDKIO_Open(DWORDhDeviceContext,DWORDAccessCode,DWORDShareMode)
LED_Open\r\n"
BOOLKIO_Close(DWORDhOpenContext)
LED_Close\r\n"
voidKIO_PowerDown(DWORDhDeviceContext)
LED_PowerDown\r\n"
voidKIO_PowerUp(DWORDhDeviceContext)
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<
<
bit_index));
KeyValues[i]=down;
RETAILMSG(0,(L"
%s"
down?
L"
1"
:
0"
));
memcpy(pBuffer,KeyValues,4);
LED_Read\r\n"
DWORDKIO_Seek(DWORDhOpenContext,longAmount,DWORDType)
LED_Seek\r\n"
return0;
DWORDKIO_Write(DWORDhOpenContext,LPCVOIDpSourceBytes,DWORDNumberOfBytes)
LED_Write\r\n"
接下来如何在上位机中调用这些函数操作硬件呢?
这里以一个读取按键的上位机程序为例!
结合上面的按键驱动。
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
);
publicstaticexternboolReadFile(
inthFile,//端口句柄
byte[]lpBuffer,//接收缓冲的指针
uintnNumberOfBytesToRead,//要读取的字节长度
refintlpNumberOfBytesRead,//Pointertothenumberofbytesread
IntPtrlpOverlapped
//不支持
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)
打开按键设备驱动失败"
btnOpenDevice.Enabled=false;
btnCloseDevice.Enabled=true;
privatevoidbtnCloseDevice_Click(objectsender,EventArgse)
ret=CloseHandle(hKey);
if(ret==false)
关闭按键设备驱动失败"
btnOpenDevice.Enabled=true;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- wince 驱动 编程 经典 教程