wdt_avr.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2006 by egnite Software GmbH. All rights reserved.
00003  *
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions
00006  * are met:
00007  *
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the copyright holders nor the names of
00014  *    contributors may be used to endorse or promote products derived
00015  *    from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS
00018  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00019  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00020  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE
00021  * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00022  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00023  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
00024  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
00025  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00026  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
00027  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00028  * SUCH DAMAGE.
00029  *
00030  * For additional information see http://www.ethernut.de/
00031  *
00032  */
00033 
00034 /*
00035  * $Log: wdt_avr.c,v $
00036  * Revision 1.1  2006/05/25 09:13:23  haraldkipp
00037  * Platform independent watchdog API added.
00038  *
00039  */
00040 
00041 #if defined(__GNUC__)
00042 #include <avr/wdt.h>
00043 #endif
00044 #include <sys/timer.h>
00045 #include <dev/watchdog.h>
00046 
00051 
00055 #ifndef NUT_WDT_FREQ
00056 #define NUT_WDT_FREQ    1165000
00057 #endif
00058 
00059 static ureg_t nested;
00060 static u_char wdt_div;
00061 
00062 
00073 u_long AvrWatchDogStart(u_long ms)
00074 {
00075     u_long ticks;
00076 
00077     wdt_reset();
00078 
00079     ticks = ((NUT_WDT_FREQ / 1000UL) * ms) >> 14;
00080     for (wdt_div = 0; wdt_div < 7 && ticks; wdt_div++) {
00081         ticks >>= 1;
00082     }
00083     wdt_enable(wdt_div);
00084     
00085     nested = 1;
00086 
00087     return (16384UL << wdt_div) / (NUT_WDT_FREQ / 1000UL);
00088 }
00089 
00096 void AvrWatchDogRestart(void)
00097 {
00098     wdt_reset();
00099 }
00100 
00107 void AvrWatchDogDisable(void)
00108 {
00109     if (nested) {
00110         nested++;
00111     }
00112     wdt_disable();
00113 }
00114 
00121 void AvrWatchDogEnable(void)
00122 {
00123     if (nested > 1 && --nested == 1) {
00124         wdt_enable(wdt_div);
00125     }
00126 }
00127 

© 2000-2007 by egnite Software GmbH - visit http://www.ethernut.de/