30 #if defined(__AVR__) || defined(DOXYGEN)
34 volatile uint8_t*
pin;
35 volatile uint8_t*
ddr;
41 #define GPIO_PIN(reg, bit) {&PIN##reg, &DDR##reg, &PORT##reg, 1 << bit}
44 #include "boards/GpioPinMap.h"
48 __attribute__((error("Pin number is too large or not a constant")));
53 static inline __attribute__((always_inline))
55 if (!__builtin_constant_p(pin) || pin >= NUM_DIGITAL_PINS) {
64 static inline __attribute__((always_inline))
65 volatile uint8_t*
ddrReg(uint8_t pin) {
67 return GpioPinMap[pin].ddr;
74 static inline __attribute__((always_inline))
77 return GpioPinMap[pin].mask;
84 static inline __attribute__((always_inline))
85 volatile uint8_t*
pinReg(uint8_t pin) {
87 return GpioPinMap[pin].pin;
94 static inline __attribute__((always_inline))
97 return GpioPinMap[pin].port;
105 static inline __attribute__((always_inline))
108 if (address > reinterpret_cast<uint8_t*>(0X3F)) {
117 if (address > reinterpret_cast<uint8_t*>(0X3F)) {
126 static inline __attribute__((always_inline))
137 static inline __attribute__((always_inline))
139 if (
pinReg(pin) > reinterpret_cast<uint8_t*>(0X3F)) {
152 static inline __attribute__((always_inline))
161 static inline __attribute__((always_inline))
173 static inline __attribute__((always_inline))
176 if (mode != OUTPUT) {
180 #else // defined(__AVR__)
181 #if defined(CORE_TEENSY)
187 static inline __attribute__((always_inline))
189 return *portInputRegister(pin);
196 static inline __attribute__((always_inline))
199 *portSetRegister(pin) = 1;
201 *portClearRegister(pin) = 1;
204 #elif defined(__SAM3X8E__) || defined(__SAM3X8H__)
210 static inline __attribute__((always_inline))
212 return g_APinDescription[pin].pPort->PIO_PDSR & g_APinDescription[pin].ulPin;
219 static inline __attribute__((always_inline))
222 g_APinDescription[pin].pPort->PIO_SODR = g_APinDescription[pin].ulPin;
224 g_APinDescription[pin].pPort->PIO_CODR = g_APinDescription[pin].ulPin;
227 #elif defined(ESP8266)
233 static inline __attribute__((always_inline))
241 }
else if (pin == 16) {
254 static inline __attribute__((always_inline))
258 }
else if (pin == 16) {
266 digitalWrite(pin, value);
270 return digitalRead(pin);
272 #endif // CORE_TEENSY
289 #define fastPinConfig(pin, mode, level)\
290 {fastPinMode(pin, mode); fastDigitalWrite(pin, level);}
296 template<u
int8_t PinNumber>
317 inline operator bool () const __attribute__((always_inline)) {
326 inline __attribute__((always_inline))
334 inline __attribute__((always_inline))
340 inline __attribute__((always_inline))
350 inline __attribute__((always_inline))
356 inline __attribute__((always_inline))
366 inline __attribute__((always_inline))
375 inline __attribute__((always_inline))
380 #endif // DigitalPin_h
DigitalPin & operator=(bool value)
static volatile uint8_t * portReg(uint8_t pin)
#define fastPinConfig(pin, mode, level)
void config(uint8_t mode, bool level)
static void fastDigitalWrite(uint8_t pin, bool level)
static volatile uint8_t * pinReg(uint8_t pin)
static bool fastDigitalRead(uint8_t pin)
static volatile uint8_t * ddrReg(uint8_t pin)
static void fastDdrWrite(uint8_t pin, bool level)
static void fastDigitalToggle(uint8_t pin)
static void fastPinMode(uint8_t pin, uint8_t mode)
static void badPinCheck(uint8_t pin)
static void fastBitWriteSafe(volatile uint8_t *address, uint8_t mask, bool level)
static uint8_t pinMask(uint8_t pin)