#include <windows.h>
#include <ceddk.h>
#include <s3c2410x_base_regs.h>
#include <s3c2410x_ioport.h>
volatile S3C2410X_IOPORT_REG * g_pIOPregs;
UINT32 g_rGPFCONBak,g_rGPFUPBak,g_rGPFDATBak;
BOOL WINAPI
DllEntryPoint(HANDLE hInstDLL, DWORD dwReason, LPVOID lpvReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
RETAILMSG(1, (TEXT("***GPIOled:DLL_PROCESS_ATTACH\n")));
break;
case DLL_THREAD_ATTACH:
RETAILMSG(1, (TEXT("***GPIOled:DLL_THREAD_ATTACH\n")));
break;
case DLL_THREAD_DETACH:
RETAILMSG(1, (TEXT("***GPIOled:DLL_THREAD_DETACH\n")));
break;
case DLL_PROCESS_DETACH:
RETAILMSG(1, (TEXT("***GPIOled:DLL_PROCESS_DETACH\n")));
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
RETAILMSG(1, (TEXT("***GPIOled:DLL_PROCESS_EXITING\n")));
break;
case DLL_SYSTEM_STARTED:
RETAILMSG(1, (TEXT("***GPIOled:DLL_SYSTEM_STARTED\n")));
break;
#endif
}
return TRUE;
}
DWORD GIO_Init(DWORD dwContext)
{
PHYSICAL_ADDRESS PA;
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Init\r\n")));
// Allocate a drive instance structure.
PA.QuadPart = S3C2410X_BASE_REG_PA_IOPORT;
g_pIOPregs = (S3C2410X_IOPORT_REG *)MmMapIoSpace(PA,sizeof(S3C2410X_IOPORT_REG),FALSE);
if(g_pIOPregs)
{
return TRUE;
}
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Init fail\r\n")));
return FALSE;
}
BOOL GIO_Deinit(DWORD hDeviceContext)
{
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Deinit\r\n")));
MmUnmapIoSpace((PVOID)g_pIOPregs,sizeof(S3C2410X_IOPORT_REG));
return TRUE;
}
DWORD GIO_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Open\r\n")));
//backup register
g_rGPFCONBak = g_pIOPregs->GPFCON ;
g_rGPFUPBak = g_pIOPregs->GPFUP;
g_rGPFDATBak = g_pIOPregs->GPFDAT;
//Set register
g_pIOPregs->GPFCON = 0x55aa;
g_pIOPregs->GPFUP = 0xff;
return TRUE;
}
BOOL GIO_Close(DWORD hOpenContext)
{
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Close\r\n")));
//restore registert
g_pIOPregs->GPFCON = g_rGPFCONBak;
g_pIOPregs->GPFUP = g_rGPFUPBak;
g_pIOPregs->GPFDAT = g_rGPFDATBak;
return TRUE;
}
BOOL GIO_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
return TRUE;
}
void GIO_PowerDown(DWORD hDeviceContext)
{
}
void GIO_PowerUp(DWORD hDeviceContext)
{
}
DWORD GIO_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
if(Count >= sizeof(DWORD))
{
return sizeof(DWORD);
}
return 0;
}
DWORD GIO_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
return 0;
}
DWORD GIO_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD NumberOfBytes)
{
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Write\r\n")));
g_pIOPregs->GPFDAT = ((*(BYTE*)pBuffer)&0xf0)|(g_pIOPregs->GPFDAT&0x0f);
return TRUE;
}
评论11
最新资源