summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ao.h4
-rw-r--r--src/ao_radio.c30
2 files changed, 28 insertions, 6 deletions
diff --git a/src/ao.h b/src/ao.h
index e86b4bf9..84e92f35 100644
--- a/src/ao.h
+++ b/src/ao.h
@@ -804,9 +804,13 @@ ao_telemetry_init(void);
extern __xdata uint8_t ao_radio_dma;
extern __xdata uint8_t ao_radio_dma_done;
+extern __xdata uint8_t ao_radio_done;
extern __xdata uint8_t ao_radio_mutex;
void
+ao_radio_general_isr(void) interrupt 16;
+
+void
ao_radio_set_telemetry(void);
void
diff --git a/src/ao_radio.c b/src/ao_radio.c
index 55a0c297..43899f44 100644
--- a/src/ao_radio.c
+++ b/src/ao_radio.c
@@ -281,6 +281,24 @@ static __code uint8_t packet_setup[] = {
RF_PKTCTRL0_LENGTH_CONFIG_FIXED),
};
+__xdata uint8_t ao_radio_dma;
+__xdata uint8_t ao_radio_dma_done;
+__xdata uint8_t ao_radio_done;
+__xdata uint8_t ao_radio_mutex;
+
+void
+ao_radio_general_isr(void) interrupt 16
+{
+ S1CON &= ~0x03;
+ if (RFIF & RFIF_IM_TIMEOUT) {
+ ao_dma_abort(ao_radio_dma);
+ RFIF &= ~ RFIF_IM_TIMEOUT;
+ } else if (RFIF & RFIF_IM_DONE) {
+ ao_radio_done = 1;
+ ao_wakeup(&ao_radio_done);
+ RFIF &= ~RFIF_IM_DONE;
+ }
+}
void
ao_radio_set_telemetry(void)
@@ -306,10 +324,6 @@ ao_radio_set_rdf(void)
RF[rdf_setup[i]] = rdf_setup[i+1];
}
-__xdata uint8_t ao_radio_dma;
-__xdata uint8_t ao_radio_dma_done;
-__xdata uint8_t ao_radio_mutex;
-
void
ao_radio_idle(void)
{
@@ -328,6 +342,7 @@ ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant
ao_config_get();
ao_mutex_get(&ao_radio_mutex);
ao_radio_idle();
+ ao_radio_done = 0;
RF_CHANNR = ao_config.radio_channel;
ao_dma_set_transfer(ao_radio_dma,
telemetry,
@@ -341,8 +356,8 @@ ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant
DMA_CFG1_PRIORITY_HIGH);
ao_dma_start(ao_radio_dma);
RFST = RFST_STX;
- __critical while (!ao_radio_dma_done)
- ao_sleep(&ao_radio_dma_done);
+ __critical while (!ao_radio_done)
+ ao_sleep(&ao_radio_done);
ao_mutex_put(&ao_radio_mutex);
}
@@ -462,5 +477,8 @@ ao_radio_init(void)
ao_radio_set_telemetry();
ao_radio_dma_done = 1;
ao_radio_dma = ao_dma_alloc(&ao_radio_dma_done);
+ RFIF = 0;
+ RFIM = RFIM_IM_TIMEOUT|RFIM_IM_DONE;
+ IEN2 |= IEN2_RFIE;
ao_cmd_register(&ao_radio_cmds[0]);
}