Upgrade doxygen configuration files to the latest version.
[pub/lufa.git] / LUFA / Common / ArchitectureSpecific.h
index 48063e0..2d2f662 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2021.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2021  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -18,7 +18,7 @@
   advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
-  The author disclaim all warranties with regard to this
+  The author disclaims all warranties with regard to this
   software, including all implied warranties of merchantability
   and fitness.  In no event shall the author be liable for any
   special, indirect or consequential damages or any damages
 
        /* Public Interface - May be used in end-application: */
                /* Macros: */
-                       #if (ARCH == ARCH_AVR8) || defined(__DOXYGEN__)
-                               /** Disables the AVR's JTAG bus in software, until a system reset. This will override the current JTAG
-                                *  status as set by the JTAGEN fuse, disabling JTAG debugging and reverting the JTAG pins back to GPIO
-                                *  mode.
-                                *
-                                *  \note This macro is not available for all architectures.
-                                */
-                               #define JTAG_DISABLE()                  MACROS{                                      \
-                                                                               __asm__ __volatile__ (               \
-                                                                               "in __tmp_reg__,__SREG__" "\n\t"     \
-                                                                               "cli" "\n\t"                         \
-                                                                               "out %1, %0" "\n\t"                  \
-                                                                               "out __SREG__, __tmp_reg__" "\n\t"   \
-                                                                               "out %1, %0" "\n\t"                  \
-                                                                               :                                    \
-                                                                               : "r" (1 << JTD),                    \
-                                                                                 "M" (_SFR_IO_ADDR(MCUCR))          \
-                                                                               : "r0");                             \
-                                                                       }MACROE
+                       #if (ARCH == ARCH_AVR8) || (ARCH == ARCH_XMEGA) || defined(__DOXYGEN__)
+                               #if (ARCH == ARCH_AVR8) || defined(__DOXYGEN__)
+                                       /** Re-enables the AVR's JTAG bus in software, until a system reset. This will re-enable JTAG debugging
+                                        *  interface after is has been disabled in software via \ref JTAG_DISABLE().
+                                        *
+                                        *  \note This macro is not available for all architectures.
+                                        */
+                                       #define JTAG_ENABLE()               do {                                     \
+                                                                               __asm__ __volatile__ (               \
+                                                                               "in __tmp_reg__,__SREG__" "\n\t"     \
+                                                                               "cli" "\n\t"                         \
+                                                                               "out %1, %0" "\n\t"                  \
+                                                                               "out __SREG__, __tmp_reg__" "\n\t"   \
+                                                                               "out %1, %0" "\n\t"                  \
+                                                                               :                                    \
+                                                                               : "r" (MCUCR & ~(1 << JTD)),         \
+                                                                                 "M" (_SFR_IO_ADDR(MCUCR))          \
+                                                                               : "r0");                             \
+                                                                           } while (0)
+
+                                       /** Disables the AVR's JTAG bus in software, until a system reset. This will override the current JTAG
+                                        *  status as set by the JTAGEN fuse, disabling JTAG debugging and reverting the JTAG pins back to GPIO
+                                        *  mode.
+                                        *
+                                        *  \note This macro is not available for all architectures.
+                                        */
+                                       #define JTAG_DISABLE()              do {                                     \
+                                                                               __asm__ __volatile__ (               \
+                                                                               "in __tmp_reg__,__SREG__" "\n\t"     \
+                                                                               "cli" "\n\t"                         \
+                                                                               "out %1, %0" "\n\t"                  \
+                                                                               "out __SREG__, __tmp_reg__" "\n\t"   \
+                                                                               "out %1, %0" "\n\t"                  \
+                                                                               :                                    \
+                                                                               : "r" (MCUCR | (1 << JTD)),          \
+                                                                                 "M" (_SFR_IO_ADDR(MCUCR))          \
+                                                                               : "r0");                             \
+                                                                           } while (0)
+                               #endif
 
                                /** Defines a volatile \c NOP statement which cannot be optimized out by the compiler, and thus can always
                                 *  be set as a breakpoint in the resulting code. Useful for debugging purposes, where the optimizer
                                 *
                                 *  \param[in] Condition  Condition that will be evaluated.
                                */
-                               #define JTAG_ASSERT(Condition)          MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE
+                               #define JTAG_ASSERT(Condition)          do {                       \
+                                                                           if (!(Condition))      \
+                                                                             JTAG_DEBUG_BREAK();  \
+                                                                       } while (0)
 
                                /** Macro for testing condition \c "x" and writing debug data to the stdout stream if \c false. The stdout stream
                                 *  must be pre-initialized before this macro is run and linked to an output device, such as the microcontroller's
                                 *
                                 *  \param[in] Condition  Condition that will be evaluated,
                                 */
-                               #define STDOUT_ASSERT(Condition)        MACROS{ if (!(x)) { printf_P(PSTR("%s: Function \"%s\", Line %d: "   \
-                                                                               "Assertion \"%s\" failed.\r\n"),     \
-                                                                               __FILE__, __func__, __LINE__, #Condition); } }MACROE
+                               #define STDOUT_ASSERT(Condition)        do {                                                           \
+                                                                           if (!(Condition))                                          \
+                                                                             printf_P(PSTR("%s: Function \"%s\", Line %d: "           \
+                                                                                           "Assertion \"%s\" failed.\r\n"),           \
+                                                                                           __FILE__, __func__, __LINE__, #Condition); \
+                                                                       } while (0)
 
                                #if !defined(pgm_read_ptr) || defined(__DOXYGEN__)
-                                       /** Reads a pointer out of PROGMEM space on the AVR8 architecture. This is currently a wrapper for the
-                                        *  avr-libc \c pgm_read_ptr() macro with a \c void* cast, so that its value can be assigned directly
-                                        *  to a pointer variable or used in pointer arithmetic without further casting in C. In a future
-                                        *  avr-libc distribution this will be part of the standard API and will be implemented in a more formal
-                                        *  manner.
+                                       /** Reads a pointer out of PROGMEM space on the AVR8 architecture. This is a wrapper for the avr-libc
+                                        *  \c pgm_read_word() macro with a \c void* cast, so that its value can be assigned directly to a
+                                        *  pointer variable or used in pointer arithmetic without further casting in C.
                                         *
                                         *  \note This macro is not available for all architectures.
                                         *
                                         *
                                         *  \return Pointer retrieved from PROGMEM space.
                                         */
-                                       #define pgm_read_ptr(Address)        (void*)pgm_read_word(Address)
+                                       #define pgm_read_ptr(Address)       (void*)pgm_read_word(Address)
                                #endif
+                       #elif (ARCH == ARCH_UC3)
+                               #define JTAG_DEBUG_POINT()              __asm__ __volatile__ ("nop" ::)
+                               #define JTAG_DEBUG_BREAK()              __asm__ __volatile__ ("breakpoint" ::)
+                               #define JTAG_ASSERT(Condition)          do {                                                    \
+                                                                           if (!(Condition))                                   \
+                                                                             JTAG_DEBUG_BREAK();                               \
+                                                                       } while (0)
+                               #define STDOUT_ASSERT(Condition)        do {                                                    \
+                                                                           if (!(Condition))                                   \
+                                                                             printf("%s: Function \"%s\", Line %d: "           \
+                                                                                    "Assertion \"%s\" failed.\r\n",            \
+                                                                                    __FILE__, __func__, __LINE__, #Condition); \
+                                                                       } while (0)
                        #endif
 
        /* Disable C linkage for C++ Compilers: */