diff options
Diffstat (limited to 'drivers/avr/analog.c')
-rw-r--r-- | drivers/avr/analog.c | 138 |
1 files changed, 0 insertions, 138 deletions
diff --git a/drivers/avr/analog.c b/drivers/avr/analog.c deleted file mode 100644 index 8d299ffdb9..0000000000 --- a/drivers/avr/analog.c +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright 2015 Jack Humbert - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <avr/io.h> -#include <avr/pgmspace.h> -#include <stdint.h> -#include "analog.h" - -static uint8_t aref = ADC_REF_POWER; - -void analogReference(uint8_t mode) { aref = mode & (_BV(REFS1) | _BV(REFS0)); } - -// Arduino compatible pin input -int16_t analogRead(uint8_t pin) { -#if defined(__AVR_ATmega32U4__) - // clang-format off - static const uint8_t PROGMEM pin_to_mux[] = { - //A0 A1 A2 A3 A4 A5 - //F7 F6 F5 F4 F1 F0 - 0x07, 0x06, 0x05, 0x04, 0x01, 0x00, - //A6 A7 A8 A9 A10 A11 - //D4 D7 B4 B5 B6 D6 - 0x20, 0x22, 0x23, 0x24, 0x25, 0x21 - }; - // clang-format on - if (pin >= 12) return 0; - return adc_read(pgm_read_byte(pin_to_mux + pin)); -#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) - if (pin >= 8) return 0; - return adc_read(pin); -#else - return 0; -#endif -} - -int16_t analogReadPin(pin_t pin) { return adc_read(pinToMux(pin)); } - -uint8_t pinToMux(pin_t pin) { - switch (pin) { - // clang-format off -#if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) - case F0: return 0; // ADC0 - case F1: return _BV(MUX0); // ADC1 - case F2: return _BV(MUX1); // ADC2 - case F3: return _BV(MUX1) | _BV(MUX0); // ADC3 - case F4: return _BV(MUX2); // ADC4 - case F5: return _BV(MUX2) | _BV(MUX0); // ADC5 - case F6: return _BV(MUX2) | _BV(MUX1); // ADC6 - case F7: return _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // ADC7 - default: return _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // 0V -#elif defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) - case F0: return 0; // ADC0 - case F1: return _BV(MUX0); // ADC1 - case F4: return _BV(MUX2); // ADC4 - case F5: return _BV(MUX2) | _BV(MUX0); // ADC5 - case F6: return _BV(MUX2) | _BV(MUX1); // ADC6 - case F7: return _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // ADC7 - case D4: return _BV(MUX5); // ADC8 - case D6: return _BV(MUX5) | _BV(MUX0); // ADC9 - case D7: return _BV(MUX5) | _BV(MUX1); // ADC10 - case B4: return _BV(MUX5) | _BV(MUX1) | _BV(MUX0); // ADC11 - case B5: return _BV(MUX5) | _BV(MUX2); // ADC12 - case B6: return _BV(MUX5) | _BV(MUX2) | _BV(MUX0); // ADC13 - default: return _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // 0V -#elif defined(__AVR_ATmega32A__) - case A0: return 0; // ADC0 - case A1: return _BV(MUX0); // ADC1 - case A2: return _BV(MUX1); // ADC2 - case A3: return _BV(MUX1) | _BV(MUX0); // ADC3 - case A4: return _BV(MUX2); // ADC4 - case A5: return _BV(MUX2) | _BV(MUX0); // ADC5 - case A6: return _BV(MUX2) | _BV(MUX1); // ADC6 - case A7: return _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // ADC7 - default: return _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // 0V -#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) - case C0: return 0; // ADC0 - case C1: return _BV(MUX0); // ADC1 - case C2: return _BV(MUX1); // ADC2 - case C3: return _BV(MUX1) | _BV(MUX0); // ADC3 - case C4: return _BV(MUX2); // ADC4 - case C5: return _BV(MUX2) | _BV(MUX0); // ADC5 - // ADC7:6 not present in DIP package and not shared by GPIO pins - default: return _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // 0V -#endif - // clang-format on - } - return 0; -} - -int16_t adc_read(uint8_t mux) { - uint16_t low; - - // Enable ADC and configure prescaler - ADCSRA = _BV(ADEN) | ADC_PRESCALER; - -#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) - // High speed mode and ADC8-13 - ADCSRB = _BV(ADHSM) | (mux & _BV(MUX5)); -#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) - // High speed mode only - ADCSRB = _BV(ADHSM); -#endif - - // Configure mux input -#if defined(MUX4) - ADMUX = aref | (mux & (_BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0))); -#else - ADMUX = aref | (mux & (_BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0))); -#endif - - // Start the conversion - ADCSRA |= _BV(ADSC); - // Wait for result - while (ADCSRA & _BV(ADSC)) - ; - // Must read LSB first - low = ADCL; - // Must read MSB only once! - low |= (ADCH << 8); - - // turn off the ADC - ADCSRA &= ~(1 << ADEN); - - return low; -} |