diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt
index 8813bcdda8..b5c8fe1fb2 100644
--- a/LUFA/DoxygenPages/ChangeLog.txt
+++ b/LUFA/DoxygenPages/ChangeLog.txt
@@ -23,6 +23,7 @@
* - Updated the BUILD build system module to produce binary BIN files in addition to Intel HEX files
* - Updated the Android Accessory Class to accept version 2 protocol devices (with version 1 functionality)
* - All board drivers now implement dummy functions and constants when BOARD is set to NONE
+ * - Added missing LEDs to the XMEGA A3BU Xplained board LED driver (thanks to Michael Janssen)
*
* Fixed:
* - Core:
diff --git a/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h b/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h
index 0fad525a03..8487daa458 100644
--- a/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h
+++ b/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h
@@ -46,6 +46,8 @@
*
Name | Color | Info | Active Level | Port Pin |
* LEDS_LED1 | Yellow | LED0 LED | Low | PORTR.0 |
* LEDS_LED2 | Yellow | LED1 LED | Low | PORTR.1 |
+ * LEDS_LED3 | Red | Status Bicolour Red LED | Low | PORTD.4 |
+ * LEDS_LED4 | Green | Status Bicolour Green LED | High | PORTD.5 |
*
*
* @{
@@ -67,6 +69,13 @@
#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
#endif
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define LEDS_PORTR_LEDS (LEDS_LED1 | LEDS_LED2)
+ #define LEDS_PORTD_LEDS (LEDS_LED3 | LEDS_LED4)
+ #endif
+
/* Public Interface - May be used in end-application: */
/* Macros: */
/** LED mask for the first LED on the board. */
@@ -75,8 +84,14 @@
/** LED mask for the second LED on the board. */
#define LEDS_LED2 (1 << 1)
+ /** LED mask for the third LED on the board. */
+ #define LEDS_LED3 (1 << 4)
+
+ /** LED mask for the fourth LED on the board. */
+ #define LEDS_LED4 (1 << 5)
+
/** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
+ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
/** LED mask for none of the board LEDs. */
#define LEDS_NO_LEDS 0
@@ -85,51 +100,66 @@
#if !defined(__DOXYGEN__)
static inline void LEDs_Init(void)
{
- PORTR.DIRSET = LEDS_ALL_LEDS;
- PORTR.OUTCLR = LEDS_ALL_LEDS;
-
- PORTCFG.MPCMASK = LEDS_ALL_LEDS;
- PORTR.PIN0CTRL = PORT_INVEN_bm;
+ PORTR.DIRSET = LEDS_PORTR_LEDS;
+ PORTR.OUTCLR = LEDS_PORTR_LEDS;
+
+ PORTCFG.MPCMASK = LEDS_PORTR_LEDS;
+ PORTR.PIN0CTRL = PORT_INVEN_bm;
+
+ PORTD.DIRSET = LEDS_PORTD_LEDS;
+ PORTD.OUTCLR = LEDS_PORTD_LEDS;
+
+ PORTD.PIN4CTRL = PORT_INVEN_bm;
}
static inline void LEDs_Disable(void)
{
- PORTR.DIRCLR = LEDS_ALL_LEDS;
- PORTR.OUTCLR = LEDS_ALL_LEDS;
+ PORTR.DIRCLR = LEDS_PORTR_LEDS;
+ PORTR.OUTCLR = LEDS_PORTR_LEDS;
PORTCFG.MPCMASK = 0;
- PORTR.PIN0CTRL = LEDS_ALL_LEDS;
+ PORTR.PIN0CTRL = LEDS_PORTR_LEDS;
+
+ PORTD.DIRCLR = LEDS_PORTD_LEDS;
+ PORTD.OUTCLR = LEDS_PORTD_LEDS;
+
+ PORTD.PIN4CTRL = 0;
}
static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
{
- PORTR_OUTSET = LEDMask;
+ PORTR_OUTSET = LEDMask & LEDS_PORTR_LEDS;
+ PORTD_OUTSET = LEDMask & LEDS_PORTD_LEDS;
}
static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
{
- PORTR_OUTCLR = LEDMask;
+ PORTR_OUTCLR = LEDMask & LEDS_PORTR_LEDS;
+ PORTD_OUTCLR = LEDMask & LEDS_PORTD_LEDS;
}
static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
{
- PORTR_OUT = (PORTR.OUT & ~LEDS_ALL_LEDS) | LEDMask;
+ PORTR_OUT = ((PORTR.OUT & ~LEDS_PORTR_LEDS) | (LEDMask & LEDS_PORTR_LEDS));
+ PORTD_OUT = ((PORTD.OUT & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS));
}
static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask)
{
- PORTR_OUT = (PORTR.OUT & ~LEDMask) | ActiveMask;
+ PORTR_OUT = (PORTR.OUT & ~(LEDMask & LEDS_PORTR_LEDS)) | (Active & LEDS_PORTR_LEDS);
+ PORTD_OUT = (PORTD.OUT & ~(LEDMask & LEDS_PORTD_LEDS)) | (Active & LEDS_PORTD_LEDS);
}
static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
{
- PORTR_OUTTGL = LEDMask;
+ PORTR_OUTTGL = (LEDMask & LEDS_PORTR_LEDS);
+ PORTD_OUTTGL = (LEDMask & LEDS_PORTD_LEDS);
}
static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
static inline uint8_t LEDs_GetLEDs(void)
{
- return (PORTR_OUT & LEDS_ALL_LEDS);
+ return ((PORTR_OUT & LEDS_PORTR_LEDS) | (PORTD_OUT & LEDS_PORTD_LEDS));
}
#endif
diff --git a/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h b/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h
index 333d541193..d3488537d2 100644
--- a/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h
+++ b/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h
@@ -46,6 +46,8 @@
* Name | Color | Info | Active Level | Port Pin |
* LEDS_LED1 | Yellow | LED0 LED | Low | PORTR.0 |
* LEDS_LED2 | Yellow | LED1 LED | Low | PORTR.1 |
+ * LEDS_LED3 | Red | Status Bicolour Red LED | Low | PORTD.4 |
+ * LEDS_LED4 | Green | Status Bicolour Green LED | High | PORTD.5 |
*
*
* @{
@@ -67,6 +69,13 @@
#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
#endif
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define LEDS_PORTR_LEDS (LEDS_LED1 | LEDS_LED2)
+ #define LEDS_PORTD_LEDS (LEDS_LED3 | LEDS_LED4)
+ #endif
+
/* Public Interface - May be used in end-application: */
/* Macros: */
/** LED mask for the first LED on the board. */
@@ -75,8 +84,14 @@
/** LED mask for the second LED on the board. */
#define LEDS_LED2 (1 << 1)
+ /** LED mask for the third LED on the board. */
+ #define LEDS_LED3 (1 << 4)
+
+ /** LED mask for the fourth LED on the board. */
+ #define LEDS_LED4 (1 << 5)
+
/** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
+ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
/** LED mask for none of the board LEDs. */
#define LEDS_NO_LEDS 0
@@ -85,51 +100,66 @@
#if !defined(__DOXYGEN__)
static inline void LEDs_Init(void)
{
- PORTR.DIRSET = LEDS_ALL_LEDS;
- PORTR.OUTCLR = LEDS_ALL_LEDS;
+ PORTR.DIRSET = LEDS_PORTR_LEDS;
+ PORTR.OUTCLR = LEDS_PORTR_LEDS;
- PORTCFG.MPCMASK = LEDS_ALL_LEDS;
+ PORTCFG.MPCMASK = LEDS_PORTR_LEDS;
PORTR.PIN0CTRL = PORT_INVEN_bm;
+
+ PORTD.DIRSET = LEDS_PORTD_LEDS;
+ PORTD.OUTCLR = LEDS_PORTD_LEDS;
+
+ PORTD.PIN4CTRL = PORT_INVEN_bm;
}
static inline void LEDs_Disable(void)
{
- PORTR.DIRCLR = LEDS_ALL_LEDS;
- PORTR.OUTCLR = LEDS_ALL_LEDS;
+ PORTR.DIRCLR = LEDS_PORTR_LEDS;
+ PORTR.OUTCLR = LEDS_PORTR_LEDS;
PORTCFG.MPCMASK = 0;
- PORTR.PIN0CTRL = LEDS_ALL_LEDS;
+ PORTR.PIN0CTRL = LEDS_PORTR_LEDS;
+
+ PORTD.DIRCLR = LEDS_PORTD_LEDS;
+ PORTD.OUTCLR = LEDS_PORTD_LEDS;
+
+ PORTD.PIN4CTRL = 0;
}
static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
{
- PORTR_OUTSET = LEDMask;
+ PORTR_OUTSET = LEDMask & LEDS_PORTR_LEDS;
+ PORTD_OUTSET = LEDMask & LEDS_PORTD_LEDS;
}
static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
{
- PORTR_OUTCLR = LEDMask;
+ PORTR_OUTCLR = LEDMask & LEDS_PORTR_LEDS;
+ PORTD_OUTCLR = LEDMask & LEDS_PORTD_LEDS;
}
static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
{
- PORTR_OUT = (PORTR.OUT & ~LEDS_ALL_LEDS) | LEDMask;
+ PORTR_OUT = ((PORTR.OUT & ~LEDS_PORTR_LEDS) | (LEDMask & LEDS_PORTR_LEDS));
+ PORTD_OUT = ((PORTD.OUT & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS));
}
static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask)
{
- PORTR_OUT = (PORTR.OUT & ~LEDMask) | ActiveMask;
+ PORTR_OUT = (PORTR.OUT & ~(LEDMask & LEDS_PORTR_LEDS)) | (Active & LEDS_PORTR_LEDS);
+ PORTD_OUT = (PORTD.OUT & ~(LEDMask & LEDS_PORTD_LEDS)) | (Active & LEDS_PORTD_LEDS);
}
static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
{
- PORTR_OUTTGL = LEDMask;
+ PORTR_OUTTGL = (LEDMask & LEDS_PORTR_LEDS);
+ PORTD_OUTTGL = (LEDMask & LEDS_PORTD_LEDS);
}
static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
static inline uint8_t LEDs_GetLEDs(void)
{
- return (PORTR_OUT & LEDS_ALL_LEDS);
+ return ((PORTR_OUT & LEDS_PORTR_LEDS) | (PORTD_OUT & LEDS_PORTD_LEDS));
}
#endif