回答

收藏

[分享] 看门狗流驱动源码

飞凌嵌入式 飞凌嵌入式 2870 人阅读 | 0 人回复 | 2014-01-23

本帖最后由 forlinx2013 于 2014-1-24 09:17 编辑

欢迎大家来到飞凌爱板网专区,对嵌入式技术感兴趣的朋友不妨多多关注一下,我们提供了公司所有开发板的所有资料,也会更新大量技术文章,欢迎大家一块学习提高!!!

看门狗流驱动源码
硬件平台:飞凌OK6410-A
操作系统:飞凌光盘中的BSPWINCE6.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


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条