WinCE 5.0 SMDK2440BSP—— Leddriver分析

友善mini2440开发板 BSP包下的Led driver,作为驱动入门的第一课,可以了解到基本的流驱动程序。

 

#include <windows.h>
//#include <ceddk.h>
#include <nkintr.h>
#include <pm.h>
#include "pmplatform.h"
#include "Pkfuncs.h"
#include "s2440.h"


#define IO_CTL_LED_1_ON 0x01
#define IO_CTL_LED_2_ON 0x02
#define IO_CTL_LED_3_ON 0x03
#define IO_CTL_LED_4_ON 0x04
#define IO_CTL_LED_ALL_ON 0x05
#define IO_CTL_LED_1_OFF 0x06
#define IO_CTL_LED_2_OFF 0x07
#define IO_CTL_LED_3_OFF 0x08
#define IO_CTL_LED_4_OFF 0x09
#define IO_CTL_LED_ALL_OFF 0x0a


volatile IOPreg  *s2440IOP = (IOPreg *)IOP_BASE;//IOPreg:IO口结构体
volatile INTreg  *s2440INT = (INTreg *)INT_BASE;//INTreg:中断控制器结构体

 

BOOL mInitialized;
void Virtual_Alloc();      // Virtual allocation

 

void Virtual_Alloc()
{

    // GPIO Virtual alloc
 s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
 if(s2440IOP == NULL) {
  RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc faiLED!/r/n")));
 }
 else {
  if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
   RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy faiLED!/r/n")));
  }
 }
 
 
}


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 LED_Deinit(DWORD hDeviceContext)
{
 BOOL bRet = TRUE;
 
 RETAILMSG(1,(TEXT("USERLED: LED_Deinit/r/n")));

 return TRUE;
}

 

 

/*GPIO口初始化,主要是配置寄存器GPBCON初始化,从代码中可以看出皆设置为OUTPUT模式*/
BOOL LEDGpioInit()
{
 RETAILMSG(1,(TEXT("LED_Gpio_Setting----/r/n")));
 s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 10)) | (1<< 10); // GPB5 == OUTPUT.
 s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 12)) | (1<< 12); // GPB6 == OUTPUT.
 s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 14)) | (1<< 14); // GPB7 == OUTPUT.
 s2440IOP->rGPBCON  = (s2440IOP->rGPBCON  &~(3 << 16)) | (1<< 16); // GPB8 == OUTPUT.
 return TRUE;
}

 


DWORD LED_Init(DWORD dwContext)
{
 
 RETAILMSG(1,(TEXT("LED_Init----/r/n")));

 // 1. Virtual Alloc
 Virtual_Alloc();
 
 LEDGpioInit();
 
 
 mInitialized = TRUE;
 return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL LED_IOControl(DWORD hOpenContext,
       DWORD dwCode,
       PBYTE pBufIn,
       DWORD dwLenIn,
       PBYTE pBufOut,
       DWORD dwLenOut,
       PDWORD pdwActualOut)
{
 LEDGpioInit();
 switch(dwCode)
 {
 case IO_CTL_LED_1_ON:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<5);
  break;
 case IO_CTL_LED_2_ON:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<6);
  break;
 case IO_CTL_LED_3_ON:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<7);
  break;
 case IO_CTL_LED_4_ON:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0x1<<8);
  break;
 case IO_CTL_LED_ALL_ON:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&~(0xF<<5);
  break;
 case IO_CTL_LED_1_OFF:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<5);
  break;
 case IO_CTL_LED_2_OFF:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<6);
  break;
 case IO_CTL_LED_3_OFF:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<7);
  break;
 case IO_CTL_LED_4_OFF:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0x1<<8);
  break;
 case IO_CTL_LED_ALL_OFF:
  s2440IOP->rGPBDAT=s2440IOP->rGPBDAT|(0xF<<5);
  break;
 default:
  break;  
 }
   
 RETAILMSG(1,(TEXT("LED:Ioctl code = 0x%x/r/n"), dwCode));
 return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD LED_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
 RETAILMSG(1,(TEXT("USERLED: LED_Open/r/n")));
 return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL LED_Close(DWORD hOpenContext)
{
 s2440IOP->rGPBDAT=s2440IOP->rGPBDAT&(0xF<<5);
 RETAILMSG(1,(TEXT("USERLED: LED_Close/r/n")));
 return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void LED_PowerDown(DWORD hDeviceContext)
{
 RETAILMSG(1,(TEXT("USERLED: LED_PowerDown/r/n")));
 
 //RETAILMSG(1,(TEXT("CAMERA: LED_PowerDown, m_Dx = D%u, init %d /r/n"), m_Dx, mInitialized));
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void LED_PowerUp(DWORD hDeviceContext)
{
 RETAILMSG(1,(TEXT("USERLED: LED_PowerUp/r/n")));

}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD LED_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
 RETAILMSG(1,(TEXT("USERLED: LED_Read/r/n")));
 return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD LED_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
 RETAILMSG(1,(TEXT("USERLED: LED_Seek/r/n")));
 return 0;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD LED_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
 RETAILMSG(1,(TEXT("USERLED: LED_Write/r/n")));
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值