avr-libc-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-libc-commit] [2465] patch #8590: Add conditional branch to enable/


From: Pitchumani
Subject: [avr-libc-commit] [2465] patch #8590: Add conditional branch to enable/ disable WDT for devices those having CCP.
Date: Thu, 05 Feb 2015 13:09:43 +0000

Revision: 2465
          http://svn.sv.gnu.org/viewvc/?view=rev&root=avr-libc&revision=2465
Author:   pitchumani
Date:     2015-02-05 13:09:43 +0000 (Thu, 05 Feb 2015)
Log Message:
-----------
patch #8590: Add conditional branch to enable/disable WDT for devices those 
having CCP.

Ticket Links:
------------
    http://savannah.gnu.org/patch/?8590

Modified Paths:
--------------
    trunk/avr-libc/ChangeLog
    trunk/avr-libc/NEWS
    trunk/avr-libc/include/avr/wdt.h

Modified: trunk/avr-libc/ChangeLog
===================================================================
--- trunk/avr-libc/ChangeLog    2015-01-22 20:08:54 UTC (rev 2464)
+++ trunk/avr-libc/ChangeLog    2015-02-05 13:09:43 UTC (rev 2465)
@@ -1,3 +1,9 @@
+2015-02-05  Senthil Kumar Selvaraj <address@hidden>
+            Pitchumani Sivanupandi <address@hidden>
+
+    * include/avr/wdt.h: Add conditional branch to enable/disable wdt
+    for devices that has CCP.
+
 2015-01-06  Joerg Wunsch <address@hidden>
 
        * include/avr/iox128a3.h: Fix an obvious long-standing

Modified: trunk/avr-libc/NEWS
===================================================================
--- trunk/avr-libc/NEWS 2015-01-22 20:08:54 UTC (rev 2464)
+++ trunk/avr-libc/NEWS 2015-02-05 13:09:43 UTC (rev 2465)
@@ -12,6 +12,7 @@
   [no-id] save & restore rampd register in xmega wdt_enable and wdt_disable
   [#8543] Fix multiple issues with device header files
   [#8563] Generalize power reduction macros in power.h by removing hard coded 
device names
+  [#8590] WDT enable/disable for devices with CCP
 
 * Other changes:
 

Modified: trunk/avr-libc/include/avr/wdt.h
===================================================================
--- trunk/avr-libc/include/avr/wdt.h    2015-01-22 20:08:54 UTC (rev 2464)
+++ trunk/avr-libc/include/avr/wdt.h    2015-02-05 13:09:43 UTC (rev 2465)
@@ -228,6 +228,176 @@
 ); \
 }while(0)
 
+#elif defined(CCP)
+
+static __inline__
+__attribute__ ((__always_inline__))
+void wdt_enable (const uint8_t value)
+{
+       if (!_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P (_WD_CONTROL_REG))
+       {
+               __asm__ __volatile__ (
+                       "in __tmp_reg__,__SREG__" "\n\t"
+                       "cli" "\n\t"
+                       "wdr" "\n\t"
+                       "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
+                       "sts %[WDTREG],%[WDVALUE]" "\n\t"
+                       "out __SREG__,__tmp_reg__" "\n\t"
+                       : /* no outputs */
+                       : [CCPADDRESS] "M" (_SFR_MEM_ADDR(CCP)),
+                       [SIGNATURE] "r" ((uint8_t)0xD8),
+                       [WDTREG] "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
+                       [WDVALUE] "r" ((uint8_t)((value & 0x08 ? _WD_PS3_MASK : 
0x00)
+                               | _BV(WDE) | (value & 0x07) ))
+                       : "r0"
+                       );
+       }
+       else if (!_SFR_IO_REG_P (CCP) && _SFR_IO_REG_P (_WD_CONTROL_REG))
+       {
+               __asm__ __volatile__ (
+                       "in __tmp_reg__,__SREG__" "\n\t"
+                       "cli" "\n\t"
+                       "wdr" "\n\t"
+                       "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
+                       "out %[WDTREG],%[WDVALUE]" "\n\t"
+                       "out __SREG__,__tmp_reg__" "\n\t"
+                       : /* no outputs */
+                       : [CCPADDRESS] "M" (_SFR_MEM_ADDR(CCP)),
+                       [SIGNATURE] "r" ((uint8_t)0xD8),
+                       [WDTREG] "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
+                       [WDVALUE] "r" ((uint8_t)((value & 0x08 ? _WD_PS3_MASK : 
0x00)
+                               | _BV(WDE) | (value & 0x07) ))
+                       : "r0"
+                       );
+       }
+       else if (_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P (_WD_CONTROL_REG))
+       {
+               __asm__ __volatile__ (
+                       "in __tmp_reg__,__SREG__" "\n\t"
+                       "cli" "\n\t"
+                       "wdr" "\n\t"
+                       "out %[CCPADDRESS],%[SIGNATURE]" "\n\t"
+                       "sts %[WDTREG],%[WDVALUE]" "\n\t"
+                       "out __SREG__,__tmp_reg__" "\n\t"
+                       : /* no outputs */
+                       : [CCPADDRESS] "I" (_SFR_IO_ADDR(CCP)),
+                       [SIGNATURE] "r" ((uint8_t)0xD8),
+                       [WDTREG] "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
+                       [WDVALUE] "r" ((uint8_t)((value & 0x08 ? _WD_PS3_MASK : 
0x00)
+                               | _BV(WDE) | (value & 0x07) ))
+                       : "r0"
+                       );
+       }
+       else
+       {
+               __asm__ __volatile__ (
+                       "in __tmp_reg__,__SREG__" "\n\t"
+                       "cli" "\n\t"
+                       "wdr" "\n\t"
+                       "out %[CCPADDRESS],%[SIGNATURE]" "\n\t"
+                       "out %[WDTREG],%[WDVALUE]" "\n\t"
+                       "out __SREG__,__tmp_reg__" "\n\t"
+                       : /* no outputs */
+                       : [CCPADDRESS] "I" (_SFR_IO_ADDR(CCP)),
+                       [SIGNATURE] "r" ((uint8_t)0xD8),
+                       [WDTREG] "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
+                       [WDVALUE] "r" ((uint8_t)((value & 0x08 ? _WD_PS3_MASK : 
0x00)
+                               | _BV(WDE) | (value & 0x07) ))
+                       : "r0"
+                       );
+       }
+}
+
+static __inline__
+__attribute__ ((__always_inline__))
+void wdt_disable (void)
+{
+       if (!_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P(_WD_CONTROL_REG))
+       {
+        uint8_t temp_wd;
+        __asm__ __volatile__ (
+                               "in __tmp_reg__,__SREG__" "\n\t"
+                               "cli" "\n\t"
+                               "wdr" "\n\t"
+                               "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
+                               "lds %[TEMP_WD],%[WDTREG]" "\n\t"
+                               "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
+                               "sts %[WDTREG],%[TEMP_WD]" "\n\t"
+                               "out __SREG__,__tmp_reg__" "\n\t"
+                               : /*no output */
+                               : [CCPADDRESS] "M" (_SFR_MEM_ADDR(CCP)),
+                               [SIGNATURE] "r" ((uint8_t)0xD8),
+                               [WDTREG] "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
+                               [TEMP_WD] "d" (temp_wd),
+                               [WDVALUE] "I" (1 << WDE)
+                               : "r0"
+                               );
+       }
+       else if (!_SFR_IO_REG_P (CCP) && _SFR_IO_REG_P(_WD_CONTROL_REG))
+       {
+        uint8_t temp_wd;
+        __asm__ __volatile__ (
+                               "in __tmp_reg__,__SREG__" "\n\t"
+                               "cli" "\n\t"
+                               "wdr" "\n\t"
+                               "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
+                               "in %[TEMP_WD],%[WDTREG]" "\n\t"
+                               "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
+                               "out %[WDTREG],%[TEMP_WD]" "\n\t"
+                               "out __SREG__,__tmp_reg__" "\n\t"
+                               : /*no output */
+                               : [CCPADDRESS] "M" (_SFR_MEM_ADDR(CCP)),
+                               [SIGNATURE] "r" ((uint8_t)0xD8),
+                               [WDTREG] "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
+                               [TEMP_WD] "d" (temp_wd),
+                               [WDVALUE] "I" (1 << WDE)
+                               : "r0"
+                               );
+       }
+       else if (_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P(_WD_CONTROL_REG))
+       {
+        uint8_t temp_wd;
+        __asm__ __volatile__ (
+                               "in __tmp_reg__,__SREG__" "\n\t"
+                               "cli" "\n\t"
+                               "wdr" "\n\t"
+                               "out %[CCPADDRESS],%[SIGNATURE]" "\n\t"
+                               "lds %[TEMP_WD],%[WDTREG]" "\n\t"
+                               "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
+                               "sts %[WDTREG],%[TEMP_WD]" "\n\t"
+                               "out __SREG__,__tmp_reg__" "\n\t"
+                               : /*no output */
+                               : [CCPADDRESS] "I" (_SFR_IO_ADDR(CCP)),
+                               [SIGNATURE] "r" ((uint8_t)0xD8),
+                               [WDTREG] "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
+                               [TEMP_WD] "d" (temp_wd),
+                               [WDVALUE] "I" (1 << WDE)
+                               : "r0"
+                               );
+       }
+       else
+       {
+        uint8_t temp_wd;
+        __asm__ __volatile__ (
+                               "in __tmp_reg__,__SREG__" "\n\t"
+                               "cli" "\n\t"
+                               "wdr" "\n\t"
+                               "out %[CCPADDRESS],%[SIGNATURE]" "\n\t"
+                               "in %[TEMP_WD],%[WDTREG]" "\n\t"
+                               "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
+                               "out %[WDTREG],%[TEMP_WD]" "\n\t"
+                               "out __SREG__,__tmp_reg__" "\n\t"
+                               : /*no output */
+                               : [CCPADDRESS] "I" (_SFR_IO_ADDR(CCP)),
+                               [SIGNATURE] "r" ((uint8_t)0xD8),
+                               [WDTREG] "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
+                               [TEMP_WD] "d" (temp_wd),
+                               [WDVALUE] "I" (1 << WDE)
+                               : "r0"
+                               );
+       }
+}
+
 #else
 
 static __inline__




reply via email to

[Prev in Thread] Current Thread [Next in Thread]