WINCE 定时器0控制LED驱动源码

/******************************************************
*说    明:添加临界区和FCLK、HCLK、PCLK的说明
******************************************************/
#include <windows.h>
#include <nkintr.h>

#include <winreg.h>
#include <winioctl.h>
#include <ceddk.h>
#include <devload.h>
#include <S3C2440A.h>//S3C2440包含了自身硬件资源的所有头文件
 //包括寄存器、逻辑中断号
 #include "pmplatform.h"
#include "Pkfuncs.h"
#include "TIMER.h"


 //这些值可以从startup.s中的MPLLCON、CLKDIVN的配置中知道
#define FCLK 400000000
#define HCLK FCLK/4
#define PCLK FCLK/8
/*
 ===================================================================

                            普通宏定义
 
 ===================================================================
*/

#define LED1_POS     5
#define LED2_POS     6
#define LED3_POS     7
#define LED4_POS     8

#define IOCTL_START_TIMER  1
#define IOCTL_STOP_TIMER   2


/*
 ===================================================================

                            基本函数接口
 
 ===================================================================
*/

static BOOL  LEDInit              (PTMR_CONTEXT pTMR);
static BOOL  LEDCtrlOn            (PTMR_CONTEXT pTMR,UINT32 unCtrlCode);
static BOOL  LEDCtrlOff           (PTMR_CONTEXT pTMR,UINT32 unCtrlCode);

static PVOID HalRegisterAlloc     (PVOID pvRegisterAddress, 
                                   INT32 nSizeOfReg);

static BOOL TIMERInitAll          (PTMR_CONTEXT pTMR);
static BOOL TIMERDeinitAll        (PTMR_CONTEXT pTMR);

static void Led1Flash             (PTMR_CONTEXT pTMR);
static void Led2Flash             (PTMR_CONTEXT pTMR);
static void Led3Flash             (PTMR_CONTEXT pTMR);
static void Led4Flash             (PTMR_CONTEXT pTMR);

static void TIMEREnable           (PTMR_CONTEXT pTMR);
static void TIMERDisable          (PTMR_CONTEXT pTMR);

static DWORD TIMERIST             (LPVOID lpContext);

/******************************************************
*文件名称:TIMEREnable
*输    入:pTMR TIMER设备上下文
*输    出:无
*功能说明:TIMER 使能
*******************************************************/
static void TIMEREnable(PTMR_CONTEXT pTMR)
{
    pTMR->pPWMReg->TCFG1 &= ~0x0F;//使用定时器0
    pTMR->pPWMReg->TCFG1 |= 2;                   
    pTMR->pPWMReg->TCNTB0 =(PCLK)/8/1000;     //1MS
    pTMR->pPWMReg->TCON  &= ~0x0F;
    pTMR->pPWMReg->TCON  |= (1<<3)|(1<<1)|(1<<0);

    UINT32 i=100;
    while(i--);

    pTMR->pPWMReg->TCON  &= ~(1<<1);    

}
/******************************************************
*文件名称:TIMERDisable
*输    入:pTMR TIMER设备上下文
*输    出:无
*功能说明:TIMER 禁止
*******************************************************/
static void TIMERDisable(PTMR_CONTEXT pTMR)
{
    pTMR->pPWMReg->TCON  &= ~(1<<0);    
}
/******************************************************
*文件名称:LEDInit
*输    入:pTMR TIMER设备上下文
*输    出:TRUE/FALSE
*功能说明:LED 初始化
*******************************************************/
static BOOL LEDInit(PTMR_CONTEXT pTMR)
{
     if (pTMR == NULL)
     {
         return FALSE;
     }

     pTMR->pIOPortReg->GPBCON|=1<<(LED1_POS*2)|1<<(LED2_POS*2)|\
                               1<<(LED3_POS*2)|1<<(LED4_POS*2);

     pTMR->pIOPortReg->GPBUP |=1<<LED1_POS|1<<LED2_POS|\
                               1<<LED3_POS|1<<LED4_POS ;

     pTMR->pIOPortReg->GPBDAT|=1<<LED1_POS|1<<LED2_POS|\
                               1<<LED3_POS|1<<LED4_POS ;

     return TRUE;
}

/******************************************************
*文件名称:LEDCtrlOn
*输    入:unCtrlCode 控制码
*输    出:TRUE/FALSE
*功能说明:LED亮
*******************************************************/
static BOOL LEDCtrlOn(PTMR_CONTEXT pTMR,UINT32 unCtrlCode)
{
    if (pTMR == NULL)
    {
        return FALSE;
    }

    pTMR->pIOPortReg->GPBDAT&=~(unCtrlCode);

    return TRUE;
}
/******************************************************
*文件名称:LEDCtrlOff
*输    入:pTMR 设备上下文
           unCtrlCode 控制码
*输    出:TRUE/FALSE
*功能说明:LED灭
*******************************************************/
static BOOL LEDCtrlOff(PTMR_CONTEXT pTMR,UINT32 unCtrlCode)
{
    if (pTMR == NULL)
    {
        return FALSE;
    }

    pTMR->pIOPortReg->GPBDAT|=unCtrlCode;

    return TRUE;
}
/******************************************************
*文件名称:Led1Flash
*输    入:pTMR 设备上下文
*输    出:无
*功能说明:LED1 闪烁
*******************************************************/
static void Led1Flash(PTMR_CONTEXT pTMR)
{
    static  UINT32 b=0;

    b^=0x01;

    if(b)
    {
        LEDCtrlOn(pTMR,1<<LED1_POS); 
    }
    else
    {
        LEDCtrlOff(pTMR,1<<LED1_POS);        
    }


}
/******************************************************
*文件名称:Led2Flash
*输    入:pTMR 设备上下文
*输    出:无
*功能说明:LED2 闪烁
*******************************************************/
static void Led2Flash(PTMR_CONTEXT pTMR)
{
    static  UINT32 b=0;

    b^=0x01;

    if(b)
    {
        LEDCtrlOn(pTMR,1<<LED2_POS); 
    }
    else
    {
        LEDCtrlOff(pTMR,1<<LED2_POS);        
    }

}
/******************************************************
*文件名称:Led3Flash
*输    入:pTMR 设备上下文
*输    出:无
*功能说明:LED3 闪烁
*******************************************************/
static void Led3Flash(PTMR_CONTEXT pTMR)
{
    static  UINT32 b=0;

    b^=0x01;

    if(b)
    {
        LEDCtrlOn(pTMR,1<<LED3_POS); 
    }
    else
    {
        LEDCtrlOff(pTMR,1<<LED3_POS);        
    }
}
/******************************************************
*文件名称:Led4Flash
*输    入:pTMR 设备上下文
*输    出:无
*功能说明:LED4 闪烁
*******************************************************/
static void Led4Flash(PTMR_CONTEXT pTMR)
{
    static  UINT32 b=0;

    b^=0x01;

    if(b)
    {
        LEDCtrlOn(pTMR,1<<LED4_POS); 
    }
    else
    {
        LEDCtrlOff(pTMR,1<<LED4_POS);        
    }

}
/******************************************************
*文件名称:HalRegisterAlloc
*输    入:pvRegisterAddress 寄存器地址
           nSizeOfReg        寄存器占用空闲大小
*输    出:分配好的内存指针
*功能说明:分配内存
*******************************************************/
static PVOID HalRegisterAlloc(PVOID pvRegisterAddress, 
                              INT32 nSizeOfReg)
{
    PVOID pReg;

    pReg=(PVOID)VirtualAlloc(0,nSizeOfReg,MEM_RESERVE,PAGE_NOACCESS);

    if (pReg)
    {
        if(!(VirtualCopy(pReg,
            (PVOID)((UINT32)pvRegisterAddress>>8),
            nSizeOfReg,
            PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE
            )))
        {
            VirtualFree(pReg,0,MEM_RELEASE);

            pReg=NULL;
        }

    }

    return pReg;
}
/******************************************************
*文件名称:TIMERInitAll
*输    入:pTMR  TIMER设备上下文
*输    出:TRUE/FALSE
*功能说明:TIMER 初始化所有
           如事件、线程、中断初始化
*******************************************************/
static BOOL TIMERInitAll(PTMR_CONTEXT pTMR)
{

    if (pTMR == NULL)
    {
        return FALSE;
    }

    if ((pTMR->hISTEvent=CreateEvent(NULL,FALSE,FALSE,NULL))==NULL)
    {
        TMRMSG(TMRDBG,(TEXT("TIMERInitAll[ERROR]:CreateEvent for ist fail\n")));

        goto init_error;
    }

    UINT32 unIRQ = IRQ_TIMER0;

    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,
                         &unIRQ,
                         sizeof(UINT32),
                         &pTMR->unTIMERLogicNum,
                         sizeof(UINT32),
                         NULL))
    {
        TMRMSG(TMRDBG,(TEXT("TIMERInitAll[ERROR]:get logic number fail\n")));

        goto init_error;
    }

    if (!InterruptInitialize(pTMR->unTIMERLogicNum,pTMR->hISTEvent,NULL,0))
    {
        TMRMSG(TMRDBG,(TEXT("TIMERInitAll[ERROR]:init logic number and event fail\n")));

        goto init_error;
    }

    pTMR->bIsI2CThreadValid=TRUE;

    if ((pTMR->hISTThread=CreateThread(NULL,
                                      0,
                                      TIMERIST,
                                      (LPVOID)pTMR,
                                      0,
                                      NULL
                                      ))==NULL)
    {
        TMRMSG(TMRDBG,(TEXT("TIMERInitAll[ERROR]:CreateThread for timer fail\n")));

        goto init_error;
    }

    InterruptDone(pTMR->unTIMERLogicNum);

    if (!CeSetThreadPriority(pTMR->hISTThread,88))
    {
        TMRMSG(TMRDBG,(TEXT("TIMERInitAll[ERROR]:CeSetThreadPriority for timer fail\n")));

        return FALSE;
    }
    

    InitializeCriticalSection(&pTMR->RegCS);


    TMRMSG(TMRDBG,(TEXT("TIMERInitAll[MSG]:TIMERInitAll Success\n")));

    return TRUE;

init_error:

    TIMERDeinitAll(pTMR);

    return FALSE;


}
/******************************************************
*文件名称:TIMERDeinitAll
*输    入:pTMR  TIMER设备上下文
*输    出:TRUE/FALSE
*功能说明:TIMER 初始化所有
           如事件、线程、中断初始化
*******************************************************/
static BOOL TIMERDeinitAll(PTMR_CONTEXT pTMR)
{
    if (NULL == pTMR)
    {
        TMRMSG(TMRDBG,(TEXT("TIMERDeinitAll[ERROR]:TIMERDeinitAll fail because of pTMR\n")));

        return FALSE;
    }

    DeleteCriticalSection(&pTMR->RegCS);

    InterruptDisable(pTMR->unTIMERLogicNum);

    CloseHandle(pTMR->hISTEvent);
    CloseHandle(pTMR->hISTThread);

    TIMERDisable(pTMR);

    Sleep(1);

    
    
    VirtualFree((LPVOID)pTMR->pPWMReg,   sizeof(S3C2440A_PWM_REG),MEM_RELEASE);
    VirtualFree((LPVOID)pTMR->pIOPortReg,sizeof(S3C2440A_IOPORT_REG),MEM_RELEASE);
    VirtualFree((LPVOID)pTMR->pIntrReg,  sizeof(S3C2440A_INTR_REG),MEM_RELEASE);
    VirtualFree((LPVOID)pTMR->pCLKPWRReg,sizeof(S3C2440A_CLKPWR_REG),MEM_RELEASE);

    Sleep(10);

    LocalFree(pTMR);

   
    return TRUE;
}
/******************************************************
*文件名称:TIMERIST
*输    入:lpContext 设备上下文
*输    出:0/1
*功能说明:TIMER 中断服务线程
*******************************************************/
static DWORD TIMERIST(LPVOID lpContext)
{
       static UINT32 unCnt=0;


       PTMR_CONTEXT pTMR = (PTMR_CONTEXT)lpContext;

       Sleep(10);

       TMRMSG(7,(TEXT("[DLL]TIMERIST[MSG]:TIMERIST Running...\n")));
       TMRMSG(7,(TEXT("[DLL]TIMERIST[MSG]:pTMR->bIsI2CThreadValid is %d\n"),pTMR->bIsI2CThreadValid));

       while (pTMR->bIsI2CThreadValid)
       {
           WaitForSingleObject(pTMR->hISTEvent,INFINITE);
           ResetEvent(pTMR->hISTEvent);
           //TMRMSG(7,(TEXT("[DLL]TIMERIST[MSG]:TIMERIST event...\n")));

           EnterCriticalSection(&pTMR->RegCS);

           unCnt++;

           if (unCnt==1000)Led1Flash(pTMR);
           if (unCnt==2000)Led2Flash(pTMR);
           if (unCnt==3000)Led3Flash(pTMR);
           if (unCnt==4000)Led4Flash(pTMR);

           if (unCnt>=4000)unCnt=0;

           InterruptDone(pTMR->unTIMERLogicNum);

           LeaveCriticalSection(&pTMR->RegCS);
       }

       TMRMSG(7,(TEXT("[DLL]TIMERIST[MSG]:TIMERIST Exit...\n")));

       return 1;
}
/*
 ===================================================================

                         DLL 流接口函数
 
 ===================================================================
*/

/******************************************************
*文件名称:TMR_Init
*输    入:Context 注册枚举路径
*输    出:0/1
*功能说明:TIMER 初始化
*******************************************************/
PTMR_CONTEXT TMR_Init   (PVOID Context)
{
      LPTSTR ActivePath = (LPTSTR)Context; //HKLM\Drivers\Active\xx

      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_INIT[MSG]:(%s)\n"),ActivePath));//打印注册路径

      PTMR_CONTEXT pTMR;

      pTMR=(PTMR_CONTEXT)LocalAlloc(LPTR,sizeof(TMR_CONTEXT));

      if (NULL == pTMR)
      {
          return NULL;
      }

      pTMR->pIOPortReg=(volatile S3C2440A_IOPORT_REG *)HalRegisterAlloc((PVOID)S3C2440A_BASE_REG_PA_IOPORT,
                                                                        sizeof(S3C2440A_IOPORT_REG));
      if (pTMR->pIOPortReg == NULL)
      {
          TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Init[ERROR]:Unable to alloc for ioport reg\n")));

          goto init_error;
      }

      pTMR->pIntrReg=(volatile S3C2440A_INTR_REG *)HalRegisterAlloc((PVOID)S3C2440A_BASE_REG_PA_INTR,
                                                                      sizeof(S3C2440A_INTR_REG));

      if (pTMR->pIntrReg == NULL)
      {
          TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Init[ERROR]Unable to alloc for intrrrupt reg\n")));

          goto init_error;
      }

      pTMR->pPWMReg=(volatile S3C2440A_PWM_REG *)HalRegisterAlloc((PVOID)S3C2440A_BASE_REG_PA_PWM,
                                                                  sizeof(S3C2440A_PWM_REG));

      if (pTMR->pPWMReg == NULL)
      {
          TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Init[ERROR]Unable to alloc for pwm reg\n")));

          goto init_error;
      }

      pTMR->pCLKPWRReg=(volatile S3C2440A_CLKPWR_REG *)HalRegisterAlloc((PVOID)S3C2440A_BASE_REG_PA_CLOCK_POWER,
                                                                         sizeof(S3C2440A_CLKPWR_REG));

      if (pTMR->pCLKPWRReg == NULL)
      {
          TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Init[ERROR]Unable to alloc for clkpwr reg\n")));

          goto init_error;
      }


      LEDInit(pTMR);
      LEDCtrlOn(pTMR,1<<LED2_POS|1<<LED4_POS);

      TIMERInitAll(pTMR);

      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_INIT[MSG]:TMR_INIT Success\n")));

      return pTMR;   //正确返回pTMR

init_error:

      LocalFree(pTMR);

      pTMR=NULL;

      return NULL;   //错误返回NULL
}
/******************************************************
*文件名称:TMR_Deinit
*输    入:pTMR TIMER设备上下文
*输    出:TRUE/FALSE
*功能说明:TIMER 卸载
*******************************************************/
BOOL  TMR_Deinit        (PTMR_CONTEXT pTMR)
{


      TIMERDeinitAll(pTMR);

      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Deinit[MSG]:TMR_Deinit Success\n")));

      return TRUE;
}
/******************************************************
*文件名称:TMR_Open
*输    入:pTMR TIMER  设备上下文
           AccessCode  访问代码
           ShareMode   共享模式
*输    出:设备上下文指针
*功能说明:TIMER 打开
*******************************************************/
PTMR_CONTEXT TMR_Open   (PTMR_CONTEXT pTMR,DWORD AccessCode,DWORD ShareMode)
{
      if (NULL == pTMR)
      {
          TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Open[ERROR]:Context is invalid\n")));

          return NULL;
      }

      UNREFERENCED_PARAMETER(ShareMode);
      UNREFERENCED_PARAMETER(AccessCode);

      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Open[MSG]:TMR_Open Success\n")));

      return pTMR;
}
/******************************************************
*文件名称:TMR_Close
*输    入:pTMR TIMER  设备上下文
*输    出:TRUE/FALSE
*功能说明:TIMER 关闭
*******************************************************/
BOOL TMR_Close         (PTMR_CONTEXT pTMR)
{

      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Close[MSG]:TMR_Close Success\n")));

      return TRUE;
}
/******************************************************
*文件名称:TMR_Read
*输    入:pTMR TIMER    设备上下文
           lpOutputBuf   数据输出缓冲区
           dwNumOfBytes  数据输出字节数
*输    出:-1
*功能说明:TIMER 读取
*******************************************************/
DWORD TMR_Read          (PTMR_CONTEXT pTMR,LPVOID lpOutputBuf,DWORD dwNumOfBytes)
{
      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Read[ERROR]:Unable support read\n")));

      return (DWORD)-1;
}
/******************************************************
*文件名称:TMR_Seek
*输    入:pTMR TIMER    设备上下文
           lpOutputBuf   数据输出缓冲区
           dwNumOfBytes  数据输出字节数
*输    出:-1
*功能说明:TIMER 对设备指针进行操作时调用
*******************************************************/
DWORD TMR_Seek          (PTMR_CONTEXT pTMR,long lAmount,DWORD dwType)
{
      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Seek[ERROR]:Unable support seek\n")));

      return (DWORD)-1;      
}
/******************************************************
*文件名称:TMR_Write
*输    入:pTMR TIMER    设备上下文
           lpInPutBuf    数据输入缓冲区
           dwNumOfBytes  数据输入字节数
*输    出:-1
*功能说明:TIMER 写入
*******************************************************/
DWORD TMR_Write         (PTMR_CONTEXT pTMR,LPVOID lpInPutBuf,DWORD dwNumOfBytes)
{
      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_Write[ERROR]:Unable support write\n")));

      return (DWORD)-1;      
}
/******************************************************
*文件名称:TMR_IOControl
*输    入:pTMR TIMER    设备上下文
           dwCode        控制码
           pBufIn        数据输入缓冲区
           dwLenIn       数据输入字节数
           pBufOut       数据输出缓冲区
           dwLenOut      数据输处字节数
       pdwActualOut      实际数据输出字节数
*输    出:TRUE/FALSE
*功能说明:TIMER 输入输出口控制
*******************************************************/
BOOL  TMR_IOControl     (PTMR_CONTEXT pTMR, 
                         DWORD dwCode, 
                         PBYTE pBufIn, 
                         DWORD dwLenIn, 
                         PBYTE pBufOut, 
                         DWORD dwLenOut, 
                         PDWORD pdwActualOut)
{

      if (pTMR == NULL)
      {
          return FALSE;
      }

      switch(dwCode)
      {
      case IOCTL_START_TIMER:
          { 
             TIMEREnable(pTMR);
          }break;

      case IOCTL_STOP_TIMER:
          { 
              TIMERDisable(pTMR);

          }break;
      }

      return TRUE;
}
/******************************************************
*文件名称:TMR_PowerUp
*输    入:Context 设备上下文
*输    出:TRUE
*功能说明:TIMER 上电电操作
*******************************************************/
BOOL  TMR_PowerUp       (PVOID Context)
{
      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_PowerUp[ERROR]:TMR_PowerUp Success\n")));

      return TRUE;
}
/******************************************************
*文件名称:TMR_PowerDown
*输    入:Context 设备上下文
*输    出:TRUE
*功能说明:TIMER 掉电操作
*******************************************************/
BOOL  TMR_PowerDown     (PVOID Context)
{
      TMRMSG(TMRDBG,(TEXT("[DLL]TMR_PowerDown[ERROR]:TMR_PowerDown Success\n")));

      return TRUE;
}
/*
 =======================================================

                     加载DLL

 =======================================================

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

你可能感兴趣的:(WINCE 定时器0控制LED驱动源码)