[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__
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [avr-libc-commit] [2465] patch #8590: Add conditional branch to enable/ disable WDT for devices those having CCP.,
Pitchumani <=