2626
2727#include "common-hal/analogio/AnalogIn.h"
2828#include "shared-bindings/analogio/AnalogIn.h"
29+ #include "shared-bindings/microcontroller/__init__.h"
2930#include "shared-bindings/microcontroller/Pin.h"
3031#include "py/runtime.h"
3132#include "supervisor/shared/translate/translate.h"
3536#define ADC_FIRST_PIN_NUMBER 26
3637#define ADC_PIN_COUNT 4
3738
39+ // Voltage monitor is special on Pico W, because this pin is shared between the
40+ // voltage monitor function and the wifi function. Special handling is required
41+ // to read the analog voltage.
42+ #if CIRCUITPY_CYW43
43+ #define SPECIAL_PIN (pin ) (pin->number == 29)
44+ #else
45+ #define SPECIAL_PIN (pin ) false
46+ #endif
47+
3848void common_hal_analogio_analogin_construct (analogio_analogin_obj_t * self , const mcu_pin_obj_t * pin ) {
3949 if (pin -> number < ADC_FIRST_PIN_NUMBER || pin -> number > ADC_FIRST_PIN_NUMBER + ADC_PIN_COUNT ) {
4050 raise_ValueError_invalid_pin ();
4151 }
4252
4353 adc_init ();
54+ if (!SPECIAL_PIN (pin )) {
55+ adc_gpio_init (pin -> number );
56+ claim_pin (pin );
57+ }
4458
45- adc_gpio_init (pin -> number );
46-
47- claim_pin (pin );
4859 self -> pin = pin ;
4960}
5061
@@ -57,14 +68,30 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self) {
5768 return ;
5869 }
5970
60- reset_pin_number (self -> pin -> number );
71+ if (!SPECIAL_PIN (self -> pin )) {
72+ reset_pin_number (self -> pin -> number );
73+ }
6174 self -> pin = NULL ;
6275}
6376
6477uint16_t common_hal_analogio_analogin_get_value (analogio_analogin_obj_t * self ) {
65- adc_select_input (self -> pin -> number - ADC_FIRST_PIN_NUMBER );
66- uint16_t value = adc_read ();
67-
78+ uint16_t value ;
79+ if (SPECIAL_PIN (self -> pin )) {
80+ common_hal_mcu_disable_interrupts ();
81+ uint32_t old_pad = padsbank0_hw -> io [self -> pin -> number ];
82+ uint32_t old_ctrl = iobank0_hw -> io [self -> pin -> number ].ctrl ;
83+ adc_gpio_init (self -> pin -> number );
84+ adc_select_input (self -> pin -> number - ADC_FIRST_PIN_NUMBER );
85+ common_hal_mcu_delay_us (100 );
86+ value = adc_read ();
87+ gpio_init (self -> pin -> number );
88+ padsbank0_hw -> io [self -> pin -> number ] = old_pad ;
89+ iobank0_hw -> io [self -> pin -> number ].ctrl = old_ctrl ;
90+ common_hal_mcu_enable_interrupts ();
91+ } else {
92+ adc_select_input (self -> pin -> number - ADC_FIRST_PIN_NUMBER );
93+ value = adc_read ();
94+ }
6895 // Stretch 12-bit ADC reading to 16-bit range
6996 return (value << 4 ) | (value >> 8 );
7097}
0 commit comments