summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-04-28 23:02:12 -0700
committerKeith Packard <keithp@keithp.com>2013-05-07 20:07:52 -0700
commitf677a83348a9568679240ee9d731ab454f289831 (patch)
tree8a8bd51ae7cce01fac472fb33a653f0489e74f0d /src
parent0488cd9cffc837e99490a0761216bbc5847ff400 (diff)
altos: Provide timeout value to ao_radio_recv
Instead of using ao_alarm around calls to ao_radio_recv, provide an explicit timeout value as needed by radio functions with more complicated system interaction than the cc1111. The timeout is 8 bits of clock ticks. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
-rw-r--r--src/cc1111/ao_radio.c6
-rw-r--r--src/core/ao.h2
-rw-r--r--src/core/ao_monitor.c2
-rw-r--r--src/core/ao_radio_cmac.c6
-rw-r--r--src/drivers/ao_cc1120.c19
-rw-r--r--src/drivers/ao_packet.c2
-rw-r--r--src/drivers/ao_radio_master.c3
-rw-r--r--src/drivers/ao_radio_slave.c3
8 files changed, 25 insertions, 18 deletions
diff --git a/src/cc1111/ao_radio.c b/src/cc1111/ao_radio.c
index cb2c2fdd..07b0d1b5 100644
--- a/src/cc1111/ao_radio.c
+++ b/src/cc1111/ao_radio.c
@@ -322,7 +322,7 @@ ao_radio_send(__xdata void *packet, uint8_t size) __reentrant
}
uint8_t
-ao_radio_recv(__xdata void *packet, uint8_t size) __reentrant
+ao_radio_recv(__xdata void *packet, uint8_t size, uint8_t timeout) __reentrant
{
ao_radio_abort = 0;
ao_radio_get(size - 2);
@@ -342,9 +342,13 @@ ao_radio_recv(__xdata void *packet, uint8_t size) __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))
break;
+ if (timeout)
+ ao_clear_alarm();
/* If recv was aborted, clean up by stopping the DMA engine
* and idling the radio
diff --git a/src/core/ao.h b/src/core/ao.h
index 548e8738..2a8eb042 100644
--- a/src/core/ao.h
+++ b/src/core/ao.h
@@ -535,7 +535,7 @@ ao_radio_send(const __xdata void *d, uint8_t size) __reentrant;
#if HAS_RADIO_RECV
uint8_t
-ao_radio_recv(__xdata void *d, uint8_t size) __reentrant;
+ao_radio_recv(__xdata void *d, uint8_t size, uint8_t timeout) __reentrant;
void
ao_radio_recv_abort(void);
diff --git a/src/core/ao_monitor.c b/src/core/ao_monitor.c
index 5876bef7..18f170b4 100644
--- a/src/core/ao_monitor.c
+++ b/src/core/ao_monitor.c
@@ -81,7 +81,7 @@ ao_monitor_get(void)
size = ao_monitoring;
break;
}
- if (!ao_radio_recv(&ao_monitor_ring[ao_monitor_head], size + 2))
+ if (!ao_radio_recv(&ao_monitor_ring[ao_monitor_head], size + 2, 0))
continue;
ao_monitor_head = ao_monitor_ring_next(ao_monitor_head);
ao_wakeup(DATA_TO_XDATA(&ao_monitor_head));
diff --git a/src/core/ao_radio_cmac.c b/src/core/ao_radio_cmac.c
index fc0ca8b1..4920b50c 100644
--- a/src/core/ao_radio_cmac.c
+++ b/src/core/ao_radio_cmac.c
@@ -85,11 +85,7 @@ radio_cmac_recv(uint8_t len, uint16_t timeout) __reentrant
#if HAS_MONITOR
ao_monitor_set(0);
#endif
- if (timeout)
- ao_alarm(timeout);
-
- i = ao_radio_recv(cmac_data, len + AO_CMAC_KEY_LEN + 2);
- ao_clear_alarm();
+ i = ao_radio_recv(cmac_data, len + AO_CMAC_KEY_LEN + 2, timeout);
if (!i) {
ao_radio_cmac_rssi = 0;
diff --git a/src/drivers/ao_cc1120.c b/src/drivers/ao_cc1120.c
index a26eccbc..5add45e4 100644
--- a/src/drivers/ao_cc1120.c
+++ b/src/drivers/ao_cc1120.c
@@ -671,12 +671,17 @@ ao_radio_test_cmd(void)
}
static void
-ao_radio_wait_isr(void)
+ao_radio_wait_isr(uint16_t timeout)
{
+ if (timeout)
+ ao_alarm(timeout);
ao_arch_block_interrupts();
while (!ao_radio_wake && !ao_radio_mcu_wake && !ao_radio_abort)
- ao_sleep(&ao_radio_wake);
+ if (ao_sleep(&ao_radio_wake))
+ ao_radio_abort = 1;
ao_arch_release_interrupts();
+ if (timeout)
+ ao_clear_alarm();
if (ao_radio_mcu_wake)
ao_radio_check_marc_status();
}
@@ -687,7 +692,7 @@ ao_radio_wait_tx(uint8_t wait_fifo)
uint8_t fifo_space = 0;
do {
- ao_radio_wait_isr();
+ ao_radio_wait_isr(0);
if (!wait_fifo)
return 0;
fifo_space = ao_radio_tx_fifo_space();
@@ -777,7 +782,7 @@ ao_radio_send_aprs(ao_radio_fill_func fill)
/* Wait for some space in the fifo */
while (!ao_radio_abort && (fifo_space = ao_radio_tx_fifo_space()) == 0) {
ao_radio_wake = 0;
- ao_radio_wait_isr();
+ ao_radio_wait_isr(0);
}
if (ao_radio_abort)
break;
@@ -809,7 +814,7 @@ ao_radio_send_aprs(ao_radio_fill_func fill)
}
/* Wait for the transmitter to go idle */
ao_radio_wake = 0;
- ao_radio_wait_isr();
+ ao_radio_wait_isr(0);
}
ao_radio_put();
}
@@ -886,7 +891,7 @@ ao_radio_rx_wait(void)
}
uint8_t
-ao_radio_recv(__xdata void *d, uint8_t size)
+ao_radio_recv(__xdata void *d, uint8_t size, uint8_t timeout)
{
uint8_t len;
uint16_t i;
@@ -940,7 +945,7 @@ ao_radio_recv(__xdata void *d, uint8_t size)
ao_radio_strobe(CC1120_SRX);
/* Wait for the preamble to appear */
- ao_radio_wait_isr();
+ ao_radio_wait_isr(timeout);
if (ao_radio_abort)
goto abort;
diff --git a/src/drivers/ao_packet.c b/src/drivers/ao_packet.c
index 5a507478..802d4c90 100644
--- a/src/drivers/ao_packet.c
+++ b/src/drivers/ao_packet.c
@@ -62,7 +62,7 @@ ao_packet_recv(void)
#ifdef AO_LED_GREEN
ao_led_on(AO_LED_GREEN);
#endif
- dma_done = ao_radio_recv(&ao_rx_packet, sizeof (struct ao_packet_recv));
+ dma_done = ao_radio_recv(&ao_rx_packet, sizeof (struct ao_packet_recv), 0);
#ifdef AO_LED_GREEN
ao_led_off(AO_LED_GREEN);
#endif
diff --git a/src/drivers/ao_radio_master.c b/src/drivers/ao_radio_master.c
index 1e0050c8..128fcf32 100644
--- a/src/drivers/ao_radio_master.c
+++ b/src/drivers/ao_radio_master.c
@@ -156,7 +156,7 @@ ao_radio_send(const void *d, uint8_t size)
uint8_t
-ao_radio_recv(__xdata void *d, uint8_t size)
+ao_radio_recv(__xdata void *d, uint8_t size, uint8_t timeout)
{
int8_t ret;
uint8_t recv;
@@ -166,6 +166,7 @@ ao_radio_recv(__xdata void *d, uint8_t size)
ao_radio_get(AO_RADIO_SPI_RECV, 0);
ao_radio_spi_request.recv_len = size;
+ ao_radio_spi_request.timeout = timeout;
recv = ao_radio_master_send();
if (!recv) {
ao_radio_put();
diff --git a/src/drivers/ao_radio_slave.c b/src/drivers/ao_radio_slave.c
index 1d1f16fe..9a0612e5 100644
--- a/src/drivers/ao_radio_slave.c
+++ b/src/drivers/ao_radio_slave.c
@@ -65,7 +65,8 @@ ao_radio_slave_spi(void)
ao_config.radio_setting = ao_radio_spi_request.setting;
ao_led_on(AO_LED_RX);
ao_radio_spi_reply.status = ao_radio_recv(&ao_radio_spi_reply.payload,
- ao_radio_spi_request.recv_len);
+ ao_radio_spi_request.recv_len,
+ ao_radio_spi_request.timeout);
ao_led_off(AO_LED_RX);
ao_radio_spi_reply.rssi = 0;
ao_spi_send(&ao_radio_spi_reply,