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

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

[avr-libc-commit] [2451] Save & restore RAMPD register in wdt_enable/dis


From: Pitchumani
Subject: [avr-libc-commit] [2451] Save & restore RAMPD register in wdt_enable/disable for Xmega.
Date: Thu, 25 Sep 2014 18:53:48 +0000

Revision: 2451
          http://svn.sv.gnu.org/viewvc/?view=rev&root=avr-libc&revision=2451
Author:   pitchumani
Date:     2014-09-25 18:53:47 +0000 (Thu, 25 Sep 2014)
Log Message:
-----------
Save & restore RAMPD register in wdt_enable/disable for Xmega. Correct syntax.

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    2014-08-16 07:08:19 UTC (rev 2450)
+++ trunk/avr-libc/ChangeLog    2014-09-25 18:53:47 UTC (rev 2451)
@@ -1,3 +1,9 @@
+2014-09-25  Pitchumani Sivanupandi <address@hidden>
+
+       * include/avr/wdt.h (wdt_enable): save & restore rampd register.
+       correct syntax.
+       (wdt_disable): Likewise.
+
 2014-08-12  Joerg Wunsch <address@hidden>
 
        * configure.ac: Post-release 1.8.1

Modified: trunk/avr-libc/NEWS
===================================================================
--- trunk/avr-libc/NEWS 2014-08-16 07:08:19 UTC (rev 2450)
+++ trunk/avr-libc/NEWS 2014-09-25 18:53:47 UTC (rev 2451)
@@ -6,6 +6,8 @@
 
 * Contributed Patches:
 
+  [no-id] save & restore rampd register in xmega wdt_enable and wdt_disable
+
 * Other changes:
 
 

Modified: trunk/avr-libc/include/avr/wdt.h
===================================================================
--- trunk/avr-libc/include/avr/wdt.h    2014-08-16 07:08:19 UTC (rev 2450)
+++ trunk/avr-libc/include/avr/wdt.h    2014-09-25 18:53:47 UTC (rev 2451)
@@ -180,48 +180,50 @@
    1) set WDT change enable (WDT_CEN_bm)
    2) enable WDT (WDT_ENABLE_bm)
    3) set timeout (timeout)
-** Synchronization starts when ENABLE bit of WDT is set. So, wait till it 
+** Synchronization starts when ENABLE bit of WDT is set. So, wait till it
    finishes (SYNCBUSY of STATUS register is automatically cleared after the
    sync is finished).
 */
 #define wdt_enable(timeout) \
 do { \
-uint8_t temp; \
+uint8_t temp = 0; \
 __asm__ __volatile__ (         \
+    "in __tmp_reg__, %[rampd]"              "\n\t" \
+    "out %[rampd], __zero_reg__"            "\n\t" \
     "out %[ccp_reg], %[ioreg_cen_mask]"     "\n\t" \
     "sts %[wdt_reg], %[wdt_enable_timeout]" "\n\t" \
     "1:lds %[tmp], %[wdt_status_reg]"       "\n\t" \
     "sbrc  %[tmp], %[wdt_syncbusy_bit]"     "\n\t" \
     "rjmp 1b"                               "\n\t" \
-    "wdr"                                   "\n\t" \
-    : \
-    : [ccp_reg]            "M" _SFR_MEM_ADDR(CCP),        \
-      [ioreg_cen_mask]     "r" CCP_IOREG_gc,              \
-      [wdt_reg]            "M" _SFR_MEM_ADDR(WDT_CTRL),   \
-      [wdt_enable_timeout] "r" (WDT_CEN_bm | WDT_ENABLE_bm | timeout), \
-      [wdt_status_reg]     "M" _SFR_MEM_ADDR(WDT_STATUS), \
-      [wdt_syncbusy_bit]   "I" WDT_SYNCBUSY_bm,           \
-      [tmp]                "r" temp                       \
+    "out %[rampd], __tmp_reg__"             "\n\t" \
+    : "=r" (temp) \
+    : [rampd]              "M" (_SFR_MEM_ADDR(RAMPD)),      \
+      [ccp_reg]            "I" (_SFR_MEM_ADDR(CCP)),        \
+      [ioreg_cen_mask]     "r" ((uint8_t)CCP_IOREG_gc),     \
+      [wdt_reg]            "M" (_SFR_MEM_ADDR(WDT_CTRL)),   \
+      [wdt_enable_timeout] "r" ((uint8_t)(WDT_CEN_bm | WDT_ENABLE_bm | 
timeout)), \
+      [wdt_status_reg]     "M" (_SFR_MEM_ADDR(WDT_STATUS)), \
+      [wdt_syncbusy_bit]   "I" (WDT_SYNCBUSY_bm),           \
+      [tmp]                "r" (temp)                       \
     : "r0" \
-) \
+); \
 } while(0)
 
 #define wdt_disable() \
-do { \
-uint8_t temp; \
 __asm__ __volatile__ (  \
+    "in __tmp_reg__, %[rampd]"          "\n\t" \
+    "out %[rampd], __zero_reg__"        "\n\t" \
     "out %[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
-    "lds %[tmp], %[wdt_reg]"            "\n\t" \
-    "andi %[tmp], %[disable_mask]"      "\n\t" \
-    "sts %[wdt_reg], %[wdt_disable]"    "\n\t" \
+    "sts %[wdt_reg], %[disable_mask]"   "\n\t" \
+    "out %[rampd], __tmp_reg__"         "\n\t" \
     : \
-    : [ccp_reg]           "M" _SFR_MEM_ADDR(CCP),      \
-      [ioreg_cen_mask]    "r" CCP_IOREG_gc,            \
-      [wdt_reg]           "M" _SFR_MEM_ADDR(WDT_CTRL), \
-      [tmp]               "r" temp,                    \
-      [disable_mask]      "M" ~WDT_ENABLE_bm,          \
-      [wdt_disable]       "r" (temp | WDT_CEN_bm)      \
-)
+    : [rampd]             "M" (_SFR_MEM_ADDR(RAMPD)),    \
+      [ccp_reg]           "I" (_SFR_MEM_ADDR(CCP)),      \
+      [ioreg_cen_mask]    "r" ((uint8_t)CCP_IOREG_gc),   \
+      [wdt_reg]           "M" (_SFR_MEM_ADDR(WDT_CTRL)), \
+      [disable_mask]      "r" ((uint8_t)((~WDT_ENABLE_bm) | WDT_CEN_bm)) \
+    : "r0" \
+);
 
 #elif defined(__AVR_AT90CAN32__) \
 || defined(__AVR_AT90CAN64__) \




reply via email to

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