/******************************************************
*说 明:添加临界区和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驱动源码
最新推荐文章于 2017-06-29 10:49:35 发布