Switch from GPLv2 to GPLv2+
[fw/altos] / src / cc1111 / ao_adc.c
index 4a58023d50474270d017167ef09240e99184775a..94af5cda433ba710c16d13beafc2e884cf5d66e6 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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; version 2 of the License.
+ * 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
 
 volatile __xdata struct ao_data        ao_data_ring[AO_DATA_RING];
 volatile __data uint8_t                ao_data_head;
+#if (AO_DATA_ALL & ~(AO_DATA_ADC))
+volatile __data uint8_t                ao_data_present;
+#endif
+
+#ifdef TELENANO_V_0_1
+# define AO_ADC_FIRST_PIN      1
+#endif
+
+#if HAS_ACCEL_REF
+# define AO_ADC_FIRST_PIN      2
+#endif
 
 #ifndef AO_ADC_FIRST_PIN
-#define AO_ADC_FIRST_PIN       0
+# define AO_ADC_FIRST_PIN      0
 #endif
 
 void
 ao_adc_poll(void)
 {
-#if HAS_ACCEL_REF
-       ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 2;
-#else
-# ifdef TELENANO_V_0_1
-       ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 1;
-# else
        ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | AO_ADC_FIRST_PIN;
-# endif
-#endif
 }
 
 void
@@ -82,6 +86,7 @@ ao_adc_isr(void) __interrupt 1
                else
 #endif
                        ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | sequence;
+               return;
        }
 #endif
 
@@ -141,6 +146,7 @@ ao_adc_isr(void) __interrupt 1
        if (sequence) {
                /* Start next conversion */
                ADCCON3 = sequence;
+               return;
        }
 #endif /* telemini || telenano */
 
@@ -148,8 +154,10 @@ ao_adc_isr(void) __interrupt 1
        a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.sense[0] + sequence - AO_ADC_FIRST_PIN);
        a[0] = ADCL;
        a[1] = ADCH;
-       if (sequence < 5)
+       if (sequence < 5) {
                ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | (sequence + 1);
+               return;
+       }
 #define GOT_ADC
 #endif /* TELEFIRE_V_0_1 */
 
@@ -157,21 +165,22 @@ ao_adc_isr(void) __interrupt 1
        a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.batt);
        a[0] = ADCL;
        a[1] = ADCH;
-       if (0)
-               ;
 #define GOT_ADC
 #endif 
 
+#ifdef FETCH_ADC
+       FETCH_ADC();
+#define GOT_ADC
+#endif
+
 #ifndef GOT_ADC
 #error No known ADC configuration set
 #endif
 
-       else {
-               /* record this conversion series */
-               ao_data_ring[ao_data_head].tick = ao_time();
-               ao_data_head = ao_data_ring_next(ao_data_head);
-               ao_wakeup(DATA_TO_XDATA(&ao_data_head));
-       }
+       /* record this conversion series */
+       ao_data_ring[ao_data_head].tick = ao_time();
+       ao_data_head = ao_data_ring_next(ao_data_head);
+       ao_wakeup(DATA_TO_XDATA(&ao_data_head));
 }
 
 static void