altoslib: fix computation of TeleGPS battery voltage
[fw/altos] / src / cc1111 / ao_radio.c
index 8f519958ad350013671f0018fa0abae185ea7b6b..166d14d5e9e67cd5e4b92828714bb0bc64af0342 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
  *
  *     M = 1, E = 3, bw = 75kHz
  *
- * 20.5 kHz deviation, 9.6kbps signal
+ * 5.125 kHz deviation, 9.6kbps signal
  *
- *     m = 41 / 9.6, which is < 5.5:
+ *     m = 10.25 / 9.6, which is < 5.5:
  *
- *     bw = 2.6 * 20.5 + 0.55 * 9.6 = 58.58kHz
+ *     bw = 2.6 * 5.125 + 0.55 * 9.6 = 18.6kHz
  *
- *     M = 2, E = 3, bw = 62.5kHz
+ *     M = 2, E = 3, bw = 53.6kHz
  *
- * 20.5kHz deviation, 2.4kbps signal
+ * 1.28125kHz deviation, 2.4kbps signal
  *
- *     m = 41 / 2.4, which is > 5.5:
+ *     m = 2.565 / 2.4, which is < 5.5:
  *
- *     bw = 2.1 * 20.5 + 1.9 * 2.4 = 47.61kHz
+ *     bw = 2.6 * 20.5 + 1.9 * 2.4 = 47.61kHz
  *
  *     M = 3, E = 3, bw = 53.6kHz
  *
@@ -84,7 +85,7 @@
  */
 
 #define CHANBW_M_384   1
-#define CHANBW_M_96    2
+#define CHANBW_M_96    3
 #define CHANBW_M_24    3
 #define CHANBW_E       3
 
  *
  * F = 24e6/2**17 * (8 + DEVIATION_M) * 2**DEVIATION_E
  *
- * So M is 6 and E is 3
+ * For 20.5kHz deviation, M is 6 and E is 3
+ * For 5.125kHz deviation, M is 6 and E is 1
+ * For 1.28125kHz deviation, M is 0 and E is 0
  */
 
-#define DEVIATION_M    6
-#define DEVIATION_E    3
+#define DEVIATION_M_384        6
+#define DEVIATION_E_384        3
+
+#define DEVIATION_M_96 6
+#define DEVIATION_E_96 1
+
+#define DEVIATION_M_24 0
+#define DEVIATION_E_24 0
 
 /*
  * For our RDF beacon, set the symbol rate to 2kBaud (for a 1kHz tone),
@@ -182,9 +191,6 @@ static __code uint8_t radio_setup[] = {
 
        RF_CHANNR_OFF,          0,
 
-       RF_DEVIATN_OFF,         ((DEVIATION_E << RF_DEVIATN_DEVIATION_E_SHIFT) |
-                                (DEVIATION_M << RF_DEVIATN_DEVIATION_M_SHIFT)),
-
        /* SmartRF says set LODIV_BUF_CURRENT_TX to 0
         * And, we're not using power ramping, so use PA_POWER 0
         */
@@ -284,8 +290,10 @@ static __code uint8_t fixed_pkt_setup[] = {
                                 RF_MDMCFG1_NUM_PREAMBLE_4 |
                                 (2 << RF_MDMCFG1_CHANSPC_E_SHIFT)),
 
-       RF_DEVIATN_OFF,         ((DEVIATION_E << RF_DEVIATN_DEVIATION_E_SHIFT) |
-                                (DEVIATION_M << RF_DEVIATN_DEVIATION_M_SHIFT)),
+#if !HAS_RADIO_RATE
+       RF_DEVIATN_OFF,         ((DEVIATION_E_384 << RF_DEVIATN_DEVIATION_E_SHIFT) |
+                                (DEVIATION_M_384 << RF_DEVIATN_DEVIATION_M_SHIFT)),
+#endif
 
        /* max packet length -- now set inline */
        RF_PKTCTRL1_OFF,        ((1 << PKTCTRL1_PQT_SHIFT)|
@@ -298,19 +306,34 @@ static __code uint8_t fixed_pkt_setup[] = {
 };
 
 #if HAS_RADIO_RATE
-static __code uint8_t packet_rate_setup[] = {
+static __code struct {
+       uint8_t         mdmcfg4;
+       uint8_t         deviatn;
+} packet_rate_setup[] = {
        /* 38400 */
-       ((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) |
-        (CHANBW_M_384 << RF_MDMCFG4_CHANBW_M_SHIFT) |
-        (DRATE_E_384 << RF_MDMCFG4_DRATE_E_SHIFT)),
+       {
+               ((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) |
+                (CHANBW_M_384 << RF_MDMCFG4_CHANBW_M_SHIFT) |
+                (DRATE_E_384 << RF_MDMCFG4_DRATE_E_SHIFT)),
+               ((DEVIATION_E_384 << RF_DEVIATN_DEVIATION_E_SHIFT) |
+                (DEVIATION_M_384 << RF_DEVIATN_DEVIATION_M_SHIFT)),
+       },
        /* 9600 */
-       ((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) |
-        (CHANBW_M_96 << RF_MDMCFG4_CHANBW_M_SHIFT) |
-        (DRATE_E_96 << RF_MDMCFG4_DRATE_E_SHIFT)),
+       {
+               ((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) |
+                (CHANBW_M_96 << RF_MDMCFG4_CHANBW_M_SHIFT) |
+                (DRATE_E_96 << RF_MDMCFG4_DRATE_E_SHIFT)),
+               ((DEVIATION_E_96 << RF_DEVIATN_DEVIATION_E_SHIFT) |
+                (DEVIATION_M_96 << RF_DEVIATN_DEVIATION_M_SHIFT)),
+       },
        /* 2400 */
-       ((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) |
-        (CHANBW_M_24 << RF_MDMCFG4_CHANBW_M_SHIFT) |
-        (DRATE_E_24 << RF_MDMCFG4_DRATE_E_SHIFT)),
+       {
+               ((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) |
+                (CHANBW_M_24 << RF_MDMCFG4_CHANBW_M_SHIFT) |
+                (DRATE_E_24 << RF_MDMCFG4_DRATE_E_SHIFT)),
+               ((DEVIATION_E_24 << RF_DEVIATN_DEVIATION_E_SHIFT) |
+                (DEVIATION_M_24 << RF_DEVIATN_DEVIATION_M_SHIFT)),
+       },
 };
 #endif
 
@@ -380,7 +403,8 @@ ao_radio_get(uint8_t len)
        RF_FREQ0 = (uint8_t) (ao_config.radio_setting);
        RF_PKTLEN = len;
 #if HAS_RADIO_RATE
-       RF_MDMCFG4 = packet_rate_setup[ao_config.radio_rate];
+       RF_MDMCFG4 = packet_rate_setup[ao_config.radio_rate].mdmcfg4;
+       RF_DEVIATN = packet_rate_setup[ao_config.radio_rate].deviatn;
 #endif
 }
 
@@ -428,13 +452,9 @@ ao_radio_recv(__xdata void *packet, uint8_t size, uint8_t timeout) __reentrant
        /* Wait for DMA to be done, for the radio receive process to
         * get aborted or for a receive timeout to fire
         */
-       if (timeout)
-               ao_alarm(timeout);
        __critical while (!ao_radio_dma_done && !ao_radio_abort)
-                          if (ao_sleep(&ao_radio_dma_done))
+                          if (ao_sleep_for(&ao_radio_dma_done, timeout))
                                   break;
-       if (timeout)
-               ao_clear_alarm();
 
        /* If recv was aborted, clean up by stopping the DMA engine
         * and idling the radio
@@ -568,13 +588,13 @@ ao_radio_rdf_abort(void)
 
 /* Output carrier */
 
-static __xdata ao_radio_test_on;
+static __xdata radio_test_on;
 
 void
 ao_radio_test(uint8_t on)
 {
        if (on) {
-               if (!ao_radio_test_on) {
+               if (!radio_test_on) {
 #if HAS_MONITOR
                        ao_monitor_disable();
 #endif
@@ -586,13 +606,13 @@ ao_radio_test(uint8_t on)
 #endif
                        ao_radio_get(0xff);
                        RFST = RFST_STX;
-                       ao_radio_test_on = 1;
+                       radio_test_on = 1;
                }
        } else  {
-               if (ao_radio_test_on) {
+               if (radio_test_on) {
                        ao_radio_idle();
                        ao_radio_put();
-                       ao_radio_test_on = 0;
+                       radio_test_on = 0;
 #if HAS_MONITOR
                        ao_monitor_enable();
 #endif