看门狗驱动详解Word格式.docx
《看门狗驱动详解Word格式.docx》由会员分享,可在线阅读,更多相关《看门狗驱动详解Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
![看门狗驱动详解Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/f71a1416-798c-4799-80ff-98d07115faf9/f71a1416-798c-4799-80ff-98d07115faf91.gif)
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)
{