--- /dev/null
+// Simple analog to digitial conversion, similar to Wiring/Arduino
+
+#include <avr/io.h>
+#include <avr/pgmspace.h>
+
+#include "analog.h"
+
+
+#if defined(__AVR_ATmega32U4__)
+
+uint8_t analog_reference_config_val = 0x40;
+
+static const uint8_t PROGMEM adc_mapping[] = {
+ 0, 1, 4, 5, 6, 7, 13, 12, 11, 10, 9, 8
+};
+
+int analogRead(uint8_t pin)
+{
+ uint8_t low, adc;
+
+ if (pin >= 12) return 0;
+ adc = pgm_read_byte(adc_mapping + pin);
+ if (adc < 8) {
+ DIDR0 |= (1 << adc);
+ ADCSRB = 0;
+ ADMUX = analog_reference_config_val | adc;
+ } else {
+ adc -= 8;
+ DIDR2 |= (1 << adc);
+ ADCSRB = (1<<MUX5);
+ ADMUX = analog_reference_config_val | adc;
+ }
+ ADCSRA = (1<<ADSC)|(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
+ while (ADCSRA & (1<<ADSC)) ;
+ low = ADCL;
+ return (ADCH << 8) | low;
+}
+
+#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
+
+uint8_t analog_reference_config_val = 0x40;
+
+int analogRead(uint8_t pin)
+{
+ uint8_t low;
+
+ if (pin >= 8) return 0;
+ DIDR0 |= (1 << pin);
+ ADMUX = analog_reference_config_val | pin;
+ ADCSRA = (1<<ADSC)|(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
+ while (ADCSRA & (1<<ADSC)) ;
+ low = ADCL;
+ return (ADCH << 8) | low;
+}
+
+#endif
+