静态加载 直接编译进内核中
前奏 了解硬件平台 硬件的连接 查看相关的munual手册
1.写源文件
主要完成以下函数实现对硬件资源的控制
XXX_Close (Device Manager)
XXX_Deinit (Device Manager)
XXX_Init (Device Manager)
XXX_IOControl (Device Manager)
XXX_Open (Device Manager)
XXX_PowerDown (Device Manager)
XXX_PowerUp (Device Manager)
XXX_Read (Device Manager)
XXX_Seek (Device Manager)
XXX_Write (Device Manager)
以上函数不必全部实现只跟据需要完成需要的就行了
BOOL WINAPI
DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID /* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}
return TRUE;
}
BOOL MY_Deinit(DWORD hDeviceContext)
{
BOOL bRet = TRUE;
RETAILMSG(1,(TEXT("USERMY: MY_Deinit/r/n")));
return TRUE;
BOOL MYGpioInit()
{
RETAILMSG(1,(TEXT("MY_Gpio_Setting----/r/n")));
return TRUE;
}
DWORD MY_Init(DWORD dwContext)
{
RETAILMSG(1,(TEXT("MY_Init----/r/n")));
// 1. Virtual Alloc
Virtual_Alloc();
MYGpioInit();
mInitialized = TRUE;
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL MY_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
switch(dwCode)
{
Case XXX:
{
………………
}
default:
break;
}
RETAILMSG(1,(TEXT("MY:Ioctl code = 0x%x/r/n"), dwCode));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD MY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1,(TEXT("USERMY: MY_Open/r/n")));
return true;
}
BOOL MY_Close(DWORD hOpenContext)
{
RETAILMSG(1,(TEXT("USERMY: MY_Close/r/n")));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void MY_PowerDown(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT("USERMY: MY_PowerDown/r/n")));
//RETAILMSG(1,(TEXT("CAMERA: MY_PowerDown, m_Dx = D%u, init %d /r/n"), m_Dx,
mInitialized));
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void MY_PowerUp(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT("USERMY: MY_PowerUp/r/n")));
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD MY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
RETAILMSG(1,(TEXT("USERMY: MY_Read/r/n")));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD MY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
RETAILMSG(1,(TEXT("USERMY: MY_Seek/r/n")));
return 0;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD MY_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
RETAILMSG(1,(TEXT("USERMY: MY_Write/r/n")));
return 0;
}
DWORD MY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
RETAILMSG(1,(TEXT("USERMY: MY_Seek/r/n")));
return 0;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD MY_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
RETAILMSG(1,(TEXT("USERMY: MY_Write/r/n")));
return 0;
}
以上文件为经过编译,只供参考
2.source文件
!if 0
File: sources
Author: jeffmi
Copyright (c) 1995-2002 Microsoft Corporation. All rights reserved.
!endif
RELEASETYPE=PLATFORM
TARGETNAME=MYDriver
TARGETTYPE=DYNLINK
DLLENTRY=DllEntry
TARGETLIBS= /
$(_COMMONSDKROOT)/lib/$(_CPUINDPATH
RELEASETYPE=PLATFORM
TARGETNAME=MYDriver
TARGETTYPE=DYNLINK
DLLENTRY=DllEntry
TARGETLIBS= /
$(_COMMONSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib /
MSC_WARNING_LEVEL = $(MSC_WARNING_LEVEL) /W3 /WX
INCLUDES= /
$(_TARGETPLATROOT)/inc; /
$(_COMMONOAKROOT)/inc;/
$(_PUBLICROOT)/common/oak/inc;$(_PUBLICROOT)/common/sdk/inc;$(_PUBLI
CROOT)/common/ddk/inc; /
../../inc
SOURCES= /
MYdriver.cpp /
3.makefile文件
#
# DO NOT EDIT THIS FILE!!! Edit ./sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the components of Peg
#
!INCLUDE $(_MAKEENVROOT)/makefile.def
4.def导出文件
;
; Windows CE MY Driver. Written by capbily
LIBRARY userMY
EXPORTS
MY_Close
MY_Deinit
MY_Init
MY_IOControl
MY_Open
5.修改 pb中platfrom.bib文件,加入如下内容
;mydriver
mydriver.dll $(_FLATRELEASEDIR)/mydriver.dll NK SH
6.修改注册表文件,在platform.reg中加入
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/MYdriver]
"Prefix"="mydriver"
"Dll"="mydriver.dll"
7.
重新编译内核,点PB5 的主菜单Build OS --> Sysgen 即可,这样就可以生成包含以
上my驱动的内核映象文件NK.bin 和NK.nb0 了。
8.evc编写测试应用程序
要在应用程序中调用驱动程序,Createfile()打开驱动程序,当调用craetefile时首先调用文件管理器,文件管理器对其进行判断,判断不是文件然后交给设备管理器,设备管理器把驱动程序映射到自己的内存空间。
HANDLE MYdriver=CreateFile(L"MY1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL );
ReadFile(MYdriver,………………..)
DeviceIoControl(MYdriver,IO_CTL_MY_CLEAR,NULL,0,NULL,0,NULL,NULL);