wince驱动编程经典教程.docx

上传人:b****6 文档编号:6184472 上传时间:2023-01-04 格式:DOCX 页数:15 大小:1.33MB
下载 相关 举报
wince驱动编程经典教程.docx_第1页
第1页 / 共15页
wince驱动编程经典教程.docx_第2页
第2页 / 共15页
wince驱动编程经典教程.docx_第3页
第3页 / 共15页
wince驱动编程经典教程.docx_第4页
第4页 / 共15页
wince驱动编程经典教程.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

wince驱动编程经典教程.docx

《wince驱动编程经典教程.docx》由会员分享,可在线阅读,更多相关《wince驱动编程经典教程.docx(15页珍藏版)》请在冰豆网上搜索。

wince驱动编程经典教程.docx

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;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1