+/*\r
+ LUFA Library\r
+ Copyright (C) Dean Camera, 2011.\r
+\r
+ dean [at] fourwalledcubicle [dot] com\r
+ www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+ Permission to use, copy, modify, distribute, and sell this\r
+ software and its documentation for any purpose is hereby granted\r
+ without fee, provided that the above copyright notice appear in\r
+ all copies and that both that the copyright notice and this\r
+ permission notice and warranty disclaimer appear in supporting\r
+ documentation, and that the name of the author not be used in\r
+ advertising or publicity pertaining to distribution of the\r
+ software without specific, written prior permission.\r
+\r
+ The author disclaim all warranties with regard to this\r
+ software, including all implied warranties of merchantability\r
+ and fitness. In no event shall the author be liable for any\r
+ special, indirect or consequential damages or any damages\r
+ whatsoever resulting from loss of use, data or profits, whether\r
+ in an action of contract, negligence or other tortious action,\r
+ arising out of or in connection with the use or performance of\r
+ this software.\r
+*/\r
+\r
+/** \file\r
+ * \brief Architecture specific definitions relating to specific processor architectures.\r
+ *\r
+ * \copydetails Group_ArchitectureSpecific\r
+ *\r
+ * \note Do not include this file directly, rather include the Common.h header file instead to gain this file's\r
+ * functionality.\r
+ */\r
+\r
+/** \ingroup Group_Common\r
+ * \defgroup Group_ArchitectureSpecific Architecture Specific Definitions\r
+ * \brief Architecture specific definitions relating to specific processor architectures.\r
+ *\r
+ * Architecture specific macros, functions and other definitions, which relate to specific architectures. This\r
+ * definitions may or may not be available in some form on other architectures, and thus should be protected by\r
+ * preprocessor checks in portable code to prevent compile errors.\r
+ *\r
+ * @{\r
+ */\r
+\r
+#ifndef __LUFA_ARCHSPEC_H__\r
+#define __LUFA_ARCHSPEC_H__\r
+\r
+ /* Preprocessor Checks: */\r
+ #if !defined(__INCLUDE_FROM_COMMON_H)\r
+ #error Do not include this file directly. Include LUFA/Common/Common.h instead to gain this functionality.\r
+ #endif\r
+ \r
+ /* Public Interface - May be used in end-application: */\r
+ /* Macros: */\r
+ #if (ARCH == ARCH_AVR8) || defined(__DOXYGEN__)\r
+ /** Disables the AVR's JTAG bus in software, until a system reset. This will override the current JTAG\r
+ * status as set by the JTAGEN fuse, disabling JTAG debugging and reverting the JTAG pins back to GPIO\r
+ * mode.\r
+ *\r
+ * \note This macro is not available for all architectures.\r
+ */\r
+ #define JTAG_DISABLE() MACROS{ \\r
+ __asm__ __volatile__ ( \\r
+ "in __tmp_reg__,__SREG__" "\n\t" \\r
+ "cli" "\n\t" \\r
+ "out %1, %0" "\n\t" \\r
+ "out __SREG__, __tmp_reg__" "\n\t" \\r
+ "out %1, %0" "\n\t" \\r
+ : \\r
+ : "r" (1 << JTD), \\r
+ "M" (_SFR_IO_ADDR(MCUCR)) \\r
+ : "r0"); \\r
+ }MACROE\r
+ \r
+ /** Defines a volatile \c NOP statement which cannot be optimized out by the compiler, and thus can always\r
+ * be set as a breakpoint in the resulting code. Useful for debugging purposes, where the optimizer\r
+ * removes/reorders code to the point where break points cannot reliably be set.\r
+ *\r
+ * \note This macro is not available for all architectures.\r
+ */\r
+ #define JTAG_DEBUG_POINT() __asm__ __volatile__ ("NOP" ::)\r
+\r
+ /** Defines an explicit JTAG break point in the resulting binary via the assembly \c BREAK statement. When\r
+ * a JTAG is used, this causes the program execution to halt when reached until manually resumed.\r
+ *\r
+ * \note This macro is not available for all architectures.\r
+ */\r
+ #define JTAG_DEBUG_BREAK() __asm__ __volatile__ ("BREAK" ::)\r
+\r
+ /** Macro for testing condition "x" and breaking via \ref JTAG_DEBUG_BREAK() if the condition is false.\r
+ *\r
+ * \note This macro is not available for all architectures.\r
+ *\r
+ * \param[in] Condition Condition that will be evaluated.\r
+ */\r
+ #define JTAG_DEBUG_ASSERT(Condition) MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE\r
+\r
+ /** Macro for testing condition \c "x" and writing debug data to the stdout stream if \c false. The stdout stream\r
+ * must be pre-initialized before this macro is run and linked to an output device, such as the microcontroller's\r
+ * USART peripheral.\r
+ *\r
+ * The output takes the form "{FILENAME}: Function {FUNCTION NAME}, Line {LINE NUMBER}: Assertion {Condition} failed."\r
+ *\r
+ * \note This macro is not available for all architectures.\r
+ *\r
+ * \param[in] Condition Condition that will be evaluated,\r
+ */\r
+ #define STDOUT_ASSERT(Condition) MACROS{ if (!(x)) { printf_P(PSTR("%s: Function \"%s\", Line %d: " \\r
+ "Assertion \"%s\" failed.\r\n"), \\r
+ __FILE__, __func__, __LINE__, #Condition); } }MACROE\r
+\r
+ #if !defined(pgm_read_ptr) || defined(__DOXYGEN__)\r
+ /** Reads a pointer out of PROGMEM space on the AVR8 architecture. This is currently a wrapper for the\r
+ * avr-libc \c pgm_read_ptr() macro with a \c void* cast, so that its value can be assigned directly\r
+ * to a pointer variable or used in pointer arithmetic without further casting in C. In a future\r
+ * avr-libc distribution this will be part of the standard API and will be implemented in a more formal\r
+ * manner.\r
+ *\r
+ * \note This macro is not available for all architectures.\r
+ *\r
+ * \param[in] Address Address of the pointer to read.\r
+ *\r
+ * \return Pointer retrieved from PROGMEM space.\r
+ */\r
+ #define pgm_read_ptr(Address) (void*)pgm_read_word(Address)\r
+ #endif\r
+ #endif\r
+ \r
+ /* Disable C linkage for C++ Compilers: */\r
+ #if defined(__cplusplus)\r
+ }\r
+ #endif\r
+\r
+#endif\r
+\r
+/** @} */\r
+\r