本帖最后由 forlinx2013 于 2014-1-24 09:17 编辑
欢迎大家来到飞凌爱板网专区,对嵌入式技术感兴趣的朋友不妨多多关注一下,我们提供了公司所有开发板的所有资料,也会更新大量技术文章,欢迎大家一块学习提高!!!
看门狗流驱动源码 硬件平台:飞凌OK6410-A 操作系统:飞凌光盘中的BSP,WINCE6.0 编译工具:VS2005 + WINCE6.0 + BSP 如何添加流驱动,可以参考以前章节! 源码:wdg.cpp
///----------------------------------------------------------------------------// // NAME OF PROJECT: uniprOS Version: 1.0 (development) // //----------------------------------------------------------------------------// // NAME OF SOURCE FILE: LED.cpp // //----------------------------------------------------------------------------// // // // Data of creation: 2010.02.15 // // Data of last modification: 2010.02.15 // // // // CONTENTS: unipro stream driver for led control // // // //----------------------------------------------------------------------------// // NAME OF PROJECT FILE: LED.dll // //----------------------------------------------------------------------------// // UTILIZING COMPILER: Microsoft Visual Studio 2005 // //----------------------------------------------------------------------------// // YUE Wei - Unipro // //----------------------------------------------------------------------------//
#include "stdafx.h" #include <s3c6410.h> #include <DrvLib.h> #include <winuser.h> #include <windows.h> #include <ceddk.h> #include <oal.h>
// Base Definitions #include "s3c6410_base_regs.h" #include "s3c6410_wdog.h"
#include "wdg.h" #define WTCON_PRESCALE(x) (((x)&0xff)<<8) // bit 15:8, prescale value, 0 <= (x) <= 27 #define WTCON_ENABLE (1<<5) // bit 5, enable watchdog timer #define WTCON_CLK_DIV16 (0<<3) #define WTCON_CLK_DIV32 (1<<3) #define WTCON_CLK_DIV64 (2<<3) #define WTCON_CLK_DIV128 (3<<3) #define WTCON_INT_ENABLE (1<<2) #define WTCON_RESET (1<<0) #define OALPAtoVA1(pa, c) (VOID*)((c)?(pa) pa)) //jyh // WTCNT - watchdog counter register #define WTCNT_CNT(x) ((x)&0xffff)
// WTDAT - watchdog reload value register #define WTDAT_CNT(x) ((x)&0xffff)
// WTCLRINT - watchdog interrupt clear register #define WTCLRINT_CLEAR (1<<0)
// Watchdog Clock // PCLK : 25MHz // PCLK/PRESCALER : 25/25 = 1MHz // PCLK/PRESCALER/DIVIDER : 1MHz/128 = 7.812 KHz // MAX Counter = 0xffff = 65535 // Period = 65535/7812 =~ 8.4 sec #define WD_PRESCALER (25-1)
#define WD_REFRESH_PERIOD 3000 // tell the OS to refresh watchdog every 3 second. // GPIO virtual address static volatile S3C6410_GPIO_REG *v_pIOPregs ; static volatile S3C6410_WATCHDOG_REG *v_pWDGregs;
//----------------------------------------------------------------------------// // DLL entry // //----------------------------------------------------------------------------// BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: OutputDebugString(L"\nwdg - DLL_PROCESS_ATTACH\n"); RETAILMSG(1,(TEXT("wdg - DLL_PROCESS_ATTACH\n"))); break; case DLL_PROCESS_DETACH: //RETAILMSG(1,(TEXT("LED - DLL_PROCESS_DETACH\n"))); //OutputDebugString(L"LED - DLL_PROCESS_DETACH\n"); break; case DLL_THREAD_ATTACH: //RETAILMSG(1,(TEXT("LED - DLL_THREAD_ATTACH\n"))); //OutputDebugString(L"LED - DLL_THREAD_ATTACH\n"); break; case DLL_THREAD_DETACH: //RETAILMSG(1,(TEXT("LED - DLL_THREAD_DETACH\n"))); //OutputDebugString(L"LED - DLL_THREAD_DETACH\n"); break; default: break; }
return TRUE; }
//----------------------------------------------------------------------------// // wdg initial // //----------------------------------------------------------------------------// DWORD wdg_Init(LPCTSTR pContext, LPCVOID lpvBusContext) { //Virtual address mapping v_pIOPregs = (volatile S3C6410_GPIO_REG*)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_GPIO, sizeof(S3C6410_GPIO_REG), FALSE); v_pWDGregs = (volatile S3C6410_WATCHDOG_REG*)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_WATCHDOG, sizeof(S3C6410_WATCHDOG_REG), FALSE); OutputDebugString(L"wdg - wdg init sucseced\n"); return 1; }
//----------------------------------------------------------------------------// // wdg deinit // //----------------------------------------------------------------------------// BOOL wdg_Deinit(DWORD hDeviceContext) { VirtualFree((PVOID)v_pIOPregs, 0, MEM_RELEASE); v_pIOPregs = NULL; return TRUE; }
//----------------------------------------------------------------------------// // wdg open // //----------------------------------------------------------------------------// DWORD wdg_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) {
v_pWDGregs->WTCNT = 0x4000; //4s的倒计时,如果不喂狗,则重新启动 v_pWDGregs->WTDAT=0xffff; v_pWDGregs->WTCON = WTCON_PRESCALE(WD_PRESCALER) | WTCON_ENABLE | WTCON_CLK_DIV128 | WTCON_RESET; v_pWDGregs->WTCON =0x8039; OutputDebugString(L"wdg - wdg Open\n"); return 1; } //----------------------------------------------------------------------------// // wdg close // //----------------------------------------------------------------------------// BOOL wdg_Close(DWORD hOpenContext) { OutputDebugString(L"wdg - wdg Close\n"); return TRUE; }
//----------------------------------------------------------------------------// // wdg read // //----------------------------------------------------------------------------// DWORD wdg_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) { return 1; }
//----------------------------------------------------------------------------// // wdg write // //----------------------------------------------------------------------------// DWORD wdg_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count) { return 1; }
//----------------------------------------------------------------------------// // wdg power up // //----------------------------------------------------------------------------// VOID wdg_PowerUp(DWORD hDeviceContext) { }
//----------------------------------------------------------------------------// // wdg down // //----------------------------------------------------------------------------// VOID wdg_PowerDown(DWORD hDeviceContext) { }
//----------------------------------------------------------------------------// // wdg seek // //----------------------------------------------------------------------------// DWORD wdg_Seek(DWORD hOpenContext, long Amount, DWORD Type) { return 0; }
//----------------------------------------------------------------------------// // //----------------------------------------------------------------------------// BOOL wdg_IOControl(DWORD Handle, DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize, PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned) { switch (dwIoControlCode) {
//case IOCTL_LED_LED1_OPEN: //LED1 OPEN //v_pIOPregs->GPMCON&=(~(0x0f<<4)); //v_pIOPregs->GPMCON|=0x1<<4; //v_pIOPregs->GPMDAT|=(0x01<<1);
//break; case IOCTL_wdg_wdg1_OPEN: v_pWDGregs->WTCNT = WTCNT_CNT(0x4000); break;
}
return TRUE; }
源码: Wdg.h
//----------------------------------------------------------------------------// // NAME OF PROJECT: uniprOS Version: 1.0 (development) // //----------------------------------------------------------------------------// // NAME OF SOURCE FILE: SPI.h // //----------------------------------------------------------------------------// // // // Data of creation: 2010.02.15 // // Data of last modification: 2010.02.15 // // // // CONTENTS: unipro CNC module. // // // //----------------------------------------------------------------------------// // NAME OF PROJECT FILE: uniprOS.exe // //----------------------------------------------------------------------------// // UTILIZING COMPILER: Visual Studio 2005 // //----------------------------------------------------------------------------// // YUE Wei - Unipro // //----------------------------------------------------------------------------//
#ifndef LCD_H #define LCD_H
// constants define #define IOCTL_wdg_wdg1_OPEN 0x04002060 #define IOCTL_wdg_wdg1_CLOSE 0x04002061 //#define IOCTL_LED_LED2_OPEN 0x04001070 //#define IOCTL_LED_LED2_CLOSE 0x04001071 //#define IOCTL_LED_LED3_OPEN 0x04001080 //#define IOCTL_LED_LED3_CLOSE 0x04001081 //#define IOCTL_LED_LED4_OPEN 0x04001090 //#define IOCTL_LED_LED4_CLOSE 0x04001091
//#define IOCTL_LED_SET_OUTPUT 0x04003060 //#define IOCTL_LED_SET_HIGH 0x04003070 //#define IOCTL_LED_SET_LOWER 0x04003080 #endif
|