Added new JTAG_ENABLE() macro for the AVR8 architecture. Fixed the JTAG_DISABLE() macro clearing all other bits in MCUSR when called.

Moved the XPLAIN board specific bootloader entry condition code to the Application_Jump_Check() function of the DFU bootloader, added support for the original XPLAIN board to the CDC class bootloader.
pull/1469/head
Dean Camera 13 years ago
parent 7abaafb3ca
commit cd0bd7bf90

@ -70,8 +70,29 @@ uint32_t MagicBootKey ATTR_NO_INIT;
*/ */
void Application_Jump_Check(void) void Application_Jump_Check(void)
{ {
bool JumpToApplication = false;
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
/* Disable JTAG debugging */
JTAG_DISABLE();
/* Enable pull-up on the JTAG TCK pin so we can use it to select the mode */
PORTF |= (1 << 4);
Delay_MS(10);
/* If the TCK pin is not jumpered to ground, start the user application instead */
JumpToApplication |= ((PINF & (1 << 4)) != 0);
/* Re-enable JTAG debugging */
JTAG_ENABLE();
#endif
/* If the reset source was the bootloader and the key is correct, clear it and jump to the application */ /* If the reset source was the bootloader and the key is correct, clear it and jump to the application */
if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY)) if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
JumpToApplication |= true;
/* If a request has been made to jump to the user application, honor it */
if (JumpToApplication)
{ {
/* Turn off the watchdog */ /* Turn off the watchdog */
MCUSR &= ~(1<<WDRF); MCUSR &= ~(1<<WDRF);

@ -106,8 +106,29 @@ uint32_t MagicBootKey ATTR_NO_INIT;
*/ */
void Application_Jump_Check(void) void Application_Jump_Check(void)
{ {
bool JumpToApplication = false;
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
/* Disable JTAG debugging */
JTAG_DISABLE();
/* Enable pull-up on the JTAG TCK pin so we can use it to select the mode */
PORTF |= (1 << 4);
Delay_MS(10);
/* If the TCK pin is not jumpered to ground, start the user application instead */
JumpToApplication |= ((PINF & (1 << 4)) != 0);
/* Re-enable JTAG debugging */
JTAG_ENABLE();
#endif
/* If the reset source was the bootloader and the key is correct, clear it and jump to the application */ /* If the reset source was the bootloader and the key is correct, clear it and jump to the application */
if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY)) if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
JumpToApplication |= true;
/* If a request has been made to jump to the user application, honor it */
if (JumpToApplication)
{ {
/* Turn off the watchdog */ /* Turn off the watchdog */
MCUSR &= ~(1<<WDRF); MCUSR &= ~(1<<WDRF);
@ -130,23 +151,6 @@ int main(void)
/* Configure hardware required by the bootloader */ /* Configure hardware required by the bootloader */
SetupHardware(); SetupHardware();
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
/* Disable JTAG debugging */
MCUCR |= (1 << JTD);
MCUCR |= (1 << JTD);
/* Enable pull-up on the JTAG TCK pin so we can use it to select the mode */
PORTF |= (1 << 4);
Delay_MS(10);
/* If the TCK pin is not jumpered to ground, start the user application instead */
RunBootloader = (!(PINF & (1 << 4)));
/* Re-enable JTAG debugging */
MCUCR &= ~(1 << JTD);
MCUCR &= ~(1 << JTD);
#endif
/* Turn on first LED on the board to indicate that the bootloader has started */ /* Turn on first LED on the board to indicate that the bootloader has started */
LEDs_SetAllLEDs(LEDS_LED1); LEDs_SetAllLEDs(LEDS_LED1);

@ -65,6 +65,24 @@
/* Macros: */ /* Macros: */
#if (ARCH == ARCH_AVR8) || (ARCH == ARCH_XMEGA) || defined(__DOXYGEN__) #if (ARCH == ARCH_AVR8) || (ARCH == ARCH_XMEGA) || defined(__DOXYGEN__)
#if (ARCH == ARCH_AVR8) || 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 disbled in software via \ref JTAG_DISABLE().
*
* \note This macro is not available for all architectures.
*/
#define JTAG_ENABLE() 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" (MCUCR & ~(1 << JTD)), \
"M" (_SFR_IO_ADDR(MCUCR)) \
: "r0"); \
}MACROE
/** Disables the AVR's JTAG bus in software, until a system reset. This will override the current JTAG /** 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 * status as set by the JTAGEN fuse, disabling JTAG debugging and reverting the JTAG pins back to GPIO
* mode. * mode.
@ -79,7 +97,7 @@
"out __SREG__, __tmp_reg__" "\n\t" \ "out __SREG__, __tmp_reg__" "\n\t" \
"out %1, %0" "\n\t" \ "out %1, %0" "\n\t" \
: \ : \
: "r" (1 << JTD), \ : "r" (MCUCR | (1 << JTD)), \
"M" (_SFR_IO_ADDR(MCUCR)) \ "M" (_SFR_IO_ADDR(MCUCR)) \
: "r0"); \ : "r0"); \
}MACROE }MACROE

@ -19,6 +19,7 @@
* - Added build test to verify correct compilation of all board drivers using all driver APIs * - Added build test to verify correct compilation of all board drivers using all driver APIs
* - Added build test to verify correct compilation of all bootloaders using all supported devices * - Added build test to verify correct compilation of all bootloaders using all supported devices
* - Added build test to verify that there are no detectable errors in the codebase via static analysis * - Added build test to verify that there are no detectable errors in the codebase via static analysis
* - Added new JTAG_ENABLE() macro for the AVR8 architecture
* - Library Applications: * - Library Applications:
* - Modified the CDC Host demos to set a default CDC Line Encoding on enumerated devices * - Modified the CDC Host demos to set a default CDC Line Encoding on enumerated devices
* - Added Dataflash operational checks and aborts to all projects using the Dataflash to ensure it is working correctly before use * - Added Dataflash operational checks and aborts to all projects using the Dataflash to ensure it is working correctly before use
@ -66,6 +67,7 @@
* the stack (thanks to Jonathan Hudgins) * the stack (thanks to Jonathan Hudgins)
* - Fixed broken MIDI host driver MIDI_Host_ReceiveEventPacket() function due to not unfreezing the MIDI data IN pipe before use (thanks to Michael Brown) * - Fixed broken MIDI host driver MIDI_Host_ReceiveEventPacket() function due to not unfreezing the MIDI data IN pipe before use (thanks to Michael Brown)
* - Fixed swapped Little Endian/Big Endian endpoint and pipe write code for the UC3 devices (thanks to Andrew Chu) * - Fixed swapped Little Endian/Big Endian endpoint and pipe write code for the UC3 devices (thanks to Andrew Chu)
* - Fixed the JTAG_DISABLE() macro clearing all other bits in MCUSR when called
* - Library Applications: * - Library Applications:
* - Fixed error in the AVRISP-MKII programmer when ISP mode is used at 64KHz (thanks to Ben R. Porter) * - Fixed error in the AVRISP-MKII programmer when ISP mode is used at 64KHz (thanks to Ben R. Porter)
* - Fixed AVRISP-MKII programmer project failing to compile for the U4 chips when VTARGET_ADC_CHANNEL is defined to an invalid channel and NO_VTARGET_DETECT is * - Fixed AVRISP-MKII programmer project failing to compile for the U4 chips when VTARGET_ADC_CHANNEL is defined to an invalid channel and NO_VTARGET_DETECT is

Loading…
Cancel
Save