aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-08-16 05:53:04 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-08-16 05:53:04 +0000
commitfc5fa769ef3389271547a2b3f452962996b69f50 (patch)
tree1b6813c935b650fb0388ee3e1f4a56f4c6f17d88 /LUFA
parent34781781278f0fb2557b7c5dd9c0de54ad2aba09 (diff)
downloadlufa-fc5fa769ef3389271547a2b3f452962996b69f50.tar.gz
lufa-fc5fa769ef3389271547a2b3f452962996b69f50.tar.bz2
lufa-fc5fa769ef3389271547a2b3f452962996b69f50.zip
Pull out architecture specific macros and other definitions into a new common header file. Add new JTAG_DISABLE() macro for the AVR8s to software-disable JTAG debugging using cycle-safe assembly code.
Diffstat (limited to 'LUFA')
-rw-r--r--LUFA/Common/ArchitectureSpecific.h143
-rw-r--r--LUFA/Common/Common.h70
-rw-r--r--LUFA/Common/CompilerSpecific.h8
-rw-r--r--LUFA/ManPages/ChangeLog.txt1
4 files changed, 149 insertions, 73 deletions
diff --git a/LUFA/Common/ArchitectureSpecific.h b/LUFA/Common/ArchitectureSpecific.h
new file mode 100644
index 000000000..4f29be6d6
--- /dev/null
+++ b/LUFA/Common/ArchitectureSpecific.h
@@ -0,0 +1,143 @@
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaim 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
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ * \brief Architecture specific definitions relating to specific processor architectures.
+ *
+ * \copydetails Group_ArchitectureSpecific
+ *
+ * \note Do not include this file directly, rather include the Common.h header file instead to gain this file's
+ * functionality.
+ */
+
+/** \ingroup Group_Common
+ * \defgroup Group_ArchitectureSpecific Architecture Specific Definitions
+ * \brief Architecture specific definitions relating to specific processor architectures.
+ *
+ * Architecture specific macros, functions and other definitions, which relate to specific architectures. This
+ * definitions may or may not be available in some form on other architectures, and thus should be protected by
+ * preprocessor checks in portable code to prevent compile errors.
+ *
+ * @{
+ */
+
+#ifndef __LUFA_ARCHSPEC_H__
+#define __LUFA_ARCHSPEC_H__
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_COMMON_H)
+ #error Do not include this file directly. Include LUFA/Common/Common.h instead to gain this functionality.
+ #endif
+
+ /* 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
+
+ /** 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
+ * removes/reorders code to the point where break points cannot reliably be set.
+ *
+ * \note This macro is not available for all architectures.
+ */
+ #define JTAG_DEBUG_POINT() __asm__ __volatile__ ("NOP" ::)
+
+ /** Defines an explicit JTAG break point in the resulting binary via the assembly \c BREAK statement. When
+ * a JTAG is used, this causes the program execution to halt when reached until manually resumed.
+ *
+ * \note This macro is not available for all architectures.
+ */
+ #define JTAG_DEBUG_BREAK() __asm__ __volatile__ ("BREAK" ::)
+
+ /** Macro for testing condition "x" and breaking via \ref JTAG_DEBUG_BREAK() if the condition is false.
+ *
+ * \note This macro is not available for all architectures.
+ *
+ * \param[in] Condition Condition that will be evaluated.
+ */
+ #define JTAG_DEBUG_ASSERT(Condition) MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE
+
+ /** 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
+ * USART peripheral.
+ *
+ * The output takes the form "{FILENAME}: Function {FUNCTION NAME}, Line {LINE NUMBER}: Assertion {Condition} failed."
+ *
+ * \note This macro is not available for all architectures.
+ *
+ * \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
+
+ #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.
+ *
+ * \note This macro is not available for all architectures.
+ *
+ * \param[in] Address Address of the pointer to read.
+ *
+ * \return Pointer retrieved from PROGMEM space.
+ */
+ #define pgm_read_ptr(Address) (void*)pgm_read_word(Address)
+ #endif
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Common/Common.h b/LUFA/Common/Common.h
index 162d8516c..e38d63efe 100644
--- a/LUFA/Common/Common.h
+++ b/LUFA/Common/Common.h
@@ -42,12 +42,6 @@
*
* @{
*/
-
-/** \defgroup Group_Debugging Debugging Macros
- * \brief Convenience macros to aid in debugging applications.
- *
- * Macros to aid debugging of a user application.
- */
/** \defgroup Group_GlobalInt Global Interrupt Macros
* \brief Convenience macros for the management of interrupts globally within the device.
@@ -71,6 +65,7 @@
#include "LUFAConfig.h"
#endif
+ #include "ArchitectureSpecific.h"
#include "CompilerSpecific.h"
#include "Architectures.h"
#include "Attributes.h"
@@ -202,69 +197,6 @@
#define STRINGIFY_EXPANDED(x) STRINGIFY(x)
#endif
- #if (ARCH == ARCH_AVR8) || defined(__DOXYGEN__)
- /** 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
- * removes/reorders code to the point where break points cannot reliably be set.
- *
- * \note This macro is not available for all architectures.
- *
- * \ingroup Group_Debugging
- */
- #define JTAG_DEBUG_POINT() __asm__ __volatile__ ("NOP" ::)
-
- /** Defines an explicit JTAG break point in the resulting binary via the assembly \c BREAK statement. When
- * a JTAG is used, this causes the program execution to halt when reached until manually resumed.
- *
- * \note This macro is not available for all architectures.
- *
- * \ingroup Group_Debugging
- */
- #define JTAG_DEBUG_BREAK() __asm__ __volatile__ ("BREAK" ::)
-
- /** Macro for testing condition "x" and breaking via \ref JTAG_DEBUG_BREAK() if the condition is false.
- *
- * \note This macro is not available for all architectures.
- *
- * \param[in] Condition Condition that will be evaluated.
- *
- * \ingroup Group_Debugging
- */
- #define JTAG_DEBUG_ASSERT(Condition) MACROS{ if (!(Condition)) { JTAG_DEBUG_BREAK(); } }MACROE
-
- /** Macro for testing condition "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
- * USART peripheral.
- *
- * The output takes the form "{FILENAME}: Function {FUNCTION NAME}, Line {LINE NUMBER}: Assertion {Condition} failed."
- *
- * \note This macro is not available for all architectures.
- *
- * \param[in] Condition Condition that will be evaluated,
- *
- * \ingroup Group_Debugging
- */
- #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
-
- #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.
- *
- * \note This macro is not available for all architectures.
- *
- * \param[in] Address Address of the pointer to read.
- *
- * \return Pointer retrieved from PROGMEM space.
- */
- #define pgm_read_ptr(Address) (void*)pgm_read_word(Address)
- #endif
- #endif
-
#if !defined(ISR) || defined(__DOXYGEN__)
/** Macro for the definition of interrupt service routines, so that the compiler can insert the required
* prologue and epilogue code to properly manage the interrupt routine without affecting the main thread's
diff --git a/LUFA/Common/CompilerSpecific.h b/LUFA/Common/CompilerSpecific.h
index 938cbe66c..96d37cd74 100644
--- a/LUFA/Common/CompilerSpecific.h
+++ b/LUFA/Common/CompilerSpecific.h
@@ -29,7 +29,7 @@
*/
/** \file
- * \brief Compiler specific macros for code optimization and correctness.
+ * \brief Compiler specific definitions for code optimization and correctness.
*
* \copydetails Group_CompilerSpecific
*
@@ -38,10 +38,10 @@
*/
/** \ingroup Group_Common
- * \defgroup Group_CompilerSpecific Compiler Specific Macros
- * \brief Compiler specific macros for code optimization and correctness.
+ * \defgroup Group_CompilerSpecific Compiler Specific Definitions
+ * \brief Compiler specific definitions for code optimization and correctness.
*
- * Compiler specific macros to expose certain compiler features which may increase the level of code optimization
+ * Compiler specific definitions to expose certain compiler features which may increase the level of code optimization
* for a specific compiler, or correct certain issues that may be present such as memory barriers for use in conjunction
* with atomic variable access.
*
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 1bf8dae2a..d46123ac0 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -28,6 +28,7 @@
* - Added new USB_Host_GetDeviceStatus() function to the host standard request function set
* - Added AVR USB XMEGA architecture port (currently incomplete/experimental)
* - Added new STRINGIFY() and STRINGIFY_EXPANDED() convenience macros
+ * - Added new JTAG_DISABLE() macro for the AVR8 architecture
* - Added Device Qualifier standard descriptor structure definitions USB_StdDescriptor_DeviceQualifier_t and USB_Descriptor_DeviceQualifier_t
* - Library Applications:
* - Added RNDIS device mode to the Webserver project