13
13
// limitations under the License.
14
14
15
15
#include "esp32-hal-gpio.h"
16
+ #include "esp32-hal-periman.h"
16
17
#include "hal/gpio_hal.h"
17
18
#include "soc/soc_caps.h"
18
19
@@ -89,6 +90,10 @@ static InterruptHandle_t __pinInterruptHandlers[SOC_GPIO_PIN_COUNT] = {0,};
89
90
90
91
#include "driver/rtc_io.h"
91
92
93
+ static bool gpioDetachBus (void * bus ){
94
+ return true;
95
+ }
96
+
92
97
extern void ARDUINO_ISR_ATTR __pinMode (uint8_t pin , uint8_t mode )
93
98
{
94
99
#ifdef RGB_BUILTIN
@@ -102,6 +107,14 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode)
102
107
log_e ("Invalid pin selected" );
103
108
return ;
104
109
}
110
+
111
+ if (perimanGetPinBus (pin , ESP32_BUS_TYPE_GPIO ) == NULL ){
112
+ perimanSetBusDeinit (ESP32_BUS_TYPE_GPIO , gpioDetachBus );
113
+ if (!perimanSetPinBus (pin , ESP32_BUS_TYPE_INIT , NULL )){
114
+ log_e ("Deinit of previous bus failed" );
115
+ return ;
116
+ }
117
+ }
105
118
106
119
gpio_hal_context_t gpiohal ;
107
120
gpiohal .dev = GPIO_LL_GET_HW (GPIO_PORT_0 );
@@ -130,6 +143,12 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode)
130
143
log_e ("GPIO config failed" );
131
144
return ;
132
145
}
146
+ if (perimanGetPinBus (pin , ESP32_BUS_TYPE_GPIO ) == NULL ){
147
+ if (!perimanSetPinBus (pin , ESP32_BUS_TYPE_GPIO , (void * )(pin + 1 ))){
148
+ //gpioDetachBus((void *)(pin+1));
149
+ return ;
150
+ }
151
+ }
133
152
}
134
153
135
154
extern void ARDUINO_ISR_ATTR __digitalWrite (uint8_t pin , uint8_t val )
@@ -142,12 +161,22 @@ extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val)
142
161
return ;
143
162
}
144
163
#endif
145
- gpio_set_level ((gpio_num_t )pin , val );
164
+ if (perimanGetPinBus (pin , ESP32_BUS_TYPE_GPIO ) != NULL ){
165
+ gpio_set_level ((gpio_num_t )pin , val );
166
+ } else {
167
+ log_e ("Pin is not set as GPIO." );
168
+ }
146
169
}
147
170
148
171
extern int ARDUINO_ISR_ATTR __digitalRead (uint8_t pin )
149
172
{
150
- return gpio_get_level ((gpio_num_t )pin );
173
+ if (perimanGetPinBus (pin , ESP32_BUS_TYPE_GPIO ) != NULL ){
174
+ return gpio_get_level ((gpio_num_t )pin );
175
+ }
176
+ else {
177
+ log_e ("Pin is not set as GPIO." );
178
+ return 0 ;
179
+ }
151
180
}
152
181
153
182
static void ARDUINO_ISR_ATTR __onPinInterrupt (void * arg ) {
0 commit comments