From da676f0f705904df15202f34b14c99f279eda339 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 5 Feb 2012 15:50:09 +0000
Subject: [PATCH] Add support for the Micropendous (Arduino-like) series of
 boards (revisions 1 and 2).

---
 LUFA/Common/BoardTypes.h                      |  6 ++
 LUFA/DoxygenPages/ChangeLog.txt               |  2 +-
 .../Drivers/Board/AVR8/MICROPENDOUS/Buttons.h | 20 +++++++
 LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h   | 56 +++++++++++++++----
 LUFA/Drivers/Board/Buttons.h                  |  1 +
 LUFA/Drivers/Board/LEDs.h                     |  3 +-
 6 files changed, 75 insertions(+), 13 deletions(-)

diff --git a/LUFA/Common/BoardTypes.h b/LUFA/Common/BoardTypes.h
index 85885177c..e21709b2a 100644
--- a/LUFA/Common/BoardTypes.h
+++ b/LUFA/Common/BoardTypes.h
@@ -189,6 +189,12 @@
 			/** Selects the Micropendous DIP specific board drivers, including the Button. */
 			#define BOARD_MICROPENDOUS_DIP     41
 
+			/** Selects the Micropendous (Arduino-like) revision 1 specific board drivers, including the Button and LED drivers. */
+			#define BOARD_MICROPENDOUS_REV1    42
+
+			/** Selects the Micropendous (Arduino-like) revision 2 specific board drivers, including the Button and LED drivers. */
+			#define BOARD_MICROPENDOUS_REV2    43
+
 			#if !defined(__DOXYGEN__)
 				#define BOARD_                 BOARD_NONE
 
diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt
index ac9b543f7..8360f0671 100644
--- a/LUFA/DoxygenPages/ChangeLog.txt
+++ b/LUFA/DoxygenPages/ChangeLog.txt
@@ -17,7 +17,7 @@
   *   - Added new USB_Host_GetDescriptor(), USB_Host_GetDeviceConfiguration() and USB_Host_GetInterfaceAltSetting() functions
   *   - Added new CALLBACK_Audio_Device_GetSetInterfaceProperty() callback to the Audio Device Class driver
   *   - Added new LEDs_Disable(), Buttons_Disable() and Joystick_Disable() functions to the board hardware drivers
-  *   - Added support for the Micropendous family of boards
+  *   - Added support for the Micropendous family of boards (Arduino-like revisions 1 and 2, DIP, 32U2, A, 1, 2, 3 and 4)
   *   - Added INVERTED_VBUS_ENABLE_LINE and NO_AUTO_VBUS_MANAGEMENT compile time options (thanks to Opendous Inc.)
   *  - Library Applications:
   *   - Added User Application APIs to the CDC and DFU class bootloaders
diff --git a/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h b/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h
index cb426586f..5c5825afb 100644
--- a/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h
+++ b/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h
@@ -78,6 +78,20 @@
  *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
  */
 
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_REV1 MICROPENDOUS_REV1
+ *  \brief Board specific Button driver header for the Micropendous Arduino-like Revision 1 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_REV2 MICROPENDOUS_REV2
+ *  \brief Board specific Button driver header for the Micropendous Arduino-like Revision 2 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
 /** \ingroup Group_Buttons
  *  \defgroup Group_Buttons_MICROPENDOUS_32U2 MICROPENDOUS_32U2
  *  \brief Board specific Buttons driver header for the Micropendous 32U2.
@@ -128,6 +142,12 @@
 		#elif (BOARD == BOARD_MICROPENDOUS_DIP)
 			#define _BOARD_BUTTON1_MASK             (1 << 2)
 			#define _BOARD_BUTTON_PORTLETTER        E
+		#elif (BOARD == BOARD_MICROPENDOUS_REV1)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
+		#elif (BOARD == BOARD_MICROPENDOUS_REV2)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
 		#endif
 		
 		#define _BOARD_BUTTON_CONCAT2(Reg, Letter)  Reg ## Letter
diff --git a/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h b/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h
index 17a8b9f7a..649d961e9 100644
--- a/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h
@@ -36,6 +36,20 @@
  *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
  */
 
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MICROPENDOUS_REV1 MICROPENDOUS_REV1
+ *  \brief Board specific LED driver header for the Micropendous Arduino-like Revision 1 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_LEDs_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MICROPENDOUS_REV2 MICROPENDOUS_REV2
+ *  \brief Board specific LED driver header for the Micropendous Arduino-like Revision 2 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_LEDs_MICROPENDOUS_32U2 for more details.
+ */
+
 /** \ingroup Group_LEDs
  *  \defgroup Group_LEDs_MICROPENDOUS_32U2 MICROPENDOUS_32U2
  *  \brief Board specific LED driver header for the Micropendous 32U2.
@@ -61,10 +75,30 @@
 			#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__)
+		#if (BOARD == BOARD_MICROPENDOUS_32U2)
+			#define _BOARD_LED1_MASK                (1 << 6)
+			#define _BOARD_LED_PORTLETTER           D
+		#elif (BOARD == BOARD_MICROPENDOUS_REV1)
+			#define _BOARD_LED1_MASK                (1 << 1)
+			#define _BOARD_LED_PORTLETTER           B
+		#elif (BOARD == BOARD_MICROPENDOUS_REV2)
+			#define _BOARD_LED1_MASK                (1 << 1)
+			#define _BOARD_LED_PORTLETTER           B
+		#endif
+		
+		#define _BOARD_LED_CONCAT2(Reg, Letter)     Reg ## Letter
+		#define _BOARD_LED_CONCAT(Reg, Letter)      _BOARD_LED_CONCAT2(Reg, Letter)
+
+		#define _BOARD_LED_PORT                     _BOARD_LED_CONCAT(PORT, _BOARD_LED_PORTLETTER)
+		#define _BOARD_LED_DDR                      _BOARD_LED_CONCAT(DDR,  _BOARD_LED_PORTLETTER)
+	#endif
+
 	/* Public Interface - May be used in end-application: */
 		/* Macros: */
 			/** LED mask for the first LED on the board. */
-			#define LEDS_LED1        (1 << 6)
+			#define LEDS_LED1        _BOARD_LED1_MASK
 
 			/** LED mask for all the LEDs on the board. */
 			#define LEDS_ALL_LEDS    LEDS_LED1
@@ -76,46 +110,46 @@
 		#if !defined(__DOXYGEN__)
 			static inline void LEDs_Init(void)
 			{
-				DDRD  |=  LEDS_ALL_LEDS;
-				PORTD &= ~LEDS_ALL_LEDS;
+				_BOARD_LED_DDR  |=  LEDS_ALL_LEDS;
+				_BOARD_LED_PORT &= ~LEDS_ALL_LEDS;
 			}
 
 			static inline void LEDs_Disable(void)
 			{
-				DDRD  &= ~LEDS_ALL_LEDS;
-				PORTD &= ~LEDS_ALL_LEDS;
+				_BOARD_LED_DDR  &= ~LEDS_ALL_LEDS;
+				_BOARD_LED_PORT &= ~LEDS_ALL_LEDS;
 			}
 
 			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
 			{
-				PORTD |= LEDMask;
+				_BOARD_LED_PORT |= LEDMask;
 			}
 
 			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
 			{
-				PORTD &= ~LEDMask;
+				_BOARD_LED_PORT &= ~LEDMask;
 			}
 
 			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
 			{
-				PORTD = ((PORTF & ~LEDS_ALL_LEDS) | LEDMask);
+				_BOARD_LED_PORT = ((PORTF & ~LEDS_ALL_LEDS) | LEDMask);
 			}
 
 			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
 			                                   const uint8_t ActiveMask)
 			{
-				PORTD = ((PORTF & ~LEDMask) | ActiveMask);
+				_BOARD_LED_PORT = ((PORTF & ~LEDMask) | ActiveMask);
 			}
 
 			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
 			{
-				PORTD ^= LEDMask;
+				_BOARD_LED_PORT ^= LEDMask;
 			}
 
 			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
 			static inline uint8_t LEDs_GetLEDs(void)
 			{
-				return (PORTD & LEDS_ALL_LEDS);
+				return (_BOARD_LED_PORT & LEDS_ALL_LEDS);
 			}
 		#endif
 
diff --git a/LUFA/Drivers/Board/Buttons.h b/LUFA/Drivers/Board/Buttons.h
index 2b430baac..6ea072ccb 100644
--- a/LUFA/Drivers/Board/Buttons.h
+++ b/LUFA/Drivers/Board/Buttons.h
@@ -138,6 +138,7 @@
 		#elif ((BOARD == BOARD_MICROPENDOUS_32U2) || (BOARD == BOARD_MICROPENDOUS_A) || \
 		       (BOARD == BOARD_MICROPENDOUS_1)    || (BOARD == BOARD_MICROPENDOUS_2) || \
 		       (BOARD == BOARD_MICROPENDOUS_3)    || (BOARD == BOARD_MICROPENDOUS_4) || \
+		       (BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \
 		       (BOARD == BOARD_MICROPENDOUS_DIP))
 			#include "AVR8/MICROPENDOUS/Buttons.h"
 		#else
diff --git a/LUFA/Drivers/Board/LEDs.h b/LUFA/Drivers/Board/LEDs.h
index d1836dad4..94421a2c8 100644
--- a/LUFA/Drivers/Board/LEDs.h
+++ b/LUFA/Drivers/Board/LEDs.h
@@ -175,7 +175,8 @@
 			#include "XMEGA/A3BU_XPLAINED/LEDs.h"
 		#elif ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3))
 			#include "AVR8/USB2AX/LEDs.h"
-		#elif (BOARD == BOARD_MICROPENDOUS_32U2)
+		#elif ((BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \
+		       (BOARD == BOARD_MICROPENDOUS_32U2))
 			#include "AVR8/MICROPENDOUS/LEDs.h"
 		#else
 			#include "Board/LEDs.h"
-- 
GitLab