summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriabdalkader <i.abdalkader@gmail.com>2023-10-25 09:05:54 +0200
committerDamien George <damien@micropython.org>2023-11-03 18:20:31 +1100
commitb41055a5a3e1c51ee7ea274da4744dd47c211b3a (patch)
treecf80bcd7f03c78a5787add0f532c59af19788c56
parentd95f5aa01131f3aa669867ebdde391f9db277846 (diff)
rp2/machine_adc: Refactor channel/pin validation code.
This patch ensures that integer channel numbers passed to the ADC constructor (including temperature sensor) are interpreted as raw channel numbers, and not cause any GPIO pins to be initialized. Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
-rw-r--r--ports/rp2/machine_adc.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/ports/rp2/machine_adc.c b/ports/rp2/machine_adc.c
index 80c4d0533..3a7a71a74 100644
--- a/ports/rp2/machine_adc.c
+++ b/ports/rp2/machine_adc.c
@@ -69,21 +69,21 @@ STATIC mp_obj_t mp_machine_adc_make_new(const mp_obj_type_t *type, size_t n_args
mp_obj_t source = all_args[0];
- uint32_t channel;
+ uint32_t channel = -1;
bool is_ext = false;
const machine_pin_obj_t *pin = NULL;
if (mp_obj_is_int(source)) {
// Get and validate channel number.
channel = mp_obj_get_int(source);
- if (!((channel >= 0 && channel <= ADC_CHANNEL_TEMPSENSOR) || ADC_IS_VALID_GPIO(channel))) {
+ if (ADC_IS_VALID_GPIO(channel)) {
+ channel = ADC_CHANNEL_FROM_GPIO(channel);
+ } else if (!(channel >= 0 && channel <= ADC_CHANNEL_TEMPSENSOR)) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid channel"));
}
-
} else {
// Get GPIO and check it has ADC capabilities.
pin = machine_pin_find(source);
- channel = pin->id;
bool valid_adc_pin = false;
#if MICROPY_HW_ADC_EXT_COUNT
is_ext = pin->is_ext;
@@ -92,7 +92,7 @@ STATIC mp_obj_t mp_machine_adc_make_new(const mp_obj_type_t *type, size_t n_args
} else
#endif
{
- valid_adc_pin = ADC_IS_VALID_GPIO(channel);
+ valid_adc_pin = ADC_IS_VALID_GPIO(pin->id);
}
if (!valid_adc_pin) {
mp_raise_ValueError(MP_ERROR_TEXT("Pin doesn't have ADC capabilities"));
@@ -104,16 +104,18 @@ STATIC mp_obj_t mp_machine_adc_make_new(const mp_obj_type_t *type, size_t n_args
adc_init();
}
- if (is_ext) {
- #if MICROPY_HW_ADC_EXT_COUNT
- // Note external pins are mutable.
- machine_pin_ext_config((machine_pin_obj_t *)pin, MACHINE_PIN_MODE_ANALOG, 0);
- channel = machine_pin_ext_to_adc_channel(pin);
- #endif
- } else if (ADC_IS_VALID_GPIO(channel)) {
- // Configure the GPIO pin in ADC mode.
- adc_gpio_init(channel);
- channel = ADC_CHANNEL_FROM_GPIO(channel);
+ if (pin) {
+ if (is_ext) {
+ #if MICROPY_HW_ADC_EXT_COUNT
+ // Note external pins are mutable.
+ machine_pin_ext_config((machine_pin_obj_t *)pin, MACHINE_PIN_MODE_ANALOG, 0);
+ channel = machine_pin_ext_to_adc_channel(pin);
+ #endif
+ } else {
+ // Configure the GPIO pin in ADC mode.
+ adc_gpio_init(pin->id);
+ channel = ADC_CHANNEL_FROM_GPIO(pin->id);
+ }
} else if (channel == ADC_CHANNEL_TEMPSENSOR) {
// Enable temperature sensor.
adc_set_temp_sensor_enabled(1);