【原创】WinCE下流驱动开发流程
硬件平台:S5PV210
软件平台:WinCE6.0
已IICBUS为例,实现流驱动框架,供以后参考使用
1、创建文件
IICBUS.cpp
IICBUS.DEF
makefile
sources
2、IICBUS.DEF文件导出函数接口
EXPORTS IBS_Init IBS_Deinit IBS_Open IBS_Close IBS_Read IBS_Write IBS_Seek IBS_IOControl IBS_PowerDown IBS_PowerUp
3、source文件
TARGETNAME=IICBUS TARGETTYPE=DYNLINK RELEASETYPE=PLATFORM DLLENTRY = DllEntry DEFFILE = IICBUS.DEF TARGETLIBS=$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib INCLUDES=$(INCLUDES); \ SOURCES= \ iicbus.cpp \
4、 IICBUS.cpp文件
BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved) { switch ( dwReason ) { case DLL_PROCESS_ATTACH: RETAILMSG(TRUE,(TEXT("******************[+IICBUS DLL_PROCESS_ATTACH]**************\r\n"))); break; case DLL_PROCESS_DETACH: RETAILMSG(TRUE,(TEXT("******************[-IICBUS DLL_PROCESS_DETACH]**************\r\n"))); break; } return TRUE; } DWORD IBS_Init(DWORD dwContext) { RETAILMSG(TRUE,(TEXT("[+IICBUS_Init: %s]\r\n"), (LPCTSTR)dwContext)); RETAILMSG(TRUE,(TEXT("[-IICBUS_Init]\r\n"))); return TRUE; } BOOL IBS_Deinit(DWORD dwContext) { RETAILMSG(TRUE, (TEXT("[+IICBUS_Deinit]\r\n"))); RETAILMSG(TRUE,(TEXT("[-VSP_Deinit]\r\n"))); return TRUE; } BOOL IBS_Open( DWORD dwData, DWORD dwAccess, DWORD dwShareMode) { RETAILMSG(TRUE,(TEXT("[+IICBUS_Open]\r\n"))); RETAILMSG(TRUE,(TEXT("[-IICBUS_Open]\r\n"))); return TRUE; } BOOL IBS_Close(DWORD dwHandle) { RETAILMSG(TRUE,(TEXT("[+IICBUS_Close]\r\n"))); RETAILMSG(TRUE,(TEXT("[-IICBUS_Close]\r\n"))); return TRUE; } BOOL IBS_IOControl( DWORD dwHandle, DWORD dwIoControlCode, PBYTE pBufIn, DWORD dwBufInSize, PBYTE pBufOut, DWORD dwBufOutSize, PDWORD pBytesReturned ) { switch(dwIoControlCode) { 。。。。。 。。。。。 } return TRUE; } DWORD IBS_Read(DWORD dwHandle, LPVOID pBuffer, DWORD dwNumBytes) { RETAILMSG(TRUE,(TEXT("[+IICBUS_Read]\r\n"))); RETAILMSG(TRUE,(TEXT("[-IICBUS_Read]\r\n"))); return 0; } DWORD IBS_Write(DWORD dwHandle, LPCVOID pBuffer, DWORD dwNumBytes) { RETAILMSG(TRUE,(TEXT("[+IICBUS_Write]\r\n"))); RETAILMSG(TRUE,(TEXT("[-IICBUS_Write]\r\n"))); return 0; } DWORD IBS_Seek(DWORD dwHandle, long lDistance, DWORD dwMoveMethod) { return FALSE; } void IBS_PowerUp(void) { return; } void IBS_PowerDown(void) { return; }
4、修改platform.bib文件
IF BSP_NOIICBUS ! IICBUS.dll $(_FLATRELEASEDIR)\IICBUS.dll NK SHK ENDIF BSP_NOIICBUS !
5、修改platform.reg文件
IF BSP_NOIICBUS ! [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IICBUS] "DLL" = "IICBUS.DLL" "Prefix" = "IBS" "Index" = dword:1 "Order" = dword:0 ENDIF BSP_NOIICBUS !
注意:Prefix不能超过3个字符!而且必须跟驱动文件里的前缀一致!
以上完成流驱动的架构,具体的实现功能可以根据需求来做。
6、应用程序调用
HANDLE hIICBUS; hIICBUS = CreateFile(_T("IBS1:"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); if (INVALID_HANDLE_VALUE == hIICBUS) { MessageBox(_T("打开IICBUS:失败!")); return; } if(!DeviceIoControl(hIICBUS, CHANGE_CH1, NULL, 0, NULL, 0, NULL, NULL)) { MessageBox(_T("CH1切换失败!")); return; } CloseHandle(hIICBUS);