RoboAide
Project to improve a DIY robotic arm used for mobility assistance
direct_pin_read.h
Go to the documentation of this file.
1 #ifndef direct_pin_read_h_
2 #define direct_pin_read_h_
3 
4 #if defined(__AVR__)
5 
6 #define IO_REG_TYPE uint8_t
7 #define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin)))
8 #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
9 #define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0)
10 
11 #elif defined(__OPENCR__) || defined(__OPENCM904__)
12 
13 extern const uint32_t *digital_pin_bitband_table[];
14 #define IO_REG_TYPE uint32_t
15 #define PIN_TO_BASEREG(pin) ((volatile uint32_t *)(digital_pin_bitband_table[(pin)] - 32))
16 #define PIN_TO_BITMASK(pin) (1)
17 #define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0)
18 
19 #elif defined(TEENSYDUINO) && (defined(KINETISK) || defined(KINETISL))
20 
21 #define IO_REG_TYPE uint8_t
22 #define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin)))
23 #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
24 #define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0)
25 
26 #elif defined(__IMXRT1052__) || defined(__IMXRT1062__)
27 
28 #define IO_REG_TYPE uint32_t
29 #define PIN_TO_BASEREG(pin) (portOutputRegister(pin))
30 #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
31 #define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0)
32 
33 #elif defined(__SAM3X8E__) // || defined(ESP8266)
34 
35 #define IO_REG_TYPE uint32_t
36 #define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin)))
37 #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
38 #define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0)
39 
40 #elif defined(__PIC32MX__)
41 
42 #define IO_REG_TYPE uint32_t
43 #define PIN_TO_BASEREG(pin) (portModeRegister(digitalPinToPort(pin)))
44 #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
45 #define DIRECT_PIN_READ(base, mask) (((*(base+4)) & (mask)) ? 1 : 0)
46 
47 /* ESP8266 v2.0.0 Arduino workaround for bug https://github.com/esp8266/Arduino/issues/1110 */
48 #elif defined(ESP8266)
49 
50 #define IO_REG_TYPE uint32_t
51 #define PIN_TO_BASEREG(pin) ((volatile uint32_t *)(0x60000000+(0x318)))
52 #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
53 #define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0)
54 
55 /* ESP32 Arduino (https://github.com/espressif/arduino-esp32) */
56 #elif defined(ESP32)
57 
58 #define IO_REG_TYPE uint32_t
59 #define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin)))
60 #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
61 #define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0)
62 
63 #elif defined(__SAMD21G18A__) || defined(__SAMD51__)
64 
65 #define IO_REG_TYPE uint32_t
66 #define PIN_TO_BASEREG(pin) portModeRegister(digitalPinToPort(pin))
67 #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
68 #define DIRECT_PIN_READ(base, mask) (((*((base)+8)) & (mask)) ? 1 : 0)
69 
70 #elif defined(RBL_NRF51822)
71 
72 #define IO_REG_TYPE uint32_t
73 #define PIN_TO_BASEREG(pin) (0)
74 #define PIN_TO_BITMASK(pin) (pin)
75 #define DIRECT_PIN_READ(base, pin) nrf_gpio_pin_read(pin)
76 
77 #elif defined(__arc__) /* Arduino101/Genuino101 specifics */
78 
79 #include "scss_registers.h"
80 #include "portable.h"
81 #include "avr/pgmspace.h"
82 #define GPIO_ID(pin) (g_APinDescription[pin].ulGPIOId)
83 #define GPIO_TYPE(pin) (g_APinDescription[pin].ulGPIOType)
84 #define GPIO_BASE(pin) (g_APinDescription[pin].ulGPIOBase)
85 #define EXT_PORT_OFFSET_SS 0x0A
86 #define EXT_PORT_OFFSET_SOC 0x50
87 #define PIN_TO_BASEREG(pin) ((volatile uint32_t *)g_APinDescription[pin].ulGPIOBase)
88 #define PIN_TO_BITMASK(pin) pin
89 #define IO_REG_TYPE uint32_t
90 static inline __attribute__((always_inline))
91 IO_REG_TYPE directRead(volatile IO_REG_TYPE *base, IO_REG_TYPE pin)
92 {
93  IO_REG_TYPE ret;
94  if (SS_GPIO == GPIO_TYPE(pin)) {
95  ret = READ_ARC_REG(((IO_REG_TYPE)base + EXT_PORT_OFFSET_SS));
96  } else {
97  ret = MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, EXT_PORT_OFFSET_SOC);
98  }
99  return ((ret >> GPIO_ID(pin)) & 0x01);
100 }
101 #define DIRECT_PIN_READ(base, pin) directRead(base, pin)
102 
103 #endif
104 
105 #endif