30#if defined(__AVR__) || defined(DOXYGEN)
35 volatile uint8_t *
pin;
36 volatile uint8_t *
ddr;
42#define GPIO_PIN(reg, bit) \
44 &PIN##reg, &DDR##reg, &PORT##reg, 1 << bit \
56static inline __attribute__((always_inline))
void badPinCheck(uint8_t pin)
58 if (!__builtin_constant_p(pin) || pin >= NUM_DIGITAL_PINS)
68static inline __attribute__((always_inline))
volatile uint8_t *ddrReg(uint8_t pin)
78static inline __attribute__((always_inline)) uint8_t pinMask(uint8_t pin)
88static inline __attribute__((always_inline))
volatile uint8_t *pinReg(uint8_t pin)
98static inline __attribute__((always_inline))
volatile uint8_t *portReg(uint8_t pin)
112 if (address >
reinterpret_cast<uint8_t *
>(0X3F))
125 if (address >
reinterpret_cast<uint8_t *
>(0X3F))
135static inline __attribute__((always_inline))
bool fastDigitalRead(uint8_t pin)
137 return *pinReg(pin) & pinMask(pin);
146static inline __attribute__((always_inline))
void fastDigitalToggle(uint8_t pin)
148 if (pinReg(pin) >
reinterpret_cast<uint8_t *
>(0X3F))
151 *pinReg(pin) = pinMask(pin);
156 *pinReg(pin) |= pinMask(pin);
164static inline __attribute__((always_inline))
void fastDigitalWrite(uint8_t pin,
bool level)
166 fastBitWriteSafe(portReg(pin), pinMask(pin),
level);
173static inline __attribute__((always_inline))
void fastDdrWrite(uint8_t pin,
bool level)
175 fastBitWriteSafe(ddrReg(pin), pinMask(pin),
level);
187 fastDdrWrite(pin,
mode == OUTPUT);
190 fastDigitalWrite(pin,
mode == INPUT_PULLUP);
194#if defined(CORE_TEENSY)
200static inline __attribute__((always_inline))
bool fastDigitalRead(uint8_t pin)
202 return *portInputRegister(pin);
213 *portSetRegister(pin) = 1;
217 *portClearRegister(pin) = 1;
220#elif defined(__SAM3X8E__) || defined(__SAM3X8H__)
226static inline __attribute__((always_inline))
bool fastDigitalRead(uint8_t pin)
228 return g_APinDescription[pin].pPort->PIO_PDSR & g_APinDescription[pin].ulPin;
235static inline __attribute__((always_inline))
void fastDigitalWrite(uint8_t pin,
bool value)
239 g_APinDescription[pin].pPort->PIO_SODR = g_APinDescription[pin].ulPin;
243 g_APinDescription[pin].pPort->PIO_CODR = g_APinDescription[pin].ulPin;
246#elif defined(ESP8266)
252static inline __attribute__((always_inline))
void fastDigitalWrite(uint8_t pin, uint8_t val)
282static inline __attribute__((always_inline))
bool fastDigitalRead(uint8_t pin)
296inline void fastDigitalWrite(uint8_t pin,
bool value)
298 digitalWrite(pin,
value);
301inline bool fastDigitalRead(uint8_t pin)
303 return digitalRead(pin);
307inline void fastDigitalToggle(uint8_t pin)
309 fastDigitalWrite(pin, !fastDigitalRead(pin));
312inline void fastPinMode(uint8_t pin, uint8_t
mode)
324#define fastPinConfig(pin, mode, level) \
326 fastPinMode(pin, mode); \
327 fastDigitalWrite(pin, level); \
334template <u
int8_t PinNumber>
class DigitalPin
398 fastPinMode(PinNumber,
mode);
404 return fastDigitalRead(PinNumber);
414 fastDigitalToggle(PinNumber);
423 fastDigitalWrite(PinNumber,
value);
static const GpioPinMap_t GpioPinMap[]
Definition AvrDevelopersGpioPinMap.h:3
union csd_t __attribute__
static bool value
Definition DigitalPin.h:210
static uint8_t mode
Definition DigitalPin.h:186
void badPinNumber(void) __attribute__((error("Pin number is too large or not a const ant")))
static uint8_t bool level
Definition DigitalPin.h:110
static uint8_t mask
Definition DigitalPin.h:109
Definition DigitalPin.h:34
volatile uint8_t * ddr
Definition DigitalPin.h:36
volatile uint8_t * port
Definition DigitalPin.h:37
volatile uint8_t * pin
Definition DigitalPin.h:35
uint8_t mask
Definition DigitalPin.h:38