]> git.pld-linux.org Git - packages/crossavr-libc.git/blobdiff - 504-avr-libc-bugavrtc-448.patch
- synchronized patches with official AVR toolchain 3.4.1.830
[packages/crossavr-libc.git] / 504-avr-libc-bugavrtc-448.patch
diff --git a/504-avr-libc-bugavrtc-448.patch b/504-avr-libc-bugavrtc-448.patch
new file mode 100644 (file)
index 0000000..93682aa
--- /dev/null
@@ -0,0 +1,154 @@
+diff -Naurp include/avr/wdt.h include/avr/wdt.h
+--- include/avr/wdt.h  2012-11-03 00:46:16.083399618 +0530
++++ include/avr/wdt.h  2012-11-03 01:02:09.340126553 +0530
+@@ -107,8 +107,10 @@
+ #if defined(WDTCSR)
+ #  define _WD_CONTROL_REG     WDTCSR
+-#else
++#elif defined(WDTCR)
+ #  define _WD_CONTROL_REG     WDTCR
++#else
++#  define _WD_CONTROL_REG     WDT
+ #endif
+ #if defined(WDTOE)
+@@ -355,8 +357,137 @@ __asm__ __volatile__ (  \
+     : "r0" \
+ )
++#elif defined(__AVR_ATtiny1634__) \
++|| defined(__AVR_ATtiny828__)
++
++#define wdt_enable(value) \
++__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)) \
++    : "r0" \
++)
++
++#define wdt_disable() \
++do { \
++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" \
++); \
++}while(0)
++
++#elif defined(__AVR_ATtiny4__) \
++|| defined(__AVR_ATtiny5__) \
++|| defined(__AVR_ATtiny9__) \
++|| defined(__AVR_ATtiny10__) \
++|| defined(__AVR_ATtiny20__) \
++|| defined(__AVR_ATtiny40__) 
++
++#define wdt_enable(value) \
++__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)) \
++    : "r16" \
++)
++
++#define wdt_disable() \
++do { \
++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) \
++    : "r16" \
++); \
++}while(0)
++
++#elif defined(__AVR_ATxmega32X1__) \
++||defined(__AVR_ATxmega64A1__)
++
++#define wdt_enable(value) \
++__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)((_BV(WDT_ENABLE_bp)) | (_BV(WDT_CEN_bp)) | \
++                                   (value << WDT_PER_gp))) \
++    : "r0" \
++)
++
++#define wdt_disable() \
++__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)((_BV(WDT_CEN_bp)))) \
++    : "r0" \
++) 
+-    
++/**
++Undefining explicitly so that it produces an error.
++ */
++#elif defined(__AVR_AT90C8534__) \
++|| defined(__AVR_M3000__) 
++    #undef wdt_enable
++    #undef wdt_disale    
+ #else  
+ /* Use OUT instruction. */
This page took 0.059144 seconds and 4 git commands to generate.