From 70a1b26041c9bd01aff80427327e6a409909f9dd Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Thu, 1 Jun 2023 22:46:11 +0100 Subject: [PATCH] ADC: Avoid re-initialising ADC. Only init the ADC if it's not already running. In MicroPython this could trounce an already initialised and configured ADC, and would disable the temperature sensor if it had been enabled by a user before initialising any of the affected libraries. --- drivers/analog/analog.hpp | 2 +- libraries/adcfft/adcfft.cpp | 2 +- libraries/cosmic_unicorn/cosmic_unicorn.cpp | 2 +- libraries/galactic_unicorn/galactic_unicorn.cpp | 2 +- libraries/stellar_unicorn/stellar_unicorn.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/analog/analog.hpp b/drivers/analog/analog.hpp index 7f321b0d..d51795a8 100644 --- a/drivers/analog/analog.hpp +++ b/drivers/analog/analog.hpp @@ -11,7 +11,7 @@ namespace pimoroni { public: Analog(uint pin, float amplifier_gain = 1.0f, float resistor = 0.0f, float offset = 0.0f) : pin(pin), amplifier_gain(amplifier_gain), resistor(resistor), offset(offset) { - adc_init(); + if (!(adc_hw->cs & ADC_CS_EN_BITS)) adc_init(); //Make sure GPIO is high-impedance, no pullups etc adc_gpio_init(pin); diff --git a/libraries/adcfft/adcfft.cpp b/libraries/adcfft/adcfft.cpp index e5433d57..a28fdd1d 100644 --- a/libraries/adcfft/adcfft.cpp +++ b/libraries/adcfft/adcfft.cpp @@ -47,7 +47,7 @@ void ADCFFT::init() { // Initialize the ADC harware // (resets it, enables the clock, spins until the hardware is ready) - adc_init(); + if (!(adc_hw->cs & ADC_CS_EN_BITS)) adc_init(); // Select analog mux input (0...3 are GPIO 26, 27, 28, 29; 4 is temp sensor) adc_select_input(adc_channel); diff --git a/libraries/cosmic_unicorn/cosmic_unicorn.cpp b/libraries/cosmic_unicorn/cosmic_unicorn.cpp index 5d0dc26e..2db59201 100644 --- a/libraries/cosmic_unicorn/cosmic_unicorn.cpp +++ b/libraries/cosmic_unicorn/cosmic_unicorn.cpp @@ -149,7 +149,7 @@ namespace pimoroni { } // setup light sensor adc - adc_init(); + if (!(adc_hw->cs & ADC_CS_EN_BITS)) adc_init(); adc_gpio_init(LIGHT_SENSOR); gpio_init(COLUMN_CLOCK); gpio_set_dir(COLUMN_CLOCK, GPIO_OUT); gpio_put(COLUMN_CLOCK, false); diff --git a/libraries/galactic_unicorn/galactic_unicorn.cpp b/libraries/galactic_unicorn/galactic_unicorn.cpp index da2bc041..c9587e18 100644 --- a/libraries/galactic_unicorn/galactic_unicorn.cpp +++ b/libraries/galactic_unicorn/galactic_unicorn.cpp @@ -149,7 +149,7 @@ namespace pimoroni { } // setup light sensor adc - adc_init(); + if (!(adc_hw->cs & ADC_CS_EN_BITS)) adc_init(); adc_gpio_init(LIGHT_SENSOR); gpio_init(COLUMN_CLOCK); gpio_set_dir(COLUMN_CLOCK, GPIO_OUT); gpio_put(COLUMN_CLOCK, false); diff --git a/libraries/stellar_unicorn/stellar_unicorn.cpp b/libraries/stellar_unicorn/stellar_unicorn.cpp index 3917aa5f..3b4bde04 100644 --- a/libraries/stellar_unicorn/stellar_unicorn.cpp +++ b/libraries/stellar_unicorn/stellar_unicorn.cpp @@ -149,7 +149,7 @@ namespace pimoroni { } // setup light sensor adc - adc_init(); + if (!(adc_hw->cs & ADC_CS_EN_BITS)) adc_init(); adc_gpio_init(LIGHT_SENSOR); gpio_init(COLUMN_CLOCK); gpio_set_dir(COLUMN_CLOCK, GPIO_OUT); gpio_put(COLUMN_CLOCK, false);