*
* 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
*
*/
#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),
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
*/
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)|
};
#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
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
}
/* 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
/* 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
#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