看门狗驱动详解Word格式.docx

上传人:b****1 文档编号:1146957 上传时间:2023-04-30 格式:DOCX 页数:15 大小:18.16KB
下载 相关 举报
看门狗驱动详解Word格式.docx_第1页
第1页 / 共15页
看门狗驱动详解Word格式.docx_第2页
第2页 / 共15页
看门狗驱动详解Word格式.docx_第3页
第3页 / 共15页
看门狗驱动详解Word格式.docx_第4页
第4页 / 共15页
看门狗驱动详解Word格式.docx_第5页
第5页 / 共15页
看门狗驱动详解Word格式.docx_第6页
第6页 / 共15页
看门狗驱动详解Word格式.docx_第7页
第7页 / 共15页
看门狗驱动详解Word格式.docx_第8页
第8页 / 共15页
看门狗驱动详解Word格式.docx_第9页
第9页 / 共15页
看门狗驱动详解Word格式.docx_第10页
第10页 / 共15页
看门狗驱动详解Word格式.docx_第11页
第11页 / 共15页
看门狗驱动详解Word格式.docx_第12页
第12页 / 共15页
看门狗驱动详解Word格式.docx_第13页
第13页 / 共15页
看门狗驱动详解Word格式.docx_第14页
第14页 / 共15页
看门狗驱动详解Word格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

看门狗驱动详解Word格式.docx

《看门狗驱动详解Word格式.docx》由会员分享,可在线阅读,更多相关《看门狗驱动详解Word格式.docx(15页珍藏版)》请在冰点文库上搜索。

看门狗驱动详解Word格式.docx

wdg_Write

wdg_Seek

wdg_IOControl

wdg_PowerUp

wdg_PowerDown

【wdg.c】文件内容如下:

#include<

windows.h>

types.h>

tchar.h>

excpt.h>

cardserv.h>

cardapi.h>

tuple.h>

devload.h>

diskio.h>

nkintr.h>

windev.h>

#include"

BSP.h"

#definePUBLIC

HANDLEg_hInstance;

HANDLEIntThread;

HANDLEIntEvent;

UINT32g_TimerIrq=IRQ_TIMER1;

UINT32g_SysIrq=SYSINTR_UNDEFINED;

DWORDdwTime;

DWORDwtdata;

DWORDnum;

volatileS3C2440A_WATCHDOG_REG*v_pWDGregs;

//创建watchdog寄存器指针对象

volatileS3C2440A_PWM_REG*v_pPWMregs;

volatileS3C2440A_INTR_REG*v_pINTregs;

BOOLwdg_InitAddr(void);

voidVitural_Alloc(void);

voidTimer_Init(void);

DWORDTimer_IST(void);

voidVitural_Alloc(void)

{

/*INTRRegisterAllocation*/

v_pINTregs=(volatileS3C2440A_INTR_REG*)VirtualAlloc(0,sizeof(S3C2440A_INTR_REG),MEM_RESERVE,PAGE_NOACCESS);

if(v_pINTregs==NULL)

{

ERRORMSG(1,(TEXT("

ForINTRregs:

VirtualAllocfailed!

\r\n"

)));

}

else

if(!

VirtualCopy((PVOID)v_pINTregs,(PVOID)(S3C2440A_BASE_REG_PA_INTR>

>

8),sizeof(S3C2440A_INTR_REG),PAGE_PHYSICAL|PAGE_READWRITE|PAGE_NOCACHE))

{

ERRORMSG(1,(TEXT("

ForINTRregs:

VirtualCopyfailed!

}

/*PWMRegisterAllocation*/

v_pPWMregs=(volatileS3C2440A_PWM_REG*)VirtualAlloc(0,sizeof(S3C2440A_PWM_REG),MEM_RESERVE,PAGE_NOACCESS);

if(v_pPWMregs==NULL)

ForPWMregs:

VirtualCopy((PVOID)v_pPWMregs,(PVOID)(S3C2440A_BASE_REG_PA_PWM>

8),sizeof(S3C2440A_PWM_REG),PAGE_PHYSICAL|PAGE_READWRITE|PAGE_NOCACHE))

ForPWMregs:

}

voidTimer_Init(void)

v_pPWMregs->

TCFG0&

=~0xFF;

TCFG0|=199;

//Timer1预分频值199

TCFG1&

=~(0x0F<

<

4);

TCFG1|=(0<

20)|(3<

//Timer1分频值16

TCON&

=~(0xF<

8);

TCNTB1=dwTime;

TCON|=(2<

TCON|=(9<

//自动装载模式,启动Timer

=~(1<

9);

//这句很重要,这句不写定时器将不会启动

v_pINTregs->

INTMSK&

=~(1<

IRQ_TIMER1);

//使能Timer中断

 

DWORDTimer_IST(void)

DWORDdwStatus;

IntEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

if(!

IntEvent)

RETAILMSG(1,(TEXT("

ERROR:

Timer:

Failedtocreateevent.\r\n"

returnFALSE;

InterruptInitialize(g_SysIrq,IntEvent,NULL,0))

RETAILMSG(1,(TEXT("

FailtoinitializeTimerinterruptevent\r\n"

while

(1)

dwStatus=WaitForSingleObject(IntEvent,INFINITE);

if(dwStatus==WAIT_OBJECT_0)

v_pWDGregs->

WTCNT=wtdata;

//0x6000;

//更新看门狗计数器

num++;

//测试

InterruptDone(g_SysIrq);

//RETAILMSG(1,(TEXT("

CompleteTimerInterrupt.num=%d.\r\n"

),num));

else

CloseHandle(IntEvent);

//这句很重要

BOOL

wdg_InitAddr(void)

BOOLRetValue=TRUE;

v_pWDGregs=(volatileS3C2440A_WATCHDOG_REG*)VirtualAlloc(0,sizeof(S3C2440A_WATCHDOG_REG),MEM_RESERVE,PAGE_NOACCESS);

if(v_pWDGregs==NULL)

Forwdg_regs:

RetValue=FALSE;

else

if(!

VirtualCopy((PVOID)v_pWDGregs,(PVOID)(S3C2440A_BASE_REG_PA_WATCHDOG>

8),sizeof(S3C2440A_WATCHDOG_REG),PAGE_PHYSICAL|PAGE_READWRITE|PAGE_NOCACHE))

{

ERRORMSG(1,(TEXT("

Forwdg_regs:

RetValue=FALSE;

}

RetValue)

RETAILMSG(1,(TEXT("

:

wdg_InitializeAddresses-Fail!

)));

if(v_pWDGregs)

VirtualFree((PVOID)v_pWDGregs,0,MEM_RELEASE);

v_pWDGregs=NULL;

//RETAILMSG(1,(TEXT("

wdg_InitializeAddresses-Success\r\n"

return(RetValue);

BOOLWINAPI

DllEntry(HANDLEhInstDLL,

DWORDdwReason,

LPVOIDlpvReserved)

switch(dwReason)

caseDLL_PROCESS_ATTACH:

//g_hInstance=hInstDLL;

RETAILMSG(1,(TEXT("

wdg:

DLL_PROCESS_ATTACH.\r\n"

DisableThreadLibraryCalls((HMODULE)hInstDLL);

break;

//returnTRUE;

caseDLL_THREAD_ATTACH:

DLL_THREAD_ATTACH\r\n"

break;

caseDLL_THREAD_DETACH:

DLL_THREAD_DETACH\r\n"

caseDLL_PROCESS_DETACH:

DLL_PROCESS_DETACH\r\n"

#ifdefUNDER_CE

caseDLL_PROCESS_EXITING:

DLL_PROCESS_EXITING\r\n"

caseDLL_SYSTEM_STARTED:

DLL_SYSTEM_STARTED\r\n"

#endif

returnTRUE;

DWORDwdg_Init(DWORDdwContext)

dwTime=0x5000;

num=0;

wtdata=0x6000;

RETAILMSG(1,(TEXT("

wdg_INIT.\r\n"

wdg_InitAddr();

Vitural_Alloc();

KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&

g_TimerIrq,sizeof(UINT32),&

g_SysIrq,sizeof(UINT32),NULL))

Failedtorequestsysintrvalue.\r\n"

Timer_Init();

//Returnshandlevaluefortheopeninstance.

DWORDwdg_Open(

DWORDdwData,

DWORDdwAccess,

DWORDdwShareMode

DWORDthreadID;

v_pWDGregs->

WTCON&

=~((1<

5)|(1<

2));

//DisableWatchdog

WTCNT=wtdata;

//20480

WTDAT=wtdata;

WTCON|=(199<

8)|(1<

5)|(0x00>

3);

/*200presacle,EnableWatchdog,16divisionfactor*/

v_pWDGregs->

WTCON|=(1<

0);

//startwatchdogtimer

IntThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Timer_IST,0,0,&

threadID);

//创建定时器中断线程

if(NULL==IntThread)

failedtoCreateTimerThread!

}

//以下两句为调试打印语句

RETAILMSG(1,(TEXT("

num=%d,TCNTO1=0x%x.\r\n"

),num,v_pPWMregs->

TCNTO1));

wdg_Open.dwTime=0x%x,wtdata=0x%x,TCNTB1=0x%x,WTCNT=0x%x.\r\n"

),dwTime,wtdata,v_pPWMregs->

TCNTB1,v_pWDGregs->

WTCNT));

return1;

DWORD

wdg_Close(DWORDHandle)

TCON|=(0<

8);

//停止定时器1

INTMSK|=(1<

//禁止定时器中断

//禁止看门狗

CloseHandle(IntThread);

if(IntEvent)

CloseHandle(IntEvent);

//RETAILMSG(1,(TEXT("

//RETAILMSG(1,(TEXT("

wdg_Close.dwTime=0x%x,wtdata=0x%x,TCNTB1=0x%x,WTCNT=0x%x.\r\n"

}

//Devicedeinit-devicesareexpectedtoclosedown.

//Thedevicemanagerdoesnotcheckthereturncode.

DWORDwdg_Deinit(DWORDdwContext)

//释放中断资源

InterruptDisable(g_SysIrq);

KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&

g_SysIrq,sizeof(UINT32),NULL,0,NULL);

if(v_pPWMregs)

VirtualFree((PVOID)v_pPWMregs,0,MEM_RELEASE);

v_pPWMregs=NULL;

if(v_pINTregs)

VirtualFree((PVOID)v_pINTregs,0,MEM_RELEASE);

v_pINTregs=NULL;

if(v_pWDGregs)

VirtualFree((PVOID)v_pWDGregs,0,MEM_RELEASE);

v_pWDGregs=NULL;

wdg_Deinit.\r\n"

DWORDwdg_IOControl(

DWORDHandle,

DWORDdwIoControlCode,

PBYTEpInBuf,

DWORDnInBufSize,

PBYTEpOutBuf,

DWORDnOutBufSize,

PDWORDpBytesReturned

switch(dwIoControlCode)

case0:

dwTime=0x6000;

//dwTime=wtdata

case1:

//dwTime<

wtdata

case2:

wtdata=0x5000;

//dwTime>

//case3:

dwTime=data[0];

wtdata=data[1];

break;

wdg_IOControl.dwTime=0x%x,wtdata=0x%x,TCNTB1=0x%x,WTCNT=0x%x.\r\n"

DWORDwdg_Read(DWORDHandle,LPVOIDpBuffer,DWORDdwNumBytes)

wdg_Read.\r\n"

*((DWORD*)pBuffer)=dwTime;

((DWORD*)pBuffer)++;

*((DWORD*)pBuffer)=wtdata;

*((DWORD*)pBuffer)=num;

DWORDwdg_Write(DWORDHandle,LPCVOIDpBuffer,DWORDdwNumBytes)

wdg_Write.\r\n"

dwTime=*((DWORD*)pBuffer);

wtdata=*((DWORD*)pBuffer);

num=*((DWORD*)pBuffer);

wdg_IOControl.dwTime=0x%x,wtdata=0x%x.\r\n"

),dwTime,wtdata));

DWORDwdg_Seek(DWORDHandle,longlDistance,DWORDdwMoveMethod)

return0;

voidwdg_PowerUp(void)

return;

voidwdg_PowerDown(void)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2