/****************************************************** *说 明:添加临界区和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; }