From f677a83348a9568679240ee9d731ab454f289831 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 28 Apr 2013 23:02:12 -0700 Subject: [PATCH] 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 --- src/cc1111/ao_radio.c | 6 +++++- src/core/ao.h | 2 +- src/core/ao_monitor.c | 2 +- src/core/ao_radio_cmac.c | 6 +----- src/drivers/ao_cc1120.c | 19 ++++++++++++------- src/drivers/ao_packet.c | 2 +- src/drivers/ao_radio_master.c | 3 ++- src/drivers/ao_radio_slave.c | 3 ++- 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, -- 2.30.2