26
26
27
27
#include "common-hal/analogio/AnalogIn.h"
28
28
#include "shared-bindings/analogio/AnalogIn.h"
29
+ #include "shared-bindings/microcontroller/__init__.h"
29
30
#include "shared-bindings/microcontroller/Pin.h"
30
31
#include "py/runtime.h"
31
32
#include "supervisor/shared/translate/translate.h"
35
36
#define ADC_FIRST_PIN_NUMBER 26
36
37
#define ADC_PIN_COUNT 4
37
38
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
+
38
48
void common_hal_analogio_analogin_construct (analogio_analogin_obj_t * self , const mcu_pin_obj_t * pin ) {
39
49
if (pin -> number < ADC_FIRST_PIN_NUMBER || pin -> number > ADC_FIRST_PIN_NUMBER + ADC_PIN_COUNT ) {
40
50
raise_ValueError_invalid_pin ();
41
51
}
42
52
43
53
adc_init ();
54
+ if (!SPECIAL_PIN (pin )) {
55
+ adc_gpio_init (pin -> number );
56
+ claim_pin (pin );
57
+ }
44
58
45
- adc_gpio_init (pin -> number );
46
-
47
- claim_pin (pin );
48
59
self -> pin = pin ;
49
60
}
50
61
@@ -57,14 +68,30 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self) {
57
68
return ;
58
69
}
59
70
60
- reset_pin_number (self -> pin -> number );
71
+ if (!SPECIAL_PIN (self -> pin )) {
72
+ reset_pin_number (self -> pin -> number );
73
+ }
61
74
self -> pin = NULL ;
62
75
}
63
76
64
77
uint16_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
+ }
68
95
// Stretch 12-bit ADC reading to 16-bit range
69
96
return (value << 4 ) | (value >> 8 );
70
97
}
0 commit comments