speeduino/libs/digitalIOPerformance/digitalIOPerformance.h

8139 lines
255 KiB
C
Executable File

/*
*
* Header for high performance Arduino Digital I/O
*
* Automatically generated from the Arduino library setup (boards.txt & pins_arduino.h)
*
* See the accompanying file README.md for documentation.
*
* ****
*
* This header is a derived work of the Arduino microcontroller libraries, which are
* licensed under LGPL. Although as a header file it is not bound by the same usage
* clauses as the library itself (see "3. Object Code Incorporating Material from
* Library Header Files.)"
*
* Note that although the code generated functions below here look horrific,
* they're written to inline only very small subsets of themselves at compile
* time (they generate single port-register instructions when the parameters
* are constant.)
*
*
*/
#ifdef __AVR__
#ifndef _DIGITALIO_PERFORMANCE
#define _DIGITALIO_PERFORMANCE
#include "Arduino.h"
#include <util/atomic.h>
// Forward declarations for per-Arduino-board functions:
inline static void pinModeFast(uint8_t pin, uint8_t mode);
inline static void digitalWriteFast(uint8_t pin, uint8_t value);
inline static int digitalReadFast(uint8_t pin);
inline static void noAnalogWrite(uint8_t pin);
// These few per-board functions are designed for internal use, but
// you can call them yourself if you want.
inline static bool _isPWMPin(uint8_t pin);
inline static bool _directionIsAtomic(uint8_t pin);
inline static bool _outputIsAtomic(uint8_t pin);
inline static bool _inputIsAtomic(uint8_t pin);
#ifdef DIGITALIO_NO_INTERRUPT_SAFETY
#define DIGITALIO_NO_INTERRUPT_SAFETY 1
#else
#define DIGITALIO_NO_INTERRUPT_SAFETY 0
#endif
#ifdef DIGITALIO_NO_MIX_ANALOGWRITE
#define DIGITALIO_NO_MIX_ANALOGWRITE 1
#else
#define DIGITALIO_NO_MIX_ANALOGWRITE 0
#endif
// All the variables & conditionals in these functions should evaluate at
// compile time not run time...
__attribute__((always_inline))
static inline void pinModeSafe(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else {
if((mode == INPUT || mode == INPUT_PULLUP) && !DIGITALIO_NO_MIX_ANALOGWRITE)
noAnalogWrite(pin);
const bool write_is_atomic = DIGITALIO_NO_INTERRUPT_SAFETY
|| (__builtin_constant_p(mode)
&& mode == OUTPUT
&& _directionIsAtomic(pin));
if(write_is_atomic) {
pinModeFast(pin, mode);
}
else {
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
pinModeFast(pin, mode);
}
}
}
}
__attribute__((always_inline))
static inline void digitalWriteSafe(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else {
if(!DIGITALIO_NO_MIX_ANALOGWRITE)
noAnalogWrite(pin);
if(DIGITALIO_NO_INTERRUPT_SAFETY || _outputIsAtomic(pin)) {
digitalWriteFast(pin, value);
}
else {
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
digitalWriteFast(pin, value);
}
}
}
}
__attribute__((always_inline))
static inline int digitalReadSafe(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else {
if(!DIGITALIO_NO_MIX_ANALOGWRITE)
noAnalogWrite(pin);
return digitalReadFast(pin);
}
}
/* Arduino board:
* mini | nano | bt
* Arduino Mini w/ ATmega168 | Arduino Nano w/ ATmega168 | Arduino BT w/ ATmega168
* MCU: atmega168
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 8 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x94 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 0) DDRD |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 1) DDRD |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 2) DDRD |= (1 << (2));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 3) DDRD |= (1 << (3));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRD &= ~(1 << (5));
PORTD &= ~(1 << (5));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (5));
PORTD |= (1 << (5));
} else if(pin == 5) DDRD |= (1 << (5));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 6) DDRD |= (1 << (6));
else if(pin == 7 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 7) DDRD |= (1 << (7));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 8) DDRB |= (1 << (0));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 9) DDRB |= (1 << (1));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 10) DDRB |= (1 << (2));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 11) DDRB |= (1 << (3));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 12) DDRB |= (1 << (4));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 13) DDRB |= (1 << (5));
else if(pin == 14 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 14) DDRC |= (1 << (0));
else if(pin == 15 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 15) DDRC |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 16) DDRC |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 17) DDRC |= (1 << (3));
else if(pin == 18 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 18) DDRC |= (1 << (4));
else if(pin == 19 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 19) DDRC |= (1 << (5));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (0));
else if(pin == 0 && !value) PORTD &= ~(1 << (0));
else if(pin == 1 && value) PORTD |= (1 << (1));
else if(pin == 1 && !value) PORTD &= ~(1 << (1));
else if(pin == 2 && value) PORTD |= (1 << (2));
else if(pin == 2 && !value) PORTD &= ~(1 << (2));
else if(pin == 3 && value) PORTD |= (1 << (3));
else if(pin == 3 && !value) PORTD &= ~(1 << (3));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTD |= (1 << (5));
else if(pin == 5 && !value) PORTD &= ~(1 << (5));
else if(pin == 6 && value) PORTD |= (1 << (6));
else if(pin == 6 && !value) PORTD &= ~(1 << (6));
else if(pin == 7 && value) PORTD |= (1 << (7));
else if(pin == 7 && !value) PORTD &= ~(1 << (7));
else if(pin == 8 && value) PORTB |= (1 << (0));
else if(pin == 8 && !value) PORTB &= ~(1 << (0));
else if(pin == 9 && value) PORTB |= (1 << (1));
else if(pin == 9 && !value) PORTB &= ~(1 << (1));
else if(pin == 10 && value) PORTB |= (1 << (2));
else if(pin == 10 && !value) PORTB &= ~(1 << (2));
else if(pin == 11 && value) PORTB |= (1 << (3));
else if(pin == 11 && !value) PORTB &= ~(1 << (3));
else if(pin == 12 && value) PORTB |= (1 << (4));
else if(pin == 12 && !value) PORTB &= ~(1 << (4));
else if(pin == 13 && value) PORTB |= (1 << (5));
else if(pin == 13 && !value) PORTB &= ~(1 << (5));
else if(pin == 14 && value) PORTC |= (1 << (0));
else if(pin == 14 && !value) PORTC &= ~(1 << (0));
else if(pin == 15 && value) PORTC |= (1 << (1));
else if(pin == 15 && !value) PORTC &= ~(1 << (1));
else if(pin == 16 && value) PORTC |= (1 << (2));
else if(pin == 16 && !value) PORTC &= ~(1 << (2));
else if(pin == 17 && value) PORTC |= (1 << (3));
else if(pin == 17 && !value) PORTC &= ~(1 << (3));
else if(pin == 18 && value) PORTC |= (1 << (4));
else if(pin == 18 && !value) PORTC &= ~(1 << (4));
else if(pin == 19 && value) PORTC |= (1 << (5));
else if(pin == 19 && !value) PORTC &= ~(1 << (5));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PIND & (1 << (5)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 7) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 14) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 15) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 18) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 19) return PINC & (1 << (5)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR2A &= ~_BV(COM2B1);
else if(pin == 5) TCCR0A &= ~_BV(COM0B1);
else if(pin == 6) TCCR0A &= ~_BV(COM0A1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR2A &= ~_BV(COM2A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRD);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRD);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRC);
if(pin == 15)
return _SFR_IO_REG_P(DDRC);
if(pin == 16)
return _SFR_IO_REG_P(DDRC);
if(pin == 17)
return _SFR_IO_REG_P(DDRC);
if(pin == 18)
return _SFR_IO_REG_P(DDRC);
if(pin == 19)
return _SFR_IO_REG_P(DDRC);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTD);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTD);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTC);
if(pin == 15)
return _SFR_IO_REG_P(PORTC);
if(pin == 16)
return _SFR_IO_REG_P(PORTC);
if(pin == 17)
return _SFR_IO_REG_P(PORTC);
if(pin == 18)
return _SFR_IO_REG_P(PORTC);
if(pin == 19)
return _SFR_IO_REG_P(PORTC);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PIND);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PIND);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINC);
if(pin == 15)
return _SFR_IO_REG_P(PINC);
if(pin == 16)
return _SFR_IO_REG_P(PINC);
if(pin == 17)
return _SFR_IO_REG_P(PINC);
if(pin == 18)
return _SFR_IO_REG_P(PINC);
if(pin == 19)
return _SFR_IO_REG_P(PINC);
return false;
}
#endif
/* Arduino board:
* pro | lilypad
* Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 | LilyPad Arduino w/ ATmega168
* MCU: atmega168
*/
#if defined(F_CPU) && (F_CPU+0) == 8000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 6 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x94 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 0) DDRD |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 1) DDRD |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 2) DDRD |= (1 << (2));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 3) DDRD |= (1 << (3));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRD &= ~(1 << (5));
PORTD &= ~(1 << (5));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (5));
PORTD |= (1 << (5));
} else if(pin == 5) DDRD |= (1 << (5));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 6) DDRD |= (1 << (6));
else if(pin == 7 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 7) DDRD |= (1 << (7));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 8) DDRB |= (1 << (0));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 9) DDRB |= (1 << (1));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 10) DDRB |= (1 << (2));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 11) DDRB |= (1 << (3));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 12) DDRB |= (1 << (4));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 13) DDRB |= (1 << (5));
else if(pin == 14 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 14) DDRC |= (1 << (0));
else if(pin == 15 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 15) DDRC |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 16) DDRC |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 17) DDRC |= (1 << (3));
else if(pin == 18 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 18) DDRC |= (1 << (4));
else if(pin == 19 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 19) DDRC |= (1 << (5));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (0));
else if(pin == 0 && !value) PORTD &= ~(1 << (0));
else if(pin == 1 && value) PORTD |= (1 << (1));
else if(pin == 1 && !value) PORTD &= ~(1 << (1));
else if(pin == 2 && value) PORTD |= (1 << (2));
else if(pin == 2 && !value) PORTD &= ~(1 << (2));
else if(pin == 3 && value) PORTD |= (1 << (3));
else if(pin == 3 && !value) PORTD &= ~(1 << (3));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTD |= (1 << (5));
else if(pin == 5 && !value) PORTD &= ~(1 << (5));
else if(pin == 6 && value) PORTD |= (1 << (6));
else if(pin == 6 && !value) PORTD &= ~(1 << (6));
else if(pin == 7 && value) PORTD |= (1 << (7));
else if(pin == 7 && !value) PORTD &= ~(1 << (7));
else if(pin == 8 && value) PORTB |= (1 << (0));
else if(pin == 8 && !value) PORTB &= ~(1 << (0));
else if(pin == 9 && value) PORTB |= (1 << (1));
else if(pin == 9 && !value) PORTB &= ~(1 << (1));
else if(pin == 10 && value) PORTB |= (1 << (2));
else if(pin == 10 && !value) PORTB &= ~(1 << (2));
else if(pin == 11 && value) PORTB |= (1 << (3));
else if(pin == 11 && !value) PORTB &= ~(1 << (3));
else if(pin == 12 && value) PORTB |= (1 << (4));
else if(pin == 12 && !value) PORTB &= ~(1 << (4));
else if(pin == 13 && value) PORTB |= (1 << (5));
else if(pin == 13 && !value) PORTB &= ~(1 << (5));
else if(pin == 14 && value) PORTC |= (1 << (0));
else if(pin == 14 && !value) PORTC &= ~(1 << (0));
else if(pin == 15 && value) PORTC |= (1 << (1));
else if(pin == 15 && !value) PORTC &= ~(1 << (1));
else if(pin == 16 && value) PORTC |= (1 << (2));
else if(pin == 16 && !value) PORTC &= ~(1 << (2));
else if(pin == 17 && value) PORTC |= (1 << (3));
else if(pin == 17 && !value) PORTC &= ~(1 << (3));
else if(pin == 18 && value) PORTC |= (1 << (4));
else if(pin == 18 && !value) PORTC &= ~(1 << (4));
else if(pin == 19 && value) PORTC |= (1 << (5));
else if(pin == 19 && !value) PORTC &= ~(1 << (5));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PIND & (1 << (5)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 7) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 14) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 15) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 18) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 19) return PINC & (1 << (5)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR2A &= ~_BV(COM2B1);
else if(pin == 5) TCCR0A &= ~_BV(COM0B1);
else if(pin == 6) TCCR0A &= ~_BV(COM0A1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR2A &= ~_BV(COM2A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRD);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRD);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRC);
if(pin == 15)
return _SFR_IO_REG_P(DDRC);
if(pin == 16)
return _SFR_IO_REG_P(DDRC);
if(pin == 17)
return _SFR_IO_REG_P(DDRC);
if(pin == 18)
return _SFR_IO_REG_P(DDRC);
if(pin == 19)
return _SFR_IO_REG_P(DDRC);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTD);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTD);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTC);
if(pin == 15)
return _SFR_IO_REG_P(PORTC);
if(pin == 16)
return _SFR_IO_REG_P(PORTC);
if(pin == 17)
return _SFR_IO_REG_P(PORTC);
if(pin == 18)
return _SFR_IO_REG_P(PORTC);
if(pin == 19)
return _SFR_IO_REG_P(PORTC);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PIND);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PIND);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINC);
if(pin == 15)
return _SFR_IO_REG_P(PINC);
if(pin == 16)
return _SFR_IO_REG_P(PINC);
if(pin == 17)
return _SFR_IO_REG_P(PINC);
if(pin == 18)
return _SFR_IO_REG_P(PINC);
if(pin == 19)
return _SFR_IO_REG_P(PINC);
return false;
}
#endif
/* Arduino board:
* lilypad328 | pro328
* LilyPad Arduino w/ ATmega328 | Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
* MCU: atmega328p
*/
#if defined(F_CPU) && (F_CPU+0) == 8000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 6 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x95 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 0) DDRD |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 1) DDRD |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 2) DDRD |= (1 << (2));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 3) DDRD |= (1 << (3));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRD &= ~(1 << (5));
PORTD &= ~(1 << (5));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (5));
PORTD |= (1 << (5));
} else if(pin == 5) DDRD |= (1 << (5));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 6) DDRD |= (1 << (6));
else if(pin == 7 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 7) DDRD |= (1 << (7));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 8) DDRB |= (1 << (0));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 9) DDRB |= (1 << (1));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 10) DDRB |= (1 << (2));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 11) DDRB |= (1 << (3));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 12) DDRB |= (1 << (4));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 13) DDRB |= (1 << (5));
else if(pin == 14 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 14) DDRC |= (1 << (0));
else if(pin == 15 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 15) DDRC |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 16) DDRC |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 17) DDRC |= (1 << (3));
else if(pin == 18 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 18) DDRC |= (1 << (4));
else if(pin == 19 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 19) DDRC |= (1 << (5));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (0));
else if(pin == 0 && !value) PORTD &= ~(1 << (0));
else if(pin == 1 && value) PORTD |= (1 << (1));
else if(pin == 1 && !value) PORTD &= ~(1 << (1));
else if(pin == 2 && value) PORTD |= (1 << (2));
else if(pin == 2 && !value) PORTD &= ~(1 << (2));
else if(pin == 3 && value) PORTD |= (1 << (3));
else if(pin == 3 && !value) PORTD &= ~(1 << (3));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTD |= (1 << (5));
else if(pin == 5 && !value) PORTD &= ~(1 << (5));
else if(pin == 6 && value) PORTD |= (1 << (6));
else if(pin == 6 && !value) PORTD &= ~(1 << (6));
else if(pin == 7 && value) PORTD |= (1 << (7));
else if(pin == 7 && !value) PORTD &= ~(1 << (7));
else if(pin == 8 && value) PORTB |= (1 << (0));
else if(pin == 8 && !value) PORTB &= ~(1 << (0));
else if(pin == 9 && value) PORTB |= (1 << (1));
else if(pin == 9 && !value) PORTB &= ~(1 << (1));
else if(pin == 10 && value) PORTB |= (1 << (2));
else if(pin == 10 && !value) PORTB &= ~(1 << (2));
else if(pin == 11 && value) PORTB |= (1 << (3));
else if(pin == 11 && !value) PORTB &= ~(1 << (3));
else if(pin == 12 && value) PORTB |= (1 << (4));
else if(pin == 12 && !value) PORTB &= ~(1 << (4));
else if(pin == 13 && value) PORTB |= (1 << (5));
else if(pin == 13 && !value) PORTB &= ~(1 << (5));
else if(pin == 14 && value) PORTC |= (1 << (0));
else if(pin == 14 && !value) PORTC &= ~(1 << (0));
else if(pin == 15 && value) PORTC |= (1 << (1));
else if(pin == 15 && !value) PORTC &= ~(1 << (1));
else if(pin == 16 && value) PORTC |= (1 << (2));
else if(pin == 16 && !value) PORTC &= ~(1 << (2));
else if(pin == 17 && value) PORTC |= (1 << (3));
else if(pin == 17 && !value) PORTC &= ~(1 << (3));
else if(pin == 18 && value) PORTC |= (1 << (4));
else if(pin == 18 && !value) PORTC &= ~(1 << (4));
else if(pin == 19 && value) PORTC |= (1 << (5));
else if(pin == 19 && !value) PORTC &= ~(1 << (5));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PIND & (1 << (5)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 7) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 14) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 15) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 18) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 19) return PINC & (1 << (5)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR2A &= ~_BV(COM2B1);
else if(pin == 5) TCCR0A &= ~_BV(COM0B1);
else if(pin == 6) TCCR0A &= ~_BV(COM0A1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR2A &= ~_BV(COM2A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRD);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRD);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRC);
if(pin == 15)
return _SFR_IO_REG_P(DDRC);
if(pin == 16)
return _SFR_IO_REG_P(DDRC);
if(pin == 17)
return _SFR_IO_REG_P(DDRC);
if(pin == 18)
return _SFR_IO_REG_P(DDRC);
if(pin == 19)
return _SFR_IO_REG_P(DDRC);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTD);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTD);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTC);
if(pin == 15)
return _SFR_IO_REG_P(PORTC);
if(pin == 16)
return _SFR_IO_REG_P(PORTC);
if(pin == 17)
return _SFR_IO_REG_P(PORTC);
if(pin == 18)
return _SFR_IO_REG_P(PORTC);
if(pin == 19)
return _SFR_IO_REG_P(PORTC);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PIND);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PIND);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINC);
if(pin == 15)
return _SFR_IO_REG_P(PINC);
if(pin == 16)
return _SFR_IO_REG_P(PINC);
if(pin == 17)
return _SFR_IO_REG_P(PINC);
if(pin == 18)
return _SFR_IO_REG_P(PINC);
if(pin == 19)
return _SFR_IO_REG_P(PINC);
return false;
}
#endif
/* Arduino board:
* atmega8
* Arduino NG or older w/ ATmega8
* MCU: atmega8
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 6 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x93 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 0) DDRD |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 1) DDRD |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 2) DDRD |= (1 << (2));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 3) DDRD |= (1 << (3));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRD &= ~(1 << (5));
PORTD &= ~(1 << (5));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (5));
PORTD |= (1 << (5));
} else if(pin == 5) DDRD |= (1 << (5));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 6) DDRD |= (1 << (6));
else if(pin == 7 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 7) DDRD |= (1 << (7));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 8) DDRB |= (1 << (0));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 9) DDRB |= (1 << (1));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 10) DDRB |= (1 << (2));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 11) DDRB |= (1 << (3));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 12) DDRB |= (1 << (4));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 13) DDRB |= (1 << (5));
else if(pin == 14 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 14) DDRC |= (1 << (0));
else if(pin == 15 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 15) DDRC |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 16) DDRC |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 17) DDRC |= (1 << (3));
else if(pin == 18 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 18) DDRC |= (1 << (4));
else if(pin == 19 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 19) DDRC |= (1 << (5));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (0));
else if(pin == 0 && !value) PORTD &= ~(1 << (0));
else if(pin == 1 && value) PORTD |= (1 << (1));
else if(pin == 1 && !value) PORTD &= ~(1 << (1));
else if(pin == 2 && value) PORTD |= (1 << (2));
else if(pin == 2 && !value) PORTD &= ~(1 << (2));
else if(pin == 3 && value) PORTD |= (1 << (3));
else if(pin == 3 && !value) PORTD &= ~(1 << (3));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTD |= (1 << (5));
else if(pin == 5 && !value) PORTD &= ~(1 << (5));
else if(pin == 6 && value) PORTD |= (1 << (6));
else if(pin == 6 && !value) PORTD &= ~(1 << (6));
else if(pin == 7 && value) PORTD |= (1 << (7));
else if(pin == 7 && !value) PORTD &= ~(1 << (7));
else if(pin == 8 && value) PORTB |= (1 << (0));
else if(pin == 8 && !value) PORTB &= ~(1 << (0));
else if(pin == 9 && value) PORTB |= (1 << (1));
else if(pin == 9 && !value) PORTB &= ~(1 << (1));
else if(pin == 10 && value) PORTB |= (1 << (2));
else if(pin == 10 && !value) PORTB &= ~(1 << (2));
else if(pin == 11 && value) PORTB |= (1 << (3));
else if(pin == 11 && !value) PORTB &= ~(1 << (3));
else if(pin == 12 && value) PORTB |= (1 << (4));
else if(pin == 12 && !value) PORTB &= ~(1 << (4));
else if(pin == 13 && value) PORTB |= (1 << (5));
else if(pin == 13 && !value) PORTB &= ~(1 << (5));
else if(pin == 14 && value) PORTC |= (1 << (0));
else if(pin == 14 && !value) PORTC &= ~(1 << (0));
else if(pin == 15 && value) PORTC |= (1 << (1));
else if(pin == 15 && !value) PORTC &= ~(1 << (1));
else if(pin == 16 && value) PORTC |= (1 << (2));
else if(pin == 16 && !value) PORTC &= ~(1 << (2));
else if(pin == 17 && value) PORTC |= (1 << (3));
else if(pin == 17 && !value) PORTC &= ~(1 << (3));
else if(pin == 18 && value) PORTC |= (1 << (4));
else if(pin == 18 && !value) PORTC &= ~(1 << (4));
else if(pin == 19 && value) PORTC |= (1 << (5));
else if(pin == 19 && !value) PORTC &= ~(1 << (5));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PIND & (1 << (5)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 7) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 14) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 15) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 18) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 19) return PINC & (1 << (5)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR2 &= ~_BV(COM21);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRD);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRD);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRC);
if(pin == 15)
return _SFR_IO_REG_P(DDRC);
if(pin == 16)
return _SFR_IO_REG_P(DDRC);
if(pin == 17)
return _SFR_IO_REG_P(DDRC);
if(pin == 18)
return _SFR_IO_REG_P(DDRC);
if(pin == 19)
return _SFR_IO_REG_P(DDRC);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTD);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTD);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTC);
if(pin == 15)
return _SFR_IO_REG_P(PORTC);
if(pin == 16)
return _SFR_IO_REG_P(PORTC);
if(pin == 17)
return _SFR_IO_REG_P(PORTC);
if(pin == 18)
return _SFR_IO_REG_P(PORTC);
if(pin == 19)
return _SFR_IO_REG_P(PORTC);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PIND);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PIND);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINC);
if(pin == 15)
return _SFR_IO_REG_P(PINC);
if(pin == 16)
return _SFR_IO_REG_P(PINC);
if(pin == 17)
return _SFR_IO_REG_P(PINC);
if(pin == 18)
return _SFR_IO_REG_P(PINC);
if(pin == 19)
return _SFR_IO_REG_P(PINC);
return false;
}
#endif
/* Arduino board:
* pro5v | atmega168 | diecimila
* Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 | Arduino NG or older w/ ATmega168 | Arduino Diecimila or Duemilanove w/ ATmega168
* MCU: atmega168
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 6 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x94 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 0) DDRD |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 1) DDRD |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 2) DDRD |= (1 << (2));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 3) DDRD |= (1 << (3));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRD &= ~(1 << (5));
PORTD &= ~(1 << (5));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (5));
PORTD |= (1 << (5));
} else if(pin == 5) DDRD |= (1 << (5));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 6) DDRD |= (1 << (6));
else if(pin == 7 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 7) DDRD |= (1 << (7));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 8) DDRB |= (1 << (0));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 9) DDRB |= (1 << (1));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 10) DDRB |= (1 << (2));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 11) DDRB |= (1 << (3));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 12) DDRB |= (1 << (4));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 13) DDRB |= (1 << (5));
else if(pin == 14 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 14) DDRC |= (1 << (0));
else if(pin == 15 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 15) DDRC |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 16) DDRC |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 17) DDRC |= (1 << (3));
else if(pin == 18 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 18) DDRC |= (1 << (4));
else if(pin == 19 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 19) DDRC |= (1 << (5));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (0));
else if(pin == 0 && !value) PORTD &= ~(1 << (0));
else if(pin == 1 && value) PORTD |= (1 << (1));
else if(pin == 1 && !value) PORTD &= ~(1 << (1));
else if(pin == 2 && value) PORTD |= (1 << (2));
else if(pin == 2 && !value) PORTD &= ~(1 << (2));
else if(pin == 3 && value) PORTD |= (1 << (3));
else if(pin == 3 && !value) PORTD &= ~(1 << (3));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTD |= (1 << (5));
else if(pin == 5 && !value) PORTD &= ~(1 << (5));
else if(pin == 6 && value) PORTD |= (1 << (6));
else if(pin == 6 && !value) PORTD &= ~(1 << (6));
else if(pin == 7 && value) PORTD |= (1 << (7));
else if(pin == 7 && !value) PORTD &= ~(1 << (7));
else if(pin == 8 && value) PORTB |= (1 << (0));
else if(pin == 8 && !value) PORTB &= ~(1 << (0));
else if(pin == 9 && value) PORTB |= (1 << (1));
else if(pin == 9 && !value) PORTB &= ~(1 << (1));
else if(pin == 10 && value) PORTB |= (1 << (2));
else if(pin == 10 && !value) PORTB &= ~(1 << (2));
else if(pin == 11 && value) PORTB |= (1 << (3));
else if(pin == 11 && !value) PORTB &= ~(1 << (3));
else if(pin == 12 && value) PORTB |= (1 << (4));
else if(pin == 12 && !value) PORTB &= ~(1 << (4));
else if(pin == 13 && value) PORTB |= (1 << (5));
else if(pin == 13 && !value) PORTB &= ~(1 << (5));
else if(pin == 14 && value) PORTC |= (1 << (0));
else if(pin == 14 && !value) PORTC &= ~(1 << (0));
else if(pin == 15 && value) PORTC |= (1 << (1));
else if(pin == 15 && !value) PORTC &= ~(1 << (1));
else if(pin == 16 && value) PORTC |= (1 << (2));
else if(pin == 16 && !value) PORTC &= ~(1 << (2));
else if(pin == 17 && value) PORTC |= (1 << (3));
else if(pin == 17 && !value) PORTC &= ~(1 << (3));
else if(pin == 18 && value) PORTC |= (1 << (4));
else if(pin == 18 && !value) PORTC &= ~(1 << (4));
else if(pin == 19 && value) PORTC |= (1 << (5));
else if(pin == 19 && !value) PORTC &= ~(1 << (5));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PIND & (1 << (5)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 7) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 14) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 15) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 18) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 19) return PINC & (1 << (5)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR2A &= ~_BV(COM2B1);
else if(pin == 5) TCCR0A &= ~_BV(COM0B1);
else if(pin == 6) TCCR0A &= ~_BV(COM0A1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR2A &= ~_BV(COM2A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRD);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRD);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRC);
if(pin == 15)
return _SFR_IO_REG_P(DDRC);
if(pin == 16)
return _SFR_IO_REG_P(DDRC);
if(pin == 17)
return _SFR_IO_REG_P(DDRC);
if(pin == 18)
return _SFR_IO_REG_P(DDRC);
if(pin == 19)
return _SFR_IO_REG_P(DDRC);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTD);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTD);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTC);
if(pin == 15)
return _SFR_IO_REG_P(PORTC);
if(pin == 16)
return _SFR_IO_REG_P(PORTC);
if(pin == 17)
return _SFR_IO_REG_P(PORTC);
if(pin == 18)
return _SFR_IO_REG_P(PORTC);
if(pin == 19)
return _SFR_IO_REG_P(PORTC);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PIND);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PIND);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINC);
if(pin == 15)
return _SFR_IO_REG_P(PINC);
if(pin == 16)
return _SFR_IO_REG_P(PINC);
if(pin == 17)
return _SFR_IO_REG_P(PINC);
if(pin == 18)
return _SFR_IO_REG_P(PINC);
if(pin == 19)
return _SFR_IO_REG_P(PINC);
return false;
}
#endif
/* Arduino board:
* fio
* Arduino Fio
* MCU: atmega328p
*/
#if defined(F_CPU) && (F_CPU+0) == 8000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 8 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x95 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 0) DDRD |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 1) DDRD |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 2) DDRD |= (1 << (2));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 3) DDRD |= (1 << (3));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRD &= ~(1 << (5));
PORTD &= ~(1 << (5));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (5));
PORTD |= (1 << (5));
} else if(pin == 5) DDRD |= (1 << (5));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 6) DDRD |= (1 << (6));
else if(pin == 7 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 7) DDRD |= (1 << (7));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 8) DDRB |= (1 << (0));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 9) DDRB |= (1 << (1));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 10) DDRB |= (1 << (2));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 11) DDRB |= (1 << (3));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 12) DDRB |= (1 << (4));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 13) DDRB |= (1 << (5));
else if(pin == 14 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 14) DDRC |= (1 << (0));
else if(pin == 15 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 15) DDRC |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 16) DDRC |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 17) DDRC |= (1 << (3));
else if(pin == 18 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 18) DDRC |= (1 << (4));
else if(pin == 19 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 19) DDRC |= (1 << (5));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (0));
else if(pin == 0 && !value) PORTD &= ~(1 << (0));
else if(pin == 1 && value) PORTD |= (1 << (1));
else if(pin == 1 && !value) PORTD &= ~(1 << (1));
else if(pin == 2 && value) PORTD |= (1 << (2));
else if(pin == 2 && !value) PORTD &= ~(1 << (2));
else if(pin == 3 && value) PORTD |= (1 << (3));
else if(pin == 3 && !value) PORTD &= ~(1 << (3));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTD |= (1 << (5));
else if(pin == 5 && !value) PORTD &= ~(1 << (5));
else if(pin == 6 && value) PORTD |= (1 << (6));
else if(pin == 6 && !value) PORTD &= ~(1 << (6));
else if(pin == 7 && value) PORTD |= (1 << (7));
else if(pin == 7 && !value) PORTD &= ~(1 << (7));
else if(pin == 8 && value) PORTB |= (1 << (0));
else if(pin == 8 && !value) PORTB &= ~(1 << (0));
else if(pin == 9 && value) PORTB |= (1 << (1));
else if(pin == 9 && !value) PORTB &= ~(1 << (1));
else if(pin == 10 && value) PORTB |= (1 << (2));
else if(pin == 10 && !value) PORTB &= ~(1 << (2));
else if(pin == 11 && value) PORTB |= (1 << (3));
else if(pin == 11 && !value) PORTB &= ~(1 << (3));
else if(pin == 12 && value) PORTB |= (1 << (4));
else if(pin == 12 && !value) PORTB &= ~(1 << (4));
else if(pin == 13 && value) PORTB |= (1 << (5));
else if(pin == 13 && !value) PORTB &= ~(1 << (5));
else if(pin == 14 && value) PORTC |= (1 << (0));
else if(pin == 14 && !value) PORTC &= ~(1 << (0));
else if(pin == 15 && value) PORTC |= (1 << (1));
else if(pin == 15 && !value) PORTC &= ~(1 << (1));
else if(pin == 16 && value) PORTC |= (1 << (2));
else if(pin == 16 && !value) PORTC &= ~(1 << (2));
else if(pin == 17 && value) PORTC |= (1 << (3));
else if(pin == 17 && !value) PORTC &= ~(1 << (3));
else if(pin == 18 && value) PORTC |= (1 << (4));
else if(pin == 18 && !value) PORTC &= ~(1 << (4));
else if(pin == 19 && value) PORTC |= (1 << (5));
else if(pin == 19 && !value) PORTC &= ~(1 << (5));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PIND & (1 << (5)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 7) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 14) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 15) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 18) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 19) return PINC & (1 << (5)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR2A &= ~_BV(COM2B1);
else if(pin == 5) TCCR0A &= ~_BV(COM0B1);
else if(pin == 6) TCCR0A &= ~_BV(COM0A1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR2A &= ~_BV(COM2A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRD);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRD);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRC);
if(pin == 15)
return _SFR_IO_REG_P(DDRC);
if(pin == 16)
return _SFR_IO_REG_P(DDRC);
if(pin == 17)
return _SFR_IO_REG_P(DDRC);
if(pin == 18)
return _SFR_IO_REG_P(DDRC);
if(pin == 19)
return _SFR_IO_REG_P(DDRC);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTD);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTD);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTC);
if(pin == 15)
return _SFR_IO_REG_P(PORTC);
if(pin == 16)
return _SFR_IO_REG_P(PORTC);
if(pin == 17)
return _SFR_IO_REG_P(PORTC);
if(pin == 18)
return _SFR_IO_REG_P(PORTC);
if(pin == 19)
return _SFR_IO_REG_P(PORTC);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PIND);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PIND);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINC);
if(pin == 15)
return _SFR_IO_REG_P(PINC);
if(pin == 16)
return _SFR_IO_REG_P(PINC);
if(pin == 17)
return _SFR_IO_REG_P(PINC);
if(pin == 18)
return _SFR_IO_REG_P(PINC);
if(pin == 19)
return _SFR_IO_REG_P(PINC);
return false;
}
#endif
/* Arduino board:
* mega2560
* Arduino Mega 2560 or Mega ADK
* MCU: atmega2560
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 16 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x98 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRE &= ~(1 << (0));
PORTE &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (0));
PORTE |= (1 << (0));
} else if(pin == 0) DDRE |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRE &= ~(1 << (1));
PORTE &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (1));
PORTE |= (1 << (1));
} else if(pin == 1) DDRE |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRE &= ~(1 << (4));
PORTE &= ~(1 << (4));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (4));
PORTE |= (1 << (4));
} else if(pin == 2) DDRE |= (1 << (4));
else if(pin == 3 && mode == INPUT) {
DDRE &= ~(1 << (5));
PORTE &= ~(1 << (5));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (5));
PORTE |= (1 << (5));
} else if(pin == 3) DDRE |= (1 << (5));
else if(pin == 4 && mode == INPUT) {
DDRG &= ~(1 << (5));
PORTG &= ~(1 << (5));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRG &= ~(1 << (5));
PORTG |= (1 << (5));
} else if(pin == 4) DDRG |= (1 << (5));
else if(pin == 5 && mode == INPUT) {
DDRE &= ~(1 << (3));
PORTE &= ~(1 << (3));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (3));
PORTE |= (1 << (3));
} else if(pin == 5) DDRE |= (1 << (3));
else if(pin == 6 && mode == INPUT) {
DDRH &= ~(1 << (3));
PORTH &= ~(1 << (3));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (3));
PORTH |= (1 << (3));
} else if(pin == 6) DDRH |= (1 << (3));
else if(pin == 7 && mode == INPUT) {
DDRH &= ~(1 << (4));
PORTH &= ~(1 << (4));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (4));
PORTH |= (1 << (4));
} else if(pin == 7) DDRH |= (1 << (4));
else if(pin == 8 && mode == INPUT) {
DDRH &= ~(1 << (5));
PORTH &= ~(1 << (5));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (5));
PORTH |= (1 << (5));
} else if(pin == 8) DDRH |= (1 << (5));
else if(pin == 9 && mode == INPUT) {
DDRH &= ~(1 << (6));
PORTH &= ~(1 << (6));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (6));
PORTH |= (1 << (6));
} else if(pin == 9) DDRH |= (1 << (6));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 10) DDRB |= (1 << (4));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 11) DDRB |= (1 << (5));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 12) DDRB |= (1 << (6));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (7));
PORTB &= ~(1 << (7));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (7));
PORTB |= (1 << (7));
} else if(pin == 13) DDRB |= (1 << (7));
else if(pin == 14 && mode == INPUT) {
DDRJ &= ~(1 << (1));
PORTJ &= ~(1 << (1));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRJ &= ~(1 << (1));
PORTJ |= (1 << (1));
} else if(pin == 14) DDRJ |= (1 << (1));
else if(pin == 15 && mode == INPUT) {
DDRJ &= ~(1 << (0));
PORTJ &= ~(1 << (0));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRJ &= ~(1 << (0));
PORTJ |= (1 << (0));
} else if(pin == 15) DDRJ |= (1 << (0));
else if(pin == 16 && mode == INPUT) {
DDRH &= ~(1 << (1));
PORTH &= ~(1 << (1));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (1));
PORTH |= (1 << (1));
} else if(pin == 16) DDRH |= (1 << (1));
else if(pin == 17 && mode == INPUT) {
DDRH &= ~(1 << (0));
PORTH &= ~(1 << (0));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (0));
PORTH |= (1 << (0));
} else if(pin == 17) DDRH |= (1 << (0));
else if(pin == 18 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 18) DDRD |= (1 << (3));
else if(pin == 19 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 19) DDRD |= (1 << (2));
else if(pin == 20 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 20 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 20) DDRD |= (1 << (1));
else if(pin == 21 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 21 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 21) DDRD |= (1 << (0));
else if(pin == 22 && mode == INPUT) {
DDRA &= ~(1 << (0));
PORTA &= ~(1 << (0));
} else if(pin == 22 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (0));
PORTA |= (1 << (0));
} else if(pin == 22) DDRA |= (1 << (0));
else if(pin == 23 && mode == INPUT) {
DDRA &= ~(1 << (1));
PORTA &= ~(1 << (1));
} else if(pin == 23 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (1));
PORTA |= (1 << (1));
} else if(pin == 23) DDRA |= (1 << (1));
else if(pin == 24 && mode == INPUT) {
DDRA &= ~(1 << (2));
PORTA &= ~(1 << (2));
} else if(pin == 24 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (2));
PORTA |= (1 << (2));
} else if(pin == 24) DDRA |= (1 << (2));
else if(pin == 25 && mode == INPUT) {
DDRA &= ~(1 << (3));
PORTA &= ~(1 << (3));
} else if(pin == 25 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (3));
PORTA |= (1 << (3));
} else if(pin == 25) DDRA |= (1 << (3));
else if(pin == 26 && mode == INPUT) {
DDRA &= ~(1 << (4));
PORTA &= ~(1 << (4));
} else if(pin == 26 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (4));
PORTA |= (1 << (4));
} else if(pin == 26) DDRA |= (1 << (4));
else if(pin == 27 && mode == INPUT) {
DDRA &= ~(1 << (5));
PORTA &= ~(1 << (5));
} else if(pin == 27 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (5));
PORTA |= (1 << (5));
} else if(pin == 27) DDRA |= (1 << (5));
else if(pin == 28 && mode == INPUT) {
DDRA &= ~(1 << (6));
PORTA &= ~(1 << (6));
} else if(pin == 28 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (6));
PORTA |= (1 << (6));
} else if(pin == 28) DDRA |= (1 << (6));
else if(pin == 29 && mode == INPUT) {
DDRA &= ~(1 << (7));
PORTA &= ~(1 << (7));
} else if(pin == 29 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (7));
PORTA |= (1 << (7));
} else if(pin == 29) DDRA |= (1 << (7));
else if(pin == 30 && mode == INPUT) {
DDRC &= ~(1 << (7));
PORTC &= ~(1 << (7));
} else if(pin == 30 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (7));
PORTC |= (1 << (7));
} else if(pin == 30) DDRC |= (1 << (7));
else if(pin == 31 && mode == INPUT) {
DDRC &= ~(1 << (6));
PORTC &= ~(1 << (6));
} else if(pin == 31 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (6));
PORTC |= (1 << (6));
} else if(pin == 31) DDRC |= (1 << (6));
else if(pin == 32 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 32 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 32) DDRC |= (1 << (5));
else if(pin == 33 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 33 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 33) DDRC |= (1 << (4));
else if(pin == 34 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 34 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 34) DDRC |= (1 << (3));
else if(pin == 35 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 35 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 35) DDRC |= (1 << (2));
else if(pin == 36 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 36 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 36) DDRC |= (1 << (1));
else if(pin == 37 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 37 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 37) DDRC |= (1 << (0));
else if(pin == 38 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 38 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 38) DDRD |= (1 << (7));
else if(pin == 39 && mode == INPUT) {
DDRG &= ~(1 << (2));
PORTG &= ~(1 << (2));
} else if(pin == 39 && mode == INPUT_PULLUP) {
DDRG &= ~(1 << (2));
PORTG |= (1 << (2));
} else if(pin == 39) DDRG |= (1 << (2));
else if(pin == 40 && mode == INPUT) {
DDRG &= ~(1 << (1));
PORTG &= ~(1 << (1));
} else if(pin == 40 && mode == INPUT_PULLUP) {
DDRG &= ~(1 << (1));
PORTG |= (1 << (1));
} else if(pin == 40) DDRG |= (1 << (1));
else if(pin == 41 && mode == INPUT) {
DDRG &= ~(1 << (0));
PORTG &= ~(1 << (0));
} else if(pin == 41 && mode == INPUT_PULLUP) {
DDRG &= ~(1 << (0));
PORTG |= (1 << (0));
} else if(pin == 41) DDRG |= (1 << (0));
else if(pin == 42 && mode == INPUT) {
DDRL &= ~(1 << (7));
PORTL &= ~(1 << (7));
} else if(pin == 42 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (7));
PORTL |= (1 << (7));
} else if(pin == 42) DDRL |= (1 << (7));
else if(pin == 43 && mode == INPUT) {
DDRL &= ~(1 << (6));
PORTL &= ~(1 << (6));
} else if(pin == 43 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (6));
PORTL |= (1 << (6));
} else if(pin == 43) DDRL |= (1 << (6));
else if(pin == 44 && mode == INPUT) {
DDRL &= ~(1 << (5));
PORTL &= ~(1 << (5));
} else if(pin == 44 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (5));
PORTL |= (1 << (5));
} else if(pin == 44) DDRL |= (1 << (5));
else if(pin == 45 && mode == INPUT) {
DDRL &= ~(1 << (4));
PORTL &= ~(1 << (4));
} else if(pin == 45 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (4));
PORTL |= (1 << (4));
} else if(pin == 45) DDRL |= (1 << (4));
else if(pin == 46 && mode == INPUT) {
DDRL &= ~(1 << (3));
PORTL &= ~(1 << (3));
} else if(pin == 46 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (3));
PORTL |= (1 << (3));
} else if(pin == 46) DDRL |= (1 << (3));
else if(pin == 47 && mode == INPUT) {
DDRL &= ~(1 << (2));
PORTL &= ~(1 << (2));
} else if(pin == 47 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (2));
PORTL |= (1 << (2));
} else if(pin == 47) DDRL |= (1 << (2));
else if(pin == 48 && mode == INPUT) {
DDRL &= ~(1 << (1));
PORTL &= ~(1 << (1));
} else if(pin == 48 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (1));
PORTL |= (1 << (1));
} else if(pin == 48) DDRL |= (1 << (1));
else if(pin == 49 && mode == INPUT) {
DDRL &= ~(1 << (0));
PORTL &= ~(1 << (0));
} else if(pin == 49 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (0));
PORTL |= (1 << (0));
} else if(pin == 49) DDRL |= (1 << (0));
else if(pin == 50 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 50 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 50) DDRB |= (1 << (3));
else if(pin == 51 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 51 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 51) DDRB |= (1 << (2));
else if(pin == 52 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 52 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 52) DDRB |= (1 << (1));
else if(pin == 53 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 53 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 53) DDRB |= (1 << (0));
else if(pin == 54 && mode == INPUT) {
DDRF &= ~(1 << (0));
PORTF &= ~(1 << (0));
} else if(pin == 54 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (0));
PORTF |= (1 << (0));
} else if(pin == 54) DDRF |= (1 << (0));
else if(pin == 55 && mode == INPUT) {
DDRF &= ~(1 << (1));
PORTF &= ~(1 << (1));
} else if(pin == 55 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (1));
PORTF |= (1 << (1));
} else if(pin == 55) DDRF |= (1 << (1));
else if(pin == 56 && mode == INPUT) {
DDRF &= ~(1 << (2));
PORTF &= ~(1 << (2));
} else if(pin == 56 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (2));
PORTF |= (1 << (2));
} else if(pin == 56) DDRF |= (1 << (2));
else if(pin == 57 && mode == INPUT) {
DDRF &= ~(1 << (3));
PORTF &= ~(1 << (3));
} else if(pin == 57 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (3));
PORTF |= (1 << (3));
} else if(pin == 57) DDRF |= (1 << (3));
else if(pin == 58 && mode == INPUT) {
DDRF &= ~(1 << (4));
PORTF &= ~(1 << (4));
} else if(pin == 58 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (4));
PORTF |= (1 << (4));
} else if(pin == 58) DDRF |= (1 << (4));
else if(pin == 59 && mode == INPUT) {
DDRF &= ~(1 << (5));
PORTF &= ~(1 << (5));
} else if(pin == 59 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (5));
PORTF |= (1 << (5));
} else if(pin == 59) DDRF |= (1 << (5));
else if(pin == 60 && mode == INPUT) {
DDRF &= ~(1 << (6));
PORTF &= ~(1 << (6));
} else if(pin == 60 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (6));
PORTF |= (1 << (6));
} else if(pin == 60) DDRF |= (1 << (6));
else if(pin == 61 && mode == INPUT) {
DDRF &= ~(1 << (7));
PORTF &= ~(1 << (7));
} else if(pin == 61 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (7));
PORTF |= (1 << (7));
} else if(pin == 61) DDRF |= (1 << (7));
else if(pin == 62 && mode == INPUT) {
DDRK &= ~(1 << (0));
PORTK &= ~(1 << (0));
} else if(pin == 62 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (0));
PORTK |= (1 << (0));
} else if(pin == 62) DDRK |= (1 << (0));
else if(pin == 63 && mode == INPUT) {
DDRK &= ~(1 << (1));
PORTK &= ~(1 << (1));
} else if(pin == 63 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (1));
PORTK |= (1 << (1));
} else if(pin == 63) DDRK |= (1 << (1));
else if(pin == 64 && mode == INPUT) {
DDRK &= ~(1 << (2));
PORTK &= ~(1 << (2));
} else if(pin == 64 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (2));
PORTK |= (1 << (2));
} else if(pin == 64) DDRK |= (1 << (2));
else if(pin == 65 && mode == INPUT) {
DDRK &= ~(1 << (3));
PORTK &= ~(1 << (3));
} else if(pin == 65 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (3));
PORTK |= (1 << (3));
} else if(pin == 65) DDRK |= (1 << (3));
else if(pin == 66 && mode == INPUT) {
DDRK &= ~(1 << (4));
PORTK &= ~(1 << (4));
} else if(pin == 66 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (4));
PORTK |= (1 << (4));
} else if(pin == 66) DDRK |= (1 << (4));
else if(pin == 67 && mode == INPUT) {
DDRK &= ~(1 << (5));
PORTK &= ~(1 << (5));
} else if(pin == 67 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (5));
PORTK |= (1 << (5));
} else if(pin == 67) DDRK |= (1 << (5));
else if(pin == 68 && mode == INPUT) {
DDRK &= ~(1 << (6));
PORTK &= ~(1 << (6));
} else if(pin == 68 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (6));
PORTK |= (1 << (6));
} else if(pin == 68) DDRK |= (1 << (6));
else if(pin == 69 && mode == INPUT) {
DDRK &= ~(1 << (7));
PORTK &= ~(1 << (7));
} else if(pin == 69 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (7));
PORTK |= (1 << (7));
} else if(pin == 69) DDRK |= (1 << (7));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTE |= (1 << (0));
else if(pin == 0 && !value) PORTE &= ~(1 << (0));
else if(pin == 1 && value) PORTE |= (1 << (1));
else if(pin == 1 && !value) PORTE &= ~(1 << (1));
else if(pin == 2 && value) PORTE |= (1 << (4));
else if(pin == 2 && !value) PORTE &= ~(1 << (4));
else if(pin == 3 && value) PORTE |= (1 << (5));
else if(pin == 3 && !value) PORTE &= ~(1 << (5));
else if(pin == 4 && value) PORTG |= (1 << (5));
else if(pin == 4 && !value) PORTG &= ~(1 << (5));
else if(pin == 5 && value) PORTE |= (1 << (3));
else if(pin == 5 && !value) PORTE &= ~(1 << (3));
else if(pin == 6 && value) PORTH |= (1 << (3));
else if(pin == 6 && !value) PORTH &= ~(1 << (3));
else if(pin == 7 && value) PORTH |= (1 << (4));
else if(pin == 7 && !value) PORTH &= ~(1 << (4));
else if(pin == 8 && value) PORTH |= (1 << (5));
else if(pin == 8 && !value) PORTH &= ~(1 << (5));
else if(pin == 9 && value) PORTH |= (1 << (6));
else if(pin == 9 && !value) PORTH &= ~(1 << (6));
else if(pin == 10 && value) PORTB |= (1 << (4));
else if(pin == 10 && !value) PORTB &= ~(1 << (4));
else if(pin == 11 && value) PORTB |= (1 << (5));
else if(pin == 11 && !value) PORTB &= ~(1 << (5));
else if(pin == 12 && value) PORTB |= (1 << (6));
else if(pin == 12 && !value) PORTB &= ~(1 << (6));
else if(pin == 13 && value) PORTB |= (1 << (7));
else if(pin == 13 && !value) PORTB &= ~(1 << (7));
else if(pin == 14 && value) PORTJ |= (1 << (1));
else if(pin == 14 && !value) PORTJ &= ~(1 << (1));
else if(pin == 15 && value) PORTJ |= (1 << (0));
else if(pin == 15 && !value) PORTJ &= ~(1 << (0));
else if(pin == 16 && value) PORTH |= (1 << (1));
else if(pin == 16 && !value) PORTH &= ~(1 << (1));
else if(pin == 17 && value) PORTH |= (1 << (0));
else if(pin == 17 && !value) PORTH &= ~(1 << (0));
else if(pin == 18 && value) PORTD |= (1 << (3));
else if(pin == 18 && !value) PORTD &= ~(1 << (3));
else if(pin == 19 && value) PORTD |= (1 << (2));
else if(pin == 19 && !value) PORTD &= ~(1 << (2));
else if(pin == 20 && value) PORTD |= (1 << (1));
else if(pin == 20 && !value) PORTD &= ~(1 << (1));
else if(pin == 21 && value) PORTD |= (1 << (0));
else if(pin == 21 && !value) PORTD &= ~(1 << (0));
else if(pin == 22 && value) PORTA |= (1 << (0));
else if(pin == 22 && !value) PORTA &= ~(1 << (0));
else if(pin == 23 && value) PORTA |= (1 << (1));
else if(pin == 23 && !value) PORTA &= ~(1 << (1));
else if(pin == 24 && value) PORTA |= (1 << (2));
else if(pin == 24 && !value) PORTA &= ~(1 << (2));
else if(pin == 25 && value) PORTA |= (1 << (3));
else if(pin == 25 && !value) PORTA &= ~(1 << (3));
else if(pin == 26 && value) PORTA |= (1 << (4));
else if(pin == 26 && !value) PORTA &= ~(1 << (4));
else if(pin == 27 && value) PORTA |= (1 << (5));
else if(pin == 27 && !value) PORTA &= ~(1 << (5));
else if(pin == 28 && value) PORTA |= (1 << (6));
else if(pin == 28 && !value) PORTA &= ~(1 << (6));
else if(pin == 29 && value) PORTA |= (1 << (7));
else if(pin == 29 && !value) PORTA &= ~(1 << (7));
else if(pin == 30 && value) PORTC |= (1 << (7));
else if(pin == 30 && !value) PORTC &= ~(1 << (7));
else if(pin == 31 && value) PORTC |= (1 << (6));
else if(pin == 31 && !value) PORTC &= ~(1 << (6));
else if(pin == 32 && value) PORTC |= (1 << (5));
else if(pin == 32 && !value) PORTC &= ~(1 << (5));
else if(pin == 33 && value) PORTC |= (1 << (4));
else if(pin == 33 && !value) PORTC &= ~(1 << (4));
else if(pin == 34 && value) PORTC |= (1 << (3));
else if(pin == 34 && !value) PORTC &= ~(1 << (3));
else if(pin == 35 && value) PORTC |= (1 << (2));
else if(pin == 35 && !value) PORTC &= ~(1 << (2));
else if(pin == 36 && value) PORTC |= (1 << (1));
else if(pin == 36 && !value) PORTC &= ~(1 << (1));
else if(pin == 37 && value) PORTC |= (1 << (0));
else if(pin == 37 && !value) PORTC &= ~(1 << (0));
else if(pin == 38 && value) PORTD |= (1 << (7));
else if(pin == 38 && !value) PORTD &= ~(1 << (7));
else if(pin == 39 && value) PORTG |= (1 << (2));
else if(pin == 39 && !value) PORTG &= ~(1 << (2));
else if(pin == 40 && value) PORTG |= (1 << (1));
else if(pin == 40 && !value) PORTG &= ~(1 << (1));
else if(pin == 41 && value) PORTG |= (1 << (0));
else if(pin == 41 && !value) PORTG &= ~(1 << (0));
else if(pin == 42 && value) PORTL |= (1 << (7));
else if(pin == 42 && !value) PORTL &= ~(1 << (7));
else if(pin == 43 && value) PORTL |= (1 << (6));
else if(pin == 43 && !value) PORTL &= ~(1 << (6));
else if(pin == 44 && value) PORTL |= (1 << (5));
else if(pin == 44 && !value) PORTL &= ~(1 << (5));
else if(pin == 45 && value) PORTL |= (1 << (4));
else if(pin == 45 && !value) PORTL &= ~(1 << (4));
else if(pin == 46 && value) PORTL |= (1 << (3));
else if(pin == 46 && !value) PORTL &= ~(1 << (3));
else if(pin == 47 && value) PORTL |= (1 << (2));
else if(pin == 47 && !value) PORTL &= ~(1 << (2));
else if(pin == 48 && value) PORTL |= (1 << (1));
else if(pin == 48 && !value) PORTL &= ~(1 << (1));
else if(pin == 49 && value) PORTL |= (1 << (0));
else if(pin == 49 && !value) PORTL &= ~(1 << (0));
else if(pin == 50 && value) PORTB |= (1 << (3));
else if(pin == 50 && !value) PORTB &= ~(1 << (3));
else if(pin == 51 && value) PORTB |= (1 << (2));
else if(pin == 51 && !value) PORTB &= ~(1 << (2));
else if(pin == 52 && value) PORTB |= (1 << (1));
else if(pin == 52 && !value) PORTB &= ~(1 << (1));
else if(pin == 53 && value) PORTB |= (1 << (0));
else if(pin == 53 && !value) PORTB &= ~(1 << (0));
else if(pin == 54 && value) PORTF |= (1 << (0));
else if(pin == 54 && !value) PORTF &= ~(1 << (0));
else if(pin == 55 && value) PORTF |= (1 << (1));
else if(pin == 55 && !value) PORTF &= ~(1 << (1));
else if(pin == 56 && value) PORTF |= (1 << (2));
else if(pin == 56 && !value) PORTF &= ~(1 << (2));
else if(pin == 57 && value) PORTF |= (1 << (3));
else if(pin == 57 && !value) PORTF &= ~(1 << (3));
else if(pin == 58 && value) PORTF |= (1 << (4));
else if(pin == 58 && !value) PORTF &= ~(1 << (4));
else if(pin == 59 && value) PORTF |= (1 << (5));
else if(pin == 59 && !value) PORTF &= ~(1 << (5));
else if(pin == 60 && value) PORTF |= (1 << (6));
else if(pin == 60 && !value) PORTF &= ~(1 << (6));
else if(pin == 61 && value) PORTF |= (1 << (7));
else if(pin == 61 && !value) PORTF &= ~(1 << (7));
else if(pin == 62 && value) PORTK |= (1 << (0));
else if(pin == 62 && !value) PORTK &= ~(1 << (0));
else if(pin == 63 && value) PORTK |= (1 << (1));
else if(pin == 63 && !value) PORTK &= ~(1 << (1));
else if(pin == 64 && value) PORTK |= (1 << (2));
else if(pin == 64 && !value) PORTK &= ~(1 << (2));
else if(pin == 65 && value) PORTK |= (1 << (3));
else if(pin == 65 && !value) PORTK &= ~(1 << (3));
else if(pin == 66 && value) PORTK |= (1 << (4));
else if(pin == 66 && !value) PORTK &= ~(1 << (4));
else if(pin == 67 && value) PORTK |= (1 << (5));
else if(pin == 67 && !value) PORTK &= ~(1 << (5));
else if(pin == 68 && value) PORTK |= (1 << (6));
else if(pin == 68 && !value) PORTK &= ~(1 << (6));
else if(pin == 69 && value) PORTK |= (1 << (7));
else if(pin == 69 && !value) PORTK &= ~(1 << (7));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PINE & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PINE & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PINE & (1 << (4)) ? HIGH : LOW;
else if(pin == 3) return PINE & (1 << (5)) ? HIGH : LOW;
else if(pin == 4) return PING & (1 << (5)) ? HIGH : LOW;
else if(pin == 5) return PINE & (1 << (3)) ? HIGH : LOW;
else if(pin == 6) return PINH & (1 << (3)) ? HIGH : LOW;
else if(pin == 7) return PINH & (1 << (4)) ? HIGH : LOW;
else if(pin == 8) return PINH & (1 << (5)) ? HIGH : LOW;
else if(pin == 9) return PINH & (1 << (6)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (7)) ? HIGH : LOW;
else if(pin == 14) return PINJ & (1 << (1)) ? HIGH : LOW;
else if(pin == 15) return PINJ & (1 << (0)) ? HIGH : LOW;
else if(pin == 16) return PINH & (1 << (1)) ? HIGH : LOW;
else if(pin == 17) return PINH & (1 << (0)) ? HIGH : LOW;
else if(pin == 18) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 19) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 20) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 21) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 22) return PINA & (1 << (0)) ? HIGH : LOW;
else if(pin == 23) return PINA & (1 << (1)) ? HIGH : LOW;
else if(pin == 24) return PINA & (1 << (2)) ? HIGH : LOW;
else if(pin == 25) return PINA & (1 << (3)) ? HIGH : LOW;
else if(pin == 26) return PINA & (1 << (4)) ? HIGH : LOW;
else if(pin == 27) return PINA & (1 << (5)) ? HIGH : LOW;
else if(pin == 28) return PINA & (1 << (6)) ? HIGH : LOW;
else if(pin == 29) return PINA & (1 << (7)) ? HIGH : LOW;
else if(pin == 30) return PINC & (1 << (7)) ? HIGH : LOW;
else if(pin == 31) return PINC & (1 << (6)) ? HIGH : LOW;
else if(pin == 32) return PINC & (1 << (5)) ? HIGH : LOW;
else if(pin == 33) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 34) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 35) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 36) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 37) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 38) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 39) return PING & (1 << (2)) ? HIGH : LOW;
else if(pin == 40) return PING & (1 << (1)) ? HIGH : LOW;
else if(pin == 41) return PING & (1 << (0)) ? HIGH : LOW;
else if(pin == 42) return PINL & (1 << (7)) ? HIGH : LOW;
else if(pin == 43) return PINL & (1 << (6)) ? HIGH : LOW;
else if(pin == 44) return PINL & (1 << (5)) ? HIGH : LOW;
else if(pin == 45) return PINL & (1 << (4)) ? HIGH : LOW;
else if(pin == 46) return PINL & (1 << (3)) ? HIGH : LOW;
else if(pin == 47) return PINL & (1 << (2)) ? HIGH : LOW;
else if(pin == 48) return PINL & (1 << (1)) ? HIGH : LOW;
else if(pin == 49) return PINL & (1 << (0)) ? HIGH : LOW;
else if(pin == 50) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 51) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 52) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 53) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 54) return PINF & (1 << (0)) ? HIGH : LOW;
else if(pin == 55) return PINF & (1 << (1)) ? HIGH : LOW;
else if(pin == 56) return PINF & (1 << (2)) ? HIGH : LOW;
else if(pin == 57) return PINF & (1 << (3)) ? HIGH : LOW;
else if(pin == 58) return PINF & (1 << (4)) ? HIGH : LOW;
else if(pin == 59) return PINF & (1 << (5)) ? HIGH : LOW;
else if(pin == 60) return PINF & (1 << (6)) ? HIGH : LOW;
else if(pin == 61) return PINF & (1 << (7)) ? HIGH : LOW;
else if(pin == 62) return PINK & (1 << (0)) ? HIGH : LOW;
else if(pin == 63) return PINK & (1 << (1)) ? HIGH : LOW;
else if(pin == 64) return PINK & (1 << (2)) ? HIGH : LOW;
else if(pin == 65) return PINK & (1 << (3)) ? HIGH : LOW;
else if(pin == 66) return PINK & (1 << (4)) ? HIGH : LOW;
else if(pin == 67) return PINK & (1 << (5)) ? HIGH : LOW;
else if(pin == 68) return PINK & (1 << (6)) ? HIGH : LOW;
else if(pin == 69) return PINK & (1 << (7)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 2) TCCR3A &= ~_BV(COM3B1);
else if(pin == 3) TCCR3A &= ~_BV(COM3C1);
else if(pin == 4) TCCR0A &= ~_BV(COM0B1);
else if(pin == 5) TCCR3A &= ~_BV(COM3A1);
else if(pin == 6) TCCR4A &= ~_BV(COM4A1);
else if(pin == 7) TCCR4A &= ~_BV(COM4B1);
else if(pin == 8) TCCR4A &= ~_BV(COM4C1);
else if(pin == 9) TCCR2A &= ~_BV(COM2B1);
else if(pin == 10) TCCR2A &= ~_BV(COM2A1);
else if(pin == 11) TCCR1A &= ~_BV(COM1A1);
else if(pin == 12) TCCR1A &= ~_BV(COM1B1);
else if(pin == 13) TCCR0A &= ~_BV(COM0A1);
else if(pin == 44) TCCR5A &= ~_BV(COM5C1);
else if(pin == 45) TCCR5A &= ~_BV(COM5B1);
else if(pin == 46) TCCR5A &= ~_BV(COM5A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 2)
return true;
if(pin == 3)
return true;
if(pin == 4)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 7)
return true;
if(pin == 8)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
if(pin == 12)
return true;
if(pin == 13)
return true;
if(pin == 44)
return true;
if(pin == 45)
return true;
if(pin == 46)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRE);
if(pin == 1)
return _SFR_IO_REG_P(DDRE);
if(pin == 2)
return _SFR_IO_REG_P(DDRE);
if(pin == 3)
return _SFR_IO_REG_P(DDRE);
if(pin == 4)
return _SFR_IO_REG_P(DDRG);
if(pin == 5)
return _SFR_IO_REG_P(DDRE);
if(pin == 6)
return _SFR_IO_REG_P(DDRH);
if(pin == 7)
return _SFR_IO_REG_P(DDRH);
if(pin == 8)
return _SFR_IO_REG_P(DDRH);
if(pin == 9)
return _SFR_IO_REG_P(DDRH);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRJ);
if(pin == 15)
return _SFR_IO_REG_P(DDRJ);
if(pin == 16)
return _SFR_IO_REG_P(DDRH);
if(pin == 17)
return _SFR_IO_REG_P(DDRH);
if(pin == 18)
return _SFR_IO_REG_P(DDRD);
if(pin == 19)
return _SFR_IO_REG_P(DDRD);
if(pin == 20)
return _SFR_IO_REG_P(DDRD);
if(pin == 21)
return _SFR_IO_REG_P(DDRD);
if(pin == 22)
return _SFR_IO_REG_P(DDRA);
if(pin == 23)
return _SFR_IO_REG_P(DDRA);
if(pin == 24)
return _SFR_IO_REG_P(DDRA);
if(pin == 25)
return _SFR_IO_REG_P(DDRA);
if(pin == 26)
return _SFR_IO_REG_P(DDRA);
if(pin == 27)
return _SFR_IO_REG_P(DDRA);
if(pin == 28)
return _SFR_IO_REG_P(DDRA);
if(pin == 29)
return _SFR_IO_REG_P(DDRA);
if(pin == 30)
return _SFR_IO_REG_P(DDRC);
if(pin == 31)
return _SFR_IO_REG_P(DDRC);
if(pin == 32)
return _SFR_IO_REG_P(DDRC);
if(pin == 33)
return _SFR_IO_REG_P(DDRC);
if(pin == 34)
return _SFR_IO_REG_P(DDRC);
if(pin == 35)
return _SFR_IO_REG_P(DDRC);
if(pin == 36)
return _SFR_IO_REG_P(DDRC);
if(pin == 37)
return _SFR_IO_REG_P(DDRC);
if(pin == 38)
return _SFR_IO_REG_P(DDRD);
if(pin == 39)
return _SFR_IO_REG_P(DDRG);
if(pin == 40)
return _SFR_IO_REG_P(DDRG);
if(pin == 41)
return _SFR_IO_REG_P(DDRG);
if(pin == 42)
return _SFR_IO_REG_P(DDRL);
if(pin == 43)
return _SFR_IO_REG_P(DDRL);
if(pin == 44)
return _SFR_IO_REG_P(DDRL);
if(pin == 45)
return _SFR_IO_REG_P(DDRL);
if(pin == 46)
return _SFR_IO_REG_P(DDRL);
if(pin == 47)
return _SFR_IO_REG_P(DDRL);
if(pin == 48)
return _SFR_IO_REG_P(DDRL);
if(pin == 49)
return _SFR_IO_REG_P(DDRL);
if(pin == 50)
return _SFR_IO_REG_P(DDRB);
if(pin == 51)
return _SFR_IO_REG_P(DDRB);
if(pin == 52)
return _SFR_IO_REG_P(DDRB);
if(pin == 53)
return _SFR_IO_REG_P(DDRB);
if(pin == 54)
return _SFR_IO_REG_P(DDRF);
if(pin == 55)
return _SFR_IO_REG_P(DDRF);
if(pin == 56)
return _SFR_IO_REG_P(DDRF);
if(pin == 57)
return _SFR_IO_REG_P(DDRF);
if(pin == 58)
return _SFR_IO_REG_P(DDRF);
if(pin == 59)
return _SFR_IO_REG_P(DDRF);
if(pin == 60)
return _SFR_IO_REG_P(DDRF);
if(pin == 61)
return _SFR_IO_REG_P(DDRF);
if(pin == 62)
return _SFR_IO_REG_P(DDRK);
if(pin == 63)
return _SFR_IO_REG_P(DDRK);
if(pin == 64)
return _SFR_IO_REG_P(DDRK);
if(pin == 65)
return _SFR_IO_REG_P(DDRK);
if(pin == 66)
return _SFR_IO_REG_P(DDRK);
if(pin == 67)
return _SFR_IO_REG_P(DDRK);
if(pin == 68)
return _SFR_IO_REG_P(DDRK);
if(pin == 69)
return _SFR_IO_REG_P(DDRK);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTE);
if(pin == 1)
return _SFR_IO_REG_P(PORTE);
if(pin == 2)
return _SFR_IO_REG_P(PORTE);
if(pin == 3)
return _SFR_IO_REG_P(PORTE);
if(pin == 4)
return _SFR_IO_REG_P(PORTG);
if(pin == 5)
return _SFR_IO_REG_P(PORTE);
if(pin == 6)
return _SFR_IO_REG_P(PORTH);
if(pin == 7)
return _SFR_IO_REG_P(PORTH);
if(pin == 8)
return _SFR_IO_REG_P(PORTH);
if(pin == 9)
return _SFR_IO_REG_P(PORTH);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTJ);
if(pin == 15)
return _SFR_IO_REG_P(PORTJ);
if(pin == 16)
return _SFR_IO_REG_P(PORTH);
if(pin == 17)
return _SFR_IO_REG_P(PORTH);
if(pin == 18)
return _SFR_IO_REG_P(PORTD);
if(pin == 19)
return _SFR_IO_REG_P(PORTD);
if(pin == 20)
return _SFR_IO_REG_P(PORTD);
if(pin == 21)
return _SFR_IO_REG_P(PORTD);
if(pin == 22)
return _SFR_IO_REG_P(PORTA);
if(pin == 23)
return _SFR_IO_REG_P(PORTA);
if(pin == 24)
return _SFR_IO_REG_P(PORTA);
if(pin == 25)
return _SFR_IO_REG_P(PORTA);
if(pin == 26)
return _SFR_IO_REG_P(PORTA);
if(pin == 27)
return _SFR_IO_REG_P(PORTA);
if(pin == 28)
return _SFR_IO_REG_P(PORTA);
if(pin == 29)
return _SFR_IO_REG_P(PORTA);
if(pin == 30)
return _SFR_IO_REG_P(PORTC);
if(pin == 31)
return _SFR_IO_REG_P(PORTC);
if(pin == 32)
return _SFR_IO_REG_P(PORTC);
if(pin == 33)
return _SFR_IO_REG_P(PORTC);
if(pin == 34)
return _SFR_IO_REG_P(PORTC);
if(pin == 35)
return _SFR_IO_REG_P(PORTC);
if(pin == 36)
return _SFR_IO_REG_P(PORTC);
if(pin == 37)
return _SFR_IO_REG_P(PORTC);
if(pin == 38)
return _SFR_IO_REG_P(PORTD);
if(pin == 39)
return _SFR_IO_REG_P(PORTG);
if(pin == 40)
return _SFR_IO_REG_P(PORTG);
if(pin == 41)
return _SFR_IO_REG_P(PORTG);
if(pin == 42)
return _SFR_IO_REG_P(PORTL);
if(pin == 43)
return _SFR_IO_REG_P(PORTL);
if(pin == 44)
return _SFR_IO_REG_P(PORTL);
if(pin == 45)
return _SFR_IO_REG_P(PORTL);
if(pin == 46)
return _SFR_IO_REG_P(PORTL);
if(pin == 47)
return _SFR_IO_REG_P(PORTL);
if(pin == 48)
return _SFR_IO_REG_P(PORTL);
if(pin == 49)
return _SFR_IO_REG_P(PORTL);
if(pin == 50)
return _SFR_IO_REG_P(PORTB);
if(pin == 51)
return _SFR_IO_REG_P(PORTB);
if(pin == 52)
return _SFR_IO_REG_P(PORTB);
if(pin == 53)
return _SFR_IO_REG_P(PORTB);
if(pin == 54)
return _SFR_IO_REG_P(PORTF);
if(pin == 55)
return _SFR_IO_REG_P(PORTF);
if(pin == 56)
return _SFR_IO_REG_P(PORTF);
if(pin == 57)
return _SFR_IO_REG_P(PORTF);
if(pin == 58)
return _SFR_IO_REG_P(PORTF);
if(pin == 59)
return _SFR_IO_REG_P(PORTF);
if(pin == 60)
return _SFR_IO_REG_P(PORTF);
if(pin == 61)
return _SFR_IO_REG_P(PORTF);
if(pin == 62)
return _SFR_IO_REG_P(PORTK);
if(pin == 63)
return _SFR_IO_REG_P(PORTK);
if(pin == 64)
return _SFR_IO_REG_P(PORTK);
if(pin == 65)
return _SFR_IO_REG_P(PORTK);
if(pin == 66)
return _SFR_IO_REG_P(PORTK);
if(pin == 67)
return _SFR_IO_REG_P(PORTK);
if(pin == 68)
return _SFR_IO_REG_P(PORTK);
if(pin == 69)
return _SFR_IO_REG_P(PORTK);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PINE);
if(pin == 1)
return _SFR_IO_REG_P(PINE);
if(pin == 2)
return _SFR_IO_REG_P(PINE);
if(pin == 3)
return _SFR_IO_REG_P(PINE);
if(pin == 4)
return _SFR_IO_REG_P(PING);
if(pin == 5)
return _SFR_IO_REG_P(PINE);
if(pin == 6)
return _SFR_IO_REG_P(PINH);
if(pin == 7)
return _SFR_IO_REG_P(PINH);
if(pin == 8)
return _SFR_IO_REG_P(PINH);
if(pin == 9)
return _SFR_IO_REG_P(PINH);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINJ);
if(pin == 15)
return _SFR_IO_REG_P(PINJ);
if(pin == 16)
return _SFR_IO_REG_P(PINH);
if(pin == 17)
return _SFR_IO_REG_P(PINH);
if(pin == 18)
return _SFR_IO_REG_P(PIND);
if(pin == 19)
return _SFR_IO_REG_P(PIND);
if(pin == 20)
return _SFR_IO_REG_P(PIND);
if(pin == 21)
return _SFR_IO_REG_P(PIND);
if(pin == 22)
return _SFR_IO_REG_P(PINA);
if(pin == 23)
return _SFR_IO_REG_P(PINA);
if(pin == 24)
return _SFR_IO_REG_P(PINA);
if(pin == 25)
return _SFR_IO_REG_P(PINA);
if(pin == 26)
return _SFR_IO_REG_P(PINA);
if(pin == 27)
return _SFR_IO_REG_P(PINA);
if(pin == 28)
return _SFR_IO_REG_P(PINA);
if(pin == 29)
return _SFR_IO_REG_P(PINA);
if(pin == 30)
return _SFR_IO_REG_P(PINC);
if(pin == 31)
return _SFR_IO_REG_P(PINC);
if(pin == 32)
return _SFR_IO_REG_P(PINC);
if(pin == 33)
return _SFR_IO_REG_P(PINC);
if(pin == 34)
return _SFR_IO_REG_P(PINC);
if(pin == 35)
return _SFR_IO_REG_P(PINC);
if(pin == 36)
return _SFR_IO_REG_P(PINC);
if(pin == 37)
return _SFR_IO_REG_P(PINC);
if(pin == 38)
return _SFR_IO_REG_P(PIND);
if(pin == 39)
return _SFR_IO_REG_P(PING);
if(pin == 40)
return _SFR_IO_REG_P(PING);
if(pin == 41)
return _SFR_IO_REG_P(PING);
if(pin == 42)
return _SFR_IO_REG_P(PINL);
if(pin == 43)
return _SFR_IO_REG_P(PINL);
if(pin == 44)
return _SFR_IO_REG_P(PINL);
if(pin == 45)
return _SFR_IO_REG_P(PINL);
if(pin == 46)
return _SFR_IO_REG_P(PINL);
if(pin == 47)
return _SFR_IO_REG_P(PINL);
if(pin == 48)
return _SFR_IO_REG_P(PINL);
if(pin == 49)
return _SFR_IO_REG_P(PINL);
if(pin == 50)
return _SFR_IO_REG_P(PINB);
if(pin == 51)
return _SFR_IO_REG_P(PINB);
if(pin == 52)
return _SFR_IO_REG_P(PINB);
if(pin == 53)
return _SFR_IO_REG_P(PINB);
if(pin == 54)
return _SFR_IO_REG_P(PINF);
if(pin == 55)
return _SFR_IO_REG_P(PINF);
if(pin == 56)
return _SFR_IO_REG_P(PINF);
if(pin == 57)
return _SFR_IO_REG_P(PINF);
if(pin == 58)
return _SFR_IO_REG_P(PINF);
if(pin == 59)
return _SFR_IO_REG_P(PINF);
if(pin == 60)
return _SFR_IO_REG_P(PINF);
if(pin == 61)
return _SFR_IO_REG_P(PINF);
if(pin == 62)
return _SFR_IO_REG_P(PINK);
if(pin == 63)
return _SFR_IO_REG_P(PINK);
if(pin == 64)
return _SFR_IO_REG_P(PINK);
if(pin == 65)
return _SFR_IO_REG_P(PINK);
if(pin == 66)
return _SFR_IO_REG_P(PINK);
if(pin == 67)
return _SFR_IO_REG_P(PINK);
if(pin == 68)
return _SFR_IO_REG_P(PINK);
if(pin == 69)
return _SFR_IO_REG_P(PINK);
return false;
}
#endif
/* Arduino board:
* pro5v328 | atmega328 | ethernet | uno
* Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 | Arduino Duemilanove w/ ATmega328 | Arduino Ethernet | Arduino Uno
* MCU: atmega328p
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 6 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x95 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 0) DDRD |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 1) DDRD |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 2) DDRD |= (1 << (2));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 3) DDRD |= (1 << (3));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRD &= ~(1 << (5));
PORTD &= ~(1 << (5));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (5));
PORTD |= (1 << (5));
} else if(pin == 5) DDRD |= (1 << (5));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 6) DDRD |= (1 << (6));
else if(pin == 7 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 7) DDRD |= (1 << (7));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 8) DDRB |= (1 << (0));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 9) DDRB |= (1 << (1));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 10) DDRB |= (1 << (2));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 11) DDRB |= (1 << (3));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 12) DDRB |= (1 << (4));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 13) DDRB |= (1 << (5));
else if(pin == 14 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 14) DDRC |= (1 << (0));
else if(pin == 15 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 15) DDRC |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 16) DDRC |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 17) DDRC |= (1 << (3));
else if(pin == 18 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 18) DDRC |= (1 << (4));
else if(pin == 19 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 19) DDRC |= (1 << (5));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (0));
else if(pin == 0 && !value) PORTD &= ~(1 << (0));
else if(pin == 1 && value) PORTD |= (1 << (1));
else if(pin == 1 && !value) PORTD &= ~(1 << (1));
else if(pin == 2 && value) PORTD |= (1 << (2));
else if(pin == 2 && !value) PORTD &= ~(1 << (2));
else if(pin == 3 && value) PORTD |= (1 << (3));
else if(pin == 3 && !value) PORTD &= ~(1 << (3));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTD |= (1 << (5));
else if(pin == 5 && !value) PORTD &= ~(1 << (5));
else if(pin == 6 && value) PORTD |= (1 << (6));
else if(pin == 6 && !value) PORTD &= ~(1 << (6));
else if(pin == 7 && value) PORTD |= (1 << (7));
else if(pin == 7 && !value) PORTD &= ~(1 << (7));
else if(pin == 8 && value) PORTB |= (1 << (0));
else if(pin == 8 && !value) PORTB &= ~(1 << (0));
else if(pin == 9 && value) PORTB |= (1 << (1));
else if(pin == 9 && !value) PORTB &= ~(1 << (1));
else if(pin == 10 && value) PORTB |= (1 << (2));
else if(pin == 10 && !value) PORTB &= ~(1 << (2));
else if(pin == 11 && value) PORTB |= (1 << (3));
else if(pin == 11 && !value) PORTB &= ~(1 << (3));
else if(pin == 12 && value) PORTB |= (1 << (4));
else if(pin == 12 && !value) PORTB &= ~(1 << (4));
else if(pin == 13 && value) PORTB |= (1 << (5));
else if(pin == 13 && !value) PORTB &= ~(1 << (5));
else if(pin == 14 && value) PORTC |= (1 << (0));
else if(pin == 14 && !value) PORTC &= ~(1 << (0));
else if(pin == 15 && value) PORTC |= (1 << (1));
else if(pin == 15 && !value) PORTC &= ~(1 << (1));
else if(pin == 16 && value) PORTC |= (1 << (2));
else if(pin == 16 && !value) PORTC &= ~(1 << (2));
else if(pin == 17 && value) PORTC |= (1 << (3));
else if(pin == 17 && !value) PORTC &= ~(1 << (3));
else if(pin == 18 && value) PORTC |= (1 << (4));
else if(pin == 18 && !value) PORTC &= ~(1 << (4));
else if(pin == 19 && value) PORTC |= (1 << (5));
else if(pin == 19 && !value) PORTC &= ~(1 << (5));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PIND & (1 << (5)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 7) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 14) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 15) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 18) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 19) return PINC & (1 << (5)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR2A &= ~_BV(COM2B1);
else if(pin == 5) TCCR0A &= ~_BV(COM0B1);
else if(pin == 6) TCCR0A &= ~_BV(COM0A1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR2A &= ~_BV(COM2A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRD);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRD);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRC);
if(pin == 15)
return _SFR_IO_REG_P(DDRC);
if(pin == 16)
return _SFR_IO_REG_P(DDRC);
if(pin == 17)
return _SFR_IO_REG_P(DDRC);
if(pin == 18)
return _SFR_IO_REG_P(DDRC);
if(pin == 19)
return _SFR_IO_REG_P(DDRC);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTD);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTD);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTC);
if(pin == 15)
return _SFR_IO_REG_P(PORTC);
if(pin == 16)
return _SFR_IO_REG_P(PORTC);
if(pin == 17)
return _SFR_IO_REG_P(PORTC);
if(pin == 18)
return _SFR_IO_REG_P(PORTC);
if(pin == 19)
return _SFR_IO_REG_P(PORTC);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PIND);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PIND);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINC);
if(pin == 15)
return _SFR_IO_REG_P(PINC);
if(pin == 16)
return _SFR_IO_REG_P(PINC);
if(pin == 17)
return _SFR_IO_REG_P(PINC);
if(pin == 18)
return _SFR_IO_REG_P(PINC);
if(pin == 19)
return _SFR_IO_REG_P(PINC);
return false;
}
#endif
/* Arduino board:
* bt328 | nano328 | mini328
* Arduino BT w/ ATmega328 | Arduino Nano w/ ATmega328 | Arduino Mini w/ ATmega328
* MCU: atmega328p
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 8 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x95 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 0) DDRD |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 1) DDRD |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 2) DDRD |= (1 << (2));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 3) DDRD |= (1 << (3));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRD &= ~(1 << (5));
PORTD &= ~(1 << (5));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (5));
PORTD |= (1 << (5));
} else if(pin == 5) DDRD |= (1 << (5));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 6) DDRD |= (1 << (6));
else if(pin == 7 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 7) DDRD |= (1 << (7));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 8) DDRB |= (1 << (0));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 9) DDRB |= (1 << (1));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 10) DDRB |= (1 << (2));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 11) DDRB |= (1 << (3));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 12) DDRB |= (1 << (4));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 13) DDRB |= (1 << (5));
else if(pin == 14 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 14) DDRC |= (1 << (0));
else if(pin == 15 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 15) DDRC |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 16) DDRC |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 17) DDRC |= (1 << (3));
else if(pin == 18 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 18) DDRC |= (1 << (4));
else if(pin == 19 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 19) DDRC |= (1 << (5));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (0));
else if(pin == 0 && !value) PORTD &= ~(1 << (0));
else if(pin == 1 && value) PORTD |= (1 << (1));
else if(pin == 1 && !value) PORTD &= ~(1 << (1));
else if(pin == 2 && value) PORTD |= (1 << (2));
else if(pin == 2 && !value) PORTD &= ~(1 << (2));
else if(pin == 3 && value) PORTD |= (1 << (3));
else if(pin == 3 && !value) PORTD &= ~(1 << (3));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTD |= (1 << (5));
else if(pin == 5 && !value) PORTD &= ~(1 << (5));
else if(pin == 6 && value) PORTD |= (1 << (6));
else if(pin == 6 && !value) PORTD &= ~(1 << (6));
else if(pin == 7 && value) PORTD |= (1 << (7));
else if(pin == 7 && !value) PORTD &= ~(1 << (7));
else if(pin == 8 && value) PORTB |= (1 << (0));
else if(pin == 8 && !value) PORTB &= ~(1 << (0));
else if(pin == 9 && value) PORTB |= (1 << (1));
else if(pin == 9 && !value) PORTB &= ~(1 << (1));
else if(pin == 10 && value) PORTB |= (1 << (2));
else if(pin == 10 && !value) PORTB &= ~(1 << (2));
else if(pin == 11 && value) PORTB |= (1 << (3));
else if(pin == 11 && !value) PORTB &= ~(1 << (3));
else if(pin == 12 && value) PORTB |= (1 << (4));
else if(pin == 12 && !value) PORTB &= ~(1 << (4));
else if(pin == 13 && value) PORTB |= (1 << (5));
else if(pin == 13 && !value) PORTB &= ~(1 << (5));
else if(pin == 14 && value) PORTC |= (1 << (0));
else if(pin == 14 && !value) PORTC &= ~(1 << (0));
else if(pin == 15 && value) PORTC |= (1 << (1));
else if(pin == 15 && !value) PORTC &= ~(1 << (1));
else if(pin == 16 && value) PORTC |= (1 << (2));
else if(pin == 16 && !value) PORTC &= ~(1 << (2));
else if(pin == 17 && value) PORTC |= (1 << (3));
else if(pin == 17 && !value) PORTC &= ~(1 << (3));
else if(pin == 18 && value) PORTC |= (1 << (4));
else if(pin == 18 && !value) PORTC &= ~(1 << (4));
else if(pin == 19 && value) PORTC |= (1 << (5));
else if(pin == 19 && !value) PORTC &= ~(1 << (5));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PIND & (1 << (5)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 7) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 14) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 15) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 18) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 19) return PINC & (1 << (5)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR2A &= ~_BV(COM2B1);
else if(pin == 5) TCCR0A &= ~_BV(COM0B1);
else if(pin == 6) TCCR0A &= ~_BV(COM0A1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR2A &= ~_BV(COM2A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRD);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRD);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRC);
if(pin == 15)
return _SFR_IO_REG_P(DDRC);
if(pin == 16)
return _SFR_IO_REG_P(DDRC);
if(pin == 17)
return _SFR_IO_REG_P(DDRC);
if(pin == 18)
return _SFR_IO_REG_P(DDRC);
if(pin == 19)
return _SFR_IO_REG_P(DDRC);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTD);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTD);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTC);
if(pin == 15)
return _SFR_IO_REG_P(PORTC);
if(pin == 16)
return _SFR_IO_REG_P(PORTC);
if(pin == 17)
return _SFR_IO_REG_P(PORTC);
if(pin == 18)
return _SFR_IO_REG_P(PORTC);
if(pin == 19)
return _SFR_IO_REG_P(PORTC);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PIND);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PIND);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINC);
if(pin == 15)
return _SFR_IO_REG_P(PINC);
if(pin == 16)
return _SFR_IO_REG_P(PINC);
if(pin == 17)
return _SFR_IO_REG_P(PINC);
if(pin == 18)
return _SFR_IO_REG_P(PINC);
if(pin == 19)
return _SFR_IO_REG_P(PINC);
return false;
}
#endif
/* Arduino board:
* esplora
* Arduino Esplora
* MCU: atmega32u4
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 12 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x95 && defined(USB_PID) && (USB_PID+0) == 0x803C
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 0) DDRD |= (1 << (2));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 1) DDRD |= (1 << (3));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 2) DDRD |= (1 << (1));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 3) DDRD |= (1 << (0));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRC &= ~(1 << (6));
PORTC &= ~(1 << (6));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (6));
PORTC |= (1 << (6));
} else if(pin == 5) DDRC |= (1 << (6));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 6) DDRD |= (1 << (7));
else if(pin == 7 && mode == INPUT) {
DDRE &= ~(1 << (6));
PORTE &= ~(1 << (6));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (6));
PORTE |= (1 << (6));
} else if(pin == 7) DDRE |= (1 << (6));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 8) DDRB |= (1 << (4));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 9) DDRB |= (1 << (5));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 10) DDRB |= (1 << (6));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (7));
PORTB &= ~(1 << (7));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (7));
PORTB |= (1 << (7));
} else if(pin == 11) DDRB |= (1 << (7));
else if(pin == 12 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 12) DDRD |= (1 << (6));
else if(pin == 13 && mode == INPUT) {
DDRC &= ~(1 << (7));
PORTC &= ~(1 << (7));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (7));
PORTC |= (1 << (7));
} else if(pin == 13) DDRC |= (1 << (7));
else if(pin == 14 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 14) DDRB |= (1 << (3));
else if(pin == 15 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 15) DDRB |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 16) DDRB |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 17) DDRB |= (1 << (0));
else if(pin == 18 && mode == INPUT) {
DDRF &= ~(1 << (7));
PORTF &= ~(1 << (7));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (7));
PORTF |= (1 << (7));
} else if(pin == 18) DDRF |= (1 << (7));
else if(pin == 19 && mode == INPUT) {
DDRF &= ~(1 << (6));
PORTF &= ~(1 << (6));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (6));
PORTF |= (1 << (6));
} else if(pin == 19) DDRF |= (1 << (6));
else if(pin == 20 && mode == INPUT) {
DDRF &= ~(1 << (5));
PORTF &= ~(1 << (5));
} else if(pin == 20 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (5));
PORTF |= (1 << (5));
} else if(pin == 20) DDRF |= (1 << (5));
else if(pin == 21 && mode == INPUT) {
DDRF &= ~(1 << (4));
PORTF &= ~(1 << (4));
} else if(pin == 21 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (4));
PORTF |= (1 << (4));
} else if(pin == 21) DDRF |= (1 << (4));
else if(pin == 22 && mode == INPUT) {
DDRF &= ~(1 << (1));
PORTF &= ~(1 << (1));
} else if(pin == 22 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (1));
PORTF |= (1 << (1));
} else if(pin == 22) DDRF |= (1 << (1));
else if(pin == 23 && mode == INPUT) {
DDRF &= ~(1 << (0));
PORTF &= ~(1 << (0));
} else if(pin == 23 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (0));
PORTF |= (1 << (0));
} else if(pin == 23) DDRF |= (1 << (0));
else if(pin == 24 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 24 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 24) DDRD |= (1 << (4));
else if(pin == 25 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 25 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 25) DDRD |= (1 << (7));
else if(pin == 26 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 26 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 26) DDRB |= (1 << (4));
else if(pin == 27 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 27 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 27) DDRB |= (1 << (5));
else if(pin == 28 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 28 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 28) DDRB |= (1 << (6));
else if(pin == 29 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 29 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 29) DDRD |= (1 << (6));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (2));
else if(pin == 0 && !value) PORTD &= ~(1 << (2));
else if(pin == 1 && value) PORTD |= (1 << (3));
else if(pin == 1 && !value) PORTD &= ~(1 << (3));
else if(pin == 2 && value) PORTD |= (1 << (1));
else if(pin == 2 && !value) PORTD &= ~(1 << (1));
else if(pin == 3 && value) PORTD |= (1 << (0));
else if(pin == 3 && !value) PORTD &= ~(1 << (0));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTC |= (1 << (6));
else if(pin == 5 && !value) PORTC &= ~(1 << (6));
else if(pin == 6 && value) PORTD |= (1 << (7));
else if(pin == 6 && !value) PORTD &= ~(1 << (7));
else if(pin == 7 && value) PORTE |= (1 << (6));
else if(pin == 7 && !value) PORTE &= ~(1 << (6));
else if(pin == 8 && value) PORTB |= (1 << (4));
else if(pin == 8 && !value) PORTB &= ~(1 << (4));
else if(pin == 9 && value) PORTB |= (1 << (5));
else if(pin == 9 && !value) PORTB &= ~(1 << (5));
else if(pin == 10 && value) PORTB |= (1 << (6));
else if(pin == 10 && !value) PORTB &= ~(1 << (6));
else if(pin == 11 && value) PORTB |= (1 << (7));
else if(pin == 11 && !value) PORTB &= ~(1 << (7));
else if(pin == 12 && value) PORTD |= (1 << (6));
else if(pin == 12 && !value) PORTD &= ~(1 << (6));
else if(pin == 13 && value) PORTC |= (1 << (7));
else if(pin == 13 && !value) PORTC &= ~(1 << (7));
else if(pin == 14 && value) PORTB |= (1 << (3));
else if(pin == 14 && !value) PORTB &= ~(1 << (3));
else if(pin == 15 && value) PORTB |= (1 << (1));
else if(pin == 15 && !value) PORTB &= ~(1 << (1));
else if(pin == 16 && value) PORTB |= (1 << (2));
else if(pin == 16 && !value) PORTB &= ~(1 << (2));
else if(pin == 17 && value) PORTB |= (1 << (0));
else if(pin == 17 && !value) PORTB &= ~(1 << (0));
else if(pin == 18 && value) PORTF |= (1 << (7));
else if(pin == 18 && !value) PORTF &= ~(1 << (7));
else if(pin == 19 && value) PORTF |= (1 << (6));
else if(pin == 19 && !value) PORTF &= ~(1 << (6));
else if(pin == 20 && value) PORTF |= (1 << (5));
else if(pin == 20 && !value) PORTF &= ~(1 << (5));
else if(pin == 21 && value) PORTF |= (1 << (4));
else if(pin == 21 && !value) PORTF &= ~(1 << (4));
else if(pin == 22 && value) PORTF |= (1 << (1));
else if(pin == 22 && !value) PORTF &= ~(1 << (1));
else if(pin == 23 && value) PORTF |= (1 << (0));
else if(pin == 23 && !value) PORTF &= ~(1 << (0));
else if(pin == 24 && value) PORTD |= (1 << (4));
else if(pin == 24 && !value) PORTD &= ~(1 << (4));
else if(pin == 25 && value) PORTD |= (1 << (7));
else if(pin == 25 && !value) PORTD &= ~(1 << (7));
else if(pin == 26 && value) PORTB |= (1 << (4));
else if(pin == 26 && !value) PORTB &= ~(1 << (4));
else if(pin == 27 && value) PORTB |= (1 << (5));
else if(pin == 27 && !value) PORTB &= ~(1 << (5));
else if(pin == 28 && value) PORTB |= (1 << (6));
else if(pin == 28 && !value) PORTB &= ~(1 << (6));
else if(pin == 29 && value) PORTD |= (1 << (6));
else if(pin == 29 && !value) PORTD &= ~(1 << (6));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PINC & (1 << (6)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 7) return PINE & (1 << (6)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (7)) ? HIGH : LOW;
else if(pin == 12) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 13) return PINC & (1 << (7)) ? HIGH : LOW;
else if(pin == 14) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 15) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 18) return PINF & (1 << (7)) ? HIGH : LOW;
else if(pin == 19) return PINF & (1 << (6)) ? HIGH : LOW;
else if(pin == 20) return PINF & (1 << (5)) ? HIGH : LOW;
else if(pin == 21) return PINF & (1 << (4)) ? HIGH : LOW;
else if(pin == 22) return PINF & (1 << (1)) ? HIGH : LOW;
else if(pin == 23) return PINF & (1 << (0)) ? HIGH : LOW;
else if(pin == 24) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 25) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 26) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 27) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 28) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 29) return PIND & (1 << (6)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR0A &= ~_BV(COM0B1);
else if(pin == 5) TCCR3A &= ~_BV(COM3A1);
else if(pin == 6) TCCR4C &= ~_BV(COM4D1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR0A &= ~_BV(COM0A1);
else if(pin == 13) TCCR4A &= ~_BV(COM4A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
if(pin == 13)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRC);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRE);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRD);
if(pin == 13)
return _SFR_IO_REG_P(DDRC);
if(pin == 14)
return _SFR_IO_REG_P(DDRB);
if(pin == 15)
return _SFR_IO_REG_P(DDRB);
if(pin == 16)
return _SFR_IO_REG_P(DDRB);
if(pin == 17)
return _SFR_IO_REG_P(DDRB);
if(pin == 18)
return _SFR_IO_REG_P(DDRF);
if(pin == 19)
return _SFR_IO_REG_P(DDRF);
if(pin == 20)
return _SFR_IO_REG_P(DDRF);
if(pin == 21)
return _SFR_IO_REG_P(DDRF);
if(pin == 22)
return _SFR_IO_REG_P(DDRF);
if(pin == 23)
return _SFR_IO_REG_P(DDRF);
if(pin == 24)
return _SFR_IO_REG_P(DDRD);
if(pin == 25)
return _SFR_IO_REG_P(DDRD);
if(pin == 26)
return _SFR_IO_REG_P(DDRB);
if(pin == 27)
return _SFR_IO_REG_P(DDRB);
if(pin == 28)
return _SFR_IO_REG_P(DDRB);
if(pin == 29)
return _SFR_IO_REG_P(DDRD);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTC);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTE);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTD);
if(pin == 13)
return _SFR_IO_REG_P(PORTC);
if(pin == 14)
return _SFR_IO_REG_P(PORTB);
if(pin == 15)
return _SFR_IO_REG_P(PORTB);
if(pin == 16)
return _SFR_IO_REG_P(PORTB);
if(pin == 17)
return _SFR_IO_REG_P(PORTB);
if(pin == 18)
return _SFR_IO_REG_P(PORTF);
if(pin == 19)
return _SFR_IO_REG_P(PORTF);
if(pin == 20)
return _SFR_IO_REG_P(PORTF);
if(pin == 21)
return _SFR_IO_REG_P(PORTF);
if(pin == 22)
return _SFR_IO_REG_P(PORTF);
if(pin == 23)
return _SFR_IO_REG_P(PORTF);
if(pin == 24)
return _SFR_IO_REG_P(PORTD);
if(pin == 25)
return _SFR_IO_REG_P(PORTD);
if(pin == 26)
return _SFR_IO_REG_P(PORTB);
if(pin == 27)
return _SFR_IO_REG_P(PORTB);
if(pin == 28)
return _SFR_IO_REG_P(PORTB);
if(pin == 29)
return _SFR_IO_REG_P(PORTD);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PINC);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PINE);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PIND);
if(pin == 13)
return _SFR_IO_REG_P(PINC);
if(pin == 14)
return _SFR_IO_REG_P(PINB);
if(pin == 15)
return _SFR_IO_REG_P(PINB);
if(pin == 16)
return _SFR_IO_REG_P(PINB);
if(pin == 17)
return _SFR_IO_REG_P(PINB);
if(pin == 18)
return _SFR_IO_REG_P(PINF);
if(pin == 19)
return _SFR_IO_REG_P(PINF);
if(pin == 20)
return _SFR_IO_REG_P(PINF);
if(pin == 21)
return _SFR_IO_REG_P(PINF);
if(pin == 22)
return _SFR_IO_REG_P(PINF);
if(pin == 23)
return _SFR_IO_REG_P(PINF);
if(pin == 24)
return _SFR_IO_REG_P(PIND);
if(pin == 25)
return _SFR_IO_REG_P(PIND);
if(pin == 26)
return _SFR_IO_REG_P(PINB);
if(pin == 27)
return _SFR_IO_REG_P(PINB);
if(pin == 28)
return _SFR_IO_REG_P(PINB);
if(pin == 29)
return _SFR_IO_REG_P(PIND);
return false;
}
#endif
/* Arduino board:
* mega
* Arduino Mega (ATmega1280)
* MCU: atmega1280
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 16 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x97 && (!defined(USB_PID) || !(USB_PID+0))
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRE &= ~(1 << (0));
PORTE &= ~(1 << (0));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (0));
PORTE |= (1 << (0));
} else if(pin == 0) DDRE |= (1 << (0));
else if(pin == 1 && mode == INPUT) {
DDRE &= ~(1 << (1));
PORTE &= ~(1 << (1));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (1));
PORTE |= (1 << (1));
} else if(pin == 1) DDRE |= (1 << (1));
else if(pin == 2 && mode == INPUT) {
DDRE &= ~(1 << (4));
PORTE &= ~(1 << (4));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (4));
PORTE |= (1 << (4));
} else if(pin == 2) DDRE |= (1 << (4));
else if(pin == 3 && mode == INPUT) {
DDRE &= ~(1 << (5));
PORTE &= ~(1 << (5));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (5));
PORTE |= (1 << (5));
} else if(pin == 3) DDRE |= (1 << (5));
else if(pin == 4 && mode == INPUT) {
DDRG &= ~(1 << (5));
PORTG &= ~(1 << (5));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRG &= ~(1 << (5));
PORTG |= (1 << (5));
} else if(pin == 4) DDRG |= (1 << (5));
else if(pin == 5 && mode == INPUT) {
DDRE &= ~(1 << (3));
PORTE &= ~(1 << (3));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (3));
PORTE |= (1 << (3));
} else if(pin == 5) DDRE |= (1 << (3));
else if(pin == 6 && mode == INPUT) {
DDRH &= ~(1 << (3));
PORTH &= ~(1 << (3));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (3));
PORTH |= (1 << (3));
} else if(pin == 6) DDRH |= (1 << (3));
else if(pin == 7 && mode == INPUT) {
DDRH &= ~(1 << (4));
PORTH &= ~(1 << (4));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (4));
PORTH |= (1 << (4));
} else if(pin == 7) DDRH |= (1 << (4));
else if(pin == 8 && mode == INPUT) {
DDRH &= ~(1 << (5));
PORTH &= ~(1 << (5));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (5));
PORTH |= (1 << (5));
} else if(pin == 8) DDRH |= (1 << (5));
else if(pin == 9 && mode == INPUT) {
DDRH &= ~(1 << (6));
PORTH &= ~(1 << (6));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (6));
PORTH |= (1 << (6));
} else if(pin == 9) DDRH |= (1 << (6));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 10) DDRB |= (1 << (4));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 11) DDRB |= (1 << (5));
else if(pin == 12 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 12) DDRB |= (1 << (6));
else if(pin == 13 && mode == INPUT) {
DDRB &= ~(1 << (7));
PORTB &= ~(1 << (7));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (7));
PORTB |= (1 << (7));
} else if(pin == 13) DDRB |= (1 << (7));
else if(pin == 14 && mode == INPUT) {
DDRJ &= ~(1 << (1));
PORTJ &= ~(1 << (1));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRJ &= ~(1 << (1));
PORTJ |= (1 << (1));
} else if(pin == 14) DDRJ |= (1 << (1));
else if(pin == 15 && mode == INPUT) {
DDRJ &= ~(1 << (0));
PORTJ &= ~(1 << (0));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRJ &= ~(1 << (0));
PORTJ |= (1 << (0));
} else if(pin == 15) DDRJ |= (1 << (0));
else if(pin == 16 && mode == INPUT) {
DDRH &= ~(1 << (1));
PORTH &= ~(1 << (1));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (1));
PORTH |= (1 << (1));
} else if(pin == 16) DDRH |= (1 << (1));
else if(pin == 17 && mode == INPUT) {
DDRH &= ~(1 << (0));
PORTH &= ~(1 << (0));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRH &= ~(1 << (0));
PORTH |= (1 << (0));
} else if(pin == 17) DDRH |= (1 << (0));
else if(pin == 18 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 18) DDRD |= (1 << (3));
else if(pin == 19 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 19) DDRD |= (1 << (2));
else if(pin == 20 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 20 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 20) DDRD |= (1 << (1));
else if(pin == 21 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 21 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 21) DDRD |= (1 << (0));
else if(pin == 22 && mode == INPUT) {
DDRA &= ~(1 << (0));
PORTA &= ~(1 << (0));
} else if(pin == 22 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (0));
PORTA |= (1 << (0));
} else if(pin == 22) DDRA |= (1 << (0));
else if(pin == 23 && mode == INPUT) {
DDRA &= ~(1 << (1));
PORTA &= ~(1 << (1));
} else if(pin == 23 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (1));
PORTA |= (1 << (1));
} else if(pin == 23) DDRA |= (1 << (1));
else if(pin == 24 && mode == INPUT) {
DDRA &= ~(1 << (2));
PORTA &= ~(1 << (2));
} else if(pin == 24 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (2));
PORTA |= (1 << (2));
} else if(pin == 24) DDRA |= (1 << (2));
else if(pin == 25 && mode == INPUT) {
DDRA &= ~(1 << (3));
PORTA &= ~(1 << (3));
} else if(pin == 25 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (3));
PORTA |= (1 << (3));
} else if(pin == 25) DDRA |= (1 << (3));
else if(pin == 26 && mode == INPUT) {
DDRA &= ~(1 << (4));
PORTA &= ~(1 << (4));
} else if(pin == 26 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (4));
PORTA |= (1 << (4));
} else if(pin == 26) DDRA |= (1 << (4));
else if(pin == 27 && mode == INPUT) {
DDRA &= ~(1 << (5));
PORTA &= ~(1 << (5));
} else if(pin == 27 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (5));
PORTA |= (1 << (5));
} else if(pin == 27) DDRA |= (1 << (5));
else if(pin == 28 && mode == INPUT) {
DDRA &= ~(1 << (6));
PORTA &= ~(1 << (6));
} else if(pin == 28 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (6));
PORTA |= (1 << (6));
} else if(pin == 28) DDRA |= (1 << (6));
else if(pin == 29 && mode == INPUT) {
DDRA &= ~(1 << (7));
PORTA &= ~(1 << (7));
} else if(pin == 29 && mode == INPUT_PULLUP) {
DDRA &= ~(1 << (7));
PORTA |= (1 << (7));
} else if(pin == 29) DDRA |= (1 << (7));
else if(pin == 30 && mode == INPUT) {
DDRC &= ~(1 << (7));
PORTC &= ~(1 << (7));
} else if(pin == 30 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (7));
PORTC |= (1 << (7));
} else if(pin == 30) DDRC |= (1 << (7));
else if(pin == 31 && mode == INPUT) {
DDRC &= ~(1 << (6));
PORTC &= ~(1 << (6));
} else if(pin == 31 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (6));
PORTC |= (1 << (6));
} else if(pin == 31) DDRC |= (1 << (6));
else if(pin == 32 && mode == INPUT) {
DDRC &= ~(1 << (5));
PORTC &= ~(1 << (5));
} else if(pin == 32 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (5));
PORTC |= (1 << (5));
} else if(pin == 32) DDRC |= (1 << (5));
else if(pin == 33 && mode == INPUT) {
DDRC &= ~(1 << (4));
PORTC &= ~(1 << (4));
} else if(pin == 33 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (4));
PORTC |= (1 << (4));
} else if(pin == 33) DDRC |= (1 << (4));
else if(pin == 34 && mode == INPUT) {
DDRC &= ~(1 << (3));
PORTC &= ~(1 << (3));
} else if(pin == 34 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (3));
PORTC |= (1 << (3));
} else if(pin == 34) DDRC |= (1 << (3));
else if(pin == 35 && mode == INPUT) {
DDRC &= ~(1 << (2));
PORTC &= ~(1 << (2));
} else if(pin == 35 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (2));
PORTC |= (1 << (2));
} else if(pin == 35) DDRC |= (1 << (2));
else if(pin == 36 && mode == INPUT) {
DDRC &= ~(1 << (1));
PORTC &= ~(1 << (1));
} else if(pin == 36 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (1));
PORTC |= (1 << (1));
} else if(pin == 36) DDRC |= (1 << (1));
else if(pin == 37 && mode == INPUT) {
DDRC &= ~(1 << (0));
PORTC &= ~(1 << (0));
} else if(pin == 37 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (0));
PORTC |= (1 << (0));
} else if(pin == 37) DDRC |= (1 << (0));
else if(pin == 38 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 38 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 38) DDRD |= (1 << (7));
else if(pin == 39 && mode == INPUT) {
DDRG &= ~(1 << (2));
PORTG &= ~(1 << (2));
} else if(pin == 39 && mode == INPUT_PULLUP) {
DDRG &= ~(1 << (2));
PORTG |= (1 << (2));
} else if(pin == 39) DDRG |= (1 << (2));
else if(pin == 40 && mode == INPUT) {
DDRG &= ~(1 << (1));
PORTG &= ~(1 << (1));
} else if(pin == 40 && mode == INPUT_PULLUP) {
DDRG &= ~(1 << (1));
PORTG |= (1 << (1));
} else if(pin == 40) DDRG |= (1 << (1));
else if(pin == 41 && mode == INPUT) {
DDRG &= ~(1 << (0));
PORTG &= ~(1 << (0));
} else if(pin == 41 && mode == INPUT_PULLUP) {
DDRG &= ~(1 << (0));
PORTG |= (1 << (0));
} else if(pin == 41) DDRG |= (1 << (0));
else if(pin == 42 && mode == INPUT) {
DDRL &= ~(1 << (7));
PORTL &= ~(1 << (7));
} else if(pin == 42 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (7));
PORTL |= (1 << (7));
} else if(pin == 42) DDRL |= (1 << (7));
else if(pin == 43 && mode == INPUT) {
DDRL &= ~(1 << (6));
PORTL &= ~(1 << (6));
} else if(pin == 43 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (6));
PORTL |= (1 << (6));
} else if(pin == 43) DDRL |= (1 << (6));
else if(pin == 44 && mode == INPUT) {
DDRL &= ~(1 << (5));
PORTL &= ~(1 << (5));
} else if(pin == 44 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (5));
PORTL |= (1 << (5));
} else if(pin == 44) DDRL |= (1 << (5));
else if(pin == 45 && mode == INPUT) {
DDRL &= ~(1 << (4));
PORTL &= ~(1 << (4));
} else if(pin == 45 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (4));
PORTL |= (1 << (4));
} else if(pin == 45) DDRL |= (1 << (4));
else if(pin == 46 && mode == INPUT) {
DDRL &= ~(1 << (3));
PORTL &= ~(1 << (3));
} else if(pin == 46 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (3));
PORTL |= (1 << (3));
} else if(pin == 46) DDRL |= (1 << (3));
else if(pin == 47 && mode == INPUT) {
DDRL &= ~(1 << (2));
PORTL &= ~(1 << (2));
} else if(pin == 47 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (2));
PORTL |= (1 << (2));
} else if(pin == 47) DDRL |= (1 << (2));
else if(pin == 48 && mode == INPUT) {
DDRL &= ~(1 << (1));
PORTL &= ~(1 << (1));
} else if(pin == 48 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (1));
PORTL |= (1 << (1));
} else if(pin == 48) DDRL |= (1 << (1));
else if(pin == 49 && mode == INPUT) {
DDRL &= ~(1 << (0));
PORTL &= ~(1 << (0));
} else if(pin == 49 && mode == INPUT_PULLUP) {
DDRL &= ~(1 << (0));
PORTL |= (1 << (0));
} else if(pin == 49) DDRL |= (1 << (0));
else if(pin == 50 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 50 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 50) DDRB |= (1 << (3));
else if(pin == 51 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 51 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 51) DDRB |= (1 << (2));
else if(pin == 52 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 52 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 52) DDRB |= (1 << (1));
else if(pin == 53 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 53 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 53) DDRB |= (1 << (0));
else if(pin == 54 && mode == INPUT) {
DDRF &= ~(1 << (0));
PORTF &= ~(1 << (0));
} else if(pin == 54 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (0));
PORTF |= (1 << (0));
} else if(pin == 54) DDRF |= (1 << (0));
else if(pin == 55 && mode == INPUT) {
DDRF &= ~(1 << (1));
PORTF &= ~(1 << (1));
} else if(pin == 55 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (1));
PORTF |= (1 << (1));
} else if(pin == 55) DDRF |= (1 << (1));
else if(pin == 56 && mode == INPUT) {
DDRF &= ~(1 << (2));
PORTF &= ~(1 << (2));
} else if(pin == 56 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (2));
PORTF |= (1 << (2));
} else if(pin == 56) DDRF |= (1 << (2));
else if(pin == 57 && mode == INPUT) {
DDRF &= ~(1 << (3));
PORTF &= ~(1 << (3));
} else if(pin == 57 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (3));
PORTF |= (1 << (3));
} else if(pin == 57) DDRF |= (1 << (3));
else if(pin == 58 && mode == INPUT) {
DDRF &= ~(1 << (4));
PORTF &= ~(1 << (4));
} else if(pin == 58 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (4));
PORTF |= (1 << (4));
} else if(pin == 58) DDRF |= (1 << (4));
else if(pin == 59 && mode == INPUT) {
DDRF &= ~(1 << (5));
PORTF &= ~(1 << (5));
} else if(pin == 59 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (5));
PORTF |= (1 << (5));
} else if(pin == 59) DDRF |= (1 << (5));
else if(pin == 60 && mode == INPUT) {
DDRF &= ~(1 << (6));
PORTF &= ~(1 << (6));
} else if(pin == 60 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (6));
PORTF |= (1 << (6));
} else if(pin == 60) DDRF |= (1 << (6));
else if(pin == 61 && mode == INPUT) {
DDRF &= ~(1 << (7));
PORTF &= ~(1 << (7));
} else if(pin == 61 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (7));
PORTF |= (1 << (7));
} else if(pin == 61) DDRF |= (1 << (7));
else if(pin == 62 && mode == INPUT) {
DDRK &= ~(1 << (0));
PORTK &= ~(1 << (0));
} else if(pin == 62 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (0));
PORTK |= (1 << (0));
} else if(pin == 62) DDRK |= (1 << (0));
else if(pin == 63 && mode == INPUT) {
DDRK &= ~(1 << (1));
PORTK &= ~(1 << (1));
} else if(pin == 63 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (1));
PORTK |= (1 << (1));
} else if(pin == 63) DDRK |= (1 << (1));
else if(pin == 64 && mode == INPUT) {
DDRK &= ~(1 << (2));
PORTK &= ~(1 << (2));
} else if(pin == 64 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (2));
PORTK |= (1 << (2));
} else if(pin == 64) DDRK |= (1 << (2));
else if(pin == 65 && mode == INPUT) {
DDRK &= ~(1 << (3));
PORTK &= ~(1 << (3));
} else if(pin == 65 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (3));
PORTK |= (1 << (3));
} else if(pin == 65) DDRK |= (1 << (3));
else if(pin == 66 && mode == INPUT) {
DDRK &= ~(1 << (4));
PORTK &= ~(1 << (4));
} else if(pin == 66 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (4));
PORTK |= (1 << (4));
} else if(pin == 66) DDRK |= (1 << (4));
else if(pin == 67 && mode == INPUT) {
DDRK &= ~(1 << (5));
PORTK &= ~(1 << (5));
} else if(pin == 67 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (5));
PORTK |= (1 << (5));
} else if(pin == 67) DDRK |= (1 << (5));
else if(pin == 68 && mode == INPUT) {
DDRK &= ~(1 << (6));
PORTK &= ~(1 << (6));
} else if(pin == 68 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (6));
PORTK |= (1 << (6));
} else if(pin == 68) DDRK |= (1 << (6));
else if(pin == 69 && mode == INPUT) {
DDRK &= ~(1 << (7));
PORTK &= ~(1 << (7));
} else if(pin == 69 && mode == INPUT_PULLUP) {
DDRK &= ~(1 << (7));
PORTK |= (1 << (7));
} else if(pin == 69) DDRK |= (1 << (7));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTE |= (1 << (0));
else if(pin == 0 && !value) PORTE &= ~(1 << (0));
else if(pin == 1 && value) PORTE |= (1 << (1));
else if(pin == 1 && !value) PORTE &= ~(1 << (1));
else if(pin == 2 && value) PORTE |= (1 << (4));
else if(pin == 2 && !value) PORTE &= ~(1 << (4));
else if(pin == 3 && value) PORTE |= (1 << (5));
else if(pin == 3 && !value) PORTE &= ~(1 << (5));
else if(pin == 4 && value) PORTG |= (1 << (5));
else if(pin == 4 && !value) PORTG &= ~(1 << (5));
else if(pin == 5 && value) PORTE |= (1 << (3));
else if(pin == 5 && !value) PORTE &= ~(1 << (3));
else if(pin == 6 && value) PORTH |= (1 << (3));
else if(pin == 6 && !value) PORTH &= ~(1 << (3));
else if(pin == 7 && value) PORTH |= (1 << (4));
else if(pin == 7 && !value) PORTH &= ~(1 << (4));
else if(pin == 8 && value) PORTH |= (1 << (5));
else if(pin == 8 && !value) PORTH &= ~(1 << (5));
else if(pin == 9 && value) PORTH |= (1 << (6));
else if(pin == 9 && !value) PORTH &= ~(1 << (6));
else if(pin == 10 && value) PORTB |= (1 << (4));
else if(pin == 10 && !value) PORTB &= ~(1 << (4));
else if(pin == 11 && value) PORTB |= (1 << (5));
else if(pin == 11 && !value) PORTB &= ~(1 << (5));
else if(pin == 12 && value) PORTB |= (1 << (6));
else if(pin == 12 && !value) PORTB &= ~(1 << (6));
else if(pin == 13 && value) PORTB |= (1 << (7));
else if(pin == 13 && !value) PORTB &= ~(1 << (7));
else if(pin == 14 && value) PORTJ |= (1 << (1));
else if(pin == 14 && !value) PORTJ &= ~(1 << (1));
else if(pin == 15 && value) PORTJ |= (1 << (0));
else if(pin == 15 && !value) PORTJ &= ~(1 << (0));
else if(pin == 16 && value) PORTH |= (1 << (1));
else if(pin == 16 && !value) PORTH &= ~(1 << (1));
else if(pin == 17 && value) PORTH |= (1 << (0));
else if(pin == 17 && !value) PORTH &= ~(1 << (0));
else if(pin == 18 && value) PORTD |= (1 << (3));
else if(pin == 18 && !value) PORTD &= ~(1 << (3));
else if(pin == 19 && value) PORTD |= (1 << (2));
else if(pin == 19 && !value) PORTD &= ~(1 << (2));
else if(pin == 20 && value) PORTD |= (1 << (1));
else if(pin == 20 && !value) PORTD &= ~(1 << (1));
else if(pin == 21 && value) PORTD |= (1 << (0));
else if(pin == 21 && !value) PORTD &= ~(1 << (0));
else if(pin == 22 && value) PORTA |= (1 << (0));
else if(pin == 22 && !value) PORTA &= ~(1 << (0));
else if(pin == 23 && value) PORTA |= (1 << (1));
else if(pin == 23 && !value) PORTA &= ~(1 << (1));
else if(pin == 24 && value) PORTA |= (1 << (2));
else if(pin == 24 && !value) PORTA &= ~(1 << (2));
else if(pin == 25 && value) PORTA |= (1 << (3));
else if(pin == 25 && !value) PORTA &= ~(1 << (3));
else if(pin == 26 && value) PORTA |= (1 << (4));
else if(pin == 26 && !value) PORTA &= ~(1 << (4));
else if(pin == 27 && value) PORTA |= (1 << (5));
else if(pin == 27 && !value) PORTA &= ~(1 << (5));
else if(pin == 28 && value) PORTA |= (1 << (6));
else if(pin == 28 && !value) PORTA &= ~(1 << (6));
else if(pin == 29 && value) PORTA |= (1 << (7));
else if(pin == 29 && !value) PORTA &= ~(1 << (7));
else if(pin == 30 && value) PORTC |= (1 << (7));
else if(pin == 30 && !value) PORTC &= ~(1 << (7));
else if(pin == 31 && value) PORTC |= (1 << (6));
else if(pin == 31 && !value) PORTC &= ~(1 << (6));
else if(pin == 32 && value) PORTC |= (1 << (5));
else if(pin == 32 && !value) PORTC &= ~(1 << (5));
else if(pin == 33 && value) PORTC |= (1 << (4));
else if(pin == 33 && !value) PORTC &= ~(1 << (4));
else if(pin == 34 && value) PORTC |= (1 << (3));
else if(pin == 34 && !value) PORTC &= ~(1 << (3));
else if(pin == 35 && value) PORTC |= (1 << (2));
else if(pin == 35 && !value) PORTC &= ~(1 << (2));
else if(pin == 36 && value) PORTC |= (1 << (1));
else if(pin == 36 && !value) PORTC &= ~(1 << (1));
else if(pin == 37 && value) PORTC |= (1 << (0));
else if(pin == 37 && !value) PORTC &= ~(1 << (0));
else if(pin == 38 && value) PORTD |= (1 << (7));
else if(pin == 38 && !value) PORTD &= ~(1 << (7));
else if(pin == 39 && value) PORTG |= (1 << (2));
else if(pin == 39 && !value) PORTG &= ~(1 << (2));
else if(pin == 40 && value) PORTG |= (1 << (1));
else if(pin == 40 && !value) PORTG &= ~(1 << (1));
else if(pin == 41 && value) PORTG |= (1 << (0));
else if(pin == 41 && !value) PORTG &= ~(1 << (0));
else if(pin == 42 && value) PORTL |= (1 << (7));
else if(pin == 42 && !value) PORTL &= ~(1 << (7));
else if(pin == 43 && value) PORTL |= (1 << (6));
else if(pin == 43 && !value) PORTL &= ~(1 << (6));
else if(pin == 44 && value) PORTL |= (1 << (5));
else if(pin == 44 && !value) PORTL &= ~(1 << (5));
else if(pin == 45 && value) PORTL |= (1 << (4));
else if(pin == 45 && !value) PORTL &= ~(1 << (4));
else if(pin == 46 && value) PORTL |= (1 << (3));
else if(pin == 46 && !value) PORTL &= ~(1 << (3));
else if(pin == 47 && value) PORTL |= (1 << (2));
else if(pin == 47 && !value) PORTL &= ~(1 << (2));
else if(pin == 48 && value) PORTL |= (1 << (1));
else if(pin == 48 && !value) PORTL &= ~(1 << (1));
else if(pin == 49 && value) PORTL |= (1 << (0));
else if(pin == 49 && !value) PORTL &= ~(1 << (0));
else if(pin == 50 && value) PORTB |= (1 << (3));
else if(pin == 50 && !value) PORTB &= ~(1 << (3));
else if(pin == 51 && value) PORTB |= (1 << (2));
else if(pin == 51 && !value) PORTB &= ~(1 << (2));
else if(pin == 52 && value) PORTB |= (1 << (1));
else if(pin == 52 && !value) PORTB &= ~(1 << (1));
else if(pin == 53 && value) PORTB |= (1 << (0));
else if(pin == 53 && !value) PORTB &= ~(1 << (0));
else if(pin == 54 && value) PORTF |= (1 << (0));
else if(pin == 54 && !value) PORTF &= ~(1 << (0));
else if(pin == 55 && value) PORTF |= (1 << (1));
else if(pin == 55 && !value) PORTF &= ~(1 << (1));
else if(pin == 56 && value) PORTF |= (1 << (2));
else if(pin == 56 && !value) PORTF &= ~(1 << (2));
else if(pin == 57 && value) PORTF |= (1 << (3));
else if(pin == 57 && !value) PORTF &= ~(1 << (3));
else if(pin == 58 && value) PORTF |= (1 << (4));
else if(pin == 58 && !value) PORTF &= ~(1 << (4));
else if(pin == 59 && value) PORTF |= (1 << (5));
else if(pin == 59 && !value) PORTF &= ~(1 << (5));
else if(pin == 60 && value) PORTF |= (1 << (6));
else if(pin == 60 && !value) PORTF &= ~(1 << (6));
else if(pin == 61 && value) PORTF |= (1 << (7));
else if(pin == 61 && !value) PORTF &= ~(1 << (7));
else if(pin == 62 && value) PORTK |= (1 << (0));
else if(pin == 62 && !value) PORTK &= ~(1 << (0));
else if(pin == 63 && value) PORTK |= (1 << (1));
else if(pin == 63 && !value) PORTK &= ~(1 << (1));
else if(pin == 64 && value) PORTK |= (1 << (2));
else if(pin == 64 && !value) PORTK &= ~(1 << (2));
else if(pin == 65 && value) PORTK |= (1 << (3));
else if(pin == 65 && !value) PORTK &= ~(1 << (3));
else if(pin == 66 && value) PORTK |= (1 << (4));
else if(pin == 66 && !value) PORTK &= ~(1 << (4));
else if(pin == 67 && value) PORTK |= (1 << (5));
else if(pin == 67 && !value) PORTK &= ~(1 << (5));
else if(pin == 68 && value) PORTK |= (1 << (6));
else if(pin == 68 && !value) PORTK &= ~(1 << (6));
else if(pin == 69 && value) PORTK |= (1 << (7));
else if(pin == 69 && !value) PORTK &= ~(1 << (7));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PINE & (1 << (0)) ? HIGH : LOW;
else if(pin == 1) return PINE & (1 << (1)) ? HIGH : LOW;
else if(pin == 2) return PINE & (1 << (4)) ? HIGH : LOW;
else if(pin == 3) return PINE & (1 << (5)) ? HIGH : LOW;
else if(pin == 4) return PING & (1 << (5)) ? HIGH : LOW;
else if(pin == 5) return PINE & (1 << (3)) ? HIGH : LOW;
else if(pin == 6) return PINH & (1 << (3)) ? HIGH : LOW;
else if(pin == 7) return PINH & (1 << (4)) ? HIGH : LOW;
else if(pin == 8) return PINH & (1 << (5)) ? HIGH : LOW;
else if(pin == 9) return PINH & (1 << (6)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 12) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 13) return PINB & (1 << (7)) ? HIGH : LOW;
else if(pin == 14) return PINJ & (1 << (1)) ? HIGH : LOW;
else if(pin == 15) return PINJ & (1 << (0)) ? HIGH : LOW;
else if(pin == 16) return PINH & (1 << (1)) ? HIGH : LOW;
else if(pin == 17) return PINH & (1 << (0)) ? HIGH : LOW;
else if(pin == 18) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 19) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 20) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 21) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 22) return PINA & (1 << (0)) ? HIGH : LOW;
else if(pin == 23) return PINA & (1 << (1)) ? HIGH : LOW;
else if(pin == 24) return PINA & (1 << (2)) ? HIGH : LOW;
else if(pin == 25) return PINA & (1 << (3)) ? HIGH : LOW;
else if(pin == 26) return PINA & (1 << (4)) ? HIGH : LOW;
else if(pin == 27) return PINA & (1 << (5)) ? HIGH : LOW;
else if(pin == 28) return PINA & (1 << (6)) ? HIGH : LOW;
else if(pin == 29) return PINA & (1 << (7)) ? HIGH : LOW;
else if(pin == 30) return PINC & (1 << (7)) ? HIGH : LOW;
else if(pin == 31) return PINC & (1 << (6)) ? HIGH : LOW;
else if(pin == 32) return PINC & (1 << (5)) ? HIGH : LOW;
else if(pin == 33) return PINC & (1 << (4)) ? HIGH : LOW;
else if(pin == 34) return PINC & (1 << (3)) ? HIGH : LOW;
else if(pin == 35) return PINC & (1 << (2)) ? HIGH : LOW;
else if(pin == 36) return PINC & (1 << (1)) ? HIGH : LOW;
else if(pin == 37) return PINC & (1 << (0)) ? HIGH : LOW;
else if(pin == 38) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 39) return PING & (1 << (2)) ? HIGH : LOW;
else if(pin == 40) return PING & (1 << (1)) ? HIGH : LOW;
else if(pin == 41) return PING & (1 << (0)) ? HIGH : LOW;
else if(pin == 42) return PINL & (1 << (7)) ? HIGH : LOW;
else if(pin == 43) return PINL & (1 << (6)) ? HIGH : LOW;
else if(pin == 44) return PINL & (1 << (5)) ? HIGH : LOW;
else if(pin == 45) return PINL & (1 << (4)) ? HIGH : LOW;
else if(pin == 46) return PINL & (1 << (3)) ? HIGH : LOW;
else if(pin == 47) return PINL & (1 << (2)) ? HIGH : LOW;
else if(pin == 48) return PINL & (1 << (1)) ? HIGH : LOW;
else if(pin == 49) return PINL & (1 << (0)) ? HIGH : LOW;
else if(pin == 50) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 51) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 52) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 53) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 54) return PINF & (1 << (0)) ? HIGH : LOW;
else if(pin == 55) return PINF & (1 << (1)) ? HIGH : LOW;
else if(pin == 56) return PINF & (1 << (2)) ? HIGH : LOW;
else if(pin == 57) return PINF & (1 << (3)) ? HIGH : LOW;
else if(pin == 58) return PINF & (1 << (4)) ? HIGH : LOW;
else if(pin == 59) return PINF & (1 << (5)) ? HIGH : LOW;
else if(pin == 60) return PINF & (1 << (6)) ? HIGH : LOW;
else if(pin == 61) return PINF & (1 << (7)) ? HIGH : LOW;
else if(pin == 62) return PINK & (1 << (0)) ? HIGH : LOW;
else if(pin == 63) return PINK & (1 << (1)) ? HIGH : LOW;
else if(pin == 64) return PINK & (1 << (2)) ? HIGH : LOW;
else if(pin == 65) return PINK & (1 << (3)) ? HIGH : LOW;
else if(pin == 66) return PINK & (1 << (4)) ? HIGH : LOW;
else if(pin == 67) return PINK & (1 << (5)) ? HIGH : LOW;
else if(pin == 68) return PINK & (1 << (6)) ? HIGH : LOW;
else if(pin == 69) return PINK & (1 << (7)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 2) TCCR3A &= ~_BV(COM3B1);
else if(pin == 3) TCCR3A &= ~_BV(COM3C1);
else if(pin == 4) TCCR0A &= ~_BV(COM0B1);
else if(pin == 5) TCCR3A &= ~_BV(COM3A1);
else if(pin == 6) TCCR4A &= ~_BV(COM4A1);
else if(pin == 7) TCCR4A &= ~_BV(COM4B1);
else if(pin == 8) TCCR4A &= ~_BV(COM4C1);
else if(pin == 9) TCCR2A &= ~_BV(COM2B1);
else if(pin == 10) TCCR2A &= ~_BV(COM2A1);
else if(pin == 11) TCCR1A &= ~_BV(COM1A1);
else if(pin == 12) TCCR1A &= ~_BV(COM1B1);
else if(pin == 13) TCCR0A &= ~_BV(COM0A1);
else if(pin == 44) TCCR5A &= ~_BV(COM5C1);
else if(pin == 45) TCCR5A &= ~_BV(COM5B1);
else if(pin == 46) TCCR5A &= ~_BV(COM5A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 2)
return true;
if(pin == 3)
return true;
if(pin == 4)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 7)
return true;
if(pin == 8)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
if(pin == 12)
return true;
if(pin == 13)
return true;
if(pin == 44)
return true;
if(pin == 45)
return true;
if(pin == 46)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRE);
if(pin == 1)
return _SFR_IO_REG_P(DDRE);
if(pin == 2)
return _SFR_IO_REG_P(DDRE);
if(pin == 3)
return _SFR_IO_REG_P(DDRE);
if(pin == 4)
return _SFR_IO_REG_P(DDRG);
if(pin == 5)
return _SFR_IO_REG_P(DDRE);
if(pin == 6)
return _SFR_IO_REG_P(DDRH);
if(pin == 7)
return _SFR_IO_REG_P(DDRH);
if(pin == 8)
return _SFR_IO_REG_P(DDRH);
if(pin == 9)
return _SFR_IO_REG_P(DDRH);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRB);
if(pin == 13)
return _SFR_IO_REG_P(DDRB);
if(pin == 14)
return _SFR_IO_REG_P(DDRJ);
if(pin == 15)
return _SFR_IO_REG_P(DDRJ);
if(pin == 16)
return _SFR_IO_REG_P(DDRH);
if(pin == 17)
return _SFR_IO_REG_P(DDRH);
if(pin == 18)
return _SFR_IO_REG_P(DDRD);
if(pin == 19)
return _SFR_IO_REG_P(DDRD);
if(pin == 20)
return _SFR_IO_REG_P(DDRD);
if(pin == 21)
return _SFR_IO_REG_P(DDRD);
if(pin == 22)
return _SFR_IO_REG_P(DDRA);
if(pin == 23)
return _SFR_IO_REG_P(DDRA);
if(pin == 24)
return _SFR_IO_REG_P(DDRA);
if(pin == 25)
return _SFR_IO_REG_P(DDRA);
if(pin == 26)
return _SFR_IO_REG_P(DDRA);
if(pin == 27)
return _SFR_IO_REG_P(DDRA);
if(pin == 28)
return _SFR_IO_REG_P(DDRA);
if(pin == 29)
return _SFR_IO_REG_P(DDRA);
if(pin == 30)
return _SFR_IO_REG_P(DDRC);
if(pin == 31)
return _SFR_IO_REG_P(DDRC);
if(pin == 32)
return _SFR_IO_REG_P(DDRC);
if(pin == 33)
return _SFR_IO_REG_P(DDRC);
if(pin == 34)
return _SFR_IO_REG_P(DDRC);
if(pin == 35)
return _SFR_IO_REG_P(DDRC);
if(pin == 36)
return _SFR_IO_REG_P(DDRC);
if(pin == 37)
return _SFR_IO_REG_P(DDRC);
if(pin == 38)
return _SFR_IO_REG_P(DDRD);
if(pin == 39)
return _SFR_IO_REG_P(DDRG);
if(pin == 40)
return _SFR_IO_REG_P(DDRG);
if(pin == 41)
return _SFR_IO_REG_P(DDRG);
if(pin == 42)
return _SFR_IO_REG_P(DDRL);
if(pin == 43)
return _SFR_IO_REG_P(DDRL);
if(pin == 44)
return _SFR_IO_REG_P(DDRL);
if(pin == 45)
return _SFR_IO_REG_P(DDRL);
if(pin == 46)
return _SFR_IO_REG_P(DDRL);
if(pin == 47)
return _SFR_IO_REG_P(DDRL);
if(pin == 48)
return _SFR_IO_REG_P(DDRL);
if(pin == 49)
return _SFR_IO_REG_P(DDRL);
if(pin == 50)
return _SFR_IO_REG_P(DDRB);
if(pin == 51)
return _SFR_IO_REG_P(DDRB);
if(pin == 52)
return _SFR_IO_REG_P(DDRB);
if(pin == 53)
return _SFR_IO_REG_P(DDRB);
if(pin == 54)
return _SFR_IO_REG_P(DDRF);
if(pin == 55)
return _SFR_IO_REG_P(DDRF);
if(pin == 56)
return _SFR_IO_REG_P(DDRF);
if(pin == 57)
return _SFR_IO_REG_P(DDRF);
if(pin == 58)
return _SFR_IO_REG_P(DDRF);
if(pin == 59)
return _SFR_IO_REG_P(DDRF);
if(pin == 60)
return _SFR_IO_REG_P(DDRF);
if(pin == 61)
return _SFR_IO_REG_P(DDRF);
if(pin == 62)
return _SFR_IO_REG_P(DDRK);
if(pin == 63)
return _SFR_IO_REG_P(DDRK);
if(pin == 64)
return _SFR_IO_REG_P(DDRK);
if(pin == 65)
return _SFR_IO_REG_P(DDRK);
if(pin == 66)
return _SFR_IO_REG_P(DDRK);
if(pin == 67)
return _SFR_IO_REG_P(DDRK);
if(pin == 68)
return _SFR_IO_REG_P(DDRK);
if(pin == 69)
return _SFR_IO_REG_P(DDRK);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTE);
if(pin == 1)
return _SFR_IO_REG_P(PORTE);
if(pin == 2)
return _SFR_IO_REG_P(PORTE);
if(pin == 3)
return _SFR_IO_REG_P(PORTE);
if(pin == 4)
return _SFR_IO_REG_P(PORTG);
if(pin == 5)
return _SFR_IO_REG_P(PORTE);
if(pin == 6)
return _SFR_IO_REG_P(PORTH);
if(pin == 7)
return _SFR_IO_REG_P(PORTH);
if(pin == 8)
return _SFR_IO_REG_P(PORTH);
if(pin == 9)
return _SFR_IO_REG_P(PORTH);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTB);
if(pin == 13)
return _SFR_IO_REG_P(PORTB);
if(pin == 14)
return _SFR_IO_REG_P(PORTJ);
if(pin == 15)
return _SFR_IO_REG_P(PORTJ);
if(pin == 16)
return _SFR_IO_REG_P(PORTH);
if(pin == 17)
return _SFR_IO_REG_P(PORTH);
if(pin == 18)
return _SFR_IO_REG_P(PORTD);
if(pin == 19)
return _SFR_IO_REG_P(PORTD);
if(pin == 20)
return _SFR_IO_REG_P(PORTD);
if(pin == 21)
return _SFR_IO_REG_P(PORTD);
if(pin == 22)
return _SFR_IO_REG_P(PORTA);
if(pin == 23)
return _SFR_IO_REG_P(PORTA);
if(pin == 24)
return _SFR_IO_REG_P(PORTA);
if(pin == 25)
return _SFR_IO_REG_P(PORTA);
if(pin == 26)
return _SFR_IO_REG_P(PORTA);
if(pin == 27)
return _SFR_IO_REG_P(PORTA);
if(pin == 28)
return _SFR_IO_REG_P(PORTA);
if(pin == 29)
return _SFR_IO_REG_P(PORTA);
if(pin == 30)
return _SFR_IO_REG_P(PORTC);
if(pin == 31)
return _SFR_IO_REG_P(PORTC);
if(pin == 32)
return _SFR_IO_REG_P(PORTC);
if(pin == 33)
return _SFR_IO_REG_P(PORTC);
if(pin == 34)
return _SFR_IO_REG_P(PORTC);
if(pin == 35)
return _SFR_IO_REG_P(PORTC);
if(pin == 36)
return _SFR_IO_REG_P(PORTC);
if(pin == 37)
return _SFR_IO_REG_P(PORTC);
if(pin == 38)
return _SFR_IO_REG_P(PORTD);
if(pin == 39)
return _SFR_IO_REG_P(PORTG);
if(pin == 40)
return _SFR_IO_REG_P(PORTG);
if(pin == 41)
return _SFR_IO_REG_P(PORTG);
if(pin == 42)
return _SFR_IO_REG_P(PORTL);
if(pin == 43)
return _SFR_IO_REG_P(PORTL);
if(pin == 44)
return _SFR_IO_REG_P(PORTL);
if(pin == 45)
return _SFR_IO_REG_P(PORTL);
if(pin == 46)
return _SFR_IO_REG_P(PORTL);
if(pin == 47)
return _SFR_IO_REG_P(PORTL);
if(pin == 48)
return _SFR_IO_REG_P(PORTL);
if(pin == 49)
return _SFR_IO_REG_P(PORTL);
if(pin == 50)
return _SFR_IO_REG_P(PORTB);
if(pin == 51)
return _SFR_IO_REG_P(PORTB);
if(pin == 52)
return _SFR_IO_REG_P(PORTB);
if(pin == 53)
return _SFR_IO_REG_P(PORTB);
if(pin == 54)
return _SFR_IO_REG_P(PORTF);
if(pin == 55)
return _SFR_IO_REG_P(PORTF);
if(pin == 56)
return _SFR_IO_REG_P(PORTF);
if(pin == 57)
return _SFR_IO_REG_P(PORTF);
if(pin == 58)
return _SFR_IO_REG_P(PORTF);
if(pin == 59)
return _SFR_IO_REG_P(PORTF);
if(pin == 60)
return _SFR_IO_REG_P(PORTF);
if(pin == 61)
return _SFR_IO_REG_P(PORTF);
if(pin == 62)
return _SFR_IO_REG_P(PORTK);
if(pin == 63)
return _SFR_IO_REG_P(PORTK);
if(pin == 64)
return _SFR_IO_REG_P(PORTK);
if(pin == 65)
return _SFR_IO_REG_P(PORTK);
if(pin == 66)
return _SFR_IO_REG_P(PORTK);
if(pin == 67)
return _SFR_IO_REG_P(PORTK);
if(pin == 68)
return _SFR_IO_REG_P(PORTK);
if(pin == 69)
return _SFR_IO_REG_P(PORTK);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PINE);
if(pin == 1)
return _SFR_IO_REG_P(PINE);
if(pin == 2)
return _SFR_IO_REG_P(PINE);
if(pin == 3)
return _SFR_IO_REG_P(PINE);
if(pin == 4)
return _SFR_IO_REG_P(PING);
if(pin == 5)
return _SFR_IO_REG_P(PINE);
if(pin == 6)
return _SFR_IO_REG_P(PINH);
if(pin == 7)
return _SFR_IO_REG_P(PINH);
if(pin == 8)
return _SFR_IO_REG_P(PINH);
if(pin == 9)
return _SFR_IO_REG_P(PINH);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PINB);
if(pin == 13)
return _SFR_IO_REG_P(PINB);
if(pin == 14)
return _SFR_IO_REG_P(PINJ);
if(pin == 15)
return _SFR_IO_REG_P(PINJ);
if(pin == 16)
return _SFR_IO_REG_P(PINH);
if(pin == 17)
return _SFR_IO_REG_P(PINH);
if(pin == 18)
return _SFR_IO_REG_P(PIND);
if(pin == 19)
return _SFR_IO_REG_P(PIND);
if(pin == 20)
return _SFR_IO_REG_P(PIND);
if(pin == 21)
return _SFR_IO_REG_P(PIND);
if(pin == 22)
return _SFR_IO_REG_P(PINA);
if(pin == 23)
return _SFR_IO_REG_P(PINA);
if(pin == 24)
return _SFR_IO_REG_P(PINA);
if(pin == 25)
return _SFR_IO_REG_P(PINA);
if(pin == 26)
return _SFR_IO_REG_P(PINA);
if(pin == 27)
return _SFR_IO_REG_P(PINA);
if(pin == 28)
return _SFR_IO_REG_P(PINA);
if(pin == 29)
return _SFR_IO_REG_P(PINA);
if(pin == 30)
return _SFR_IO_REG_P(PINC);
if(pin == 31)
return _SFR_IO_REG_P(PINC);
if(pin == 32)
return _SFR_IO_REG_P(PINC);
if(pin == 33)
return _SFR_IO_REG_P(PINC);
if(pin == 34)
return _SFR_IO_REG_P(PINC);
if(pin == 35)
return _SFR_IO_REG_P(PINC);
if(pin == 36)
return _SFR_IO_REG_P(PINC);
if(pin == 37)
return _SFR_IO_REG_P(PINC);
if(pin == 38)
return _SFR_IO_REG_P(PIND);
if(pin == 39)
return _SFR_IO_REG_P(PING);
if(pin == 40)
return _SFR_IO_REG_P(PING);
if(pin == 41)
return _SFR_IO_REG_P(PING);
if(pin == 42)
return _SFR_IO_REG_P(PINL);
if(pin == 43)
return _SFR_IO_REG_P(PINL);
if(pin == 44)
return _SFR_IO_REG_P(PINL);
if(pin == 45)
return _SFR_IO_REG_P(PINL);
if(pin == 46)
return _SFR_IO_REG_P(PINL);
if(pin == 47)
return _SFR_IO_REG_P(PINL);
if(pin == 48)
return _SFR_IO_REG_P(PINL);
if(pin == 49)
return _SFR_IO_REG_P(PINL);
if(pin == 50)
return _SFR_IO_REG_P(PINB);
if(pin == 51)
return _SFR_IO_REG_P(PINB);
if(pin == 52)
return _SFR_IO_REG_P(PINB);
if(pin == 53)
return _SFR_IO_REG_P(PINB);
if(pin == 54)
return _SFR_IO_REG_P(PINF);
if(pin == 55)
return _SFR_IO_REG_P(PINF);
if(pin == 56)
return _SFR_IO_REG_P(PINF);
if(pin == 57)
return _SFR_IO_REG_P(PINF);
if(pin == 58)
return _SFR_IO_REG_P(PINF);
if(pin == 59)
return _SFR_IO_REG_P(PINF);
if(pin == 60)
return _SFR_IO_REG_P(PINF);
if(pin == 61)
return _SFR_IO_REG_P(PINF);
if(pin == 62)
return _SFR_IO_REG_P(PINK);
if(pin == 63)
return _SFR_IO_REG_P(PINK);
if(pin == 64)
return _SFR_IO_REG_P(PINK);
if(pin == 65)
return _SFR_IO_REG_P(PINK);
if(pin == 66)
return _SFR_IO_REG_P(PINK);
if(pin == 67)
return _SFR_IO_REG_P(PINK);
if(pin == 68)
return _SFR_IO_REG_P(PINK);
if(pin == 69)
return _SFR_IO_REG_P(PINK);
return false;
}
#endif
/* Arduino board:
* LilyPadUSB
* LilyPad Arduino USB
* MCU: atmega32u4
*/
#if defined(F_CPU) && (F_CPU+0) == 8000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 12 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x95 && defined(USB_PID) && (USB_PID+0) == 0x9208
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 0) DDRD |= (1 << (2));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 1) DDRD |= (1 << (3));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 2) DDRD |= (1 << (1));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 3) DDRD |= (1 << (0));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRC &= ~(1 << (6));
PORTC &= ~(1 << (6));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (6));
PORTC |= (1 << (6));
} else if(pin == 5) DDRC |= (1 << (6));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 6) DDRD |= (1 << (7));
else if(pin == 7 && mode == INPUT) {
DDRE &= ~(1 << (6));
PORTE &= ~(1 << (6));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (6));
PORTE |= (1 << (6));
} else if(pin == 7) DDRE |= (1 << (6));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 8) DDRB |= (1 << (4));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 9) DDRB |= (1 << (5));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 10) DDRB |= (1 << (6));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (7));
PORTB &= ~(1 << (7));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (7));
PORTB |= (1 << (7));
} else if(pin == 11) DDRB |= (1 << (7));
else if(pin == 12 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 12) DDRD |= (1 << (6));
else if(pin == 13 && mode == INPUT) {
DDRC &= ~(1 << (7));
PORTC &= ~(1 << (7));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (7));
PORTC |= (1 << (7));
} else if(pin == 13) DDRC |= (1 << (7));
else if(pin == 14 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 14) DDRB |= (1 << (3));
else if(pin == 15 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 15) DDRB |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 16) DDRB |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 17) DDRB |= (1 << (0));
else if(pin == 18 && mode == INPUT) {
DDRF &= ~(1 << (7));
PORTF &= ~(1 << (7));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (7));
PORTF |= (1 << (7));
} else if(pin == 18) DDRF |= (1 << (7));
else if(pin == 19 && mode == INPUT) {
DDRF &= ~(1 << (6));
PORTF &= ~(1 << (6));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (6));
PORTF |= (1 << (6));
} else if(pin == 19) DDRF |= (1 << (6));
else if(pin == 20 && mode == INPUT) {
DDRF &= ~(1 << (5));
PORTF &= ~(1 << (5));
} else if(pin == 20 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (5));
PORTF |= (1 << (5));
} else if(pin == 20) DDRF |= (1 << (5));
else if(pin == 21 && mode == INPUT) {
DDRF &= ~(1 << (4));
PORTF &= ~(1 << (4));
} else if(pin == 21 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (4));
PORTF |= (1 << (4));
} else if(pin == 21) DDRF |= (1 << (4));
else if(pin == 22 && mode == INPUT) {
DDRF &= ~(1 << (1));
PORTF &= ~(1 << (1));
} else if(pin == 22 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (1));
PORTF |= (1 << (1));
} else if(pin == 22) DDRF |= (1 << (1));
else if(pin == 23 && mode == INPUT) {
DDRF &= ~(1 << (0));
PORTF &= ~(1 << (0));
} else if(pin == 23 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (0));
PORTF |= (1 << (0));
} else if(pin == 23) DDRF |= (1 << (0));
else if(pin == 24 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 24 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 24) DDRD |= (1 << (4));
else if(pin == 25 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 25 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 25) DDRD |= (1 << (7));
else if(pin == 26 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 26 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 26) DDRB |= (1 << (4));
else if(pin == 27 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 27 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 27) DDRB |= (1 << (5));
else if(pin == 28 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 28 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 28) DDRB |= (1 << (6));
else if(pin == 29 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 29 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 29) DDRD |= (1 << (6));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (2));
else if(pin == 0 && !value) PORTD &= ~(1 << (2));
else if(pin == 1 && value) PORTD |= (1 << (3));
else if(pin == 1 && !value) PORTD &= ~(1 << (3));
else if(pin == 2 && value) PORTD |= (1 << (1));
else if(pin == 2 && !value) PORTD &= ~(1 << (1));
else if(pin == 3 && value) PORTD |= (1 << (0));
else if(pin == 3 && !value) PORTD &= ~(1 << (0));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTC |= (1 << (6));
else if(pin == 5 && !value) PORTC &= ~(1 << (6));
else if(pin == 6 && value) PORTD |= (1 << (7));
else if(pin == 6 && !value) PORTD &= ~(1 << (7));
else if(pin == 7 && value) PORTE |= (1 << (6));
else if(pin == 7 && !value) PORTE &= ~(1 << (6));
else if(pin == 8 && value) PORTB |= (1 << (4));
else if(pin == 8 && !value) PORTB &= ~(1 << (4));
else if(pin == 9 && value) PORTB |= (1 << (5));
else if(pin == 9 && !value) PORTB &= ~(1 << (5));
else if(pin == 10 && value) PORTB |= (1 << (6));
else if(pin == 10 && !value) PORTB &= ~(1 << (6));
else if(pin == 11 && value) PORTB |= (1 << (7));
else if(pin == 11 && !value) PORTB &= ~(1 << (7));
else if(pin == 12 && value) PORTD |= (1 << (6));
else if(pin == 12 && !value) PORTD &= ~(1 << (6));
else if(pin == 13 && value) PORTC |= (1 << (7));
else if(pin == 13 && !value) PORTC &= ~(1 << (7));
else if(pin == 14 && value) PORTB |= (1 << (3));
else if(pin == 14 && !value) PORTB &= ~(1 << (3));
else if(pin == 15 && value) PORTB |= (1 << (1));
else if(pin == 15 && !value) PORTB &= ~(1 << (1));
else if(pin == 16 && value) PORTB |= (1 << (2));
else if(pin == 16 && !value) PORTB &= ~(1 << (2));
else if(pin == 17 && value) PORTB |= (1 << (0));
else if(pin == 17 && !value) PORTB &= ~(1 << (0));
else if(pin == 18 && value) PORTF |= (1 << (7));
else if(pin == 18 && !value) PORTF &= ~(1 << (7));
else if(pin == 19 && value) PORTF |= (1 << (6));
else if(pin == 19 && !value) PORTF &= ~(1 << (6));
else if(pin == 20 && value) PORTF |= (1 << (5));
else if(pin == 20 && !value) PORTF &= ~(1 << (5));
else if(pin == 21 && value) PORTF |= (1 << (4));
else if(pin == 21 && !value) PORTF &= ~(1 << (4));
else if(pin == 22 && value) PORTF |= (1 << (1));
else if(pin == 22 && !value) PORTF &= ~(1 << (1));
else if(pin == 23 && value) PORTF |= (1 << (0));
else if(pin == 23 && !value) PORTF &= ~(1 << (0));
else if(pin == 24 && value) PORTD |= (1 << (4));
else if(pin == 24 && !value) PORTD &= ~(1 << (4));
else if(pin == 25 && value) PORTD |= (1 << (7));
else if(pin == 25 && !value) PORTD &= ~(1 << (7));
else if(pin == 26 && value) PORTB |= (1 << (4));
else if(pin == 26 && !value) PORTB &= ~(1 << (4));
else if(pin == 27 && value) PORTB |= (1 << (5));
else if(pin == 27 && !value) PORTB &= ~(1 << (5));
else if(pin == 28 && value) PORTB |= (1 << (6));
else if(pin == 28 && !value) PORTB &= ~(1 << (6));
else if(pin == 29 && value) PORTD |= (1 << (6));
else if(pin == 29 && !value) PORTD &= ~(1 << (6));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PINC & (1 << (6)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 7) return PINE & (1 << (6)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (7)) ? HIGH : LOW;
else if(pin == 12) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 13) return PINC & (1 << (7)) ? HIGH : LOW;
else if(pin == 14) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 15) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 18) return PINF & (1 << (7)) ? HIGH : LOW;
else if(pin == 19) return PINF & (1 << (6)) ? HIGH : LOW;
else if(pin == 20) return PINF & (1 << (5)) ? HIGH : LOW;
else if(pin == 21) return PINF & (1 << (4)) ? HIGH : LOW;
else if(pin == 22) return PINF & (1 << (1)) ? HIGH : LOW;
else if(pin == 23) return PINF & (1 << (0)) ? HIGH : LOW;
else if(pin == 24) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 25) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 26) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 27) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 28) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 29) return PIND & (1 << (6)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR0A &= ~_BV(COM0B1);
else if(pin == 5) TCCR3A &= ~_BV(COM3A1);
else if(pin == 6) TCCR4C &= ~_BV(COM4D1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR0A &= ~_BV(COM0A1);
else if(pin == 13) TCCR4A &= ~_BV(COM4A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
if(pin == 13)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRC);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRE);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRD);
if(pin == 13)
return _SFR_IO_REG_P(DDRC);
if(pin == 14)
return _SFR_IO_REG_P(DDRB);
if(pin == 15)
return _SFR_IO_REG_P(DDRB);
if(pin == 16)
return _SFR_IO_REG_P(DDRB);
if(pin == 17)
return _SFR_IO_REG_P(DDRB);
if(pin == 18)
return _SFR_IO_REG_P(DDRF);
if(pin == 19)
return _SFR_IO_REG_P(DDRF);
if(pin == 20)
return _SFR_IO_REG_P(DDRF);
if(pin == 21)
return _SFR_IO_REG_P(DDRF);
if(pin == 22)
return _SFR_IO_REG_P(DDRF);
if(pin == 23)
return _SFR_IO_REG_P(DDRF);
if(pin == 24)
return _SFR_IO_REG_P(DDRD);
if(pin == 25)
return _SFR_IO_REG_P(DDRD);
if(pin == 26)
return _SFR_IO_REG_P(DDRB);
if(pin == 27)
return _SFR_IO_REG_P(DDRB);
if(pin == 28)
return _SFR_IO_REG_P(DDRB);
if(pin == 29)
return _SFR_IO_REG_P(DDRD);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTC);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTE);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTD);
if(pin == 13)
return _SFR_IO_REG_P(PORTC);
if(pin == 14)
return _SFR_IO_REG_P(PORTB);
if(pin == 15)
return _SFR_IO_REG_P(PORTB);
if(pin == 16)
return _SFR_IO_REG_P(PORTB);
if(pin == 17)
return _SFR_IO_REG_P(PORTB);
if(pin == 18)
return _SFR_IO_REG_P(PORTF);
if(pin == 19)
return _SFR_IO_REG_P(PORTF);
if(pin == 20)
return _SFR_IO_REG_P(PORTF);
if(pin == 21)
return _SFR_IO_REG_P(PORTF);
if(pin == 22)
return _SFR_IO_REG_P(PORTF);
if(pin == 23)
return _SFR_IO_REG_P(PORTF);
if(pin == 24)
return _SFR_IO_REG_P(PORTD);
if(pin == 25)
return _SFR_IO_REG_P(PORTD);
if(pin == 26)
return _SFR_IO_REG_P(PORTB);
if(pin == 27)
return _SFR_IO_REG_P(PORTB);
if(pin == 28)
return _SFR_IO_REG_P(PORTB);
if(pin == 29)
return _SFR_IO_REG_P(PORTD);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PINC);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PINE);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PIND);
if(pin == 13)
return _SFR_IO_REG_P(PINC);
if(pin == 14)
return _SFR_IO_REG_P(PINB);
if(pin == 15)
return _SFR_IO_REG_P(PINB);
if(pin == 16)
return _SFR_IO_REG_P(PINB);
if(pin == 17)
return _SFR_IO_REG_P(PINB);
if(pin == 18)
return _SFR_IO_REG_P(PINF);
if(pin == 19)
return _SFR_IO_REG_P(PINF);
if(pin == 20)
return _SFR_IO_REG_P(PINF);
if(pin == 21)
return _SFR_IO_REG_P(PINF);
if(pin == 22)
return _SFR_IO_REG_P(PINF);
if(pin == 23)
return _SFR_IO_REG_P(PINF);
if(pin == 24)
return _SFR_IO_REG_P(PIND);
if(pin == 25)
return _SFR_IO_REG_P(PIND);
if(pin == 26)
return _SFR_IO_REG_P(PINB);
if(pin == 27)
return _SFR_IO_REG_P(PINB);
if(pin == 28)
return _SFR_IO_REG_P(PINB);
if(pin == 29)
return _SFR_IO_REG_P(PIND);
return false;
}
#endif
/* Arduino board:
* micro
* Arduino Micro
* MCU: atmega32u4
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 12 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x95 && defined(USB_PID) && (USB_PID+0) == 0x8037
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 0) DDRD |= (1 << (2));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 1) DDRD |= (1 << (3));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 2) DDRD |= (1 << (1));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 3) DDRD |= (1 << (0));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRC &= ~(1 << (6));
PORTC &= ~(1 << (6));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (6));
PORTC |= (1 << (6));
} else if(pin == 5) DDRC |= (1 << (6));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 6) DDRD |= (1 << (7));
else if(pin == 7 && mode == INPUT) {
DDRE &= ~(1 << (6));
PORTE &= ~(1 << (6));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (6));
PORTE |= (1 << (6));
} else if(pin == 7) DDRE |= (1 << (6));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 8) DDRB |= (1 << (4));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 9) DDRB |= (1 << (5));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 10) DDRB |= (1 << (6));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (7));
PORTB &= ~(1 << (7));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (7));
PORTB |= (1 << (7));
} else if(pin == 11) DDRB |= (1 << (7));
else if(pin == 12 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 12) DDRD |= (1 << (6));
else if(pin == 13 && mode == INPUT) {
DDRC &= ~(1 << (7));
PORTC &= ~(1 << (7));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (7));
PORTC |= (1 << (7));
} else if(pin == 13) DDRC |= (1 << (7));
else if(pin == 14 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 14) DDRB |= (1 << (3));
else if(pin == 15 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 15) DDRB |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 16) DDRB |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 17) DDRB |= (1 << (0));
else if(pin == 18 && mode == INPUT) {
DDRF &= ~(1 << (7));
PORTF &= ~(1 << (7));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (7));
PORTF |= (1 << (7));
} else if(pin == 18) DDRF |= (1 << (7));
else if(pin == 19 && mode == INPUT) {
DDRF &= ~(1 << (6));
PORTF &= ~(1 << (6));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (6));
PORTF |= (1 << (6));
} else if(pin == 19) DDRF |= (1 << (6));
else if(pin == 20 && mode == INPUT) {
DDRF &= ~(1 << (5));
PORTF &= ~(1 << (5));
} else if(pin == 20 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (5));
PORTF |= (1 << (5));
} else if(pin == 20) DDRF |= (1 << (5));
else if(pin == 21 && mode == INPUT) {
DDRF &= ~(1 << (4));
PORTF &= ~(1 << (4));
} else if(pin == 21 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (4));
PORTF |= (1 << (4));
} else if(pin == 21) DDRF |= (1 << (4));
else if(pin == 22 && mode == INPUT) {
DDRF &= ~(1 << (1));
PORTF &= ~(1 << (1));
} else if(pin == 22 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (1));
PORTF |= (1 << (1));
} else if(pin == 22) DDRF |= (1 << (1));
else if(pin == 23 && mode == INPUT) {
DDRF &= ~(1 << (0));
PORTF &= ~(1 << (0));
} else if(pin == 23 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (0));
PORTF |= (1 << (0));
} else if(pin == 23) DDRF |= (1 << (0));
else if(pin == 24 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 24 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 24) DDRD |= (1 << (4));
else if(pin == 25 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 25 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 25) DDRD |= (1 << (7));
else if(pin == 26 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 26 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 26) DDRB |= (1 << (4));
else if(pin == 27 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 27 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 27) DDRB |= (1 << (5));
else if(pin == 28 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 28 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 28) DDRB |= (1 << (6));
else if(pin == 29 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 29 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 29) DDRD |= (1 << (6));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (2));
else if(pin == 0 && !value) PORTD &= ~(1 << (2));
else if(pin == 1 && value) PORTD |= (1 << (3));
else if(pin == 1 && !value) PORTD &= ~(1 << (3));
else if(pin == 2 && value) PORTD |= (1 << (1));
else if(pin == 2 && !value) PORTD &= ~(1 << (1));
else if(pin == 3 && value) PORTD |= (1 << (0));
else if(pin == 3 && !value) PORTD &= ~(1 << (0));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTC |= (1 << (6));
else if(pin == 5 && !value) PORTC &= ~(1 << (6));
else if(pin == 6 && value) PORTD |= (1 << (7));
else if(pin == 6 && !value) PORTD &= ~(1 << (7));
else if(pin == 7 && value) PORTE |= (1 << (6));
else if(pin == 7 && !value) PORTE &= ~(1 << (6));
else if(pin == 8 && value) PORTB |= (1 << (4));
else if(pin == 8 && !value) PORTB &= ~(1 << (4));
else if(pin == 9 && value) PORTB |= (1 << (5));
else if(pin == 9 && !value) PORTB &= ~(1 << (5));
else if(pin == 10 && value) PORTB |= (1 << (6));
else if(pin == 10 && !value) PORTB &= ~(1 << (6));
else if(pin == 11 && value) PORTB |= (1 << (7));
else if(pin == 11 && !value) PORTB &= ~(1 << (7));
else if(pin == 12 && value) PORTD |= (1 << (6));
else if(pin == 12 && !value) PORTD &= ~(1 << (6));
else if(pin == 13 && value) PORTC |= (1 << (7));
else if(pin == 13 && !value) PORTC &= ~(1 << (7));
else if(pin == 14 && value) PORTB |= (1 << (3));
else if(pin == 14 && !value) PORTB &= ~(1 << (3));
else if(pin == 15 && value) PORTB |= (1 << (1));
else if(pin == 15 && !value) PORTB &= ~(1 << (1));
else if(pin == 16 && value) PORTB |= (1 << (2));
else if(pin == 16 && !value) PORTB &= ~(1 << (2));
else if(pin == 17 && value) PORTB |= (1 << (0));
else if(pin == 17 && !value) PORTB &= ~(1 << (0));
else if(pin == 18 && value) PORTF |= (1 << (7));
else if(pin == 18 && !value) PORTF &= ~(1 << (7));
else if(pin == 19 && value) PORTF |= (1 << (6));
else if(pin == 19 && !value) PORTF &= ~(1 << (6));
else if(pin == 20 && value) PORTF |= (1 << (5));
else if(pin == 20 && !value) PORTF &= ~(1 << (5));
else if(pin == 21 && value) PORTF |= (1 << (4));
else if(pin == 21 && !value) PORTF &= ~(1 << (4));
else if(pin == 22 && value) PORTF |= (1 << (1));
else if(pin == 22 && !value) PORTF &= ~(1 << (1));
else if(pin == 23 && value) PORTF |= (1 << (0));
else if(pin == 23 && !value) PORTF &= ~(1 << (0));
else if(pin == 24 && value) PORTD |= (1 << (4));
else if(pin == 24 && !value) PORTD &= ~(1 << (4));
else if(pin == 25 && value) PORTD |= (1 << (7));
else if(pin == 25 && !value) PORTD &= ~(1 << (7));
else if(pin == 26 && value) PORTB |= (1 << (4));
else if(pin == 26 && !value) PORTB &= ~(1 << (4));
else if(pin == 27 && value) PORTB |= (1 << (5));
else if(pin == 27 && !value) PORTB &= ~(1 << (5));
else if(pin == 28 && value) PORTB |= (1 << (6));
else if(pin == 28 && !value) PORTB &= ~(1 << (6));
else if(pin == 29 && value) PORTD |= (1 << (6));
else if(pin == 29 && !value) PORTD &= ~(1 << (6));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PINC & (1 << (6)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 7) return PINE & (1 << (6)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (7)) ? HIGH : LOW;
else if(pin == 12) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 13) return PINC & (1 << (7)) ? HIGH : LOW;
else if(pin == 14) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 15) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 18) return PINF & (1 << (7)) ? HIGH : LOW;
else if(pin == 19) return PINF & (1 << (6)) ? HIGH : LOW;
else if(pin == 20) return PINF & (1 << (5)) ? HIGH : LOW;
else if(pin == 21) return PINF & (1 << (4)) ? HIGH : LOW;
else if(pin == 22) return PINF & (1 << (1)) ? HIGH : LOW;
else if(pin == 23) return PINF & (1 << (0)) ? HIGH : LOW;
else if(pin == 24) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 25) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 26) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 27) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 28) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 29) return PIND & (1 << (6)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR0A &= ~_BV(COM0B1);
else if(pin == 5) TCCR3A &= ~_BV(COM3A1);
else if(pin == 6) TCCR4C &= ~_BV(COM4D1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR0A &= ~_BV(COM0A1);
else if(pin == 13) TCCR4A &= ~_BV(COM4A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
if(pin == 13)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRC);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRE);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRD);
if(pin == 13)
return _SFR_IO_REG_P(DDRC);
if(pin == 14)
return _SFR_IO_REG_P(DDRB);
if(pin == 15)
return _SFR_IO_REG_P(DDRB);
if(pin == 16)
return _SFR_IO_REG_P(DDRB);
if(pin == 17)
return _SFR_IO_REG_P(DDRB);
if(pin == 18)
return _SFR_IO_REG_P(DDRF);
if(pin == 19)
return _SFR_IO_REG_P(DDRF);
if(pin == 20)
return _SFR_IO_REG_P(DDRF);
if(pin == 21)
return _SFR_IO_REG_P(DDRF);
if(pin == 22)
return _SFR_IO_REG_P(DDRF);
if(pin == 23)
return _SFR_IO_REG_P(DDRF);
if(pin == 24)
return _SFR_IO_REG_P(DDRD);
if(pin == 25)
return _SFR_IO_REG_P(DDRD);
if(pin == 26)
return _SFR_IO_REG_P(DDRB);
if(pin == 27)
return _SFR_IO_REG_P(DDRB);
if(pin == 28)
return _SFR_IO_REG_P(DDRB);
if(pin == 29)
return _SFR_IO_REG_P(DDRD);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTC);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTE);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTD);
if(pin == 13)
return _SFR_IO_REG_P(PORTC);
if(pin == 14)
return _SFR_IO_REG_P(PORTB);
if(pin == 15)
return _SFR_IO_REG_P(PORTB);
if(pin == 16)
return _SFR_IO_REG_P(PORTB);
if(pin == 17)
return _SFR_IO_REG_P(PORTB);
if(pin == 18)
return _SFR_IO_REG_P(PORTF);
if(pin == 19)
return _SFR_IO_REG_P(PORTF);
if(pin == 20)
return _SFR_IO_REG_P(PORTF);
if(pin == 21)
return _SFR_IO_REG_P(PORTF);
if(pin == 22)
return _SFR_IO_REG_P(PORTF);
if(pin == 23)
return _SFR_IO_REG_P(PORTF);
if(pin == 24)
return _SFR_IO_REG_P(PORTD);
if(pin == 25)
return _SFR_IO_REG_P(PORTD);
if(pin == 26)
return _SFR_IO_REG_P(PORTB);
if(pin == 27)
return _SFR_IO_REG_P(PORTB);
if(pin == 28)
return _SFR_IO_REG_P(PORTB);
if(pin == 29)
return _SFR_IO_REG_P(PORTD);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PINC);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PINE);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PIND);
if(pin == 13)
return _SFR_IO_REG_P(PINC);
if(pin == 14)
return _SFR_IO_REG_P(PINB);
if(pin == 15)
return _SFR_IO_REG_P(PINB);
if(pin == 16)
return _SFR_IO_REG_P(PINB);
if(pin == 17)
return _SFR_IO_REG_P(PINB);
if(pin == 18)
return _SFR_IO_REG_P(PINF);
if(pin == 19)
return _SFR_IO_REG_P(PINF);
if(pin == 20)
return _SFR_IO_REG_P(PINF);
if(pin == 21)
return _SFR_IO_REG_P(PINF);
if(pin == 22)
return _SFR_IO_REG_P(PINF);
if(pin == 23)
return _SFR_IO_REG_P(PINF);
if(pin == 24)
return _SFR_IO_REG_P(PIND);
if(pin == 25)
return _SFR_IO_REG_P(PIND);
if(pin == 26)
return _SFR_IO_REG_P(PINB);
if(pin == 27)
return _SFR_IO_REG_P(PINB);
if(pin == 28)
return _SFR_IO_REG_P(PINB);
if(pin == 29)
return _SFR_IO_REG_P(PIND);
return false;
}
#endif
/* Arduino board:
* leonardo
* Arduino Leonardo
* MCU: atmega32u4
*/
#if defined(F_CPU) && (F_CPU+0) == 16000000L && defined(NUM_ANALOG_INPUTS) && (NUM_ANALOG_INPUTS+0) == 12 && defined(SIGNATURE_1) && (SIGNATURE_1+0) == 0x95 && defined(USB_PID) && (USB_PID+0) == 0x8036
#ifdef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics have matched multiple boards. The header may be out of date."
#endif
#define _DIGITALIO_MATCHED_BOARD
__attribute__((always_inline))
static inline void pinModeFast(uint8_t pin, uint8_t mode) {
if(!__builtin_constant_p(pin)) {
pinMode(pin, mode);
}
else if(pin == 0 && mode == INPUT) {
DDRD &= ~(1 << (2));
PORTD &= ~(1 << (2));
} else if(pin == 0 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (2));
PORTD |= (1 << (2));
} else if(pin == 0) DDRD |= (1 << (2));
else if(pin == 1 && mode == INPUT) {
DDRD &= ~(1 << (3));
PORTD &= ~(1 << (3));
} else if(pin == 1 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (3));
PORTD |= (1 << (3));
} else if(pin == 1) DDRD |= (1 << (3));
else if(pin == 2 && mode == INPUT) {
DDRD &= ~(1 << (1));
PORTD &= ~(1 << (1));
} else if(pin == 2 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (1));
PORTD |= (1 << (1));
} else if(pin == 2) DDRD |= (1 << (1));
else if(pin == 3 && mode == INPUT) {
DDRD &= ~(1 << (0));
PORTD &= ~(1 << (0));
} else if(pin == 3 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (0));
PORTD |= (1 << (0));
} else if(pin == 3) DDRD |= (1 << (0));
else if(pin == 4 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 4 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 4) DDRD |= (1 << (4));
else if(pin == 5 && mode == INPUT) {
DDRC &= ~(1 << (6));
PORTC &= ~(1 << (6));
} else if(pin == 5 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (6));
PORTC |= (1 << (6));
} else if(pin == 5) DDRC |= (1 << (6));
else if(pin == 6 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 6 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 6) DDRD |= (1 << (7));
else if(pin == 7 && mode == INPUT) {
DDRE &= ~(1 << (6));
PORTE &= ~(1 << (6));
} else if(pin == 7 && mode == INPUT_PULLUP) {
DDRE &= ~(1 << (6));
PORTE |= (1 << (6));
} else if(pin == 7) DDRE |= (1 << (6));
else if(pin == 8 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 8 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 8) DDRB |= (1 << (4));
else if(pin == 9 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 9 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 9) DDRB |= (1 << (5));
else if(pin == 10 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 10 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 10) DDRB |= (1 << (6));
else if(pin == 11 && mode == INPUT) {
DDRB &= ~(1 << (7));
PORTB &= ~(1 << (7));
} else if(pin == 11 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (7));
PORTB |= (1 << (7));
} else if(pin == 11) DDRB |= (1 << (7));
else if(pin == 12 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 12 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 12) DDRD |= (1 << (6));
else if(pin == 13 && mode == INPUT) {
DDRC &= ~(1 << (7));
PORTC &= ~(1 << (7));
} else if(pin == 13 && mode == INPUT_PULLUP) {
DDRC &= ~(1 << (7));
PORTC |= (1 << (7));
} else if(pin == 13) DDRC |= (1 << (7));
else if(pin == 14 && mode == INPUT) {
DDRB &= ~(1 << (3));
PORTB &= ~(1 << (3));
} else if(pin == 14 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (3));
PORTB |= (1 << (3));
} else if(pin == 14) DDRB |= (1 << (3));
else if(pin == 15 && mode == INPUT) {
DDRB &= ~(1 << (1));
PORTB &= ~(1 << (1));
} else if(pin == 15 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (1));
PORTB |= (1 << (1));
} else if(pin == 15) DDRB |= (1 << (1));
else if(pin == 16 && mode == INPUT) {
DDRB &= ~(1 << (2));
PORTB &= ~(1 << (2));
} else if(pin == 16 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (2));
PORTB |= (1 << (2));
} else if(pin == 16) DDRB |= (1 << (2));
else if(pin == 17 && mode == INPUT) {
DDRB &= ~(1 << (0));
PORTB &= ~(1 << (0));
} else if(pin == 17 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (0));
PORTB |= (1 << (0));
} else if(pin == 17) DDRB |= (1 << (0));
else if(pin == 18 && mode == INPUT) {
DDRF &= ~(1 << (7));
PORTF &= ~(1 << (7));
} else if(pin == 18 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (7));
PORTF |= (1 << (7));
} else if(pin == 18) DDRF |= (1 << (7));
else if(pin == 19 && mode == INPUT) {
DDRF &= ~(1 << (6));
PORTF &= ~(1 << (6));
} else if(pin == 19 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (6));
PORTF |= (1 << (6));
} else if(pin == 19) DDRF |= (1 << (6));
else if(pin == 20 && mode == INPUT) {
DDRF &= ~(1 << (5));
PORTF &= ~(1 << (5));
} else if(pin == 20 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (5));
PORTF |= (1 << (5));
} else if(pin == 20) DDRF |= (1 << (5));
else if(pin == 21 && mode == INPUT) {
DDRF &= ~(1 << (4));
PORTF &= ~(1 << (4));
} else if(pin == 21 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (4));
PORTF |= (1 << (4));
} else if(pin == 21) DDRF |= (1 << (4));
else if(pin == 22 && mode == INPUT) {
DDRF &= ~(1 << (1));
PORTF &= ~(1 << (1));
} else if(pin == 22 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (1));
PORTF |= (1 << (1));
} else if(pin == 22) DDRF |= (1 << (1));
else if(pin == 23 && mode == INPUT) {
DDRF &= ~(1 << (0));
PORTF &= ~(1 << (0));
} else if(pin == 23 && mode == INPUT_PULLUP) {
DDRF &= ~(1 << (0));
PORTF |= (1 << (0));
} else if(pin == 23) DDRF |= (1 << (0));
else if(pin == 24 && mode == INPUT) {
DDRD &= ~(1 << (4));
PORTD &= ~(1 << (4));
} else if(pin == 24 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (4));
PORTD |= (1 << (4));
} else if(pin == 24) DDRD |= (1 << (4));
else if(pin == 25 && mode == INPUT) {
DDRD &= ~(1 << (7));
PORTD &= ~(1 << (7));
} else if(pin == 25 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (7));
PORTD |= (1 << (7));
} else if(pin == 25) DDRD |= (1 << (7));
else if(pin == 26 && mode == INPUT) {
DDRB &= ~(1 << (4));
PORTB &= ~(1 << (4));
} else if(pin == 26 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (4));
PORTB |= (1 << (4));
} else if(pin == 26) DDRB |= (1 << (4));
else if(pin == 27 && mode == INPUT) {
DDRB &= ~(1 << (5));
PORTB &= ~(1 << (5));
} else if(pin == 27 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (5));
PORTB |= (1 << (5));
} else if(pin == 27) DDRB |= (1 << (5));
else if(pin == 28 && mode == INPUT) {
DDRB &= ~(1 << (6));
PORTB &= ~(1 << (6));
} else if(pin == 28 && mode == INPUT_PULLUP) {
DDRB &= ~(1 << (6));
PORTB |= (1 << (6));
} else if(pin == 28) DDRB |= (1 << (6));
else if(pin == 29 && mode == INPUT) {
DDRD &= ~(1 << (6));
PORTD &= ~(1 << (6));
} else if(pin == 29 && mode == INPUT_PULLUP) {
DDRD &= ~(1 << (6));
PORTD |= (1 << (6));
} else if(pin == 29) DDRD |= (1 << (6));
}
__attribute__((always_inline))
static inline void digitalWriteFast(uint8_t pin, uint8_t value) {
if(!__builtin_constant_p(pin)) {
digitalWrite(pin, value);
}
else if(pin == 0 && value) PORTD |= (1 << (2));
else if(pin == 0 && !value) PORTD &= ~(1 << (2));
else if(pin == 1 && value) PORTD |= (1 << (3));
else if(pin == 1 && !value) PORTD &= ~(1 << (3));
else if(pin == 2 && value) PORTD |= (1 << (1));
else if(pin == 2 && !value) PORTD &= ~(1 << (1));
else if(pin == 3 && value) PORTD |= (1 << (0));
else if(pin == 3 && !value) PORTD &= ~(1 << (0));
else if(pin == 4 && value) PORTD |= (1 << (4));
else if(pin == 4 && !value) PORTD &= ~(1 << (4));
else if(pin == 5 && value) PORTC |= (1 << (6));
else if(pin == 5 && !value) PORTC &= ~(1 << (6));
else if(pin == 6 && value) PORTD |= (1 << (7));
else if(pin == 6 && !value) PORTD &= ~(1 << (7));
else if(pin == 7 && value) PORTE |= (1 << (6));
else if(pin == 7 && !value) PORTE &= ~(1 << (6));
else if(pin == 8 && value) PORTB |= (1 << (4));
else if(pin == 8 && !value) PORTB &= ~(1 << (4));
else if(pin == 9 && value) PORTB |= (1 << (5));
else if(pin == 9 && !value) PORTB &= ~(1 << (5));
else if(pin == 10 && value) PORTB |= (1 << (6));
else if(pin == 10 && !value) PORTB &= ~(1 << (6));
else if(pin == 11 && value) PORTB |= (1 << (7));
else if(pin == 11 && !value) PORTB &= ~(1 << (7));
else if(pin == 12 && value) PORTD |= (1 << (6));
else if(pin == 12 && !value) PORTD &= ~(1 << (6));
else if(pin == 13 && value) PORTC |= (1 << (7));
else if(pin == 13 && !value) PORTC &= ~(1 << (7));
else if(pin == 14 && value) PORTB |= (1 << (3));
else if(pin == 14 && !value) PORTB &= ~(1 << (3));
else if(pin == 15 && value) PORTB |= (1 << (1));
else if(pin == 15 && !value) PORTB &= ~(1 << (1));
else if(pin == 16 && value) PORTB |= (1 << (2));
else if(pin == 16 && !value) PORTB &= ~(1 << (2));
else if(pin == 17 && value) PORTB |= (1 << (0));
else if(pin == 17 && !value) PORTB &= ~(1 << (0));
else if(pin == 18 && value) PORTF |= (1 << (7));
else if(pin == 18 && !value) PORTF &= ~(1 << (7));
else if(pin == 19 && value) PORTF |= (1 << (6));
else if(pin == 19 && !value) PORTF &= ~(1 << (6));
else if(pin == 20 && value) PORTF |= (1 << (5));
else if(pin == 20 && !value) PORTF &= ~(1 << (5));
else if(pin == 21 && value) PORTF |= (1 << (4));
else if(pin == 21 && !value) PORTF &= ~(1 << (4));
else if(pin == 22 && value) PORTF |= (1 << (1));
else if(pin == 22 && !value) PORTF &= ~(1 << (1));
else if(pin == 23 && value) PORTF |= (1 << (0));
else if(pin == 23 && !value) PORTF &= ~(1 << (0));
else if(pin == 24 && value) PORTD |= (1 << (4));
else if(pin == 24 && !value) PORTD &= ~(1 << (4));
else if(pin == 25 && value) PORTD |= (1 << (7));
else if(pin == 25 && !value) PORTD &= ~(1 << (7));
else if(pin == 26 && value) PORTB |= (1 << (4));
else if(pin == 26 && !value) PORTB &= ~(1 << (4));
else if(pin == 27 && value) PORTB |= (1 << (5));
else if(pin == 27 && !value) PORTB &= ~(1 << (5));
else if(pin == 28 && value) PORTB |= (1 << (6));
else if(pin == 28 && !value) PORTB &= ~(1 << (6));
else if(pin == 29 && value) PORTD |= (1 << (6));
else if(pin == 29 && !value) PORTD &= ~(1 << (6));
}
__attribute__((always_inline))
static inline int digitalReadFast(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return digitalRead(pin);
}
else if(pin == 0) return PIND & (1 << (2)) ? HIGH : LOW;
else if(pin == 1) return PIND & (1 << (3)) ? HIGH : LOW;
else if(pin == 2) return PIND & (1 << (1)) ? HIGH : LOW;
else if(pin == 3) return PIND & (1 << (0)) ? HIGH : LOW;
else if(pin == 4) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 5) return PINC & (1 << (6)) ? HIGH : LOW;
else if(pin == 6) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 7) return PINE & (1 << (6)) ? HIGH : LOW;
else if(pin == 8) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 9) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 10) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 11) return PINB & (1 << (7)) ? HIGH : LOW;
else if(pin == 12) return PIND & (1 << (6)) ? HIGH : LOW;
else if(pin == 13) return PINC & (1 << (7)) ? HIGH : LOW;
else if(pin == 14) return PINB & (1 << (3)) ? HIGH : LOW;
else if(pin == 15) return PINB & (1 << (1)) ? HIGH : LOW;
else if(pin == 16) return PINB & (1 << (2)) ? HIGH : LOW;
else if(pin == 17) return PINB & (1 << (0)) ? HIGH : LOW;
else if(pin == 18) return PINF & (1 << (7)) ? HIGH : LOW;
else if(pin == 19) return PINF & (1 << (6)) ? HIGH : LOW;
else if(pin == 20) return PINF & (1 << (5)) ? HIGH : LOW;
else if(pin == 21) return PINF & (1 << (4)) ? HIGH : LOW;
else if(pin == 22) return PINF & (1 << (1)) ? HIGH : LOW;
else if(pin == 23) return PINF & (1 << (0)) ? HIGH : LOW;
else if(pin == 24) return PIND & (1 << (4)) ? HIGH : LOW;
else if(pin == 25) return PIND & (1 << (7)) ? HIGH : LOW;
else if(pin == 26) return PINB & (1 << (4)) ? HIGH : LOW;
else if(pin == 27) return PINB & (1 << (5)) ? HIGH : LOW;
else if(pin == 28) return PINB & (1 << (6)) ? HIGH : LOW;
else if(pin == 29) return PIND & (1 << (6)) ? HIGH : LOW;
return LOW;
}
__attribute__((always_inline))
static inline void noAnalogWrite(uint8_t pin) {
if(!__builtin_constant_p(pin)) {
return; // noAnalogWrite is taken care of by digitalWrite() for variables
}
else if(pin == 3) TCCR0A &= ~_BV(COM0B1);
else if(pin == 5) TCCR3A &= ~_BV(COM3A1);
else if(pin == 6) TCCR4C &= ~_BV(COM4D1);
else if(pin == 9) TCCR1A &= ~_BV(COM1A1);
else if(pin == 10) TCCR1A &= ~_BV(COM1B1);
else if(pin == 11) TCCR0A &= ~_BV(COM0A1);
else if(pin == 13) TCCR4A &= ~_BV(COM4A1);
}
__attribute__((always_inline))
static inline bool _isPWMPin(uint8_t pin) {
if(pin == 3)
return true;
if(pin == 5)
return true;
if(pin == 6)
return true;
if(pin == 9)
return true;
if(pin == 10)
return true;
if(pin == 11)
return true;
if(pin == 13)
return true;
return false;
}
__attribute__((always_inline))
static inline bool _directionIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(DDRD);
if(pin == 1)
return _SFR_IO_REG_P(DDRD);
if(pin == 2)
return _SFR_IO_REG_P(DDRD);
if(pin == 3)
return _SFR_IO_REG_P(DDRD);
if(pin == 4)
return _SFR_IO_REG_P(DDRD);
if(pin == 5)
return _SFR_IO_REG_P(DDRC);
if(pin == 6)
return _SFR_IO_REG_P(DDRD);
if(pin == 7)
return _SFR_IO_REG_P(DDRE);
if(pin == 8)
return _SFR_IO_REG_P(DDRB);
if(pin == 9)
return _SFR_IO_REG_P(DDRB);
if(pin == 10)
return _SFR_IO_REG_P(DDRB);
if(pin == 11)
return _SFR_IO_REG_P(DDRB);
if(pin == 12)
return _SFR_IO_REG_P(DDRD);
if(pin == 13)
return _SFR_IO_REG_P(DDRC);
if(pin == 14)
return _SFR_IO_REG_P(DDRB);
if(pin == 15)
return _SFR_IO_REG_P(DDRB);
if(pin == 16)
return _SFR_IO_REG_P(DDRB);
if(pin == 17)
return _SFR_IO_REG_P(DDRB);
if(pin == 18)
return _SFR_IO_REG_P(DDRF);
if(pin == 19)
return _SFR_IO_REG_P(DDRF);
if(pin == 20)
return _SFR_IO_REG_P(DDRF);
if(pin == 21)
return _SFR_IO_REG_P(DDRF);
if(pin == 22)
return _SFR_IO_REG_P(DDRF);
if(pin == 23)
return _SFR_IO_REG_P(DDRF);
if(pin == 24)
return _SFR_IO_REG_P(DDRD);
if(pin == 25)
return _SFR_IO_REG_P(DDRD);
if(pin == 26)
return _SFR_IO_REG_P(DDRB);
if(pin == 27)
return _SFR_IO_REG_P(DDRB);
if(pin == 28)
return _SFR_IO_REG_P(DDRB);
if(pin == 29)
return _SFR_IO_REG_P(DDRD);
return false;
}
__attribute__((always_inline))
static inline bool _outputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PORTD);
if(pin == 1)
return _SFR_IO_REG_P(PORTD);
if(pin == 2)
return _SFR_IO_REG_P(PORTD);
if(pin == 3)
return _SFR_IO_REG_P(PORTD);
if(pin == 4)
return _SFR_IO_REG_P(PORTD);
if(pin == 5)
return _SFR_IO_REG_P(PORTC);
if(pin == 6)
return _SFR_IO_REG_P(PORTD);
if(pin == 7)
return _SFR_IO_REG_P(PORTE);
if(pin == 8)
return _SFR_IO_REG_P(PORTB);
if(pin == 9)
return _SFR_IO_REG_P(PORTB);
if(pin == 10)
return _SFR_IO_REG_P(PORTB);
if(pin == 11)
return _SFR_IO_REG_P(PORTB);
if(pin == 12)
return _SFR_IO_REG_P(PORTD);
if(pin == 13)
return _SFR_IO_REG_P(PORTC);
if(pin == 14)
return _SFR_IO_REG_P(PORTB);
if(pin == 15)
return _SFR_IO_REG_P(PORTB);
if(pin == 16)
return _SFR_IO_REG_P(PORTB);
if(pin == 17)
return _SFR_IO_REG_P(PORTB);
if(pin == 18)
return _SFR_IO_REG_P(PORTF);
if(pin == 19)
return _SFR_IO_REG_P(PORTF);
if(pin == 20)
return _SFR_IO_REG_P(PORTF);
if(pin == 21)
return _SFR_IO_REG_P(PORTF);
if(pin == 22)
return _SFR_IO_REG_P(PORTF);
if(pin == 23)
return _SFR_IO_REG_P(PORTF);
if(pin == 24)
return _SFR_IO_REG_P(PORTD);
if(pin == 25)
return _SFR_IO_REG_P(PORTD);
if(pin == 26)
return _SFR_IO_REG_P(PORTB);
if(pin == 27)
return _SFR_IO_REG_P(PORTB);
if(pin == 28)
return _SFR_IO_REG_P(PORTB);
if(pin == 29)
return _SFR_IO_REG_P(PORTD);
return false;
}
__attribute__((always_inline))
static inline bool _inputIsAtomic(uint8_t pin) {
if(pin == 0)
return _SFR_IO_REG_P(PIND);
if(pin == 1)
return _SFR_IO_REG_P(PIND);
if(pin == 2)
return _SFR_IO_REG_P(PIND);
if(pin == 3)
return _SFR_IO_REG_P(PIND);
if(pin == 4)
return _SFR_IO_REG_P(PIND);
if(pin == 5)
return _SFR_IO_REG_P(PINC);
if(pin == 6)
return _SFR_IO_REG_P(PIND);
if(pin == 7)
return _SFR_IO_REG_P(PINE);
if(pin == 8)
return _SFR_IO_REG_P(PINB);
if(pin == 9)
return _SFR_IO_REG_P(PINB);
if(pin == 10)
return _SFR_IO_REG_P(PINB);
if(pin == 11)
return _SFR_IO_REG_P(PINB);
if(pin == 12)
return _SFR_IO_REG_P(PIND);
if(pin == 13)
return _SFR_IO_REG_P(PINC);
if(pin == 14)
return _SFR_IO_REG_P(PINB);
if(pin == 15)
return _SFR_IO_REG_P(PINB);
if(pin == 16)
return _SFR_IO_REG_P(PINB);
if(pin == 17)
return _SFR_IO_REG_P(PINB);
if(pin == 18)
return _SFR_IO_REG_P(PINF);
if(pin == 19)
return _SFR_IO_REG_P(PINF);
if(pin == 20)
return _SFR_IO_REG_P(PINF);
if(pin == 21)
return _SFR_IO_REG_P(PINF);
if(pin == 22)
return _SFR_IO_REG_P(PINF);
if(pin == 23)
return _SFR_IO_REG_P(PINF);
if(pin == 24)
return _SFR_IO_REG_P(PIND);
if(pin == 25)
return _SFR_IO_REG_P(PIND);
if(pin == 26)
return _SFR_IO_REG_P(PINB);
if(pin == 27)
return _SFR_IO_REG_P(PINB);
if(pin == 28)
return _SFR_IO_REG_P(PINB);
if(pin == 29)
return _SFR_IO_REG_P(PIND);
return false;
}
#endif
#ifndef _DIGITALIO_MATCHED_BOARD
#error "This header's Arduino configuration heuristics couldn't match this board configuration. No fast I/O is available. The header may be out of date."
#endif
#undef _DIGITALIO_MATCHED_BOARD
#ifndef DIGITALIO_MANUAL
#define digitalWrite digitalWriteSafe
#define digitalRead digitalReadSafe
#define pinMode pinModeSafe
#endif
#endif
#endif