/*
 * pin_defs.h
 * optiboot helper defining the default pin assignments (LED, SOFT_UART)
 * for the various chips that are supported.  This also has some ugly macros
 * for selecting among various UARTs and LED possibilities using command-line
 * defines like "UART=2 LED=B5"
 *
 * Copyright 2013-2015 by Bill Westfield.
 * Copyright 2010 by Peter Knight.
 * This software is licensed under version 2 of the Gnu Public Licence.
 * See optiboot.c for details.
 */

/*------------------------------------------------------------------------ */
#if    defined(__AVR_ATmega168__)       \
    || defined(__AVR_ATmega168P__)      \
    || defined(__AVR_ATmega328__)       \
    || defined(__AVR_ATmega328P__)      \
    || defined(__AVR_ATmega88)          \
    || defined(__AVR_ATmega8__)         \
    || defined(__AVR_ATmega88__)
/*------------------------------------------------------------------------ */

/*
 * Onboard LED is connected to pin PB5 in Arduino NG, Diecimila,
 * Duemilanove, Uno, Nano, and many other Ardunio-like boards.
 */
#if !defined(LED)
#define LED B5
#endif

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTD
#define UART_PIN    PIND
#define UART_DDR    DDRD
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif

/*
 * Handle devices with up to 4 uarts (eg m1280.)  Rather inelegantly.
 * Note that mega8/m32 still needs special handling, because ubrr is handled
 * differently.
 */
#if (SOFT_UART == 0)
#if UART == 0
#if defined(UDR0)
# define UART_SRA UCSR0A
# define UART_SRB UCSR0B
# define UART_SRC UCSR0C
# define UART_SRL UBRR0L
# define UART_UDR UDR0
#elif defined(UDR)
# define UART_SRA UCSRA
# define UART_SRB UCSRB
# define UART_SRC UCSRC
# define UART_SRL UBRRL
# define UART_UDR UDR
#elif defined(LINDAT)
# define LIN_UART 1
# define UART_SRA UCSRA
# define UART_SRB UCSRB
# define UART_SRC UCSRC
# define UART_SRL UBRRL
# define UART_UDR LINDAT
#else
# error UART == 0, but no UART0 on device
#endif
#elif UART == 1
#if !defined(UDR1)
#error UART == 1, but no UART1 on device
#endif
# define UART_SRA UCSR1A
# define UART_SRB UCSR1B
# define UART_SRC UCSR1C
# define UART_SRL UBRR1L
# define UART_UDR UDR1
#elif UART == 2
#if !defined(UDR2)
#error UART == 2, but no UART2 on device
#endif
# define UART_SRA UCSR2A
# define UART_SRB UCSR2B
# define UART_SRC UCSR2C
# define UART_SRL UBRR2L
# define UART_UDR UDR2
#elif UART == 3
#if !defined(UDR3)
#error UART == 3, but no UART3 on device
#endif
# define UART_SRA UCSR3A
# define UART_SRB UCSR3B
# define UART_SRC UCSR3C
# define UART_SRL UBRR3L
# define UART_UDR UDR3
#endif
#endif //end #if SOFT_UART==0

#if    defined(__AVR_ATmega8__)         \
    || defined (__AVR_ATmega32__)       \
    || defined (__AVR_ATmega16__)
  //Name conversion R.Wiersma
  #define UCSR0A        UCSRA
  #define UDR0          UDR
  #define UDRE0         UDRE
  #define RXC0          RXC
  #define TXC0          TXC
  #define FE0           FE
  #define TIFR1         TIFR
  #define WDTCSR        WDTCR
#endif

#if    defined (__AVR_ATmega32__)       \
    || defined (__AVR_ATmega16__)
  #define WDCE          WDTOE
#endif


/*------------------------------------------------------------------------ */
/* Sanguino support (and other 40pin DIP cpus) */
/*------------------------------------------------------------------------ */
/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega8515__) || defined(__AVR_ATmega162__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B0
#endif

/* Fix register names */
#if defined(__AVR_ATmega8515__)
#define UCSR0A  UCSRA
#define UDR0    UDR
#define UDRE0   UDRE
#define RXC0    RXC
#define FE0     FE
#endif
#define TIFR1   TIFR
#define WDTCSR  WDTCR

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTD
#define UART_PIN    PIND
#define UART_DDR    DDRD
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif

#if    defined(__AVR_ATmega8535__)              \
    || defined(__AVR_ATmega16__)                \
    || defined(__AVR_ATmega32__)                \
    || defined(__AVR_ATmega164A__)              \
    || defined(__AVR_ATmega164P__)              \
    || defined(__AVR_ATmega324A__)              \
    || defined(__AVR_ATmega324P__)              \
    || defined(__AVR_ATmega324PA__)             \
    || defined(__AVR_ATmega644__)               \
    || defined(__AVR_ATmega644P__)              \
    || defined(__AVR_ATmega1284__)              \
    || defined(__AVR_ATmega1284P__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B0
#endif

#if     defined(__AVR_ATmega8535__)     \
    ||  defined(__AVR_ATmega16__)       \
    ||  defined(__AVR_ATmega32__)
/* Fix register names */
#define UCSR0A  UCSRA
#define UDR0    UDR
#define UDRE0   UDRE
#define RXC0    RXC
#define FE0     FE
#define TIFR1   TIFR
#define WDTCSR  WDTCR
#endif
#if defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__)
#define WDCE        WDTOE
#endif

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTD
#define UART_PIN    PIND
#define UART_DDR    DDRD
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif


/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega324PB__)
/*------------------------------------------------------------------------ */

#if !defined(LED)
#define LED         B0
#endif

/* Fix missing register names */
#define MPCM0   MPCM
#define U2X0    U2X
#define UPE0    UPE
#define DOR0    DOR
#define FE0     FE
#define UDRE0   UDRE
#define TXC0    TXC
#define RXC0    RXC

#define TXB80   TXB8
#define RXB80   RXB8
#define UCSZ02  UCSZ2
#define TXEN0   TXEN
#define RXEN0   RXEN
#define UDRIE0  UDRIE
#define TXCIE0  TXCIE
#define RXCIE0  RXCIE

#define UCPOL0  UCPOL
#define UCSZ00  UCSZ0
#define UCSZ01  UCSZ1
#define USBS0   USBS
#define UPM00   UPM0
#define UPM01   UPM1
#define UMSEL00 UMSEL0
#define UMSEL01 UMSEL1

#define MPCM1   MPCM
#define U2X1    U2X
#define UPE1    UPE
#define DOR1    DOR
#define FE1     FE
#define UDRE1   UDRE
#define TXC1    TXC
#define RXC1    RXC

#define TXB81   TXB8
#define RXB81   RXB8
#define UCSZ12  UCSZ2
#define TXEN1   TXEN
#define RXEN1   RXEN
#define UDRIE1  UDRIE
#define TXCIE1  TXCIE
#define RXCIE1  RXCIE

#define UCPOL1  UCPOL
#define UCSZ10  UCSZ0
#define UCSZ11  UCSZ1
#define USBS1   USBS
#define UPM10   UPM0
#define UPM11   UPM1
#define UMSEL10 UMSEL0
#define UMSEL11 UMSEL1

#define MPCM2   MPCM
#define U2X2    U2X
#define UPE2    UPE
#define DOR2    DOR
#define FE2     FE
#define UDRE2   UDRE
#define TXC2    TXC
#define RXC2    RXC

#define TXB82   TXB8
#define RXB82   RXB8
#define UCSZ22  UCSZ2
#define TXEN2   TXEN
#define RXEN2   RXEN
#define UDRIE2  UDRIE
#define TXCIE2  TXCIE
#define RXCIE2  RXCIE

#define UCPOL2  UCPOL
#define UCSZ20  UCSZ0
#define UCSZ21  UCSZ1
#define USBS2   USBS
#define UPM20   UPM0
#define UPM21   UPM1
#define UMSEL20 UMSEL0
#define UMSEL21 UMSEL1

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTD
#define UART_PIN    PIND
#define UART_DDR    DDRD
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B5
#endif

#define TIFR1 TIFR
#define WDTCSR WDTCR
//#define MCUSR MCUCSR
//#define SPMCR SPMCSR

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTE
#define UART_PIN    PINE
#define UART_DDR    DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif

/*------------------------------------------------------------------------ */
/* Mega support */
#if    defined(__AVR_ATmega640__)       \
    || defined(__AVR_ATmega1280__)      \
    || defined(__AVR_ATmega128RFA1__)   \
    || defined(__AVR_ATmega2560__)
/*------------------------------------------------------------------------ */
/* Onboard LED is connected to pin PB7 on Arduino Mega */
#if !defined(LED)
#define LED         B7
#endif

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTE
#define UART_PIN    PINE
#define UART_DDR    DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B5
#endif

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTE
#define UART_PIN    PINE
#define UART_DDR    DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif


/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega169__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B5
#endif

/* Fix register names */
#define UCSR0A UCSRA
#define UCSR0B UCSRB
#define UCSR0C UCSRC
#define UBRR0L UBRRL
#define UDR0 UDR
#define UDRE0 UDRE
#define RXC0 RXC
#define FE0 FE
#define WDTCSR WDTCR
#define U2X0 U2X
#define RXEN0 RXEN
#define TXEN0 TXEN
#define UCSZ00 UCSZ0
#define UCSZ01 UCSZ1

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTE
#define UART_PIN    PINE
#define UART_DDR    DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega169P__) || defined(__AVR_ATmega329__) || defined(__AVR_ATmega329P__) \
|| defined(__AVR_ATmega3290__) || defined(__AVR_ATmega3290P__) || defined(__AVR_ATmega649__) \
|| defined(__AVR_ATmega649P__) || defined(__AVR_ATmega6490__) || defined(__AVR_ATmega6490P__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B5
#endif

/* Fix register names */
#define WDTCSR WDTCR

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTE
#define UART_PIN    PINE
#define UART_DDR    DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif
/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B5
#endif

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTE
#define UART_PIN    PINE
#define UART_DDR    DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif


/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega169__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B5
#endif

/* Fix register names */
#define UCSR0A UCSRA
#define UCSR0B UCSRB
#define UCSR0C UCSRC
#define UBRR0L UBRRL
#define UDR0 UDR
#define UDRE0 UDRE
#define RXC0 RXC
#define FE0 FE
#define WDTCSR WDTCR
#define U2X0 U2X
#define RXEN0 RXEN
#define TXEN0 TXEN
#define UCSZ00 UCSZ0
#define UCSZ01 UCSZ1

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTE
#define UART_PIN    PINE
#define UART_DDR    DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega169P__) || defined(__AVR_ATmega329__) || defined(__AVR_ATmega329P__) \
|| defined(__AVR_ATmega3290__) || defined(__AVR_ATmega3290P__) || defined(__AVR_ATmega649__) \
|| defined(__AVR_ATmega649P__) || defined(__AVR_ATmega6490__) || defined(__AVR_ATmega6490P__)
/*------------------------------------------------------------------------ */
#if !defined(LED)
#define LED         B5
#endif

/* Fix register names */
#define WDTCSR WDTCR

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTE
#define UART_PIN    PINE
#define UART_DDR    DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) \
|| defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega32U6__) \
|| defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) \
|| defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
/*------------------------------------------------------------------------ */
/* Fix different register names */
#define MPCM0   MPCM1
#define U2X0    U2X1
#define UPE0    UPE1
#define DOR0    DOR1
#define FE0     FE1
#define UDRE0   UDRE1
#define TXC0    TXC1
#define RXC0    RXC1

#define TXB80   TXB81
#define RXB80   RXB81
#define UCSZ02  UCSZ12
#define TXEN0   TXEN1
#define RXEN0   RXEN1
#define UDRIE0  UDRIE1
#define TXCIE0  TXCIE1
#define RXCIE0  RXCIE1

#define UCPOL0  UCPOL1
#define UCSZ00  UCSZ10
#define UCSZ01  UCSZ11
#define USBS0   USBS1
#define UPM00   UPM10
#define UPM01   UPM11
#define UMSEL00 UMSEL10
#define UMSEL01 UMSEL11

/* Ports for soft UART */
#if SOFT_UART
#define UART_PORT   PORTD
#define UART_PIN    PIND
#define UART_DDR    DDRD
#define UART_TX_BIT 3
#define UART_RX_BIT 2
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__)
/*------------------------------------------------------------------------ */

#if !defined(LED)
#define LED         D5 // because of Arduino Uno USB-MCU TXLED
#endif
#endif // AtmegaXYu2

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)
/*------------------------------------------------------------------------ */

#if !defined(LED)
#define LED         C7 // because of Arduino Micro LED_BUILTIN (D13)
#endif
#endif // AtmegaXYu4

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega32U6__)
/*------------------------------------------------------------------------ */

#if !defined(LED)
#define LED         C6 // because of PWM (OSC3A)
#endif
#endif // AtmegaXYu6

/*------------------------------------------------------------------------ */
#if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) \
|| defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
/*------------------------------------------------------------------------ */

#if !defined(LED)
#define LED         C6 // because of PWM (OSC3A)
#endif
#endif // At90usbXYz6/7


#endif // usbmcus

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny1634__)
/*------------------------------------------------------------------------ */
/* LED is on C0 */
#if !defined(LED)
#define LED     C0
#endif
#define TIFR1 TIFR

#if SOFT_UART
#define UART_PORT   PORTA
#define UART_PIN    PINA
#define UART_DDR    DDRA
#define UART_TX_BIT 2
#define UART_RX_BIT 3
#endif
#endif


/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny841__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED     B2
#endif

#if SOFT_UART
#define UART_PORT   PORTA
#define UART_PIN    PINA
#define UART_DDR    DDRA
#define UART_TX_BIT 2
#define UART_RX_BIT 3
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny441__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B2
#endif

#if SOFT_UART
#define UART_PORT   PORTA
#define UART_PIN    PINA
#define UART_DDR    DDRA
#define UART_TX_BIT 2
#define UART_RX_BIT 3
#endif
#endif
/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny84__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B2
#endif

#if SOFT_UART
#define UART_PORT   PORTA
#define UART_PIN    PINA
#define UART_DDR    DDRA
#define UART_TX_BIT 1
#define UART_RX_BIT 2
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny44__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B2
#endif

#if SOFT_UART
#define UART_PORT   PORTA
#define UART_PIN    PINA
#define UART_DDR    DDRA
#define UART_TX_BIT 1
#define UART_RX_BIT 2
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny85__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B2
#endif

#if SOFT_UART
#define UART_PORT   PORTB
#define UART_PIN    PINB
#define UART_DDR    DDRB
#define UART_TX_BIT 0
#define UART_RX_BIT 1
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny45__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B2
#endif

#if SOFT_UART
#define UART_PORT   PORTB
#define UART_PIN    PINB
#define UART_DDR    DDRB
#define UART_TX_BIT 0
#define UART_RX_BIT 1
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny861__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B3
#endif

#if SOFT_UART
#define UART_PORT   PORTA
#define UART_PIN    PINA
#define UART_DDR    DDRA
#define UART_TX_BIT 6
#define UART_RX_BIT 7
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny461__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B3
#endif

#if SOFT_UART
#define UART_PORT   PORTA
#define UART_PIN    PINA
#define UART_DDR    DDRA
#define UART_TX_BIT 6
#define UART_RX_BIT 7
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny88__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B5
#endif

#if SOFT_UART
#define UART_PORT   PORTD
#define UART_PIN    PIND
#define UART_DDR    DDRD
#define UART_TX_BIT 6
#define UART_RX_BIT 7
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny48__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED   B5
#endif

#if SOFT_UART
#define UART_PORT   PORTD
#define UART_PIN    PIND
#define UART_DDR    DDRD
#define UART_TX_BIT 6
#define UART_RX_BIT 7
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny167__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED     A3
#endif
#endif

/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny87__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED     A3
#endif
#endif


/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny828__)
/*------------------------------------------------------------------------ */
/* LED is on B2 */
#if !defined(LED)
#define LED     B0
#endif

#define UDRE0 UDRE
#define FE0 FE
#define RXC0 RXC
#define UCSZ00 UCSZ0
#define UCSZ01 UCSZ1
#define TXEN0 TXEN
#define RXEN0 RXEN
#define U2X0 U2X


#if SOFT_UART
#define UART_PORT   PORTA
#define UART_PIN    PINA
#define UART_DDR    DDRA
#define UART_TX_BIT 2
#define UART_RX_BIT 3
#endif
#endif

/*
 * A bunch of macros to enable the LED to be specified as "B5" for bit 5
 * of port B, and similar.
 * We define symbols for all the legal combination of port/bit on a chip,
 * and do pre-processor tests to see if there's a match.  This ends up
 * being very verbose, but it is pretty easy to generate semi-automatically.
 * (We wouldn't need this if the preprocessor could do string compares.)
 */

// Symbols for each PortA bit.
#define A0 0x100
#define A1 0x101
#define A2 0x102
#define A3 0x103
#define A4 0x104
#define A5 0x105
#define A6 0x106
#define A7 0x107
// If there is no PORTA on this chip, don't allow these to be used
//   (and indicate the error by redefining LED)
#if !defined(PORTA)
#if LED >= A0 && LED <= A7
#undef LED
#define LED -1
#endif
#endif

#define B0 0x200
#define B1 0x201
#define B2 0x202
#define B3 0x203
#define B4 0x204
#define B5 0x205
#define B6 0x206
#define B7 0x207
#if !defined(PORTB)
#if LED >= B0 && LED <= B7
#undef LED
#define LED -1
#endif
#endif

#define C0 0x300
#define C1 0x301
#define C2 0x302
#define C3 0x303
#define C4 0x304
#define C5 0x305
#define C6 0x306
#define C7 0x307
#if !(defined(PORTC))
#if LED >= C0 && LED <= C7
#undef LED
#define LED -1
#endif
#endif

#define D0 0x400
#define D1 0x401
#define D2 0x402
#define D3 0x403
#define D4 0x404
#define D5 0x405
#define D6 0x406
#define D7 0x407
#if !(defined(PORTD))
#if LED >= D0 && LED <= D7
#undef LED
#define LED -1
#endif
#endif

#define E0 0x500
#define E1 0x501
#define E2 0x502
#define E3 0x503
#define E4 0x504
#define E5 0x505
#define E6 0x506
#define E7 0x507
#if !(defined(PORTE))
#if LED >= E0 && LED <= E7
#undef LED
#define LED -1
#endif
#endif

#define F0 0x600
#define F1 0x601
#define F2 0x602
#define F3 0x603
#define F4 0x604
#define F5 0x605
#define F6 0x606
#define F7 0x607
#if !(defined(PORTF))
#if LED >= F0 && LED <= F7
#undef LED
#define LED -1
#endif
#endif

#define G0 0x700
#define G1 0x701
#define G2 0x702
#define G3 0x703
#define G4 0x704
#define G5 0x705
#define G6 0x706
#define G7 0x707
#if !defined(PORTG)
#if LED >= G0 && LED <= G7
#undef LED
#define LED -1
#endif
#endif

#define H0 0x800
#define H1 0x801
#define H2 0x802
#define H3 0x803
#define H4 0x804
#define H5 0x805
#define H6 0x806
#define H7 0x807
#if !(defined(PORTH))
#if LED >= H0 && LED <= H7
#undef LED
#define LED -1
#endif
#endif

#define J0 0xA00
#define J1 0xA01
#define J2 0xA02
#define J3 0xA03
#define J4 0xA04
#define J5 0xA05
#define J6 0xA06
#define J7 0xA07
#if !(defined(PORTJ))
#if LED >= J0 && LED <= J7
#undef LED
#define LED -1
#endif
#endif

#define K0 0xB00
#define K1 0xB01
#define K2 0xB02
#define K3 0xB03
#define K4 0xB04
#define K5 0xB05
#define K6 0xB06
#define K7 0xB07
#if !(defined(PORTK))
#if LED >= K0 && LED <= K7
#undef LED
#define LED -1
#endif
#endif

#define L0 0xC00
#define L1 0xC01
#define L2 0xC02
#define L3 0xC03
#define L4 0xC04
#define L5 0xC05
#define L6 0xC06
#define L7 0xC07
#if !(defined(PORTL))
#if LED >= L0 && LED <= L7
#undef LED
#define LED -1
#endif
#endif


/*
 * A statement like "#if LED == B0" will evaluate (in the preprocessor)
 * to #if C0 == B0, and then to #if 0x301 == 0x201
 */
#if LED == B0
#define LED_NAME "B0"
#undef LED
#define LED_DDR     DDRB
#define LED_PORT    PORTB
#define LED_PIN     PINB
#define LED         PINB0
#elif LED == B1
#define LED_NAME "B1"
#undef LED
#define LED_DDR     DDRB
#define LED_PORT    PORTB
#define LED_PIN     PINB
#define LED         PINB1
#elif LED == B2
#define LED_NAME "B2"
#undef LED
#define LED_DDR     DDRB
#define LED_PORT    PORTB
#define LED_PIN     PINB
#define LED         PINB2
#elif LED == B3
#define LED_NAME "B3"
#undef LED
#define LED_DDR     DDRB
#define LED_PORT    PORTB
#define LED_PIN     PINB
#define LED         PINB3
#elif LED == B4
#define LED_NAME "B4"
#undef LED
#define LED_DDR     DDRB
#define LED_PORT    PORTB
#define LED_PIN     PINB
#define LED         PINB4
#elif LED == B5
#define LED_NAME "B5"
#undef LED
#define LED_DDR     DDRB
#define LED_PORT    PORTB
#define LED_PIN     PINB
#define LED         PINB5
#elif LED == B6
#define LED_NAME "B6"
#undef LED
#define LED_DDR     DDRB
#define LED_PORT    PORTB
#define LED_PIN     PINB
#define LED         PINB6
#elif LED == B7
#define LED_NAME "B7"
#undef LED
#define LED_DDR     DDRB
#define LED_PORT    PORTB
#define LED_PIN     PINB
#define LED         PINB7

#elif LED == C0
#define LED_NAME "C0"
#undef LED
#define LED_DDR     DDRC
#define LED_PORT    PORTC
#define LED_PIN     PINC
#define LED         PINC0
#elif LED == C1
#define LED_NAME "C1"
#undef LED
#define LED_DDR     DDRC
#define LED_PORT    PORTC
#define LED_PIN     PINC
#define LED         PINC1
#elif LED == C2
#define LED_NAME "C2"
#undef LED
#define LED_DDR     DDRC
#define LED_PORT    PORTC
#define LED_PIN     PINC
#define LED         PINC2
#elif LED == C3
#define LED_NAME "C3"
#undef LED
#define LED_DDR     DDRC
#define LED_PORT    PORTC
#define LED_PIN     PINC
#define LED         PINC3
#elif LED == C4
#define LED_NAME "C4"
#undef LED
#define LED_DDR     DDRC
#define LED_PORT    PORTC
#define LED_PIN     PINC
#define LED         PINC4
#elif LED == C5
#define LED_NAME "C5"
#undef LED
#define LED_DDR     DDRC
#define LED_PORT    PORTC
#define LED_PIN     PINC
#define LED         PINC5
#elif LED == C6
#define LED_NAME "C6"
#undef LED
#define LED_DDR     DDRC
#define LED_PORT    PORTC
#define LED_PIN     PINC
#define LED         PINC6
#elif LED == C7
#define LED_NAME "C7"
#undef LED
#define LED_DDR     DDRC
#define LED_PORT    PORTC
#define LED_PIN     PINC
#define LED         PINC7

#elif LED == D0
#define LED_NAME "D0"
#undef LED
#define LED_DDR     DDRD
#define LED_PORT    PORTD
#define LED_PIN     PIND
#define LED         PIND0
#elif LED == D1
#define LED_NAME "D1"
#undef LED
#define LED_DDR     DDRD
#define LED_PORT    PORTD
#define LED_PIN     PIND
#define LED         PIND1
#elif LED == D2
#define LED_NAME "D2"
#undef LED
#define LED_DDR     DDRD
#define LED_PORT    PORTD
#define LED_PIN     PIND
#define LED         PIND2
#elif LED == D3
#define LED_NAME "D3"
#undef LED
#define LED_DDR     DDRD
#define LED_PORT    PORTD
#define LED_PIN     PIND
#define LED         PIND3
#elif LED == D4
#define LED_NAME "D4"
#undef LED
#define LED_DDR     DDRD
#define LED_PORT    PORTD
#define LED_PIN     PIND
#define LED         PIND4
#elif LED == D5
#define LED_NAME "D5"
#undef LED
#define LED_DDR     DDRD
#define LED_PORT    PORTD
#define LED_PIN     PIND
#define LED         PIND5
#elif LED == D6
#define LED_NAME "D6"
#undef LED
#define LED_DDR     DDRD
#define LED_PORT    PORTD
#define LED_PIN     PIND
#define LED         PIND6
#elif LED == D7
#define LED_NAME "D7"
#undef LED
#define LED_DDR     DDRD
#define LED_PORT    PORTD
#define LED_PIN     PIND
#define LED         PIND7

#elif LED == E0
#define LED_NAME "E0"
#undef LED
#define LED_DDR     DDRE
#define LED_PORT    PORTE
#define LED_PIN     PINE
#define LED         PINE0
#elif LED == E1
#define LED_NAME "E1"
#undef LED
#define LED_DDR     DDRE
#define LED_PORT    PORTE
#define LED_PIN     PINE
#define LED         PINE1
#elif LED == E2
#define LED_NAME "E2"
#undef LED
#define LED_DDR     DDRE
#define LED_PORT    PORTE
#define LED_PIN     PINE
#define LED         PINE2
#elif LED == E3
#define LED_NAME "E3"
#undef LED
#define LED_DDR     DDRE
#define LED_PORT    PORTE
#define LED_PIN     PINE
#define LED         PINE3
#elif LED == E4
#define LED_NAME "E4"
#undef LED
#define LED_DDR     DDRE
#define LED_PORT    PORTE
#define LED_PIN     PINE
#define LED         PINE4
#elif LED == E5
#define LED_NAME "E5"
#undef LED
#define LED_DDR     DDRE
#define LED_PORT    PORTE
#define LED_PIN     PINE
#define LED         PINE5
#elif LED == E6
#define LED_NAME "E6"
#undef LED
#define LED_DDR     DDRE
#define LED_PORT    PORTE
#define LED_PIN     PINE
#define LED         PINE6
#elif LED == E7
#define LED_NAME "E7"
#undef LED
#define LED_DDR     DDRE
#define LED_PORT    PORTE
#define LED_PIN     PINE
#define LED         PINE7

#elif LED == F0
#define LED_NAME "F0"
#undef LED
#define LED_DDR     DDRF
#define LED_PORT    PORTF
#define LED_PIN     PINF
#define LED         PINF0
#elif LED == F1
#define LED_NAME "F1"
#undef LED
#define LED_DDR     DDRF
#define LED_PORT    PORTF
#define LED_PIN     PINF
#define LED         PINF1
#elif LED == F2
#define LED_NAME "F2"
#undef LED
#define LED_DDR     DDRF
#define LED_PORT    PORTF
#define LED_PIN     PINF
#define LED         PINF2
#elif LED == F3
#define LED_NAME "F3"
#undef LED
#define LED_DDR     DDRF
#define LED_PORT    PORTF
#define LED_PIN     PINF
#define LED         PINF3
#elif LED == F4
#define LED_NAME "F4"
#undef LED
#define LED_DDR     DDRF
#define LED_PORT    PORTF
#define LED_PIN     PINF
#define LED         PINF4
#elif LED == F5
#define LED_NAME "F5"
#undef LED
#define LED_DDR     DDRF
#define LED_PORT    PORTF
#define LED_PIN     PINF
#define LED         PINF5
#elif LED == F6
#define LED_NAME "F6"
#undef LED
#define LED_DDR     DDRF
#define LED_PORT    PORTF
#define LED_PIN     PINF
#define LED         PINF6
#elif LED == F7
#define LED_NAME "F7"
#undef LED
#define LED_DDR     DDRF
#define LED_PORT    PORTF
#define LED_PIN     PINF
#define LED         PINF7

#elif LED == G0
#define LED_NAME "G0"
#undef LED
#define LED_DDR     DDRG
#define LED_PORT    PORTG
#define LED_PIN     PING
#define LED         PING0
#elif LED == G1
#define LED_NAME "G1"
#undef LED
#define LED_DDR     DDRG
#define LED_PORT    PORTG
#define LED_PIN     PING
#define LED         PING1
#elif LED == G2
#define LED_NAME "G2"
#undef LED
#define LED_DDR     DDRG
#define LED_PORT    PORTG
#define LED_PIN     PING
#define LED         PING2
#elif LED == G3
#define LED_NAME "G3"
#undef LED
#define LED_DDR     DDRG
#define LED_PORT    PORTG
#define LED_PIN     PING
#define LED         PING3
#elif LED == G4
#define LED_NAME "G4"
#undef LED
#define LED_DDR     DDRG
#define LED_PORT    PORTG
#define LED_PIN     PING
#define LED         PING4
#elif LED == G5
#define LED_NAME "G5"
#undef LED
#define LED_DDR     DDRG
#define LED_PORT    PORTG
#define LED_PIN     PING
#define LED         PING5
#elif LED == G6
#define LED_NAME "G6"
#undef LED
#define LED_DDR     DDRG
#define LED_PORT    PORTG
#define LED_PIN     PING
#define LED         PING6
#elif LED == G7
#define LED_NAME "G7"
#undef LED
#define LED_DDR     DDRG
#define LED_PORT    PORTG
#define LED_PIN     PING
#define LED         PING7

#elif LED == H0
#define LED_NAME "H0"
#undef LED
#define LED_DDR     DDRH
#define LED_PORT    PORTH
#define LED_PIN     PINH
#define LED         PINH0
#elif LED == H1
#define LED_NAME "H1"
#undef LED
#define LED_DDR     DDRH
#define LED_PORT    PORTH
#define LED_PIN     PINH
#define LED         PINH1
#elif LED == H2
#define LED_NAME "H2"
#undef LED
#define LED_DDR     DDRH
#define LED_PORT    PORTH
#define LED_PIN     PINH
#define LED         PINH2
#elif LED == H3
#define LED_NAME "H3"
#undef LED
#define LED_DDR     DDRH
#define LED_PORT    PORTH
#define LED_PIN     PINH
#define LED         PINH3
#elif LED == H4
#define LED_NAME "H4"
#undef LED
#define LED_DDR     DDRH
#define LED_PORT    PORTH
#define LED_PIN     PINH
#define LED         PINH4
#elif LED == H5
#define LED_NAME "H5"
#undef LED
#define LED_DDR     DDRH
#define LED_PORT    PORTH
#define LED_PIN     PINH
#define LED         PINH5
#elif LED == H6
#define LED_NAME "H6"
#undef LED
#define LED_DDR     DDRH
#define LED_PORT    PORTH
#define LED_PIN     PINH
#define LED         PINH6
#elif LED == H7
#define LED_NAME "H7"
#undef LED
#define LED_DDR     DDRH
#define LED_PORT    PORTH
#define LED_PIN     PINH
#define LED         PINH7

#elif LED == J0
#define LED_NAME "J0"
#undef LED
#define LED_DDR     DDRJ
#define LED_PORT    PORTJ
#define LED_PIN     PINJ
#define LED         PINJ0
#elif LED == J1
#define LED_NAME "J1"
#undef LED
#define LED_DDR     DDRJ
#define LED_PORT    PORTJ
#define LED_PIN     PINJ
#define LED         PINJ1
#elif LED == J2
#define LED_NAME "J2"
#undef LED
#define LED_DDR     DDRJ
#define LED_PORT    PORTJ
#define LED_PIN     PINJ
#define LED         PINJ2
#elif LED == J3
#define LED_NAME "J3"
#undef LED
#define LED_DDR     DDRJ
#define LED_PORT    PORTJ
#define LED_PIN     PINJ
#define LED         PINJ3
#elif LED == J4
#define LED_NAME "J4"
#undef LED
#define LED_DDR     DDRJ
#define LED_PORT    PORTJ
#define LED_PIN     PINJ
#define LED         PINJ4
#elif LED == J5
#define LED_NAME "J5"
#undef LED
#define LED_DDR     DDRJ
#define LED_PORT    PORTJ
#define LED_PIN     PINJ
#define LED         PINJ5
#elif LED == J6
#define LED_NAME "J6"
#undef LED
#define LED_DDR     DDRJ
#define LED_PORT    PORTJ
#define LED_PIN     PINJ
#define LED         PINJ6
#elif LED == J7
#define LED_NAME "J7"
#undef LED
#define LED_DDR     DDRJ
#define LED_PORT    PORTJ
#define LED_PIN     PINJ
#define LED         PINJ7

#elif LED == K0
#define LED_NAME "K0"
#undef LED
#define LED_DDR     DDRK
#define LED_PORT    PORTK
#define LED_PIN     PINK
#define LED         PINK0
#elif LED == K1
#define LED_NAME "K1"
#undef LED
#define LED_DDR     DDRK
#define LED_PORT    PORTK
#define LED_PIN     PINK
#define LED         PINK1
#elif LED == K2
#define LED_NAME "K2"
#undef LED
#define LED_DDR     DDRK
#define LED_PORT    PORTK
#define LED_PIN     PINK
#define LED         PINK2
#elif LED == K3
#define LED_NAME "K3"
#undef LED
#define LED_DDR     DDRK
#define LED_PORT    PORTK
#define LED_PIN     PINK
#define LED         PINK3
#elif LED == K4
#define LED_NAME "K4"
#undef LED
#define LED_DDR     DDRK
#define LED_PORT    PORTK
#define LED_PIN     PINK
#define LED         PINK4
#elif LED == K5
#define LED_NAME "K5"
#undef LED
#define LED_DDR     DDRK
#define LED_PORT    PORTK
#define LED_PIN     PINK
#define LED         PINK5
#elif LED == K6
#define LED_NAME "K6"
#undef LED
#define LED_DDR     DDRK
#define LED_PORT    PORTK
#define LED_PIN     PINK
#define LED         PINK6
#elif LED == K7
#define LED_NAME "K7"
#undef LED
#define LED_DDR     DDRK
#define LED_PORT    PORTK
#define LED_PIN     PINK
#define LED         PINK7

#elif LED == L0
#define LED_NAME "L0"
#undef LED
#define LED_DDR     DDRL
#define LED_PORT    PORTL
#define LED_PIN     PINL
#define LED         PINL0
#elif LED == L1
#define LED_NAME "L1"
#undef LED
#define LED_DDR     DDRL
#define LED_PORT    PORTL
#define LED_PIN     PINL
#define LED         PINL1
#elif LED == L2
#define LED_NAME "L2"
#undef LED
#define LED_DDR     DDRL
#define LED_PORT    PORTL
#define LED_PIN     PINL
#define LED         PINL2
#elif LED == L3
#define LED_NAME "L3"
#undef LED
#define LED_DDR     DDRL
#define LED_PORT    PORTL
#define LED_PIN     PINL
#define LED         PINL3
#elif LED == L4
#define LED_NAME "L4"
#undef LED
#define LED_DDR     DDRL
#define LED_PORT    PORTL
#define LED_PIN     PINL
#define LED         PINL4
#elif LED == L5
#define LED_NAME "L5"
#undef LED
#define LED_DDR     DDRL
#define LED_PORT    PORTL
#define LED_PIN     PINL
#define LED         PINL5
#elif LED == L6
#define LED_NAME "L6"
#undef LED
#define LED_DDR     DDRL
#define LED_PORT    PORTL
#define LED_PIN     PINL
#define LED         PINL6
#elif LED == L7
#define LED_NAME "L7"
#undef LED
#define LED_DDR     DDRL
#define LED_PORT    PORTL
#define LED_PIN     PINL
#define LED         PINL7

#elif LED == A0
#define LED_NAME "A0"
#undef LED
#define LED_DDR     DDRA
#define LED_PORT    PORTA
#define LED_PIN     PINA
#define LED         PINA0
#elif LED == A1
#define LED_NAME "A1"
#undef LED
#define LED_DDR     DDRA
#define LED_PORT    PORTA
#define LED_PIN     PINA
#define LED         PINA1
#elif LED == A2
#define LED_NAME "A2"
#undef LED
#define LED_DDR     DDRA
#define LED_PORT    PORTA
#define LED_PIN     PINA
#define LED         PINA2
#elif LED == A3
#define LED_NAME "A3"
#undef LED
#define LED_DDR     DDRA
#define LED_PORT    PORTA
#define LED_PIN     PINA
#define LED         PINA3
#elif LED == A4
#define LED_NAME "A4"
#undef LED
#define LED_DDR     DDRA
#define LED_PORT    PORTA
#define LED_PIN     PINA
#define LED         PINA4
#elif LED == A5
#define LED_NAME "A5"
#undef LED
#define LED_DDR     DDRA
#define LED_PORT    PORTA
#define LED_PIN     PINA
#define LED         PINA5
#elif LED == A6
#define LED_NAME "A6"
#undef LED
#define LED_DDR     DDRA
#define LED_PORT    PORTA
#define LED_PIN     PINA
#define LED         PINA6
#elif LED == A7
#define LED_NAME "A7"
#undef LED
#define LED_DDR     DDRA
#define LED_PORT    PORTA
#define LED_PIN     PINA
#define LED         PINA7

#else
// Stop compilation right away, so we don't get more errors.
#if LED == -1
#error Unrecognized LED name.  Should be like "B5"
// Stop compilation right away, so we don't get more errors.
#pragma GCC diagnostic warning "-Wfatal-errors"
#error Nonexistent LED PORT.  Check datasheet.
#endif
#pragma GCC diagnostic warning "-Wfatal-errors"
#error Unrecognized LED name.  Should be like "B5"
#endif


#ifdef RS485
#include "pins_rs485.h"
#endif

#if SOFT_UART && defined(SOFTTX) && defined(SOFTRX)
#include "pins_softuart.h"
#endif
