奥尔斯的一个实例驱动分析

#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);
 }
}
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值