1313// limitations under the License.
1414
1515#include "esp32-hal-gpio.h"
16+ #include "esp32-hal-periman.h"
1617#include "hal/gpio_hal.h"
1718#include "soc/soc_caps.h"
1819
@@ -89,6 +90,10 @@ static InterruptHandle_t __pinInterruptHandlers[SOC_GPIO_PIN_COUNT] = {0,};
8990
9091#include "driver/rtc_io.h"
9192
93+ static bool gpioDetachBus (void * bus ){
94+ return true;
95+ }
96+
9297extern void ARDUINO_ISR_ATTR __pinMode (uint8_t pin , uint8_t mode )
9398{
9499#ifdef RGB_BUILTIN
@@ -102,6 +107,14 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode)
102107 log_e ("Invalid pin selected" );
103108 return ;
104109 }
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+ }
105118
106119 gpio_hal_context_t gpiohal ;
107120 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)
130143 log_e ("GPIO config failed" );
131144 return ;
132145 }
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+ }
133152}
134153
135154extern 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)
142161 return ;
143162 }
144163 #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+ }
146169}
147170
148171extern int ARDUINO_ISR_ATTR __digitalRead (uint8_t pin )
149172{
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+ }
151180}
152181
153182static void ARDUINO_ISR_ATTR __onPinInterrupt (void * arg ) {
0 commit comments