2626 */
2727
2828#include "shared-bindings/microcontroller/Pin.h"
29+ #include "shared-bindings/digitalio/DigitalInOut.h"
30+ #include "supervisor/shared/rgb_led_status.h"
2931
3032#include "py/mphal.h"
3133
3234#include "esp-idf/components/driver/include/driver/gpio.h"
3335#include "esp-idf/components/soc/include/hal/gpio_hal.h"
3436
37+ #ifdef MICROPY_HW_NEOPIXEL
38+ bool neopixel_in_use ;
39+ #endif
40+
3541STATIC uint32_t never_reset_pins [2 ];
3642STATIC uint32_t in_use [2 ];
3743
@@ -50,6 +56,14 @@ void common_hal_never_reset_pin(const mcu_pin_obj_t* pin) {
5056void reset_pin_number (gpio_num_t pin_number ) {
5157 never_reset_pins [pin_number / 32 ] &= ~(1 << pin_number % 32 );
5258 in_use [pin_number / 32 ] &= ~(1 << pin_number % 32 );
59+
60+ #ifdef MICROPY_HW_NEOPIXEL
61+ if (pin_number == MICROPY_HW_NEOPIXEL -> number ) {
62+ neopixel_in_use = false;
63+ rgb_led_status_init ();
64+ return ;
65+ }
66+ #endif
5367}
5468
5569void common_hal_reset_pin (const mcu_pin_obj_t * pin ) {
@@ -69,13 +83,32 @@ void reset_all_pins(void) {
6983 }
7084 in_use [0 ] = 0 ;
7185 in_use [1 ] = 0 ;
86+
87+ #ifdef MICROPY_HW_NEOPIXEL
88+ neopixel_in_use = false;
89+ #endif
7290}
7391
7492void claim_pin (const mcu_pin_obj_t * pin ) {
7593 in_use [pin -> number / 32 ] |= (1 << pin -> number % 32 );
94+ #ifdef MICROPY_HW_NEOPIXEL
95+ if (pin == MICROPY_HW_NEOPIXEL ) {
96+ neopixel_in_use = true;
97+ }
98+ #endif
99+ }
100+
101+ void common_hal_mcu_pin_claim (const mcu_pin_obj_t * pin ) {
102+ claim_pin (pin );
76103}
77104
78105bool pin_number_is_free (gpio_num_t pin_number ) {
106+ #ifdef MICROPY_HW_NEOPIXEL
107+ if (pin_number == MICROPY_HW_NEOPIXEL -> number ) {
108+ return !neopixel_in_use ;
109+ }
110+ #endif
111+
79112 uint8_t offset = pin_number / 32 ;
80113 uint8_t mask = 1 << pin_number % 32 ;
81114 return (never_reset_pins [offset ] & mask ) == 0 && (in_use [offset ] & mask ) == 0 ;
0 commit comments