27#if !defined(_usb_h_) || defined(_avrpins_h_)
28#error "Never include avrpins.h directly; include Usb.h instead"
35#define pgm_read_pointer(p) pgm_read_word(p)
38#if !defined(BOARD_MEGA_ADK) && defined(__AVR_ATmega2560__) && (USE_UHS_MEGA_ADK || defined(ARDUINO_AVR_ADK))
40#elif !defined(BOARD_BLACK_WIDDOW) && USE_UHS_BLACK_WIDDOW
41#define BOARD_BLACK_WIDDOW
96#define MAKE_PORT(portName, ddrName, pinName, className, ID) \
99 typedef uint8_t DataT;\
101 static void Write(DataT value){portName = value;}\
102 static void ClearAndSet(DataT clearMask, DataT value){portName = (portName & ~clearMask) | value;}\
103 static DataT Read(){return portName;}\
104 static void DirWrite(DataT value){ddrName = value;}\
105 static DataT DirRead(){return ddrName;}\
106 static void Set(DataT value){portName |= value;}\
107 static void Clear(DataT value){portName &= ~value;}\
108 static void Toggle(DataT value){portName ^= value;}\
109 static void DirSet(DataT value){ddrName |= value;}\
110 static void DirClear(DataT value){ddrName &= ~value;}\
111 static void DirToggle(DataT value){ddrName ^= value;}\
112 static DataT PinRead(){return pinName;}\
114 enum{Width=sizeof(DataT)*8};\
118#define MAKE_TCCR(TccrName, className) \
121 typedef uint8_t DataT;\
123 static void Write(DataT value){TccrName = value;}\
124 static void ClearAndSet(DataT clearMask, DataT value){TccrName = (TccrName & ~clearMask) | value;}\
125 static DataT Read(){return TccrName;}\
126 static void Set(DataT value){TccrName |= value;}\
127 static void Clear(DataT value){TccrName &= ~value;}\
128 static void Toggle(DataT value){TccrName ^= value;}\
129 enum{Width=sizeof(DataT)*8};\
185template<
typename PORT, u
int8_t PIN>
211 static void Clear() {
232 while(
IsSet() == 0) {
246template<
typename TCCR, u
int8_t COM>
260 static void Clear() {
428template<
typename Tp_pin,
typename Tc_bit>
459#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
528#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
556#elif defined(CORE_TEENSY) && defined(__AVR_ATmega32U4__)
586#elif defined(__AVR_ATmega32U4__)
626#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
677#elif defined(ARDUINO_AVR_BALANDUINO) && (defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284P__))
683#if BALANDUINO_REVISION < 13
705#if BALANDUINO_REVISION < 13
730#elif defined(ARDUINO_AVR_UNO_PRO) && defined(__AVR_ATmega1284P__)
768#elif defined(MIGHTYCORE)
770#if defined(BOBUINO_PINOUT)
828 #if defined(SANGUINO_PINOUT)
850#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
889#error "Please define board in avrpins.h"
893#elif defined(__arm__)
896#define pgm_read_pointer(p) pgm_read_dword(p)
898#if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__))
901#include "core_pins.h"
902#include "avr_emulation.h"
904#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
905#define GPIO_BITBAND_PTR(reg, bit) ((uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
907#define MAKE_PIN(className, baseReg, pinNum, configReg) \
910 static void Set() { \
911 *GPIO_BITBAND_PTR(baseReg, pinNum) = 1; \
913 static void Clear() { \
914 *GPIO_BITBAND_PTR(baseReg, pinNum) = 0; \
916 static void SetDirRead() { \
917 configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
918 *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 0; \
920 static void SetDirWrite() { \
921 configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
922 *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 1; \
924 static uint8_t IsSet() { \
925 return *(GPIO_BITBAND_PTR(baseReg, pinNum) + 512); \
963#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
998#elif defined(CORE_TEENSY) && (defined(__MKL26Z64__))
1008#include "core_pins.h"
1009#include "avr_emulation.h"
1011#define MAKE_PIN(className, baseReg, pinNum, configReg) \
1014 static void Set() { \
1015 *portSetRegister(pinNum) = digitalPinToBitMask(pinNum); \
1017 static void Clear() { \
1018 *portClearRegister(pinNum) = digitalPinToBitMask(pinNum); \
1020 static void SetDirRead() { \
1021 configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
1022 *portModeRegister(pinNum) &= ~digitalPinToBitMask(pinNum); \
1024 static void SetDirWrite() { \
1025 configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
1026 *portModeRegister(pinNum) |= digitalPinToBitMask(pinNum); \
1028 static uint8_t IsSet() { \
1029 return (*portInputRegister(pinNum) & digitalPinToBitMask(pinNum)) ? 1 : 0; \
1063#elif defined(__IMXRT1062__) && (defined(ARDUINO_TEENSY40) || defined(ARDUINO_TEENSY41))
1066#include "core_pins.h"
1068#define MAKE_PIN(className, pin) \
1071 static void Set() { \
1072 digitalWriteFast(pin, HIGH);\
1074 static void Clear() { \
1075 digitalWriteFast(pin, LOW); \
1077 static void SetDirRead() { \
1078 pinMode(pin, INPUT); \
1080 static void SetDirWrite() { \
1081 pinMode(pin, OUTPUT); \
1083 static uint8_t IsSet() { \
1084 return digitalReadFast(pin); \
1128#ifdef ARDUINO_TEENSY41
1148#elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
1162#define MAKE_PIN(className, pio, pinMask) \
1165 static void Set() { \
1166 pio->PIO_SODR = pinMask; \
1168 static void Clear() { \
1169 pio->PIO_CODR = pinMask; \
1171 static void SetDirRead() { \
1172 pio->PIO_IDR = pinMask ; \
1173 pio->PIO_PUDR = pinMask; \
1174 pio->PIO_ODR = pinMask; \
1175 pio->PIO_PER = pinMask; \
1177 static void SetDirWrite() { \
1178 pio->PIO_IDR = pinMask ; \
1179 pio->PIO_PUDR = pinMask; \
1180 pio->PIO_OER = pinMask; \
1181 pio->PIO_PER = pinMask; \
1183 static uint8_t IsSet() { \
1184 return pio->PIO_PDSR & pinMask; \
1272#elif defined(RBL_NRF51822)
1274#define MAKE_PIN(className, pin) \
1277 static void Set() { \
1278 nrf_gpio_pin_set(pin); \
1280 static void Clear() { \
1281 nrf_gpio_pin_clear(pin); \
1283 static void SetDirRead() { \
1284 nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
1286 static void SetDirWrite() { \
1287 nrf_gpio_cfg_output(pin); \
1289 static uint8_t IsSet() { \
1290 return (uint8_t)nrf_gpio_pin_read(pin); \
1323#elif defined(__IMXRT1062__) && (defined(ARDUINO_TEENSY40) || defined(ARDUINO_TEENSY41))
1326#include "core_pins.h"
1328#define MAKE_PIN(className, pin) \
1331 static void Set() { \
1332 digitalWriteFast(pin, HIGH);\
1334 static void Clear() { \
1335 digitalWriteFast(pin, LOW); \
1337 static void SetDirRead() { \
1338 pinMode(pin, INPUT); \
1340 static void SetDirWrite() { \
1341 pinMode(pin, OUTPUT); \
1343 static uint8_t IsSet() { \
1344 return digitalReadFast(pin); \
1388#ifdef ARDUINO_TEENSY41
1408#elif defined(ARDUINO_ARCH_RENESAS_UNO)
1409#define MAKE_PIN(className, pin) \
1412 static void Set() { \
1413 digitalWrite(pin, HIGH); \
1415 static void Clear() { \
1416 digitalWrite(pin, LOW); \
1418 static void SetDirRead() { \
1419 pinMode(pin, INPUT); \
1421 static void SetDirWrite() { \
1422 pinMode(pin, OUTPUT); \
1424 static uint8_t IsSet() { \
1425 return digitalRead(pin); \
1452#elif defined(STM32F446xx)
1455#define MAKE_PIN(className, port, pin) \
1458 static void Set() { \
1459 HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); \
1461 static void Clear() { \
1462 HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET); \
1464 static void SetDirRead() { \
1465 static GPIO_InitTypeDef GPIO_InitStruct; \
1466 GPIO_InitStruct.Pin = pin; \
1467 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \
1468 GPIO_InitStruct.Pull = GPIO_NOPULL; \
1469 HAL_GPIO_Init(port, &GPIO_InitStruct); \
1471 static void SetDirWrite() { \
1472 static GPIO_InitTypeDef GPIO_InitStruct; \
1473 GPIO_InitStruct.Pin = pin; \
1474 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \
1475 GPIO_InitStruct.Pull = GPIO_NOPULL; \
1476 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; \
1477 HAL_GPIO_Init(port, &GPIO_InitStruct); \
1479 static GPIO_PinState IsSet() { \
1480 return HAL_GPIO_ReadPin(port, pin); \
1509#elif defined(ARDUINO_NRF52840_FEATHER) || defined(ARDUINO_NRF52840_FEATHER_SENSE)
1511#define MAKE_PIN(className, pin) \
1514 static void Set() { \
1515 nrf_gpio_pin_set(pin); \
1517 static void Clear() { \
1518 nrf_gpio_pin_clear(pin); \
1520 static void SetDirRead() { \
1521 nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
1523 static void SetDirWrite() { \
1524 nrf_gpio_cfg_output(pin); \
1526 static uint8_t IsSet() { \
1527 return (uint8_t)nrf_gpio_pin_read(pin); \
1572#elif defined(ARDUINO_Seeed_XIAO_nRF52840_Sense)
1574#define MAKE_PIN(className, pin) \
1577 static void Set() { \
1578 nrf_gpio_pin_set(pin); \
1580 static void Clear() { \
1581 nrf_gpio_pin_clear(pin); \
1583 static void SetDirRead() { \
1584 nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
1586 static void SetDirWrite() { \
1587 nrf_gpio_cfg_output(pin); \
1589 static uint8_t IsSet() { \
1590 return (uint8_t)nrf_gpio_pin_read(pin); \
1633#error "Please define board in avrpins.h"
1637#elif defined(__ARDUINO_ARC__)
1639#include <avr/pgmspace.h>
1641#define pgm_read_pointer(p) pgm_read_dword(p)
1643#define MAKE_PIN(className, pin) \
1646 static void Set() { \
1647 digitalWrite(pin, HIGH);\
1649 static void Clear() { \
1650 digitalWrite(pin, LOW); \
1652 static void SetDirRead() { \
1653 pinMode(pin, INPUT); \
1655 static void SetDirWrite() { \
1656 pinMode(pin, OUTPUT); \
1658 static uint8_t IsSet() { \
1659 return digitalRead(pin); \
1689#elif defined(__ARDUINO_X86__)
1691#include <avr/pgmspace.h>
1694#define pgm_read_pointer(p) pgm_read_dword(p)
1696#if PLATFORM_ID == 0xE1
1697#define pinToFastPin(pin) 1
1703#define MAKE_PIN(className, pin) \
1706 static void Set() { \
1707 fastDigitalWrite(pin, HIGH); \
1709 static void Clear() { \
1710 fastDigitalWrite(pin, LOW); \
1712 static void SetDirRead() { \
1713 if (pinToFastPin(pin)) \
1714 pinMode(pin, INPUT_FAST); \
1716 pinMode(pin, INPUT); \
1718 static void SetDirWrite() { \
1719 if (pinToFastPin(pin)) \
1720 pinMode(pin, OUTPUT_FAST); \
1722 pinMode(pin, OUTPUT); \
1724 static uint8_t IsSet() { \
1725 return fastDigitalRead(pin); \
1752#elif defined(__MIPSEL__)
1756#define pgm_read_pointer(p) pgm_read_dword(p)
1758#define MAKE_PIN(className, pin) \
1761 static void Set() { \
1762 digitalWrite(pin, HIGH);\
1764 static void Clear() { \
1765 digitalWrite(pin, LOW); \
1767 static void SetDirRead() { \
1768 pinMode(pin, INPUT); \
1770 static void SetDirWrite() { \
1771 pinMode(pin, OUTPUT); \
1773 static uint8_t IsSet() { \
1774 return digitalRead(pin); \
1796#elif defined(ESP8266) || defined(ESP32)
1798#define MAKE_PIN(className, pin) \
1801 static void Set() { \
1802 digitalWrite(pin, HIGH);\
1804 static void Clear() { \
1805 digitalWrite(pin, LOW); \
1807 static void SetDirRead() { \
1808 pinMode(pin, INPUT); \
1810 static void SetDirWrite() { \
1811 pinMode(pin, OUTPUT); \
1813 static uint8_t IsSet() { \
1814 return digitalRead(pin); \
1821#undef pgm_read_ptr_aligned
1823#define pgm_read_ptr_aligned(addr) (*reinterpret_cast<const void* const*>(addr))
1825#define pgm_read_ptr_aligned(addr) (*(const void* const*)(addr))
1829#if PGM_READ_UNALIGNED
1830#define pgm_read_ptr(p) pgm_read_ptr_unaligned(p)
1832#define pgm_read_ptr(p) pgm_read_ptr_aligned(p)
1835#ifdef pgm_read_pointer
1836#undef pgm_read_pointer
1838#define pgm_read_pointer(p) pgm_read_ptr(p)
1855#elif defined(ARDUINO_M5STACK_CORES3)
1861#ifdef pgm_read_dword
1862#undef pgm_read_dword
1864#ifdef pgm_read_float
1865#undef pgm_read_float
1871#define pgm_read_word(addr) ({ \
1872 typeof(addr) _addr = (addr); \
1873 *(const unsigned short *)(_addr); \
1875#define pgm_read_dword(addr) ({ \
1876 typeof(addr) _addr = (addr); \
1877 *(const unsigned long *)(_addr); \
1879#define pgm_read_float(addr) ({ \
1880 typeof(addr) _addr = (addr); \
1881 *(const float *)(_addr); \
1883#define pgm_read_ptr(addr) ({ \
1884 typeof(addr) _addr = (addr); \
1885 *(void * const *)(_addr); \
1896#elif defined(ARDUINO_XIAO_ESP32S3)
1902#ifdef pgm_read_dword
1903#undef pgm_read_dword
1905#ifdef pgm_read_float
1906#undef pgm_read_float
1912#define pgm_read_word(addr) ({ \
1913 typeof(addr) _addr = (addr); \
1914 *(const unsigned short *)(_addr); \
1916#define pgm_read_dword(addr) ({ \
1917 typeof(addr) _addr = (addr); \
1918 *(const unsigned long *)(_addr); \
1920#define pgm_read_float(addr) ({ \
1921 typeof(addr) _addr = (addr); \
1922 *(const float *)(_addr); \
1924#define pgm_read_ptr(addr) ({ \
1925 typeof(addr) _addr = (addr); \
1926 *(void * const *)(_addr); \
1943#ifdef pgm_read_dword
1944#undef pgm_read_dword
1946#ifdef pgm_read_float
1947#undef pgm_read_float
1953#define pgm_read_word(addr) ({ \
1954 typeof(addr) _addr = (addr); \
1955 *(const unsigned short *)(_addr); \
1957#define pgm_read_dword(addr) ({ \
1958 typeof(addr) _addr = (addr); \
1959 *(const unsigned long *)(_addr); \
1961#define pgm_read_float(addr) ({ \
1962 typeof(addr) _addr = (addr); \
1963 *(const float *)(_addr); \
1965#define pgm_read_ptr(addr) ({ \
1966 typeof(addr) _addr = (addr); \
1967 *(void * const *)(_addr); \
1989#ifdef pgm_read_pointer
1990#undef pgm_read_pointer
1992#define pgm_read_pointer(p) pgm_read_ptr(p)
1995#error "Please define board in avrpins.h"
ConfigDescParser(UsbConfigXtracter *xtractor)