#include <windows.h>
#include <ceddk.h>
#include <bulverde.h>
#include <xllp_gpio.h>
//volatile
BULVERDE_GPIO_REG *g_pGPIORegs = NULL;
XLLP_UINT32_T g_aGpioPin[2] = {1, 96};//GPIO96
UINT IntrThreadProc(LPVOID ptr);
BOOL WINAPI
DllMain(HANDLE hInstDLL, DWORD dwReason, LPVOID lpvReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
DWORD GIO_Init(DWORD dwContext)
{
PHYSICAL_ADDRESS PA;
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Init/r/n")));
PA.QuadPart = BULVERDE_BASE_REG_PA_GPIO;
g_pGPIORegs = (BULVERDE_GPIO_REG *) MmMapIoSpace(PA, 0x400, FALSE);
if(g_pGPIORegs)
{
//GPIO96
XllpGpioSetDirectionOut(g_pGPIORegs, g_aGpioPin);
// SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
// if( CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)IntrThreadProc, NULL, 0, NULL))
// {
// RETAILMSG(1, (TEXT("***GPIOLED: GIO_Init CreateThread OK/r/n")));
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(g_pGPIORegs, 0x400);
return TRUE;
}
DWORD GIO_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Open/r/n")));
return TRUE;
}
BOOL GIO_Close(DWORD hOpenContext)
{
RETAILMSG(1, (TEXT("***GPIOLED: GIO_Close/r/n")));
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))
{
//*((PDWORD)pBuffer) = intr_count;
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)
{
if(NumberOfBytes >= sizeof(DWORD))
{
if(*((PDWORD)pBuffer))
XllpGpioSetOutputState1(g_pGPIORegs, g_aGpioPin);
else
XllpGpioSetOutput0(g_pGPIORegs, g_aGpioPin);
return sizeof(DWORD);
}
return 0;
}
/*
UINT IntrThreadProc(LPVOID ptr)
{
while(1)
{
//RETAILMSG(1, (TEXT("***GPIOLED: intr_count=%d/r/n"), intr_count));
XllpGpioSetOutputState1(g_pGPIORegs, g_aGpioPin);
Sleep(500);
XllpGpioSetOutput0(g_pGPIORegs, g_aGpioPin);
Sleep(500);
}
}
*/